From a1d61051c7ac5a7991b5300b900fa6392c13703a Mon Sep 17 00:00:00 2001 From: James Michael Goff Date: Thu, 9 May 2024 17:14:06 -0600 Subject: [PATCH 01/12] ACE grid computes with validation examples --- cmake/Modules/Packages/ML-PACE.cmake | 53 +-- examples/snap/coupling_coefficients.yace | 382 +++++++++++++++++++ examples/snap/in.grid.ace | 85 +++++ examples/snap/log.9May24.grid.ace.g++.1 | 66 ++++ examples/snap/log.9May24.grid.ace.g++.4 | 70 ++++ lib/pace/Install.py | 4 +- lib/pace/Makefile | 2 +- lib/pace/Makefile.lammps | 2 +- src/ML-PACE/compute_pace.cpp | 466 +++++++++++++++++++++++ src/ML-PACE/compute_pace.h | 59 +++ src/ML-PACE/compute_pace_grid.cpp | 292 ++++++++++++++ src/ML-PACE/compute_pace_grid.h | 57 +++ src/ML-PACE/compute_pace_grid_local.cpp | 290 ++++++++++++++ src/ML-PACE/compute_pace_grid_local.h | 59 +++ src/ML-PACE/pair_pace.cpp | 52 ++- src/ML-PACE/pair_pace.h | 4 + src/ML-PACE/pair_pace_extrapolation.cpp | 38 +- src/ML-PACE/pair_pace_extrapolation.h | 9 +- 18 files changed, 1948 insertions(+), 42 deletions(-) create mode 100644 examples/snap/coupling_coefficients.yace create mode 100644 examples/snap/in.grid.ace create mode 100644 examples/snap/log.9May24.grid.ace.g++.1 create mode 100644 examples/snap/log.9May24.grid.ace.g++.4 create mode 100644 src/ML-PACE/compute_pace.cpp create mode 100644 src/ML-PACE/compute_pace.h create mode 100644 src/ML-PACE/compute_pace_grid.cpp create mode 100644 src/ML-PACE/compute_pace_grid.h create mode 100644 src/ML-PACE/compute_pace_grid_local.cpp create mode 100644 src/ML-PACE/compute_pace_grid_local.h diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index 6cdb7516171..248b8eea761 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,33 +1,40 @@ -set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.01.3.fix.tar.gz" CACHE STRING "URL for PACE evaluator library sources") +set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.11.25.fix.tar.gz" CACHE STRING "URL for PACE evaluator library sources") -set(PACELIB_MD5 "4f0b3b5b14456fe9a73b447de3765caa" CACHE STRING "MD5 checksum of PACE evaluator library tarball") +set(PACELIB_MD5 "b45de9a633f42ed65422567e3ce56f9f" CACHE STRING "MD5 checksum of PACE evaluator library tarball") mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) GetFallbackURL(PACELIB_URL PACELIB_FALLBACK) -# download library sources to build folder -if(EXISTS ${CMAKE_BINARY_DIR}/libpace.tar.gz) - file(MD5 ${CMAKE_BINARY_DIR}/libpace.tar.gz DL_MD5) -endif() -if(NOT "${DL_MD5}" STREQUAL "${PACELIB_MD5}") - message(STATUS "Downloading ${PACELIB_URL}") - file(DOWNLOAD ${PACELIB_URL} ${CMAKE_BINARY_DIR}/libpace.tar.gz STATUS DL_STATUS SHOW_PROGRESS) - file(MD5 ${CMAKE_BINARY_DIR}/libpace.tar.gz DL_MD5) - if((NOT DL_STATUS EQUAL 0) OR (NOT "${DL_MD5}" STREQUAL "${PACELIB_MD5}")) - message(WARNING "Download from primary URL ${PACELIB_URL} failed\nTrying fallback URL ${PACELIB_FALLBACK}") - file(DOWNLOAD ${PACELIB_FALLBACK} ${CMAKE_BINARY_DIR}/libpace.tar.gz EXPECTED_HASH MD5=${PACELIB_MD5} SHOW_PROGRESS) - endif() +# LOCAL_ML-PACE points to top-level dir with local lammps-user-pace repo, +# to make it easier to check local build without going through the public github releases +if(LOCAL_ML-PACE) + set(lib-pace "${LOCAL_ML-PACE}") else() - message(STATUS "Using already downloaded archive ${CMAKE_BINARY_DIR}/libpace.tar.gz") -endif() + # download library sources to build folder + if(EXISTS ${CMAKE_BINARY_DIR}/libpace.tar.gz) + file(MD5 ${CMAKE_BINARY_DIR}/libpace.tar.gz DL_MD5) + endif() + if(NOT "${DL_MD5}" STREQUAL "${PACELIB_MD5}") + message(STATUS "Downloading ${PACELIB_URL}") + file(DOWNLOAD ${PACELIB_URL} ${CMAKE_BINARY_DIR}/libpace.tar.gz STATUS DL_STATUS SHOW_PROGRESS) + file(MD5 ${CMAKE_BINARY_DIR}/libpace.tar.gz DL_MD5) + if((NOT DL_STATUS EQUAL 0) OR (NOT "${DL_MD5}" STREQUAL "${PACELIB_MD5}")) + message(WARNING "Download from primary URL ${PACELIB_URL} failed\nTrying fallback URL ${PACELIB_FALLBACK}") + file(DOWNLOAD ${PACELIB_FALLBACK} ${CMAKE_BINARY_DIR}/libpace.tar.gz EXPECTED_HASH MD5=${PACELIB_MD5} SHOW_PROGRESS) + endif() + else() + message(STATUS "Using already downloaded archive ${CMAKE_BINARY_DIR}/libpace.tar.gz") + endif() + -# uncompress downloaded sources -execute_process( - COMMAND ${CMAKE_COMMAND} -E remove_directory lammps-user-pace* - COMMAND ${CMAKE_COMMAND} -E tar xzf libpace.tar.gz - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} -) -get_newest_file(${CMAKE_BINARY_DIR}/lammps-user-pace-* lib-pace) + # uncompress downloaded sources + execute_process( + COMMAND ${CMAKE_COMMAND} -E remove_directory lammps-user-pace* + COMMAND ${CMAKE_COMMAND} -E tar xzf libpace.tar.gz + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + get_newest_file(${CMAKE_BINARY_DIR}/lammps-user-pace-* lib-pace) +endif() add_subdirectory(${lib-pace} build-pace) set_target_properties(pace PROPERTIES CXX_EXTENSIONS ON OUTPUT_NAME lammps_pace${LAMMPS_MACHINE}) diff --git a/examples/snap/coupling_coefficients.yace b/examples/snap/coupling_coefficients.yace new file mode 100644 index 00000000000..3701c25adce --- /dev/null +++ b/examples/snap/coupling_coefficients.yace @@ -0,0 +1,382 @@ +elements: [Cl, Na] +E0: [0.000000, 0.000000] +deltaSplineBins: 0.001000 +embeddings: + 0: {ndensity: 1, FS_parameters: [1.0, 1.0], npoti: FinnisSinclair, rho_core_cutoff: 100000, drho_core_cutoff: 250} + 1: {ndensity: 1, FS_parameters: [1.0, 1.0], npoti: FinnisSinclair, rho_core_cutoff: 100000, drho_core_cutoff: 250} +bonds: + [0, 0]: {nradmax: 8, lmax: 2, nradbasemax: 8, radbasename: ChebExpCos, radparameters: [0.003], radcoefficients: [[[1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0]], [[0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0]], [[0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0]], [[0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.003, rcut: 3.5, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [0, 1]: {nradmax: 8, lmax: 2, nradbasemax: 8, radbasename: ChebExpCos, radparameters: [0.005], radcoefficients: [[[1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0]], [[0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0]], [[0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0]], [[0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.005, rcut: 4.0, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [1, 0]: {nradmax: 8, lmax: 2, nradbasemax: 8, radbasename: ChebExpCos, radparameters: [0.005], radcoefficients: [[[1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0]], [[0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0]], [[0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0]], [[0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.005, rcut: 4.0, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [1, 1]: {nradmax: 8, lmax: 2, nradbasemax: 8, radbasename: ChebExpCos, radparameters: [0.008], radcoefficients: [[[1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0]], [[0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0]], [[0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0]], [[0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.008, rcut: 4.5, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} +functions: + 0: + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [1], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [1], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [2], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [2], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [3], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [3], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [4], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [4], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [5], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [5], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [6], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [6], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [7], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [7], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [8], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [8], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [2, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [2, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [2, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 2, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [2, 2, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0, 1], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1, 0], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 0, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 0, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0, 0], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 0, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1, 0], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + 1: + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [1], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [1], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [2], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [2], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [3], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [3], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [4], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [4], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [5], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [5], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [6], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [6], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [7], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [7], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [8], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [8], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [2, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [2, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [2, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 2, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [2, 2, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0, 1], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1, 0], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 0, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 0, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0, 0], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 0, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1, 0], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} diff --git a/examples/snap/in.grid.ace b/examples/snap/in.grid.ace new file mode 100644 index 00000000000..ec920ef95e4 --- /dev/null +++ b/examples/snap/in.grid.ace @@ -0,0 +1,85 @@ +# Demonstrate calculation of SNAP bispectrum descriptors on a grid + +# CORRECTNESS: The two atom positions coincide with two of +# the gridpoints, so c_b[2][1-5] should match c_mygrid[8][4-8]. +# The same is true for compute grid/local c_mygridlocal[8][4-11]. +# Local arrays can not be access directly in the script, +# but they are printed out to file dump.blocal + +variable nrep index 1 +variable a index 3.316 +variable ngrid index 2 + +units metal +atom_modify map hash + +# generate the box and atom positions using a BCC lattice + +variable nx equal ${nrep} +variable ny equal ${nrep} +variable nz equal ${nrep} + +boundary p p p + +lattice custom $a & + a1 1 0 0 & + a2 0 1 0 & + a3 0 0 1 & + basis 0 0 0 & + basis 0.5 0.5 0.5 + +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 1 box +create_atoms 1 box basis 1 1 + +mass 1 35.453 +#mass 2 22.989769 + +# define atom compute and grid compute + +group acegroup type 1 +variable rcutfac equal 4.67637 + +variable ace_options string "coupling_coefficients.yace" + + +# build zero potential to satisfy compute sna/atom + +pair_style zero ${rcutfac} +pair_coeff * * + +# define atom and grid computes + +compute bace all pace ${ace_options} 1 0 +compute mygrid all pace/grid grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} +compute mygridlocal all pace/grid/local grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} +fix bace all ave/time 1 1 1 c_bace[*] file desc_out.dat mode vector +#compute mygrid all pace/grid grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} +#compute mygridlocal all pace/grid/local grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} + +# define output + +variable B5atom equal c_bace[2][5] +variable B5grid equal c_mygrid[8][8] + +variable rmse_global equal "sqrt( & + (c_mygrid[8][1] - x[2])^2 + & + (c_mygrid[8][2] - y[2])^2 + & + (c_mygrid[8][3] - z[2])^2 + & + (c_mygrid[8][4] - c_bace[2][1])^2 + & + (c_mygrid[8][5] - c_bace[2][2])^2 + & + (c_mygrid[8][6] - c_bace[2][3])^2 + & + (c_mygrid[8][7] - c_bace[2][4])^2 + & + (c_mygrid[8][8] - c_bace[2][5])^2 & + )" + +thermo_style custom step v_B5atom v_B5grid v_rmse_global + +# this is the only way to view the local grid + +dump 1 all local 1000 dump.blocal c_mygridlocal[*] + +# run + +run 0 + diff --git a/examples/snap/log.9May24.grid.ace.g++.1 b/examples/snap/log.9May24.grid.ace.g++.1 new file mode 100644 index 00000000000..45ac8a38fd6 --- /dev/null +++ b/examples/snap/log.9May24.grid.ace.g++.1 @@ -0,0 +1,66 @@ +LAMMPS (15 Jun 2023 - Development - 1c9d62543b-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +Lattice spacing in x,y,z = 3.316 3.316 3.316 +Created orthogonal box = (0 0 0) to (3.316 3.316 3.316) + 1 by 1 by 1 MPI processor grid +Created 2 atoms + using lattice units in orthogonal box = (0 0 0) to (3.316 3.316 3.316) + create_atoms CPU = 0.000 seconds +2 atoms in group acegroup +potential file name (not local): coupling_coefficients.yace +WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60) +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +WARNING: More than one compute pace (src/ML-PACE/compute_pace.cpp:135) +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.67637 + ghost atom cutoff = 6.67637 + binsize = 3.338185, bins = 1 1 1 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard + (2) compute pace, occasional + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 73.21 | 73.21 | 73.21 Mbytes + Step v_B5atom v_B5grid v_rmse_global + 0 0.37264346 0.37264346 1.3877788e-17 +Loop time of 1.445e-06 on 1 procs for 0 steps with 2 atoms + +207.6% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 1.445e-06 | | |100.00 + +Nlocal: 2 ave 2 max 2 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 339 ave 339 max 339 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 64 ave 64 max 64 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 128 ave 128 max 128 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 128 +Ave neighs/atom = 64 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/snap/log.9May24.grid.ace.g++.4 b/examples/snap/log.9May24.grid.ace.g++.4 new file mode 100644 index 00000000000..9e9bd7f3d76 --- /dev/null +++ b/examples/snap/log.9May24.grid.ace.g++.4 @@ -0,0 +1,70 @@ +LAMMPS (15 Jun 2023 - Development - 1c9d62543b-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +Lattice spacing in x,y,z = 3.316 3.316 3.316 +Created orthogonal box = (0 0 0) to (3.316 3.316 3.316) + 1 by 2 by 2 MPI processor grid +Created 2 atoms + using lattice units in orthogonal box = (0 0 0) to (3.316 3.316 3.316) + create_atoms CPU = 0.001 seconds +2 atoms in group acegroup +potential file name (not local): coupling_coefficients.yace +potential file name (not local): coupling_coefficients.yace +potential file name (not local): coupling_coefficients.yace +potential file name (not local): coupling_coefficients.yace +WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60) +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +WARNING: More than one compute pace (src/ML-PACE/compute_pace.cpp:135) +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.67637 + ghost atom cutoff = 6.67637 + binsize = 3.338185, bins = 1 1 1 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard + (2) compute pace, occasional + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +WARNING: Proc sub-domain size < neighbor skin, could lead to lost atoms (src/domain.cpp:966) +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 73.23 | 73.23 | 73.23 Mbytes + Step v_B5atom v_B5grid v_rmse_global + 0 0.37264346 0.37264346 5.5511151e-17 +Loop time of 4.885e-06 on 4 procs for 0 steps with 2 atoms + +51.2% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 4.885e-06 | | |100.00 + +Nlocal: 0.5 ave 1 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 274.5 ave 275 max 274 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Neighs: 16 ave 40 max 0 min +Histogram: 2 0 0 0 0 0 1 0 0 1 +FullNghs: 32 ave 64 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 128 +Ave neighs/atom = 64 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/lib/pace/Install.py b/lib/pace/Install.py index 4f3cf299ac1..fcd9497937d 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -18,11 +18,11 @@ # settings thisdir = fullpath('.') -version ='v.2023.01.3.fix' +version ='v.2023.11.25.fix' # known checksums for different PACE versions. used to validate the download. checksums = { \ - 'v.2023.01.3.fix': '4f0b3b5b14456fe9a73b447de3765caa' + 'v.2023.11.25.fix': 'b45de9a633f42ed65422567e3ce56f9f' } parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") diff --git a/lib/pace/Makefile b/lib/pace/Makefile index 5a1588ef935..a7ac753d285 100644 --- a/lib/pace/Makefile +++ b/lib/pace/Makefile @@ -21,7 +21,7 @@ OBJ = $(SRC:.cpp=.o) # ------ SETTINGS ------ -CXXFLAGS = -O3 -fPIC -Isrc/ML-PACE -I$(YAML_CPP_INC) -I$(WIGNER_CPP_INC) -I$(CNPY_CPP_INC) -DEXTRA_C_PROJECTIONS +CXXFLAGS = -O3 -fPIC -Isrc/ML-PACE -I$(YAML_CPP_INC) -I$(WIGNER_CPP_INC) -I$(CNPY_CPP_INC) -DEXTRA_C_PROJECTIONS -DCOMPUTE_B_GRAD ARCHIVE = ar ARCHFLAG = -rc diff --git a/lib/pace/Makefile.lammps b/lib/pace/Makefile.lammps index 6411e49a071..e2219180563 100644 --- a/lib/pace/Makefile.lammps +++ b/lib/pace/Makefile.lammps @@ -1,3 +1,3 @@ -pace_SYSINC =-I../../lib/pace/src/ML-PACE -I../../lib/pace/src/yaml-cpp/include -I../../lib/pace/src/wigner-cpp/include -DEXTRA_C_PROJECTIONS +pace_SYSINC =-I../../lib/pace/src/ML-PACE -I../../lib/pace/src/yaml-cpp/include -I../../lib/pace/src/wigner-cpp/include -DEXTRA_C_PROJECTIONS -DCOMPUTE_B_GRAD pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp pace_SYSPATH = diff --git a/src/ML-PACE/compute_pace.cpp b/src/ML-PACE/compute_pace.cpp new file mode 100644 index 00000000000..fee9a0fa0e6 --- /dev/null +++ b/src/ML-PACE/compute_pace.cpp @@ -0,0 +1,466 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS Development team: developers@lammps.org + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "compute_pace.h" + +#include "ace-evaluator/ace_c_basis.h" +#include "ace-evaluator/ace_evaluator.h" +#include "ace-evaluator/ace_types.h" + +#include "atom.h" +#include "comm.h" +#include "error.h" +#include "force.h" +#include "memory.h" +#include "modify.h" +#include "neigh_list.h" +#include "neighbor.h" +#include "pair.h" +#include "update.h" + +namespace LAMMPS_NS { +struct ACECimpl { + ACECimpl() : basis_set(nullptr), ace(nullptr) {} + ~ACECimpl() + { + delete basis_set; + delete ace; + } + ACECTildeBasisSet *basis_set; + ACECTildeEvaluator *ace; +}; +} // namespace LAMMPS_NS + +using namespace LAMMPS_NS; + +enum { SCALAR, VECTOR, ARRAY }; +ComputePACE::ComputePACE(LAMMPS *lmp, int narg, char **arg) : + Compute(lmp, narg, arg), cutsq(nullptr), list(nullptr), pace(nullptr), paceall(nullptr), + pace_peratom(nullptr), map(nullptr), c_pe(nullptr), c_virial(nullptr), acecimpl(nullptr) +{ + array_flag = 1; + extarray = 0; + bikflag = 0; + dgradflag = 0; + + int ntypes = atom->ntypes; + int nargmin = 4; + + acecimpl = new ACECimpl; + if (narg < nargmin) error->all(FLERR,"Illegal compute pace command"); + + bikflag = utils::inumeric(FLERR, arg[4], false, lmp); + dgradflag = utils::inumeric(FLERR, arg[5], false, lmp); + if (dgradflag && !bikflag) + error->all(FLERR,"Illegal compute pace command: dgradflag=1 requires bikflag=1"); + + memory->create(map,ntypes+1,"pace:map"); + + //read in file with CG coefficients or c_tilde coefficients + + auto potential_file_name = utils::get_potential_file_path(arg[3]); + delete acecimpl->basis_set; + acecimpl->basis_set = new ACECTildeBasisSet(potential_file_name); + cutmax = acecimpl->basis_set->cutoffmax; + + //# of rank 1, rank > 1 functions + + int n_r1, n_rp = 0; + n_r1 = acecimpl->basis_set->total_basis_size_rank1[0]; + n_rp = acecimpl->basis_set->total_basis_size[0]; + + int ncoeff = n_r1 + n_rp; + nvalues = ncoeff; + + ndims_force = 3; + ndims_virial = 6; + bik_rows = 1; + yoffset = nvalues; + zoffset = 2*nvalues; + natoms = atom->natoms; + if (bikflag) bik_rows = natoms; + dgrad_rows = ndims_force*natoms; + size_array_rows = bik_rows+dgrad_rows + ndims_virial; + if (dgradflag) { + size_array_rows = bik_rows + 3*natoms*natoms + 1; + size_array_cols = nvalues + 3; + if (comm->me == 0) + error->warning(FLERR,"dgradflag=1 creates a N^2 array, beware of large systems."); + } else size_array_cols = nvalues*atom->ntypes + 1; + lastcol = size_array_cols-1; + + ndims_peratom = ndims_force; + size_peratom = ndims_peratom*nvalues*atom->ntypes; + + nmax = 0; +} + +/* ---------------------------------------------------------------------- */ + +ComputePACE::~ComputePACE() +{ + modify->delete_compute(id_virial); + + delete acecimpl; + memory->destroy(pace); + memory->destroy(paceall); + memory->destroy(cutsq); + memory->destroy(pace_peratom); + memory->destroy(map); +} + +/* ---------------------------------------------------------------------- */ + +void ComputePACE::init() +{ + if (force->pair == nullptr) + error->all(FLERR,"Compute pace requires a pair style be defined"); + + if (cutmax > force->pair->cutforce) + error->all(FLERR,"Compute pace cutoff is longer than pairwise cutoff"); + + // need an occasional full neighbor list + neighbor->add_request(this, NeighConst::REQ_FULL | NeighConst::REQ_OCCASIONAL); + + if (modify->get_compute_by_style("pace").size() > 1 && comm->me == 0) + error->warning(FLERR,"More than one compute pace"); + + // allocate memory for global array + memory->create(pace,size_array_rows,size_array_cols, "pace:pace"); + memory->create(paceall,size_array_rows,size_array_cols, "pace:paceall"); + array = paceall; + + // find compute for reference energy + + c_pe = modify->get_compute_by_id("thermo_pe"); + if (!c_pe) error->all(FLERR,"Compute thermo_pe does not exist."); + + // add compute for reference virial tensor + + id_virial = id + std::string("_press"); + c_virial = modify->add_compute(id_virial + " all pressure NULL virial"); +} + +/* ---------------------------------------------------------------------- */ + +void ComputePACE::init_list(int /*id*/, NeighList *ptr) +{ + list = ptr; +} + +/* ---------------------------------------------------------------------- */ + +void ComputePACE::compute_array() +{ + int ntotal = atom->nlocal + atom->nghost; + invoked_array = update->ntimestep; + + // grow pace_peratom array if necessary + + if (atom->nmax > nmax) { + memory->destroy(pace_peratom); + nmax = atom->nmax; + memory->create(pace_peratom,nmax,size_peratom,"pace:pace_peratom"); + } + + // clear global array + + for (int irow = 0; irow < size_array_rows; irow++){ + for (int icoeff = 0; icoeff < size_array_cols; icoeff++){ + pace[irow][icoeff] = 0.0; + } + } + + // clear local peratom array + + for (int i = 0; i < ntotal; i++){ + for (int icoeff = 0; icoeff < size_peratom; icoeff++) { + pace_peratom[i][icoeff] = 0.0; + } + } + + // invoke full neighbor list (will copy or build if necessary) + + neighbor->build_one(list); + + const int inum = list->inum; + const int* const ilist = list->ilist; + const int* const numneigh = list->numneigh; + int** const firstneigh = list->firstneigh; + int * const type = atom->type; + + //determine the maximum number of neighbours + int max_jnum = -1; + int nei = 0; + int jtmp =0; + for (int iitmp = 0; iitmp < list->inum; iitmp++) { + int itmp = ilist[iitmp]; + jtmp = numneigh[itmp]; + nei = nei + jtmp; + if (jtmp > max_jnum){ + max_jnum = jtmp; + } + } + + // compute pace derivatives for each atom in group + // use full neighbor list to count atoms less than cutoff + + const int* const mask = atom->mask; + const int ntypes = atom->ntypes; + + for (int ii = 0; ii < inum; ii++) { + int irow = 0; + if (bikflag) irow = atom->tag[ilist[ii] & NEIGHMASK]-1; + const int i = ilist[ii]; + if (mask[i] & groupbit) { + const int itype = type[i]; + const int* const jlist = firstneigh[i]; + const int jnum = numneigh[i]; + const int typeoffset_local = ndims_peratom*nvalues*(itype-1); + const int typeoffset_global = nvalues*(itype-1); + + delete acecimpl->ace; + acecimpl->ace = new ACECTildeEvaluator(*acecimpl->basis_set); + acecimpl->ace->compute_projections = true; + acecimpl->ace->compute_b_grad = true; + int n_r1, n_rp = 0; + n_r1 = acecimpl->basis_set->total_basis_size_rank1[0]; + n_rp = acecimpl->basis_set->total_basis_size[0]; + + int ncoeff = n_r1 + n_rp; + acecimpl->ace->element_type_mapping.init(ntypes+1); + for (int ik = 1; ik <= ntypes; ik++) { + for(int mu = 0; mu < acecimpl->basis_set->nelements; mu++){ + if (mu != -1) { + if (mu == ik - 1) { + map[ik] = mu; + acecimpl->ace->element_type_mapping(ik) = mu; + } + } + } + } + + if (dgradflag) { + + // dBi/dRi tags + + pace[bik_rows + ((atom->tag[i]-1)*3*natoms) + 3*(atom->tag[i]-1) + 0][0] = atom->tag[i]-1; + pace[bik_rows + ((atom->tag[i]-1)*3*natoms) + 3*(atom->tag[i]-1) + 0][1] = atom->tag[i]-1; + pace[bik_rows + ((atom->tag[i]-1)*3*natoms) + 3*(atom->tag[i]-1) + 0][2] = 0; + pace[bik_rows + ((atom->tag[i]-1)*3*natoms) + 3*(atom->tag[i]-1) + 1][0] = atom->tag[i]-1; + pace[bik_rows + ((atom->tag[i]-1)*3*natoms) + 3*(atom->tag[i]-1) + 1][1] = atom->tag[i]-1; + pace[bik_rows + ((atom->tag[i]-1)*3*natoms) + 3*(atom->tag[i]-1) + 1][2] = 1; + pace[bik_rows + ((atom->tag[i]-1)*3*natoms) + 3*(atom->tag[i]-1) + 2][0] = atom->tag[i]-1; + pace[bik_rows + ((atom->tag[i]-1)*3*natoms) + 3*(atom->tag[i]-1) + 2][1] = atom->tag[i]-1; + pace[bik_rows + ((atom->tag[i]-1)*3*natoms) + 3*(atom->tag[i]-1) + 2][2] = 2; + + // dBi/dRj tags + + for (int j=0; jtag[i]-1) + 0][0] = atom->tag[i]-1; + pace[bik_rows + ((j)*3*natoms) + 3*(atom->tag[i]-1) + 0][1] = j; + pace[bik_rows + ((j)*3*natoms) + 3*(atom->tag[i]-1) + 0][2] = 0; + pace[bik_rows + ((j)*3*natoms) + 3*(atom->tag[i]-1) + 1][0] = atom->tag[i]-1; + pace[bik_rows + ((j)*3*natoms) + 3*(atom->tag[i]-1) + 1][1] = j; + pace[bik_rows + ((j)*3*natoms) + 3*(atom->tag[i]-1) + 1][2] = 1; + pace[bik_rows + ((j)*3*natoms) + 3*(atom->tag[i]-1) + 2][0] = atom->tag[i]-1; + pace[bik_rows + ((j)*3*natoms) + 3*(atom->tag[i]-1) + 2][1] = j; + pace[bik_rows + ((j)*3*natoms) + 3*(atom->tag[i]-1) + 2][2] = 2; + } + } + + // resize the neighbor cache after setting the basis + acecimpl->ace->resize_neighbours_cache(max_jnum); + acecimpl->ace->compute_atom(i, atom->x, atom->type, list->numneigh[i], list->firstneigh[i]); + Array1D Bs = acecimpl->ace->projections; + + for (int jj = 0; jj < jnum; jj++) { + const int j = jlist[jj]; + //replace mapping of jj to j + if (!dgradflag) { + double *pacedi = pace_peratom[i]+typeoffset_local; + double *pacedj = pace_peratom[j]+typeoffset_local; + + //force array in (func_ind,neighbour_ind,xyz_ind) format + // dimension: (n_descriptors,max_jnum,3) + //example to access entries for neighbour jj after running compute_atom for atom i: + for (int func_ind =0; func_ind < n_r1 + n_rp; func_ind++){ + DOUBLE_TYPE fx_dB = acecimpl->ace->neighbours_dB(func_ind,jj,0); + DOUBLE_TYPE fy_dB = acecimpl->ace->neighbours_dB(func_ind,jj,1); + DOUBLE_TYPE fz_dB = acecimpl->ace->neighbours_dB(func_ind,jj,2); + pacedi[func_ind] += fx_dB; + pacedi[func_ind+yoffset] += fy_dB; + pacedi[func_ind+zoffset] += fz_dB; + pacedj[func_ind] -= fx_dB; + pacedj[func_ind+yoffset] -= fy_dB; + pacedj[func_ind+zoffset] -= fz_dB; + } + } else { + for (int iicoeff = 0; iicoeff < ncoeff; iicoeff++) { + + // add to pace array for this proc + // dBi/dRj + DOUBLE_TYPE fx_dB = acecimpl->ace->neighbours_dB(iicoeff,jj,0); + DOUBLE_TYPE fy_dB = acecimpl->ace->neighbours_dB(iicoeff,jj,1); + DOUBLE_TYPE fz_dB = acecimpl->ace->neighbours_dB(iicoeff,jj,2); + pace[bik_rows + ((atom->tag[j]-1)*3*natoms) + 3*(atom->tag[i]-1) + 0][iicoeff+3] -= fx_dB; + pace[bik_rows + ((atom->tag[j]-1)*3*natoms) + 3*(atom->tag[i]-1) + 1][iicoeff+3] -= fy_dB; + pace[bik_rows + ((atom->tag[j]-1)*3*natoms) + 3*(atom->tag[i]-1) + 2][iicoeff+3] -= fz_dB; + + // dBi/dRi + pace[bik_rows + ((atom->tag[i]-1)*3*natoms) + 3*(atom->tag[i]-1) + 0][iicoeff+3] += fx_dB; + pace[bik_rows + ((atom->tag[i]-1)*3*natoms) + 3*(atom->tag[i]-1) + 1][iicoeff+3] += fy_dB; + pace[bik_rows + ((atom->tag[i]-1)*3*natoms) + 3*(atom->tag[i]-1) + 2][iicoeff+3] += fz_dB; + } + } + } // loop over jj inside + if (!dgradflag) { + + int k = typeoffset_global; + + for (int icoeff = 0; icoeff < ncoeff; icoeff++){ + pace[irow][k++] += Bs(icoeff); + } + } else { + int k = 3; + for (int icoeff = 0; icoeff < ncoeff; icoeff++){ + pace[irow][k++] += Bs(icoeff); + } + } + } //group bit + } // for ii loop + // accumulate force contributions to global array + if (!dgradflag){ + for (int itype = 0; itype < atom->ntypes; itype++) { + const int typeoffset_local = ndims_peratom*nvalues*itype; + const int typeoffset_global = nvalues*itype; + for (int icoeff = 0; icoeff < nvalues; icoeff++) { + for (int i = 0; i < ntotal; i++) { + double *pacedi = pace_peratom[i]+typeoffset_local; + int iglobal = atom->tag[i]; + int irow = 3*(iglobal-1)+1; + pace[irow++][icoeff+typeoffset_global] += pacedi[icoeff]; + pace[irow++][icoeff+typeoffset_global] += pacedi[icoeff+yoffset]; + pace[irow][icoeff+typeoffset_global] += pacedi[icoeff+zoffset]; + } + } + } + } + + if (!dgradflag) { + // accumulate forces to global array + for (int i = 0; i < atom->nlocal; i++) { + int iglobal = atom->tag[i]; + int irow = 3*(iglobal-1)+1; + pace[irow++][lastcol] = atom->f[i][0]; + pace[irow++][lastcol] = atom->f[i][1]; + pace[irow][lastcol] = atom->f[i][2]; + } + } else { + + // for dgradflag=1, put forces at first 3 columns of bik rows + + for (int i=0; inlocal; i++) { + int iglobal = atom->tag[i]; + pace[iglobal-1][0+0] = atom->f[i][0]; + pace[iglobal-1][0+1] = atom->f[i][1]; + pace[iglobal-1][0+2] = atom->f[i][2]; + } + } + + dbdotr_compute(); + + // sum up over all processes + MPI_Allreduce(&pace[0][0],&paceall[0][0],size_array_rows*size_array_cols,MPI_DOUBLE,MPI_SUM,world); + + // assign energy to last column + + if (!dgradflag) { + for (int i = 0; i < bik_rows; i++) paceall[i][lastcol] = 0; + int irow = 0; + double reference_energy = c_pe->compute_scalar(); + paceall[irow][lastcol] = reference_energy; + } else { + + // assign reference energy right after the dgrad rows, first column + + int irow = bik_rows + 3*natoms*natoms; + double reference_energy = c_pe->compute_scalar(); + paceall[irow][0] = reference_energy; + } + + // assign virial stress to last column + // switch to Voigt notation + + if (!dgradflag) { + c_virial->compute_vector(); + int irow = 3*natoms+bik_rows; + paceall[irow++][lastcol] = c_virial->vector[0]; + paceall[irow++][lastcol] = c_virial->vector[1]; + paceall[irow++][lastcol] = c_virial->vector[2]; + paceall[irow++][lastcol] = c_virial->vector[5]; + paceall[irow++][lastcol] = c_virial->vector[4]; + paceall[irow++][lastcol] = c_virial->vector[3]; + } +} + +/* ---------------------------------------------------------------------- + compute global virial contributions via summing r_i.dB^j/dr_i over + own & ghost atoms +------------------------------------------------------------------------- */ +void ComputePACE::dbdotr_compute() +{ + + if (dgradflag) return; + + double **x = atom->x; + int irow0 = bik_rows+ndims_force*natoms; + + // sum over ace contributions to forces + // on all particles including ghosts + + int nall = atom->nlocal + atom->nghost; + for (int i = 0; i < nall; i++) + for (int itype = 0; itype < atom->ntypes; itype++) { + const int typeoffset_local = ndims_peratom*nvalues*itype; + const int typeoffset_global = nvalues*itype; + double *pacedi = pace_peratom[i]+typeoffset_local; + for (int icoeff = 0; icoeff < nvalues; icoeff++) { + double dbdx = pacedi[icoeff]; + double dbdy = pacedi[icoeff+yoffset]; + double dbdz = pacedi[icoeff+zoffset]; + int irow = irow0; + pace[irow++][icoeff+typeoffset_global] += dbdx*x[i][0]; + pace[irow++][icoeff+typeoffset_global] += dbdy*x[i][1]; + pace[irow++][icoeff+typeoffset_global] += dbdz*x[i][2]; + pace[irow++][icoeff+typeoffset_global] += dbdz*x[i][1]; + pace[irow++][icoeff+typeoffset_global] += dbdz*x[i][0]; + pace[irow++][icoeff+typeoffset_global] += dbdy*x[i][0]; + } + } +} + +/* ---------------------------------------------------------------------- + memory usage +------------------------------------------------------------------------- */ + +double ComputePACE::memory_usage() +{ + + double bytes = (double)size_array_rows*size_array_cols*sizeof(double); // pace + bytes += (double)size_array_rows*size_array_cols*sizeof(double); // paceall + bytes += (double)nmax*size_peratom * sizeof(double); // pace_peratom + int n = atom->ntypes+1; + bytes += (double)n*sizeof(int); // map + + return bytes; +} diff --git a/src/ML-PACE/compute_pace.h b/src/ML-PACE/compute_pace.h new file mode 100644 index 00000000000..23243b0066c --- /dev/null +++ b/src/ML-PACE/compute_pace.h @@ -0,0 +1,59 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS Development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef COMPUTE_CLASS +// clang-format off +ComputeStyle(pace,ComputePACE); +// clang-format on +#else + +#ifndef LMP_COMPUTE_PACE_H +#define LMP_COMPUTE_PACE_H + +#include "compute.h" + +namespace LAMMPS_NS { + +class ComputePACE : public Compute { + public: + ComputePACE(class LAMMPS *, int, char **); + ~ComputePACE(); + void init(); + void init_list(int, class NeighList *); + void compute_array(); + double memory_usage(); + + private: + int natoms, nmax, size_peratom, lastcol; + int nvalues, yoffset, zoffset; + int ndims_peratom, ndims_force, ndims_virial; + double **cutsq; + class NeighList *list; + double **pace, **paceall; + double **pace_peratom; + int *map; // map types to [0,nelements) + int bikflag, bik_rows, dgradflag, dgrad_rows; + double cutmax; + + Compute *c_pe; + Compute *c_virial; + std::string id_virial; + + void dbdotr_compute(); + struct ACECimpl *acecimpl; +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/ML-PACE/compute_pace_grid.cpp b/src/ML-PACE/compute_pace_grid.cpp new file mode 100644 index 00000000000..17d2eb1acff --- /dev/null +++ b/src/ML-PACE/compute_pace_grid.cpp @@ -0,0 +1,292 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/ Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "compute_pace_grid.h" + +#include "ace-evaluator/ace_c_basis.h" +#include "ace-evaluator/ace_evaluator.h" +#include "ace-evaluator/ace_types.h" + +#include "atom.h" +#include "comm.h" +#include "error.h" +#include "memory.h" +#include "modify.h" +#include "update.h" + +#include + +namespace LAMMPS_NS { +struct ACECGimpl { + ACECGimpl() : basis_set(nullptr), ace(nullptr) {} + ~ACECGimpl() + { + delete basis_set; + delete ace; + } + ACECTildeBasisSet *basis_set; + ACECTildeEvaluator *ace; +}; +} // namespace LAMMPS_NS + +using namespace LAMMPS_NS; + +ComputePACEGrid::ComputePACEGrid(LAMMPS *lmp, int narg, char **arg) : + ComputeGrid(lmp, narg, arg), map(nullptr) +{ + // skip over arguments used by base class + // so that argument positions are identical to + // regular per-atom compute + arg += nargbase; + narg -= nargbase; + + // begin code common to all SNAP computes + + //double rfac0, rmin0; + //int twojmax, switchflag, bzeroflag, bnormflag, wselfallflag; + + int ntypes = atom->ntypes; + int nargmin = 6 + 2 * ntypes; + + //if (narg < nargmin) error->all(FLERR, "Illegal compute {} command", style); + + // default values + + acecgimpl = new ACECGimpl; + + bzeroflag = 1; + nelements = 1; + chunksize = 32768; + parallel_thresh = 8192; + + // process required arguments + + //read in file with CG coefficients or c_tilde coefficients + char * potential_file_name = arg[3]; + //auto potential_file_name = utils::get_potential_file_path(arg[3]); + printf("potential file name (not local): %s \n",potential_file_name); + delete acecgimpl->basis_set; + acecgimpl->basis_set = new ACECTildeBasisSet(potential_file_name); + cutmax = acecgimpl->basis_set->cutoffmax; + nelements = acecgimpl->basis_set->nelements; + + //# of rank 1, rank > 1 functions + //assume ielem 0 (only mu0=0 basis functions for grid ACE) + int ielem = 0; + int n_r1, n_rp = 0; + n_r1 = acecgimpl->basis_set->total_basis_size_rank1[ielem]; + n_rp = acecgimpl->basis_set->total_basis_size[ielem]; + memory->create(map,nelements+1,"pace/grid:map"); + + int ncoeff = n_r1 + n_rp; + // set local input checks + + // process optional args + + int iarg = nargmin; + + nvalues = ncoeff; + + size_array_cols = size_array_cols_base + nvalues; + array_flag = 1; +} + +/* ---------------------------------------------------------------------- */ + +ComputePACEGrid::~ComputePACEGrid() +{ + if (copymode) return; + + delete acecgimpl; + + memory->destroy(map); + if (ggrid_is_allocated) { + memory->destroy(gridneigh); + memory->destroy(gridinside); + memory->destroy(gridtype); + } +} + +/* ---------------------------------------------------------------------- */ + +void ComputePACEGrid::init() +{ + if ((modify->get_compute_by_style("^pace/grid$").size() > 1) && (comm->me == 0)) + error->warning(FLERR, "More than one instance of compute pace/grid"); + +} + +/* ---------------------------------------------------------------------- */ +void ComputePACEGrid::grow_ggrid(int newnmax) +{ + //if (newnmax <= nmax) return; + nmax=newnmax; + if (ggrid_is_allocated) { + memory->destroy(gridneigh); + memory->destroy(gridinside); + memory->destroy(gridtype); + } + memory->create(gridneigh, nmax, 3, "pace/grid:gridneigh"); + memory->create(gridinside, nmax, "pace/grid:gridinside"); + memory->create(gridtype, nmax, "pace/grid:gridtype"); + for (int jz = 0; jz < nmax; jz++){ + gridneigh[jz][0] = 0.00000000; + gridneigh[jz][1] = 0.00000000; + gridneigh[jz][2] = 0.00000000; + gridinside[jz] = 0; + gridtype[jz] = 0; + } + ggrid_is_allocated = 1; +} +/* ---------------------------------------------------------------------- */ + +void ComputePACEGrid::compute_array() +{ + + invoked_array = update->ntimestep; + + // compute pace for each gridpoint + + double **const x = atom->x; + const int *const mask = atom->mask; + int *const type = atom->type; + int ntypes = atom->ntypes; + const int ntotal = atom->nlocal + atom->nghost; + nmax = ntotal + 1; + + grow_ggrid(nmax); + + // loop over grid + for (int iz = nzlo; iz <= nzhi; iz++) + for (int iy = nylo; iy <= nyhi; iy++) + for (int ix = nxlo; ix <= nxhi; ix++) { + double xgrid[3]; + const int igrid = iz * (nx * ny) + iy * nx + ix; + grid2x(igrid, xgrid); + const double xtmp = xgrid[0]; + const double ytmp = xgrid[1]; + const double ztmp = xgrid[2]; + + // currently, all grid points are type 1 + // - later we may want to set up lammps_user_pace interface such that the + // real atom types begin at 2 and reserve type 1 specifically for the + // grid entries. This will allow us to only evaluate ACE for atoms around + // a grid point, but with no contributions from other grid points + + const int itype = 1; + int ielem = 0; + delete acecgimpl->ace; + acecgimpl->ace = new ACECTildeEvaluator(*acecgimpl->basis_set); + acecgimpl->ace->compute_projections = true; + acecgimpl->ace->compute_b_grad = false; + + // leave these here b/c in the future, we may be able to allow + // for different #s of descriptors per atom or grid type + int n_r1, n_rp = 0; + n_r1 = acecgimpl->basis_set->total_basis_size_rank1[ielem]; + n_rp = acecgimpl->basis_set->total_basis_size[ielem]; + int ncoeff = n_r1 + n_rp; + + //ACE element mapping + acecgimpl->ace->element_type_mapping.init(nelements+1); + for (int imu=0; imu <= nelements; imu++){ + acecgimpl->ace->element_type_mapping(imu) = 0; + } + for (int ik = 1; ik <= nelements+1; ik++) { + for(int mu = 0; mu < nelements; mu++){ + if (mu != -1) { + if (mu == ik - 1) { + map[ik] = mu; + acecgimpl->ace->element_type_mapping(ik) = mu; + } + } + } + } + + // rij[][3] = displacements between atom I and those neighbors + // inside = indices of neighbors of I within cutoff + // typej = types of neighbors of I within cutoff + + // build short neighbor list + // add in grid position and indices manually at end of short neighbor list + + grow_ggrid(nmax); + + int ninside = 0; + for (int j = 0; j < ntotal; j++) { + if (!(mask[j] & groupbit)) continue; + const double delx = xtmp - x[j][0]; + const double dely = ytmp - x[j][1]; + const double delz = ztmp - x[j][2]; + const double rsq = delx * delx + dely * dely + delz * delz; + const double rnorm = sqrt(rsq); + int jtype = type[j]; + int jelem = map[jtype]; + double thiscut = acecgimpl->basis_set->radial_functions->cut(ielem,jelem); + if (rnorm < (thiscut) && rnorm > 1.e-20) { + gridneigh[ninside][0] = x[j][0]; + gridneigh[ninside][1] = x[j][1]; + gridneigh[ninside][2] = x[j][2]; + gridinside[ninside] = ninside; + gridtype[ninside] = jtype; + ninside++; + } + } + //add in grid site at final index + gridinside[ninside]=ninside; + gridneigh[ninside][0] = xtmp; + gridneigh[ninside][1] = ytmp; + gridneigh[ninside][2] = ztmp; + gridtype[ninside]=itype; + + // perform ACE evaluation with short neighbor list + acecgimpl->ace->resize_neighbours_cache(ninside); + acecgimpl->ace->compute_atom(ninside, gridneigh, gridtype, ninside, gridinside); + Array1D Bs = acecgimpl->ace->projections; + for (int icoeff = 0; icoeff < ncoeff; icoeff++){ + gridlocal[size_array_cols_base + icoeff][iz][iy][ix] = Bs(icoeff); + } + + } + + memset(&grid[0][0], 0, sizeof(double) * size_array_rows * size_array_cols); + + for (int iz = nzlo; iz <= nzhi; iz++) + for (int iy = nylo; iy <= nyhi; iy++) + for (int ix = nxlo; ix <= nxhi; ix++) { + const int igrid = iz * (nx * ny) + iy * nx + ix; + for (int j = 0; j < nvalues; j++) + grid[igrid][size_array_cols_base + j] = gridlocal[size_array_cols_base + j][iz][iy][ix]; + } + MPI_Allreduce(&grid[0][0], &gridall[0][0], size_array_rows * size_array_cols, MPI_DOUBLE, MPI_SUM, + world); + assign_coords_all(); +} + +/* ---------------------------------------------------------------------- + memory usage +------------------------------------------------------------------------- */ + +double ComputePACEGrid::memory_usage() +{ + double nbytes = (double) size_array_rows * size_array_cols * sizeof(double); // grid + nbytes += (double) size_array_rows * size_array_cols * sizeof(double); // gridall + nbytes += (double) size_array_cols * ngridlocal * sizeof(double); // gridlocal + nbytes += (double)nmax * 3 * sizeof(double); // gridneigh + nbytes += (double)nmax * sizeof(int); // gridinside + nbytes += (double)nmax * sizeof(int); // gridtype + int n = atom->ntypes + 1; + nbytes += (double) n * sizeof(int); // map + + return nbytes; +} diff --git a/src/ML-PACE/compute_pace_grid.h b/src/ML-PACE/compute_pace_grid.h new file mode 100644 index 00000000000..54add643fc5 --- /dev/null +++ b/src/ML-PACE/compute_pace_grid.h @@ -0,0 +1,57 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/ Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef COMPUTE_CLASS +// clang-format off +ComputeStyle(pace/grid,ComputePACEGrid); +// clang-format on +#else + +#ifndef LMP_COMPUTE_PACE_GRID_H +#define LMP_COMPUTE_PACE_GRID_H + +#include "compute_grid.h" + +namespace LAMMPS_NS { + +class ComputePACEGrid : public ComputeGrid { + public: + ComputePACEGrid(class LAMMPS *, int, char **); + ~ComputePACEGrid() override; + void init() override; + void compute_array() override; + double memory_usage() override; + void grow_ggrid(int); + int nmax=0; + int ggrid_is_allocated=0; + int ntypes; + int ncoeff,nelements; // public for kokkos, but could go in the protected block now + + protected: + //int ncoeff; + double ** gridneigh; + int *gridinside; + int *gridtype; + int *map; // map types to [0,nelements) + int parallel_thresh; + double cutmax; + int bzeroflag; + int chunksize; + + struct ACECGimpl *acecgimpl; +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/ML-PACE/compute_pace_grid_local.cpp b/src/ML-PACE/compute_pace_grid_local.cpp new file mode 100644 index 00000000000..22bca259f0b --- /dev/null +++ b/src/ML-PACE/compute_pace_grid_local.cpp @@ -0,0 +1,290 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/ Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "compute_pace_grid_local.h" + +#include "ace-evaluator/ace_c_basis.h" +#include "ace-evaluator/ace_evaluator.h" +#include "ace-evaluator/ace_types.h" + +#include "atom.h" +#include "comm.h" +#include "error.h" +#include "memory.h" +#include "modify.h" +#include "update.h" + +#include +#include + +namespace LAMMPS_NS { +struct ACECLimpl { + ACECLimpl() : basis_set(nullptr), ace(nullptr) {} + ~ACECLimpl() + { + delete basis_set; + delete ace; + } + ACECTildeBasisSet *basis_set; + ACECTildeEvaluator *ace; +}; +} // namespace LAMMPS_NS + +using namespace LAMMPS_NS; + +ComputePACEGridLocal::ComputePACEGridLocal(LAMMPS *lmp, int narg, char **arg) : + ComputeGridLocal(lmp, narg, arg), map(nullptr) +{ + // skip over arguments used by base class + // so that argument positions are identical to + // regular per-atom compute + arg += nargbase; + narg -= nargbase; + + + int ntypes = atom->ntypes; + int nargmin = 6 + 2 * ntypes; + + //if (narg < nargmin) error->all(FLERR, "Illegal compute {} command", style); + + + aceclimpl = new ACECLimpl; + + bzeroflag = 1; + nelements = 1; + chunksize = 32768; + parallel_thresh = 8192; + + + //read in file with CG coefficients or c_tilde coefficients + + //auto potential_file_name = utils::get_potential_file_path(arg[3]); + char * potential_file_name = arg[3]; + delete aceclimpl->basis_set; + aceclimpl->basis_set = new ACECTildeBasisSet(potential_file_name); + cutmax = aceclimpl->basis_set->cutoffmax; + nelements = aceclimpl->basis_set->nelements; + memory->create(map,nelements+1,"pace/grid/local:map"); + for (int ielemi = 0; ielemi <= nelements; ielemi++){ + map[ielemi]=0; + } + + //# of rank 1, rank > 1 functions + + int n_r1, n_rp = 0; + n_r1 = aceclimpl->basis_set->total_basis_size_rank1[0]; + n_rp = aceclimpl->basis_set->total_basis_size[0]; + + int ncoeff = n_r1 + n_rp; + + int iarg = nargmin; + + nvalues = ncoeff; + + size_local_cols = size_local_cols_base + nvalues; +} + + +/* ---------------------------------------------------------------------- */ + +ComputePACEGridLocal::~ComputePACEGridLocal() +{ + if (copymode) return; + + delete aceclimpl; + + memory->destroy(map); + if (grid_is_allocated) { + memory->destroy(gridneigh); + memory->destroy(gridinside); + memory->destroy(gridtype); + } +} + +/* ---------------------------------------------------------------------- */ + +void ComputePACEGridLocal::init() +{ + if ((modify->get_compute_by_style("^pace/grid/local$").size() > 1) && (comm->me == 0)) + error->warning(FLERR, "More than one instance of compute pace/grid/local"); + +} + +/* ---------------------------------------------------------------------- */ + +void ComputePACEGridLocal::grow_grid(int newnmax) +{ + //if (newnmax <= nmax) return; + nmax=newnmax; + if (grid_is_allocated) { + memory->destroy(gridneigh); + memory->destroy(gridinside); + memory->destroy(gridtype); + } + memory->create(gridneigh, nmax, 3, "pace/grid/local:gridneigh"); + memory->create(gridinside, nmax, "pace/grid/local:gridinside"); + memory->create(gridtype, nmax, "pace/grid/local:gridtype"); + for (int jz = 0; jz < nmax; jz++){ + gridneigh[jz][0] = 0.00000000; + gridneigh[jz][1] = 0.00000000; + gridneigh[jz][2] = 0.00000000; + gridinside[jz] = 0; + gridtype[jz] = 0; + } + grid_is_allocated = 1; +} +/* ---------------------------------------------------------------------- */ + +void ComputePACEGridLocal::compute_local() +{ + + invoked_local = update->ntimestep; + + // compute pace for each gridpoint + + double **const x = atom->x; + const int *const mask = atom->mask; + int *const type = atom->type; + ntypes = atom->ntypes; + const int ntotal = atom->nlocal + atom->nghost; + + // grow grid arrays to match possible # of grid neighbors (analogous to jnum) + nmax = ntotal + 1; + grow_grid(nmax); + + //for (int jzj = 0; jzj < nmax; jzj++){ + // gridneigh[jzj][0] = 0.0; + // gridneigh[jzj][1] = 0.0; + // gridneigh[jzj][2] = 0.0; + //} + + int igrid = 0; + for (int iz = nzlo; iz <= nzhi; iz++) + for (int iy = nylo; iy <= nyhi; iy++) + for (int ix = nxlo; ix <= nxhi; ix++) { + double xgrid[3]; + grid2x(ix, iy, iz, xgrid); + const double xtmp = xgrid[0]; + const double ytmp = xgrid[1]; + const double ztmp = xgrid[2]; + + // currently, all grid points are type 1 + // - later we may want to set up lammps_user_pace interface such that the + // real atom types begin at 2 and reserve type 1 specifically for the + // grid entries. This will allow us to only evaluate ACE for atoms around + // a grid point, but with no contributions from other grid points + + const int itype = 1; + const int ielem = 0; + delete aceclimpl->ace; + aceclimpl->ace = new ACECTildeEvaluator(*aceclimpl->basis_set); + aceclimpl->ace->compute_projections = true; + aceclimpl->ace->compute_b_grad = false; + + // leave these here b/c in the future, we may be able to allow + // for different #s of descriptors per atom or grid type + int n_r1, n_rp = 0; + n_r1 = aceclimpl->basis_set->total_basis_size_rank1[ielem]; + n_rp = aceclimpl->basis_set->total_basis_size[ielem]; + int ncoeff = n_r1 + n_rp; + + //ACE element mapping + aceclimpl->ace->element_type_mapping.init(nelements+1); + for (int imu=0; imu <= nelements; imu++){ + aceclimpl->ace->element_type_mapping(imu) = 0; + } + for (int ik = 1; ik <= nelements+1; ik++) { + for(int mu = 0; mu < nelements; mu++){ + if (mu != -1) { + if (mu == ik - 1) { + map[ik] = mu; + aceclimpl->ace->element_type_mapping(ik) = mu; + } + } + } + } + + // rij[][3] = displacements between atom I and those neighbors + // inside = indices of neighbors of I within cutoff + // typej = types of neighbors of I within cutoff + + // build short neighbor list + // add in grid position and indices manually at end of short neighbor list + + grow_grid(nmax); + ninside = 0; + for (int j = 0; j < ntotal; j++) { + if (!(mask[j] & groupbit)) continue; + const double delx = xtmp - x[j][0]; + const double dely = ytmp - x[j][1]; + const double delz = ztmp - x[j][2]; + const double rsq = delx * delx + dely * dely + delz * delz; + const double rxtmp = x[j][0]; + const double rytmp = x[j][1]; + const double rztmp = x[j][2]; + const double rsqx = pow(rxtmp,2) + pow(rytmp,2) + pow(rztmp,2); + int jtype = type[j]; + int jelem = map[jtype]; + double thiscut = aceclimpl->basis_set->radial_functions->cut(ielem,jelem); + const double rnorm = sqrt(rsq); + const double rnormx = sqrt(rsqx); + if (rnorm < (thiscut) && rnorm > 1.e-20) { + gridneigh[ninside][0] = x[j][0]; + gridneigh[ninside][1] = x[j][1]; + gridneigh[ninside][2] = x[j][2]; + gridinside[ninside] = ninside; + gridtype[ninside] = jtype; + ninside++; + } + } + //add in grid site at final index + int ninsidegrid = ninside+1; + int copy_igrid = igrid; + const int baseind = 0; + + gridinside[ninside]=ninside; + gridneigh[ninside][0] = xtmp; + gridneigh[ninside][1] = ytmp; + gridneigh[ninside][2] = ztmp; + gridtype[ninside]=itype; + + // perform ACE evaluation with short neighbor list + aceclimpl->ace->resize_neighbours_cache(ninside); + aceclimpl->ace->compute_atom(ninside, gridneigh, gridtype, ninside, gridinside); + Array1D Bs = aceclimpl->ace->projections; + for (int icoeff = 0; icoeff < ncoeff; icoeff++){ + alocal[igrid][size_local_cols_base + icoeff] = Bs(icoeff); + } + igrid++; + + } +} + +/* ---------------------------------------------------------------------- + memory usage +------------------------------------------------------------------------- */ + +double ComputePACEGridLocal::memory_usage() +{ + //double nbytes = (double) size_array_rows * size_array_cols * sizeof(double); // grid + //nbytes += (double) size_array_rows * size_array_cols * sizeof(double); // gridall + //nbytes += (double) size_array_cols * ngridlocal * sizeof(double); // gridlocal + int n = atom->ntypes + 1; + double nbytes = (double) n * sizeof(int); // map + nbytes += (double)nmax * 3 * sizeof(double); // gridneigh + nbytes += (double)nmax * sizeof(int); // gridinside + nbytes += (double)nmax * sizeof(int); // gridtype + + + return nbytes; +} diff --git a/src/ML-PACE/compute_pace_grid_local.h b/src/ML-PACE/compute_pace_grid_local.h new file mode 100644 index 00000000000..8a3cb4b3eeb --- /dev/null +++ b/src/ML-PACE/compute_pace_grid_local.h @@ -0,0 +1,59 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/ Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef COMPUTE_CLASS +// clang-format off +ComputeStyle(pace/grid/local,ComputePACEGridLocal); +// clang-format on +#else + +#ifndef LMP_COMPUTE_PACE_GRID_LOCAL_H +#define LMP_COMPUTE_PACE_GRID_LOCAL_H + +#include "compute_grid_local.h" + +namespace LAMMPS_NS { + +class ComputePACEGridLocal : public ComputeGridLocal { + public: + ComputePACEGridLocal(class LAMMPS *, int, char **); + ~ComputePACEGridLocal() override; + void init() override; + void compute_local() override; + double memory_usage() override; + void grow_grid(int); + int ntypes; + int nelements; + int nmax=0; + int ninside=0; + int grid_is_allocated = 0; + int ncoeff; // public for kokkos, but could go in the protected block now + + protected: + //int ncoeff; + double ** gridneigh; + int *gridinside; + int *gridtype; + int *map; // map types to [0,nelements) + int parallel_thresh; + double cutmax; + int bzeroflag; + int chunksize; + + struct ACECLimpl *aceclimpl; +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/ML-PACE/pair_pace.cpp b/src/ML-PACE/pair_pace.cpp index 57f12597d19..e9bd25f9d7d 100644 --- a/src/ML-PACE/pair_pace.cpp +++ b/src/ML-PACE/pair_pace.cpp @@ -45,6 +45,7 @@ Copyright 2021 Yury Lysogorskiy^1, Cas van der Oord^2, Anton Bochkarev^1, #include "ace-evaluator/ace_evaluator.h" #include "ace-evaluator/ace_recursive.h" #include "ace-evaluator/ace_version.h" +#include "ace/ace_b_basis.h" namespace LAMMPS_NS { struct ACEImpl { @@ -87,6 +88,10 @@ PairPACE::PairPACE(LAMMPS *lmp) : Pair(lmp) one_coeff = 1; manybody_flag = 1; + nmax_corerep = 0; + flag_corerep_factor = 0; + corerep_factor = nullptr; + aceimpl = new ACEImpl; recursive = false; @@ -109,6 +114,7 @@ PairPACE::~PairPACE() memory->destroy(setflag); memory->destroy(cutsq); memory->destroy(scale); + memory->destroy(corerep_factor); } } @@ -143,10 +149,18 @@ void PairPACE::compute(int eflag, int vflag) // the pointer to the list of neighbors of "i" firstneigh = list->firstneigh; + if (flag_corerep_factor && atom->nlocal > nmax_corerep) { + memory->destroy(corerep_factor); + nmax_corerep = atom->nlocal; + memory->create(corerep_factor, nmax_corerep, "pace/atom:corerep_factor"); + //zeroify array + memset(corerep_factor, 0, nmax_corerep * sizeof(*corerep_factor)); + } + //determine the maximum number of neighbours int max_jnum = 0; int nei = 0; - for (ii = 0; ii < list->inum; ii++) { + for (ii = 0; ii < inum; ii++) { i = ilist[ii]; jnum = numneigh[i]; nei = nei + jnum; @@ -156,7 +170,7 @@ void PairPACE::compute(int eflag, int vflag) aceimpl->ace->resize_neighbours_cache(max_jnum); //loop over atoms - for (ii = 0; ii < list->inum; ii++) { + for (ii = 0; ii < inum; ii++) { i = list->ilist[ii]; const int itype = type[i]; @@ -181,6 +195,9 @@ void PairPACE::compute(int eflag, int vflag) error->one(FLERR, e.what()); } + if (flag_corerep_factor) + corerep_factor[i] = 1 - aceimpl->ace->ace_fcut; + // 'compute_atom' will update the `aceimpl->ace->e_atom` and `aceimpl->ace->neighbours_forces(jj, alpha)` arrays for (jj = 0; jj < jnum; jj++) { @@ -287,7 +304,14 @@ void PairPACE::coeff(int narg, char **arg) //load potential file delete aceimpl->basis_set; if (comm->me == 0) utils::logmesg(lmp, "Loading {}\n", potential_file_name); - aceimpl->basis_set = new ACECTildeBasisSet(potential_file_name); + // if potential is in ACEBBasisSet (YAML) format, then convert to ACECTildeBasisSet automatically + if (utils::strmatch(potential_file_name,".*\\.yaml$")) { + ACEBBasisSet bBasisSet = ACEBBasisSet(potential_file_name); + ACECTildeBasisSet cTildeBasisSet = bBasisSet.to_ACECTildeBasisSet(); + aceimpl->basis_set = new ACECTildeBasisSet(cTildeBasisSet); + } else { + aceimpl->basis_set = new ACECTildeBasisSet(potential_file_name); + } if (comm->me == 0) { utils::logmesg(lmp, "Total number of basis functions\n"); @@ -374,7 +398,29 @@ double PairPACE::init_one(int i, int j) ---------------------------------------------------------------------- */ void *PairPACE::extract(const char *str, int &dim) { + dim = 0; + //check if str=="corerep_flag" then compute extrapolation grades on this iteration + if (strcmp(str, "corerep_flag") == 0) return (void *) &flag_corerep_factor; + dim = 2; if (strcmp(str, "scale") == 0) return (void *) scale; return nullptr; } + +/* ---------------------------------------------------------------------- + peratom requests from FixPair + return ptr to requested data + also return ncol = # of quantites per atom + 0 = per-atom vector + 1 or more = # of columns in per-atom array + return NULL if str is not recognized +---------------------------------------------------------------------- */ +void *PairPACE::extract_peratom(const char *str, int &ncol) +{ + if (strcmp(str, "corerep") == 0) { + ncol = 0; + return (void *) corerep_factor; + } + + return nullptr; +} diff --git a/src/ML-PACE/pair_pace.h b/src/ML-PACE/pair_pace.h index 94649ecaab1..9b5d2c54806 100644 --- a/src/ML-PACE/pair_pace.h +++ b/src/ML-PACE/pair_pace.h @@ -48,11 +48,15 @@ class PairPACE : public Pair { double init_one(int, int) override; void *extract(const char *, int &) override; + void *extract_peratom(const char *, int &) override; protected: struct ACEImpl *aceimpl; + int nmax_corerep = 0; virtual void allocate(); + double *corerep_factor; //per-atom core-rep factor (= 1 - fcut) + int flag_corerep_factor; double **scale; bool recursive; // "recursive" option for ACERecursiveEvaluator diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 8a0116526a3..ec42d232af0 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -29,15 +29,12 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau #include "force.h" #include "math_const.h" #include "memory.h" -#include "modify.h" #include "neigh_list.h" -#include "neigh_request.h" #include "neighbor.h" #include "update.h" -#include -#include #include +#include #include "ace/ace_b_basis.h" #include "ace/ace_b_evaluator.h" @@ -93,11 +90,14 @@ PairPACEExtrapolation::PairPACEExtrapolation(LAMMPS *lmp) : Pair(lmp) manybody_flag = 1; nmax = 0; + nmax_corerep = 0; aceimpl = new ACEALImpl; scale = nullptr; flag_compute_extrapolation_grade = 0; extrapolation_grade_gamma = nullptr; + flag_corerep_factor = 0; + corerep_factor = nullptr; chunksize = 4096; } @@ -118,6 +118,7 @@ PairPACEExtrapolation::~PairPACEExtrapolation() memory->destroy(scale); memory->destroy(map); memory->destroy(extrapolation_grade_gamma); + memory->destroy(corerep_factor); } } @@ -166,11 +167,18 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) //zeroify array memset(extrapolation_grade_gamma, 0, nmax * sizeof(*extrapolation_grade_gamma)); } + if (flag_corerep_factor && atom->nlocal > nmax_corerep) { + memory->destroy(corerep_factor); + nmax_corerep = atom->nlocal; + memory->create(corerep_factor, nmax_corerep, "pace/atom:corerep_factor"); + //zeroify array + memset(corerep_factor, 0, nmax_corerep * sizeof(*corerep_factor)); + } //determine the maximum number of neighbours int max_jnum = 0; int nei = 0; - for (ii = 0; ii < list->inum; ii++) { + for (ii = 0; ii < inum; ii++) { i = ilist[ii]; jnum = numneigh[i]; nei = nei + jnum; @@ -183,7 +191,7 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) aceimpl->rec_ace->resize_neighbours_cache(max_jnum); //loop over atoms - for (ii = 0; ii < list->inum; ii++) { + for (ii = 0; ii < inum; ii++) { i = list->ilist[ii]; const int itype = type[i]; @@ -202,8 +210,10 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) // jnum(0) = 50 // jlist(neigh ind of 0-atom) = [1,2,10,7,99,25, .. 50 element in total] try { - if (flag_compute_extrapolation_grade) + if (flag_compute_extrapolation_grade) { + aceimpl->ace->compute_projections = true; aceimpl->ace->compute_atom(i, x, type, jnum, jlist); + } else aceimpl->rec_ace->compute_atom(i, x, type, jnum, jlist); } catch (std::exception &e) { @@ -214,6 +224,11 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) if (flag_compute_extrapolation_grade) extrapolation_grade_gamma[i] = aceimpl->ace->max_gamma_grade; + if (flag_corerep_factor) { + corerep_factor[i] = 1 - (flag_compute_extrapolation_grade ? aceimpl->ace->ace_fcut + : aceimpl->rec_ace->ace_fcut); + } + Array2D &neighbours_forces = (flag_compute_extrapolation_grade ? aceimpl->ace->neighbours_forces : aceimpl->rec_ace->neighbours_forces); @@ -435,9 +450,11 @@ double PairPACEExtrapolation::init_one(int i, int j) ---------------------------------------------------------------------- */ void *PairPACEExtrapolation::extract(const char *str, int &dim) { - //check if str=="gamma_flag" then compute extrapolation grades on this iteration dim = 0; + //check if str=="gamma_flag" then compute extrapolation grades on this iteration if (strcmp(str, "gamma_flag") == 0) return (void *) &flag_compute_extrapolation_grade; + //check if str=="corerep_flag" then compute extrapolation grades on this iteration + if (strcmp(str, "corerep_flag") == 0) return (void *) &flag_corerep_factor; dim = 2; if (strcmp(str, "scale") == 0) return (void *) scale; @@ -459,5 +476,10 @@ void *PairPACEExtrapolation::extract_peratom(const char *str, int &ncol) return (void *) extrapolation_grade_gamma; } + if (strcmp(str, "corerep") == 0) { + ncol = 0; + return (void *) corerep_factor; + } + return nullptr; } diff --git a/src/ML-PACE/pair_pace_extrapolation.h b/src/ML-PACE/pair_pace_extrapolation.h index 6f7eeb279eb..440d999029e 100644 --- a/src/ML-PACE/pair_pace_extrapolation.h +++ b/src/ML-PACE/pair_pace_extrapolation.h @@ -28,7 +28,6 @@ PairStyle(pace/extrapolation,PairPACEExtrapolation) #define LMP_PAIR_PACE_AL_H #include "pair.h" -#include namespace LAMMPS_NS { @@ -47,13 +46,15 @@ class PairPACEExtrapolation : public Pair { protected: struct ACEALImpl *aceimpl; - int nmax; + int nmax = 0, nmax_corerep = 0; virtual void allocate(); std::vector element_names; // list of elements (used by dump pace/extrapolation) - double *extrapolation_grade_gamma; //per-atom gamma value + double *extrapolation_grade_gamma = nullptr; //per-atom gamma value + double *corerep_factor = nullptr; //per-atom core-rep factor (= 1 - fcut) - int flag_compute_extrapolation_grade; + int flag_compute_extrapolation_grade = 0; + int flag_corerep_factor = 0; double **scale; From c4701d06fde706c63faf47f52d689213a9eb53b9 Mon Sep 17 00:00:00 2001 From: James Michael Goff Date: Thu, 23 May 2024 08:47:24 -0600 Subject: [PATCH 02/12] unique chemical basis for grid centers added for flexibility --- examples/snap/in.grid.ace | 5 ++-- src/ML-PACE/compute_pace_grid.cpp | 23 ++++++++++++++---- src/ML-PACE/compute_pace_grid.h | 1 + src/ML-PACE/compute_pace_grid_local.cpp | 32 ++++++++++++++++++------- src/ML-PACE/compute_pace_grid_local.h | 1 + 5 files changed, 47 insertions(+), 15 deletions(-) diff --git a/examples/snap/in.grid.ace b/examples/snap/in.grid.ace index ec920ef95e4..85d2fd47e76 100644 --- a/examples/snap/in.grid.ace +++ b/examples/snap/in.grid.ace @@ -51,8 +51,9 @@ pair_coeff * * # define atom and grid computes compute bace all pace ${ace_options} 1 0 -compute mygrid all pace/grid grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} -compute mygridlocal all pace/grid/local grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} +#compute mygrid all pace/grid grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} +compute mygrid all pace/grid grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} ugridtype 0 +compute mygridlocal all pace/grid/local grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} ugridtype 0 fix bace all ave/time 1 1 1 c_bace[*] file desc_out.dat mode vector #compute mygrid all pace/grid grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} #compute mygridlocal all pace/grid/local grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} diff --git a/src/ML-PACE/compute_pace_grid.cpp b/src/ML-PACE/compute_pace_grid.cpp index 17d2eb1acff..f8832971edf 100644 --- a/src/ML-PACE/compute_pace_grid.cpp +++ b/src/ML-PACE/compute_pace_grid.cpp @@ -56,7 +56,7 @@ ComputePACEGrid::ComputePACEGrid(LAMMPS *lmp, int narg, char **arg) : //int twojmax, switchflag, bzeroflag, bnormflag, wselfallflag; int ntypes = atom->ntypes; - int nargmin = 6 + 2 * ntypes; + int nargmin = 4; //6 + 2 * ntypes; //if (narg < nargmin) error->all(FLERR, "Illegal compute {} command", style); @@ -70,11 +70,21 @@ ComputePACEGrid::ComputePACEGrid(LAMMPS *lmp, int narg, char **arg) : parallel_thresh = 8192; // process required arguments + gridtypeflag = 1; //read in file with CG coefficients or c_tilde coefficients char * potential_file_name = arg[3]; + int iarg = nargmin; + + while (iarg < narg) { + if (strcmp(arg[iarg], "ugridtype") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal compute {} command", style); + gridtypeflag = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); + iarg += 2; + } + } + //auto potential_file_name = utils::get_potential_file_path(arg[3]); - printf("potential file name (not local): %s \n",potential_file_name); delete acecgimpl->basis_set; acecgimpl->basis_set = new ACECTildeBasisSet(potential_file_name); cutmax = acecgimpl->basis_set->cutoffmax; @@ -83,6 +93,9 @@ ComputePACEGrid::ComputePACEGrid(LAMMPS *lmp, int narg, char **arg) : //# of rank 1, rank > 1 functions //assume ielem 0 (only mu0=0 basis functions for grid ACE) int ielem = 0; + if (gridtypeflag){ + ielem = nelements-1; + } int n_r1, n_rp = 0; n_r1 = acecgimpl->basis_set->total_basis_size_rank1[ielem]; n_rp = acecgimpl->basis_set->total_basis_size[ielem]; @@ -93,7 +106,6 @@ ComputePACEGrid::ComputePACEGrid(LAMMPS *lmp, int narg, char **arg) : // process optional args - int iarg = nargmin; nvalues = ncoeff; @@ -183,8 +195,11 @@ void ComputePACEGrid::compute_array() // grid entries. This will allow us to only evaluate ACE for atoms around // a grid point, but with no contributions from other grid points - const int itype = 1; int ielem = 0; + if (gridtypeflag){ + ielem = nelements-1; + } + const int itype = ielem+1; delete acecgimpl->ace; acecgimpl->ace = new ACECTildeEvaluator(*acecgimpl->basis_set); acecgimpl->ace->compute_projections = true; diff --git a/src/ML-PACE/compute_pace_grid.h b/src/ML-PACE/compute_pace_grid.h index 54add643fc5..d4d9b940737 100644 --- a/src/ML-PACE/compute_pace_grid.h +++ b/src/ML-PACE/compute_pace_grid.h @@ -35,6 +35,7 @@ class ComputePACEGrid : public ComputeGrid { int nmax=0; int ggrid_is_allocated=0; int ntypes; + int gridtypeflag; int ncoeff,nelements; // public for kokkos, but could go in the protected block now protected: diff --git a/src/ML-PACE/compute_pace_grid_local.cpp b/src/ML-PACE/compute_pace_grid_local.cpp index 22bca259f0b..a53023b86b7 100644 --- a/src/ML-PACE/compute_pace_grid_local.cpp +++ b/src/ML-PACE/compute_pace_grid_local.cpp @@ -67,9 +67,20 @@ ComputePACEGridLocal::ComputePACEGridLocal(LAMMPS *lmp, int narg, char **arg) : //read in file with CG coefficients or c_tilde coefficients + gridtypeflagl = 1; - //auto potential_file_name = utils::get_potential_file_path(arg[3]); + //read in file with CG coefficients or c_tilde coefficients char * potential_file_name = arg[3]; + int iarg = nargmin; + + while (iarg < narg) { + if (strcmp(arg[iarg], "ugridtype") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal compute {} command", style); + gridtypeflagl = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); + iarg += 2; + } + } + //auto potential_file_name = utils::get_potential_file_path(arg[3]); delete aceclimpl->basis_set; aceclimpl->basis_set = new ACECTildeBasisSet(potential_file_name); cutmax = aceclimpl->basis_set->cutoffmax; @@ -80,15 +91,16 @@ ComputePACEGridLocal::ComputePACEGridLocal(LAMMPS *lmp, int narg, char **arg) : } //# of rank 1, rank > 1 functions - + int ielem = 0; + if (gridtypeflagl){ + ielem = nelements-1; + } int n_r1, n_rp = 0; - n_r1 = aceclimpl->basis_set->total_basis_size_rank1[0]; - n_rp = aceclimpl->basis_set->total_basis_size[0]; + n_r1 = aceclimpl->basis_set->total_basis_size_rank1[ielem]; + n_rp = aceclimpl->basis_set->total_basis_size[ielem]; int ncoeff = n_r1 + n_rp; - int iarg = nargmin; - nvalues = ncoeff; size_local_cols = size_local_cols_base + nvalues; @@ -183,9 +195,11 @@ void ComputePACEGridLocal::compute_local() // real atom types begin at 2 and reserve type 1 specifically for the // grid entries. This will allow us to only evaluate ACE for atoms around // a grid point, but with no contributions from other grid points - - const int itype = 1; - const int ielem = 0; + int ielem = 0; + if (gridtypeflagl){ + ielem = nelements-1; + } + const int itype = ielem+1; delete aceclimpl->ace; aceclimpl->ace = new ACECTildeEvaluator(*aceclimpl->basis_set); aceclimpl->ace->compute_projections = true; diff --git a/src/ML-PACE/compute_pace_grid_local.h b/src/ML-PACE/compute_pace_grid_local.h index 8a3cb4b3eeb..f5e0558b413 100644 --- a/src/ML-PACE/compute_pace_grid_local.h +++ b/src/ML-PACE/compute_pace_grid_local.h @@ -37,6 +37,7 @@ class ComputePACEGridLocal : public ComputeGridLocal { int nmax=0; int ninside=0; int grid_is_allocated = 0; + int gridtypeflagl; int ncoeff; // public for kokkos, but could go in the protected block now protected: From 67ab67281fb350c24ad01041d48bfd3e3b273bbc Mon Sep 17 00:00:00 2001 From: James Michael Goff Date: Fri, 24 May 2024 10:33:37 -0600 Subject: [PATCH 03/12] updated ACE grid examples for grid-adapted basis --- examples/snap/coupling_coefficients_grid.yace | 183 ++++++++++++++++++ examples/snap/in.grid.ace | 3 - examples/snap/in.grid.ace.constrained | 74 +++++++ .../log.24May24.grid.ace.constrained.g++.1 | 65 +++++++ .../log.24May24.grid.ace.constrained.g++.4 | 66 +++++++ 5 files changed, 388 insertions(+), 3 deletions(-) create mode 100644 examples/snap/coupling_coefficients_grid.yace create mode 100644 examples/snap/in.grid.ace.constrained create mode 100644 examples/snap/log.24May24.grid.ace.constrained.g++.1 create mode 100644 examples/snap/log.24May24.grid.ace.constrained.g++.4 diff --git a/examples/snap/coupling_coefficients_grid.yace b/examples/snap/coupling_coefficients_grid.yace new file mode 100644 index 00000000000..e878e962375 --- /dev/null +++ b/examples/snap/coupling_coefficients_grid.yace @@ -0,0 +1,183 @@ +elements: [Cl, Na, G] +E0: [0.000000, 0.000000, 0.000000] +deltaSplineBins: 0.001000 +embeddings: + 0: {ndensity: 1, FS_parameters: [1.0, 1.0], npoti: FinnisSinclair, rho_core_cutoff: 100000, drho_core_cutoff: 250} + 1: {ndensity: 1, FS_parameters: [1.0, 1.0], npoti: FinnisSinclair, rho_core_cutoff: 100000, drho_core_cutoff: 250} + 2: {ndensity: 1, FS_parameters: [1.0, 1.0], npoti: FinnisSinclair, rho_core_cutoff: 100000, drho_core_cutoff: 250} +bonds: + [0, 0]: {nradmax: 6, lmax: 2, nradbasemax: 6, radbasename: ChebExpCos, radparameters: [0.238], radcoefficients: [[[1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0]], [[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.238, rcut: 4.75, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [0, 1]: {nradmax: 6, lmax: 2, nradbasemax: 6, radbasename: ChebExpCos, radparameters: [0.28], radcoefficients: [[[1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0]], [[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.28, rcut: 5.6, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [0, 2]: {nradmax: 6, lmax: 2, nradbasemax: 6, radbasename: ChebExpCos, radparameters: [0.262], radcoefficients: [[[1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0]], [[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.262, rcut: 5.23, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [1, 0]: {nradmax: 6, lmax: 2, nradbasemax: 6, radbasename: ChebExpCos, radparameters: [0.28], radcoefficients: [[[1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0]], [[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.28, rcut: 5.6, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [1, 1]: {nradmax: 6, lmax: 2, nradbasemax: 6, radbasename: ChebExpCos, radparameters: [0.306], radcoefficients: [[[1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0]], [[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.306, rcut: 6.12, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [1, 2]: {nradmax: 6, lmax: 2, nradbasemax: 6, radbasename: ChebExpCos, radparameters: [0.315], radcoefficients: [[[1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0]], [[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.315, rcut: 6.3, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [2, 0]: {nradmax: 6, lmax: 2, nradbasemax: 6, radbasename: ChebExpCos, radparameters: [0.262], radcoefficients: [[[1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0]], [[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.262, rcut: 5.23, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [2, 1]: {nradmax: 6, lmax: 2, nradbasemax: 6, radbasename: ChebExpCos, radparameters: [0.315], radcoefficients: [[[1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0]], [[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.315, rcut: 6.3, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [2, 2]: {nradmax: 6, lmax: 2, nradbasemax: 6, radbasename: ChebExpCos, radparameters: [0.286], radcoefficients: [[[1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0]], [[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.286, rcut: 5.71, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} +functions: + 0: + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [1], ls: [0], ms_combs: [0], ctildes: [1.0]} + 1: + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [1], ls: [0], ms_combs: [0], ctildes: [1.0]} + 2: + - {mu0: 2, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [1], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 2, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [1], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 2, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [2], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 2, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [2], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 2, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [3], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 2, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [3], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 2, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [4], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 2, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [4], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 2, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [5], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 2, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [5], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 2, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [6], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 2, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [6], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [2, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [2, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [2, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 2, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [2, 2, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 2, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} diff --git a/examples/snap/in.grid.ace b/examples/snap/in.grid.ace index 85d2fd47e76..3ddd5549d03 100644 --- a/examples/snap/in.grid.ace +++ b/examples/snap/in.grid.ace @@ -51,12 +51,9 @@ pair_coeff * * # define atom and grid computes compute bace all pace ${ace_options} 1 0 -#compute mygrid all pace/grid grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} compute mygrid all pace/grid grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} ugridtype 0 compute mygridlocal all pace/grid/local grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} ugridtype 0 fix bace all ave/time 1 1 1 c_bace[*] file desc_out.dat mode vector -#compute mygrid all pace/grid grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} -#compute mygridlocal all pace/grid/local grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} # define output diff --git a/examples/snap/in.grid.ace.constrained b/examples/snap/in.grid.ace.constrained new file mode 100644 index 00000000000..2f13d8ac1b5 --- /dev/null +++ b/examples/snap/in.grid.ace.constrained @@ -0,0 +1,74 @@ +# Demonstrate calculation of SNAP bispectrum descriptors on a grid + +# CORRECTNESS: The two atom positions coincide with two of +# the gridpoints, so c_b[2][1-5] should match c_mygrid[8][4-8]. +# The same is true for compute grid/local c_mygridlocal[8][4-11]. +# Local arrays can not be access directly in the script, +# but they are printed out to file dump.blocal + +variable nrep index 1 +variable a index 3.316 +variable ngrid index 2 + +units metal +atom_modify map hash + +# generate the box and atom positions using a BCC lattice + +variable nx equal ${nrep} +variable ny equal ${nrep} +variable nz equal ${nrep} + +boundary p p p + +lattice custom $a & + a1 1 0 0 & + a2 0 1 0 & + a3 0 0 1 & + basis 0 0 0 & + basis 0.5 0.5 0.5 + +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 1 box +create_atoms 1 box basis 1 1 + +mass 1 35.453 +#mass 2 22.989769 + +# define atom compute and grid compute + +group acegroup type 1 +variable rcutfac equal 6.31 + +variable ace_options string "coupling_coefficients_grid.yace" + + +# build zero potential to satisfy compute sna/atom + +pair_style zero ${rcutfac} +pair_coeff * * + +# define atom and grid computes + +compute bace all pace ${ace_options} 1 0 +# NOTE that grid computes here have the unique grid type flag `ugridtype` to "true" +# When paired with the correct coupling coefficient file, the grid will not mix atoms +# and grid points in the evaluation of descriptors. +compute mygrid all pace/grid grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} ugridtype 1 +compute mygridlocal all pace/grid/local grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} ugridtype 1 +fix bace all ave/time 1 1 1 c_bace[*] file desc_out.dat mode vector + +# define output + +variable B5grid equal c_mygrid[8][8] + +thermo_style custom step v_B5grid + +# this is the only way to view the local grid + +dump 1 all local 1000 dump.blocal c_mygridlocal[*] + +# run + +run 0 + diff --git a/examples/snap/log.24May24.grid.ace.constrained.g++.1 b/examples/snap/log.24May24.grid.ace.constrained.g++.1 new file mode 100644 index 00000000000..92c285e620f --- /dev/null +++ b/examples/snap/log.24May24.grid.ace.constrained.g++.1 @@ -0,0 +1,65 @@ +LAMMPS (15 Jun 2023 - Development - a1d61051c7-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +Lattice spacing in x,y,z = 3.316 3.316 3.316 +Created orthogonal box = (0 0 0) to (3.316 3.316 3.316) + 1 by 1 by 1 MPI processor grid +Created 2 atoms + using lattice units in orthogonal box = (0 0 0) to (3.316 3.316 3.316) + create_atoms CPU = 0.000 seconds +2 atoms in group acegroup +WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60) +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +WARNING: More than one compute pace (src/ML-PACE/compute_pace.cpp:135) +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 8.31 + ghost atom cutoff = 8.31 + binsize = 4.155, bins = 1 1 1 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard + (2) compute pace, occasional + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 4.539 | 4.539 | 4.539 Mbytes + Step v_B5grid + 0 4.9831587 +Loop time of 2.124e-06 on 1 procs for 0 steps with 2 atoms + +188.3% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 2.124e-06 | | |100.00 + +Nlocal: 2 ave 2 max 2 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 557 ave 557 max 557 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 136 ave 136 max 136 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 272 ave 272 max 272 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 272 +Ave neighs/atom = 136 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/snap/log.24May24.grid.ace.constrained.g++.4 b/examples/snap/log.24May24.grid.ace.constrained.g++.4 new file mode 100644 index 00000000000..df185eb41ce --- /dev/null +++ b/examples/snap/log.24May24.grid.ace.constrained.g++.4 @@ -0,0 +1,66 @@ +LAMMPS (15 Jun 2023 - Development - a1d61051c7-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +Lattice spacing in x,y,z = 3.316 3.316 3.316 +Created orthogonal box = (0 0 0) to (3.316 3.316 3.316) + 1 by 2 by 2 MPI processor grid +Created 2 atoms + using lattice units in orthogonal box = (0 0 0) to (3.316 3.316 3.316) + create_atoms CPU = 0.001 seconds +2 atoms in group acegroup +WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60) +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +WARNING: More than one compute pace (src/ML-PACE/compute_pace.cpp:135) +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 8.31 + ghost atom cutoff = 8.31 + binsize = 4.155, bins = 1 1 1 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard + (2) compute pace, occasional + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +WARNING: Proc sub-domain size < neighbor skin, could lead to lost atoms (src/domain.cpp:966) +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 4.577 | 4.578 | 4.579 Mbytes + Step v_B5grid + 0 4.9831587 +Loop time of 5.6725e-06 on 4 procs for 0 steps with 2 atoms + +70.5% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 5.673e-06 | | |100.00 + +Nlocal: 0.5 ave 1 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 467.5 ave 468 max 467 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Neighs: 34 ave 78 max 0 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +FullNghs: 68 ave 136 max 0 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 272 +Ave neighs/atom = 136 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 From ad7861befc907c0edcdb6ddd7cab04b2c78c969d Mon Sep 17 00:00:00 2001 From: James Michael Goff Date: Mon, 5 Aug 2024 09:39:15 -0600 Subject: [PATCH 04/12] initial grid forces from fix --- build_note.sh | 29 + examples/python/coupling_coefficients.yace | 382 ++++++++++ examples/python/dedb_python.py | 69 ++ examples/python/in.fix_gridforce_dedb | 67 ++ src/PYTHON/fix_python_gridforceace.cpp | 798 +++++++++++++++++++++ src/PYTHON/fix_python_gridforceace.h | 107 +++ src/compute_pe.cpp | 5 + 7 files changed, 1457 insertions(+) create mode 100644 build_note.sh create mode 100644 examples/python/coupling_coefficients.yace create mode 100644 examples/python/dedb_python.py create mode 100644 examples/python/in.fix_gridforce_dedb create mode 100644 src/PYTHON/fix_python_gridforceace.cpp create mode 100644 src/PYTHON/fix_python_gridforceace.h diff --git a/build_note.sh b/build_note.sh new file mode 100644 index 00000000000..1dfbd19218c --- /dev/null +++ b/build_note.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +#NOTE first add your numpy include dir to your cplus include path +export CPLUS_INCLUDE_PATH=$(python -c "import numpy; print(numpy.get_include())") + + +mkdir build && cd build + +cmake ../cmake -DLAMMPS_EXCEPTIONS=yes \ + -DBUILD_SHARED_LIBS=yes \ + -DBUILD_MPI=no \ + -DBUILD_OMP=no \ + -DPKG_PYTHON=yes \ + -DPKG_ML-SNAP=yes \ + -DPKG_ML-PACE=yes \ + -DPKG_ML-IAP=yes \ + -DPKG_MLIAP_ENABLE_PYTHON=yes \ + -DPYTHON_EXECUTABLE:FILEPATH=`which python` \ + -DPYTHON_INCLUDE_DIR=$(python -c "import sysconfig; print(sysconfig.get_path('include'))") \ + -DPYTHON_LIBRARY=$(python -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))") + +make -j +make install-python + +#tested with: +#cmake version 3.26.5 +#Python 3.10.13 +#Numpy 1.26.4 +#gcc (GCC) 8.5.0 diff --git a/examples/python/coupling_coefficients.yace b/examples/python/coupling_coefficients.yace new file mode 100644 index 00000000000..cc8addff8db --- /dev/null +++ b/examples/python/coupling_coefficients.yace @@ -0,0 +1,382 @@ +elements: [Cl, Na] +E0: [0.000000, 0.000000] +deltaSplineBins: 0.001000 +embeddings: + 0: {ndensity: 1, FS_parameters: [1.0, 1.0], npoti: FinnisSinclair, rho_core_cutoff: 100000, drho_core_cutoff: 250} + 1: {ndensity: 1, FS_parameters: [1.0, 1.0], npoti: FinnisSinclair, rho_core_cutoff: 100000, drho_core_cutoff: 250} +bonds: + [0, 0]: {nradmax: 8, lmax: 2, nradbasemax: 8, radbasename: ChebExpCos, radparameters: [0.003], radcoefficients: [[[1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0]], [[0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0]], [[0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0]], [[0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.003, rcut: 5.5, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [0, 1]: {nradmax: 8, lmax: 2, nradbasemax: 8, radbasename: ChebExpCos, radparameters: [0.005], radcoefficients: [[[1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0]], [[0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0]], [[0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0]], [[0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.005, rcut: 5.6, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [1, 0]: {nradmax: 8, lmax: 2, nradbasemax: 8, radbasename: ChebExpCos, radparameters: [0.005], radcoefficients: [[[1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0]], [[0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0]], [[0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0]], [[0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.005, rcut: 5.6, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} + [1, 1]: {nradmax: 8, lmax: 2, nradbasemax: 8, radbasename: ChebExpCos, radparameters: [0.008], radcoefficients: [[[1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0]], [[0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0]], [[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0]], [[0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0]], [[0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0]], [[0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0]], [[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0]], [[0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1]]], prehc: 0, lambdahc: 0.008, rcut: 6.0, dcut: 0.01, rcut_in: 0.0, dcut_in: 0.0, inner_cutoff_type: distance} +functions: + 0: + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [1], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [1], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [2], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [2], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [3], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [3], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [4], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [4], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [5], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [5], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [6], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [6], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [7], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [7], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [8], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [8], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [2, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [2, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [2, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 2, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [2, 2, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0, 1], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1, 0], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 0, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 0, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0, 0], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 0, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1, 0], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 0, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + 1: + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [1], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [1], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [2], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [2], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [3], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [3], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [4], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [4], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [5], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [5], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [6], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [6], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [7], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [7], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [0], ns: [8], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 1, ndensity: 1, num_ms_combs: 1, mus: [1], ns: [8], ls: [0], ms_combs: [0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [1, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [1, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [2, 1], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 0], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [0, 1], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 1, mus: [1, 1], ns: [2, 2], ls: [0, 0], ms_combs: [0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [1, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [1, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [2, 1], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 0], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [0, 1], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 3, mus: [1, 1], ns: [2, 2], ls: [1, 1], ms_combs: [-1, 1, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [1, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [1, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [2, 1], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 0], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [0, 1], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 2, ndensity: 1, num_ms_combs: 5, mus: [1, 1], ns: [2, 2], ls: [2, 2], ms_combs: [-2, 2, -1, 1, 0, 0, 1, -1, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 0, 0], ms_combs: [0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 1, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 1, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 1, 1], ms_combs: [0, -1, 1, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 2, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [1, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 1, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 1, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 2, 1], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 0], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 0, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [0, 1, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 5, mus: [1, 1, 1], ns: [2, 2, 2], ls: [0, 2, 2], ms_combs: [0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2], ctildes: [0.4472135954999579, -0.4472135954999579, 0.447213595499958, -0.4472135954999579, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [1, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 1, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 1, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [2, 2, 1], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 0], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 0, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [0, 1, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 9, mus: [1, 1, 1], ns: [2, 2, 2], ls: [1, 1, 2], ms_combs: [-1, -1, 2, -1, 0, 1, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, 0, -1, 1, 1, -2], ctildes: [0.4472135954999579, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.36514837167011077, -0.31622776601683794, 0.18257418583505539, -0.31622776601683794, 0.4472135954999579]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 2, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [1, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 1, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 1, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [2, 2, 1], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 3, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1], ns: [2, 2, 2], ls: [2, 2, 2], ms_combs: [-2, 0, 2, -2, 1, 1, -2, 2, 0, -1, -1, 2, -1, 0, 1, -1, 1, 0, -1, 2, -1, 0, -2, 2, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 2, -2, 1, -2, 1, 1, -1, 0, 1, 0, -1, 1, 1, -2, 2, -2, 0, 2, -1, -1, 2, 0, -2], ctildes: [0.23904572186687872, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.11952286093343936, 0.11952286093343938, -0.2927700218845599, 0.23904572186687872, 0.11952286093343936, -0.23904572186687875, 0.11952286093343936, 0.23904572186687872, -0.2927700218845599, 0.11952286093343938, 0.11952286093343936, -0.2927700218845599, 0.23904572186687875, -0.2927700218845599, 0.23904572186687872]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 0, 1], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [0, 0, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1, 0], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 1, mus: [1, 1, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 0, 0], ms_combs: [0, 0, 0, 0], ctildes: [1.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 0, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 0, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [0, 1, 0, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 0, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 0, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1, 0], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 3, mus: [1, 1, 1, 1], ns: [1, 1, 1, 1], ls: [0, 0, 1, 1], ms_combs: [0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1], ctildes: [0.5773502691896257, -0.5773502691896257, 0.5773502691896257]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0, 0], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 0, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 0, 1, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [0, 1, 0, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1, 0], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} + - {mu0: 1, rank: 4, ndensity: 1, num_ms_combs: 19, mus: [1, 1, 1, 1], ns: [1, 1, 1, 1], ls: [1, 1, 1, 1], ms_combs: [-1, -1, 1, 1, -1, 0, 0, 1, -1, 0, 1, 0, -1, 1, -1, 1, -1, 1, 0, 0, -1, 1, 1, -1, 0, -1, 0, 1, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 1, -1, -1, 1, 1, -1, 0, 0, 1, -1, 1, -1, 1, 0, -1, 0, 1, 0, 0, -1, 1, 1, -1, -1], ctildes: [0.0, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, -0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0, 0.0, 0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0, 0.0, 0.0]} diff --git a/examples/python/dedb_python.py b/examples/python/dedb_python.py new file mode 100644 index 00000000000..0567e50873f --- /dev/null +++ b/examples/python/dedb_python.py @@ -0,0 +1,69 @@ +from __future__ import print_function +from lammps import lammps +import ctypes +import numpy as np +from numpy.random import RandomState +from ctypes import * + +#NOTE you may import mala functions here +#import mala. + +#for now, a global grid dEdB is used to evaluate forces - this function gives the grid index per nx,ny,nz point +def get_grid(ngrid): + igrid = 0 + for nx in range(ngrid): + for ny in range(ngrid): + for nz in range(ngrid): + igrid += 1 + return igrid + +def pre_force_callback(lmp): + #NOTE inside this callback, you may access the lammps state: + L = lammps(ptr=lmp) + + # flag to use contiguous dEdB (useful for casting numpy arrays in LAMMPS later) + flat_beta = True + #------------------------------------------------------------- + # variables to access fix pointer in python if needed + #------------------------------------------------------------- + fid = '4' + ftype = 2 # 0 for scalar 1 for vector 2 for array + result_type = 2 + compute_style = 0 + fstyle = 0 + + #------------------------------------------------------------- + # variables to define grid + #------------------------------------------------------------- + ncolbase = 0 # = 6 if accessing alocal from the fix + nrow = (get_grid(ngrid=2)) # get the number of global grid points - dE/dB for each + ncoef = int(368/2) #number of ace descriptors per atom - may be obtained from ACE functions in mala + ncol = ncoef + ncolbase + base_array_rows = 0 + #------------------------------------------------------------- + # dummy function to get dE_I/dB_{I,k} for a + #------------------------------------------------------------- + prng = RandomState(3481) + betas_row = prng.uniform(-1,1,ncoef)*1.e-4 #np.arange(ncoef)*1.e-6 + betas = np.repeat(np.array([betas_row]),repeats = nrow+base_array_rows,axis=0) + + #If you need to access descriptors from lammps to evaluate betas, + # a future update will allow you to extract them from the fix with: + #this_fix = L.numpy.extract_fix(fid,fstyle,ftype,nrow,ncol) + + + #NOTE that this accessing the descriptors from the fix so far seems to throw mem. + # errors - possibly due to python garbage collection + # to get around this if this,we may access the descriptors through an extract_compute: + #these_descriptors = L.numpy.extract_compute(cid,cstyle,ctype,crow,ccol) + + #------------------------------------------------------------- + # this preforce callback should return dEdB in numpy array + # format. + #------------------------------------------------------------- + if flat_beta: + betas = betas.flatten() + return np.ascontiguousarray(betas) + else: + return betas + diff --git a/examples/python/in.fix_gridforce_dedb b/examples/python/in.fix_gridforce_dedb new file mode 100644 index 00000000000..e3bd7a06c47 --- /dev/null +++ b/examples/python/in.fix_gridforce_dedb @@ -0,0 +1,67 @@ +# example with unique grid type + +variable nfreq equal 1 # how frequently to run fix (should be every step) +variable ngrid equal 2 # how many grid points +variable nthermo equal 50 +variable nrep index 1 # number of repeated unit cells for Ca +variable a index 3.316 +variable fdelta index 1.0e-5 # displacement size +variable nugget equal 1.0e-12 # regularization for relerr +variable ndump index 50 # dump output interval + +units metal +atom_modify map hash + +variable nx equal ${nrep} +variable ny equal ${nrep} +variable nz equal ${nrep} + +boundary p p p + +lattice custom $a & + a1 1 0 0 & + a2 0 1 0 & + a3 0 0 1 & + basis 0 0 0 & + basis 0.5 0.5 0.5 + +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 1 box +create_atoms 1 box basis 1 1 + +mass 1 35.453 + +group acegroup type 1 +variable rcutfac equal 6.0 # define rcutfac for pairstyle_zero (must be bigger than radial cutoffs in coupling_coefficients.yace + +variable ace_options string "coupling_coefficients.yace ugridtype 1" + +#velocity all create 3.0 87287 + +pair_style zero ${rcutfac} # null pairstyle so that lammps will still evolve system in time/run computes +pair_coeff * * + +timestep 0.5e-3 +neighbor 0.3 bin +neigh_modify every 1 delay 0 check yes + + +#define lammps python command +python pre_force_callback file dedb_python.py + +fix 4 all python/acegridforce ${nfreq} pre_force pre_force_callback grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} +# the fix can evaluate the energy if linear or quasi-linear model parameters are provided +#fix_modify 4 energy yes +compute mygridlocal all pace/grid/local grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} + +thermo ${nfreq} + + + +thermo_style custom step temp pe etotal press + +#You may dump the structure to view the dynamics +#dump 4 all custom 1 qdump.xyz id type x y z + +run 0 + diff --git a/src/PYTHON/fix_python_gridforceace.cpp b/src/PYTHON/fix_python_gridforceace.cpp new file mode 100644 index 00000000000..faef0816b7f --- /dev/null +++ b/src/PYTHON/fix_python_gridforceace.cpp @@ -0,0 +1,798 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Richard Berger (Temple U) +------------------------------------------------------------------------- */ + +#include "fix_python_gridforceace.h" + +#include "ace-evaluator/ace_c_basis.h" +#include "ace-evaluator/ace_evaluator.h" +#include "ace-evaluator/ace_types.h" + +// force/pair includes +#include "atom.h" +#include "comm.h" +#include "domain.h" +#include "memory.h" + +// python fix includes +#include "error.h" +#include "lmppython.h" +#include "python_compat.h" +#include "python_utils.h" +#include "update.h" +#include + +#include +//#include // IWYU pragma: export + + +// defines for random c++ betas +#define BETA_CONST 1.0e-5 +#define BETA_IGRID 1.0e-6 +#define BETA_ICOL 1.0e-6 +//#define DEBUG_GRID 0 +//#define DEBUG_GRID_FORCE 1 +//#define DEBUG_NUMPY_INTERFACE 1 +#define DEBUG_BETA_INDICES 0 +#define INTERFACE_NUMPY 1 +#define INTERFACE_PTR 0 +#define MPI_NUMPY 0 + +namespace LAMMPS_NS { +struct ACEFimpl { + ACEFimpl() : basis_set(nullptr), ace(nullptr) {} + ~ACEFimpl() + { + delete basis_set; + delete ace; + } + ACECTildeBasisSet *basis_set; + ACECTildeEvaluator *ace; +}; +} // namespace LAMMPS_NS + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +FixPythonAceGridForce::FixPythonAceGridForce(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), gridlocal(nullptr), alocal(nullptr), acefimpl(nullptr), py_beta(nullptr), py_beta_contig(nullptr), + e_grid(nullptr), e_grid_all(nullptr) +{ + + energy_global_flag = 1; + + if (narg < 6) error->all(FLERR,"Illegal fix python/acegridforce command"); + + nevery = utils::inumeric(FLERR,arg[3],false,lmp); + if (nevery <= 0) error->all(FLERR,"Illegal fix python/acegridforce command"); + + // ensure Python interpreter is initialized + python->init(); + + if (strcmp(arg[4],"post_force") == 0) { + selected_callback = POST_FORCE; + } else if (strcmp(arg[4],"end_of_step") == 0) { + selected_callback = END_OF_STEP; + } else if (strcmp(arg[4],"pre_force") == 0) { + selected_callback = PRE_FORCE; + } else { + error->all(FLERR,"Unsupported callback name for fix python/acegridforce"); + } + + base_allocated = 0; + size_global_array_rows = 0; + gridlocal_allocated = 0; + allocated_py_beta = 0; + allocated_global = 0; + short_allocated=0; + gridtypeflagl = 1; + nelements = 1; + + int nargmin = 11; + acefimpl = new ACEFimpl; + + int iarg0 = 6; + int iarg = iarg0; + if (strcmp(arg[iarg], "grid") == 0) { + if (iarg + 4 > narg) error->all(FLERR, "Illegal compute grid command"); + nx = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); + ny = utils::inumeric(FLERR, arg[iarg + 2], false, lmp); + nz = utils::inumeric(FLERR, arg[iarg + 3], false, lmp); + if (nx <= 0 || ny <= 0 || nz <= 0) error->all(FLERR, "All grid dimensions must be positive"); + iarg += 4; + } else + error->all(FLERR, "Illegal compute grid command"); + + ngridglobal = nx * ny * nz; + base_array_rows = 0; + size_global_array_rows = ngridglobal + base_array_rows; + //without force + //size_global_array_rows = ngridglobal + base_array_rows; + char * potential_file_name = arg[10]; + + iarg = nargmin; + + while (iarg < narg) { + if (strcmp(arg[iarg], "ugridtype") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal compute {} command", style); + gridtypeflagl = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); + iarg += 2; + } + } + + delete acefimpl->basis_set; + acefimpl->basis_set = new ACECTildeBasisSet(potential_file_name); + cutmax = acefimpl->basis_set->cutoffmax; + nelements = acefimpl->basis_set->nelements; + memory->create(map,nelements+1,"python/acegridforce:map"); + for (int ik = 1; ik <= nelements+1; ik++) { + for(int mu = 0; mu < nelements; mu++){ + if (mu != -1) { + if (mu == ik - 1) { + map[ik] = mu; + //acefimpl->ace->element_type_mapping(ik) = mu; + } + } + } + } + + //# of rank 1, rank > 1 functions + int ielem = 0; + if (gridtypeflagl){ + ielem = nelements-1; + } + int n_r1, n_rp = 0; + n_r1 = acefimpl->basis_set->total_basis_size_rank1[ielem]; + n_rp = acefimpl->basis_set->total_basis_size[ielem]; + + int ncoeff = n_r1 + n_rp; + + //ndesc_base = 6; + ndesc_base = 0; + nvalues = ncoeff; + ndesc = ncoeff; + + set_grid_global(); + set_grid_local(); + allocate_global(); + + // get Python function + PyUtils::GIL lock; + + PyObject *pyMain = PyImport_AddModule("__main__"); + + if (!pyMain) { + PyUtils::Print_Errors(); + error->all(FLERR,"Could not initialize embedded Python"); + } + + char *fname = arg[5]; + pFunc = PyObject_GetAttrString(pyMain, fname); + + if (!pFunc) { + PyUtils::Print_Errors(); + error->all(FLERR,"Could not find Python function"); + } + + lmpPtr = PY_VOID_POINTER(lmp); +} + +/* ---------------------------------------------------------------------- */ + +FixPythonAceGridForce::~FixPythonAceGridForce() +{ + PyUtils::GIL lock; + Py_CLEAR(lmpPtr); + delete acefimpl; + + deallocate_py_beta(); + deallocate_grid(); + deallocate_short(); + deallocate_global(); + memory->destroy(map); +} + +/* ---------------------------------------------------------------------- */ + +int FixPythonAceGridForce::setmask() +{ + return selected_callback; +} + + +/* ---------------------------------------------------------------------- + convert global array indexes to box coords +------------------------------------------------------------------------- */ + +void FixPythonAceGridForce::grid2x(int ix, int iy, int iz, double *x) +{ + x[0] = ix*delx; + x[1] = iy*dely; + x[2] = iz*delz; + + if (triclinic) domain->lamda2x(x, x); +} + +void FixPythonAceGridForce::grid2xglobal(int igrid, double *x) +{ + int iz = igrid / (nx * ny); + igrid -= iz * (nx * ny); + int iy = igrid / nx; + igrid -= iy * nx; + int ix = igrid; + + x[0] = ix * delx; + x[1] = iy * dely; + x[2] = iz * delz; + + if (triclinic) domain->lamda2x(x, x); + //printf(">>>>> ComputeGrid::grid2x\n"); +} + +/* ---------------------------------------------------------------------- + create arrays +------------------------------------------------------------------------- */ + +void FixPythonAceGridForce::allocate_grid() +{ + if (gridlocal_allocated){ + deallocate_grid(); + } + if (nxlo <= nxhi && nylo <= nyhi && nzlo <= nzhi) { + gridlocal_allocated = 1; + memory->create4d_offset(gridlocal,ndesc,nzlo,nzhi,nylo,nyhi, + nxlo,nxhi,"python/acegridforce:gridlocal"); + memory->create(alocal, ngridlocal, ndesc, "python/acegridforce:alocal"); + } +} + + +void FixPythonAceGridForce::allocate_py_beta() +{ + if (allocated_py_beta){ + deallocate_py_beta(); + } + memory->create(py_beta, size_global_array_rows, ndesc-ndesc_base, "python/acegridforce:py_beta"); + memory->create(py_beta_contig, size_global_array_rows*(ndesc-ndesc_base), "python/acegridforce:py_beta_contig"); + allocated_py_beta = 1; +} + +void FixPythonAceGridForce::allocate_global() +{ + if (allocated_global){ + deallocate_global(); + } + memory->create(e_grid, ngridglobal, "python/acegridforce:e_grid"); + memory->create(e_grid_all, ngridglobal, "python/acegridforce:e_grid_all"); + allocated_global = 1; + +} + +/* ---------------------------------------------------------------------- + free arrays +------------------------------------------------------------------------- */ + +void FixPythonAceGridForce::deallocate_grid() +{ + if (gridlocal_allocated) { + gridlocal_allocated = 0; + memory->destroy4d_offset(gridlocal,nzlo,nylo,nxlo); + memory->destroy(alocal); + } +} + +void FixPythonAceGridForce::deallocate_global() +{ + if (allocated_global){ + memory->destroy(e_grid); + memory->destroy(e_grid_all); + } + allocated_global = 0; +} + +void FixPythonAceGridForce::deallocate_py_beta() +{ + if (allocated_py_beta){ + memory->destroy(py_beta); + memory->destroy(py_beta_contig); + } + allocated_py_beta = 0; +} + +void FixPythonAceGridForce::deallocate_short() +{ + if (short_allocated){ + memory->destroy(gridneigh); + memory->destroy(gridinside); + memory->destroy(gridtype); + } + short_allocated=0; +} +/* ---------------------------------------------------------------------- + set global grid +------------------------------------------------------------------------- */ + +void FixPythonAceGridForce::set_grid_global() +{ + // calculate grid layout + + triclinic = domain->triclinic; + + if (triclinic == 0) { + prd = domain->prd; + boxlo = domain->boxlo; + sublo = domain->sublo; + subhi = domain->subhi; + } else { + prd = domain->prd_lamda; + boxlo = domain->boxlo_lamda; + sublo = domain->sublo_lamda; + subhi = domain->subhi_lamda; + } + + double xprd = prd[0]; + double yprd = prd[1]; + double zprd = prd[2]; + + delxinv = nx/xprd; + delyinv = ny/yprd; + delzinv = nz/zprd; + + delx = 1.0/delxinv; + dely = 1.0/delyinv; + delz = 1.0/delzinv; +} + +/* ---------------------------------------------------------------------- + set local subset of grid that I own + n xyz lo/hi = 3d brick that I own (inclusive) +------------------------------------------------------------------------- */ + +void FixPythonAceGridForce::set_grid_local() +{ + // nx,ny,nz = extent of global grid + // indices into the global grid range from 0 to N-1 in each dim + // if grid point is inside my sub-domain I own it, + // this includes sub-domain lo boundary but excludes hi boundary + // ixyz lo/hi = inclusive lo/hi bounds of global grid sub-brick I own + // if proc owns no grid cells in a dim, then ilo > ihi + // if 2 procs share a boundary a grid point is exactly on, + // the 2 equality if tests insure a consistent decision + // as to which proc owns it + + double xfraclo,xfrachi,yfraclo,yfrachi,zfraclo,zfrachi; + + if (comm->layout != Comm::LAYOUT_TILED) { + xfraclo = comm->xsplit[comm->myloc[0]]; + xfrachi = comm->xsplit[comm->myloc[0]+1]; + yfraclo = comm->ysplit[comm->myloc[1]]; + yfrachi = comm->ysplit[comm->myloc[1]+1]; + zfraclo = comm->zsplit[comm->myloc[2]]; + zfrachi = comm->zsplit[comm->myloc[2]+1]; + } else { + xfraclo = comm->mysplit[0][0]; + xfrachi = comm->mysplit[0][1]; + yfraclo = comm->mysplit[1][0]; + yfrachi = comm->mysplit[1][1]; + zfraclo = comm->mysplit[2][0]; + zfrachi = comm->mysplit[2][1]; + } + + nxlo = static_cast (xfraclo * nx); + if (1.0*nxlo != xfraclo*nx) nxlo++; + nxhi = static_cast (xfrachi * nx); + if (1.0*nxhi == xfrachi*nx) nxhi--; + + nylo = static_cast (yfraclo * ny); + if (1.0*nylo != yfraclo*ny) nylo++; + nyhi = static_cast (yfrachi * ny); + if (1.0*nyhi == yfrachi*ny) nyhi--; + + nzlo = static_cast (zfraclo * nz); + if (1.0*nzlo != zfraclo*nz) nzlo++; + nzhi = static_cast (zfrachi * nz); + if (1.0*nzhi == zfrachi*nz) nzhi--; + + ngridlocal = (nxhi - nxlo + 1) * (nyhi - nylo + 1) * (nzhi - nzlo + 1); +} + +/* ---------------------------------------------------------------------- + copy coords to local array +------------------------------------------------------------------------- */ + +void FixPythonAceGridForce::assign_coords() +{ + int igrid = 0; + for (int iz = nzlo; iz <= nzhi; iz++) + for (int iy = nylo; iy <= nyhi; iy++) + for (int ix = nxlo; ix <= nxhi; ix++) { + alocal[igrid][0] = ix; + alocal[igrid][1] = iy; + alocal[igrid][2] = iz; + double xgrid[3]; + grid2x(ix, iy, iz, xgrid); + alocal[igrid][3] = xgrid[0]; + alocal[igrid][4] = xgrid[1]; + alocal[igrid][5] = xgrid[2]; + igrid++; + } +} + +/* ---------------------------------------------------------------------- + copy the 4d gridlocal array values to the 2d local array +------------------------------------------------------------------------- */ + +void FixPythonAceGridForce::copy_gridlocal_to_local_array() +{ + int igrid = 0; + for (int iz = nzlo; iz <= nzhi; iz++) + for (int iy = nylo; iy <= nyhi; iy++) + for (int ix = nxlo; ix <= nxhi; ix++) { + for (int icol = ndesc_base; icol < ndesc; icol++) + alocal[igrid][icol] = gridlocal[icol][iz][iy][ix]; + igrid++; + } +} + +/* ---------------------------------------------------------------------- + calculate beta +------------------------------------------------------------------------- */ + +// this is a proxy for a call to the energy model +// beta is dE/dB^i, the derivative of the total +// energy w.r.t. to descriptors of grid point i + +void FixPythonAceGridForce::compute_beta() +{ + int igrid = 0; + for (int iz = nzlo; iz <= nzhi; iz++) + for (int iy = nylo; iy <= nyhi; iy++) + for (int ix = nxlo; ix <= nxhi; ix++) { + for (int icol = 0; icol < ndesc-ndesc_base; icol++) + beta[igrid][icol] = BETA_CONST + BETA_IGRID*igrid + BETA_ICOL*icol; + igrid++; + } +} +/* ---------------------------------------------------------------------- + grow grid +------------------------------------------------------------------------- */ + +void FixPythonAceGridForce::grow_grid(int newnmax) +{ + //if (newnmax <= nmax) return; + //allocate local grid + nmax=newnmax; + if (gridlocal_allocated) { + memory->destroy4d_offset(gridlocal,nzlo,nylo,nxlo); + memory->destroy(alocal); + } + memory->create4d_offset(gridlocal,ndesc,nzlo,nzhi,nylo,nyhi, + nxlo,nxhi,"python/acegridforce:gridlocal"); + memory->create(alocal, ngridlocal, ndesc, "python/acegridforce:alocal"); + if (short_allocated) { + memory->destroy(gridneigh); + memory->destroy(gridinside); + memory->destroy(gridtype); + } + memory->create(gridneigh, nmax, 3, "python/acegridforce:gridneigh"); + memory->create(gridinside, nmax, "python/acegridforce:gridinside"); + memory->create(gridtype, nmax, "python/acegridforce:gridtype"); + short_allocated = 1; + //populate short lists with 0s + for (int jz = 0; jz < nmax; jz++){ + gridneigh[jz][0] = 0.00000000; + gridneigh[jz][1] = 0.00000000; + gridneigh[jz][2] = 0.00000000; + gridinside[jz] = 0; + gridtype[jz] = 0; + } + gridlocal_allocated = 1; +} + +/* ---------------------------------------------------------------------- + calculate B +------------------------------------------------------------------------- */ +void FixPythonAceGridForce::compute(int eflag, int vflag) +{ + double fij[3]; + + // compute descriptors for each gridpoint + + double** const x = atom->x; + double **f = atom->f; + const int* const mask = atom->mask; + int * const type = atom->type; + const int ntotal = atom->nlocal + atom->nghost; + + // grow grid arrays to match possible # of grid neighbors (analogous to jnum) + nmax = ntotal + 1; + grow_grid(nmax); + + // first generate fingerprint, + int igrid = 0; + for (int iz = nzlo; iz <= nzhi; iz++) + for (int iy = nylo; iy <= nyhi; iy++) + for (int ix = nxlo; ix <= nxhi; ix++) { + const int igrid_global = iz * (nx * ny) + iy * nx + ix; + double xgrid[3]; + double xgridglobal[3]; + grid2x(ix, iy, iz, xgrid); + const double xtmp = xgrid[0]; + const double ytmp = xgrid[1]; + const double ztmp = xgrid[2]; + const int igrid_g = iz * (nx * ny) + iy * nx + ix; + grid2xglobal(igrid_g,xgridglobal); + const double xtmpg = xgridglobal[0]; + const double ytmpg = xgridglobal[1]; + const double ztmpg = xgridglobal[2]; + + // default, all grid points are type 1 + // - later we may want to set up lammps_user_pace interface such that the + // real atom types begin at 2 and reserve type 1 specifically for the + // grid entries. This will allow us to only evaluate ACE for atoms around + // a grid point, but with no contributions from other grid points + int ielem = 0; + if (gridtypeflagl){ + ielem = nelements-1; + } + const int itype = ielem+1; + delete acefimpl->ace; + acefimpl->ace = new ACECTildeEvaluator(*acefimpl->basis_set); + acefimpl->ace->compute_projections = true; + acefimpl->ace->compute_b_grad = true; + + // leave these here b/c in the future, we may be able to allow + // for different #s of descriptors per atom or grid type + int n_r1, n_rp = 0; + n_r1 = acefimpl->basis_set->total_basis_size_rank1[ielem]; + n_rp = acefimpl->basis_set->total_basis_size[ielem]; + + //ACE element mapping + acefimpl->ace->element_type_mapping.init(nelements+1); + for (int ik = 1; ik <= nelements+1; ik++) { + for(int mu = 0; mu < nelements; mu++){ + if (mu != -1) { + if (mu == ik - 1) { + map[ik] = mu; + acefimpl->ace->element_type_mapping(ik) = mu; + } + } + } + } + + // rij[][3] = displacements between atom I and those neighbors + // inside = indices of neighbors of I within cutoff + // typej = types of neighbors of I within cutoff + // + // note that extra quantities have been calculated here for debugging purposes + // but will be omitted in a later push + int ninside = 0; + for (int j = 0; j < ntotal; j++) { + if (!(mask[j] & groupbit)) continue; + const double delxlg = xtmp - x[j][0]; + const double delylg = ytmp - x[j][1]; + const double delzlg = ztmp - x[j][2]; + const double delxg = xtmpg - x[j][0]; + const double delyg = ytmpg - x[j][1]; + const double delzg = ztmpg - x[j][2]; + const double rsq = delxlg * delxlg + delylg * delylg + delzlg * delzlg; + const double rsqg = delxg * delxg + delyg * delyg + delzg * delzg; + const double rxtmp = x[j][0]; + const double rytmp = x[j][1]; + const double rztmp = x[j][2]; + const double rsqd = rxtmp * rxtmp + rytmp * rytmp + rztmp * rztmp; + const double rsqx = pow(rxtmp,2) + pow(rytmp,2) + pow(rztmp,2); + int jtype = type[j]; + int jelem = map[jtype]; + double thiscut = acefimpl->basis_set->radial_functions->cut(ielem,jelem); + const double rnorm = sqrt(rsq); + const double rnormd = sqrt(rsqd); + const double rnormg = sqrt(rsqg); + const double rnormx = sqrt(rsqx); + if (rnormd < (thiscut) && rnorm > 1.e-20) { + gridneigh[ninside][0] = x[j][0]; + gridneigh[ninside][1] = x[j][1]; + gridneigh[ninside][2] = x[j][2]; + gridinside[ninside] = ninside; + gridtype[ninside] = jtype; + ninside++; + } + } + //add in grid site at final index + int ninsidegrid = ninside+1; + int copy_igrid = igrid; + const int baseind = 0; + + gridinside[ninside]=ninside; + gridneigh[ninside][0] = xtmp; + gridneigh[ninside][1] = ytmp; + gridneigh[ninside][2] = ztmp; + gridtype[ninside]=itype; + // perform ACE evaluation with short neighbor list + acefimpl->ace->resize_neighbours_cache(ninside); + acefimpl->ace->compute_atom(ninside, gridneigh, gridtype, ninside, gridinside); + Array1D Bs = acefimpl->ace->projections; + // linear contributions + for (int icoeff = 0; icoeff < ndesc; icoeff++){ +#if INTERFACE_NUMPY + alocal[igrid][ndesc_base + icoeff] += Bs(icoeff); + e_grid[igrid_global] += Bs(icoeff)*py_beta[0][icoeff]; +#endif + } + // sum over neighbors jj + // sum over descriptor indices k=iicoeff + // multiply dE_I/dB_I * dB_I^k/drj + for (int jj =0; jj < ninside;jj++){ + for (int iicoeff = 0; iicoeff < ndesc; iicoeff++){ + DOUBLE_TYPE fx_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,0); + DOUBLE_TYPE fy_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,1); + DOUBLE_TYPE fz_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,2); + f[jj][0] -= fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[jj][1] -= fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[jj][2] -= fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + } + } + + igrid++; + } + +#ifdef DEBUG_GRID_FORCE + for (int jj =0; jj < atom->nlocal;jj++){ + printf("tallied forces for atom %d %f %f %f \n",jj,f[jj][0],f[jj][1],f[jj][2]); + } +#endif + +} + +/* ---------------------------------------------------------------------- + compute energy scalar for fix energy +------------------------------------------------------------------------- */ + +double FixPythonAceGridForce::compute_scalar() +{ + MPI_Allreduce(e_grid, e_grid_all, ngridglobal, MPI_DOUBLE, MPI_SUM, world); + double etot = 0.0; + for (int kk = 0; kk < ngridglobal; kk++){ + etot += e_grid_all[kk]; + } + return etot; +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void FixPythonAceGridForce::base_allocate() +{ + base_allocated = 1; + int n = atom->ntypes; + + map = new int[n+1]; +} + +/* ---------------------------------------------------------------------- */ + +void FixPythonAceGridForce::end_of_step() +{ + PyUtils::GIL lock; + + PyObject * result = PyObject_CallFunction((PyObject*)pFunc, (char *)"O", (PyObject*)lmpPtr); + + if (!result) { + PyUtils::Print_Errors(); + error->all(FLERR,"Fix python/acegridforce end_of_step() method failed"); + } + + Py_CLEAR(result); +} + +void FixPythonAceGridForce::process_pyarr(PyObject* arr) +{ + int prank; + MPI_Comm_rank(MPI_COMM_WORLD, &prank); + + if (prank == 0 ){ + + double* pybeta = (double*)PyArray_DATA(arr); + deallocate_py_beta(); + allocate_py_beta(); + int pyrows = size_global_array_rows; + int pycols = ndesc-ndesc_base; +#if DEBUG_BETA_INDICES + printf("pydims %d \n",pyrows); + printf("pycols %d \n",pycols); + printf("ngridlocal %d ngridglobal %d \n",ngridlocal,size_global_array_rows); + printf("lammps cols %d \n", (ndesc-ndesc_base)); +#endif +#if MPI_NUMPY + MPI_Allreduce(pybeta, py_beta_contig, (size_global_array_rows*(ndesc-ndesc_base)), MPI_DOUBLE, MPI_SUM, world); +#endif + for (int pyi =0; pyi < pyrows; pyi++){ + for (int pyj =0; pyj < pycols; pyj++){ +#ifdef DEBUG_NUMPY_INTERFACE + printf("pybeta[%d][%d] = %f \n" , pyi,pyj, pybeta[pyi*pycols + pyj]); +#endif +#if MPI_NUMPY + double resulti = py_beta_contig[pyi*pycols + pyj]; +#endif +#if !MPI_NUMPY + double resulti = pybeta[pyi*pycols + pyj]; +#endif + py_beta[pyi][pyj] = resulti; + } + } + } + +} +/* ---------------------------------------------------------------------- */ + +void FixPythonAceGridForce::post_force(int vflag) +{ + if (update->ntimestep % nevery != 0) return; + + PyUtils::GIL lock; + char fmt[] = "Oi"; + + PyObject * result = PyObject_CallFunction((PyObject*)pFunc, fmt, (PyObject*)lmpPtr, vflag); + + if (!result) { + PyUtils::Print_Errors(); + error->all(FLERR,"Fix python/acegridforce post_force() method failed"); + } + + Py_CLEAR(result); +} + +/* ---------------------------------------------------------------------- */ + +void FixPythonAceGridForce::pre_force(int vflag) +{ + if (update->ntimestep % nevery != 0) return; + + PyUtils::GIL lock; + + + char fmt[] = "O"; + + PyObject * result = PyObject_CallFunction((PyObject*)pFunc, fmt, (PyObject*)lmpPtr, vflag); + + deallocate_grid(); + allocate_grid(); + + // zero energy grid arrays + for (int ik=0; ik < ngridglobal; ik++){ + e_grid[ik] = 0.0; + e_grid_all[ik] = 0.0; + } + + // directly process python beta array + process_pyarr(result); + // compute ace descriptors on the grid + compute(1,0); + + if (!result) { + PyUtils::Print_Errors(); + error->all(FLERR,"Fix python/acegridforce pre_force() method failed"); +#ifdef DEBUG_GRID + printf("WARNING - null result for py command with result: %s \n",result); +#endif + } + + Py_CLEAR(result); +} diff --git a/src/PYTHON/fix_python_gridforceace.h b/src/PYTHON/fix_python_gridforceace.h new file mode 100644 index 00000000000..9bd7455b9dc --- /dev/null +++ b/src/PYTHON/fix_python_gridforceace.h @@ -0,0 +1,107 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(python/acegridforce,FixPythonAceGridForce); +FixStyle(python,FixPythonAceGridForce); +// clang-format on +#else + +#ifndef LMP_FIX_PYTHON_ACEGRIDFORCE_H +#define LMP_FIX_PYTHON_ACEGRIDFORCE_H + +#include "fix.h" +#include // IWYU pragma: export + +namespace LAMMPS_NS { + +class FixPythonAceGridForce : public Fix { + public: + FixPythonAceGridForce(class LAMMPS *, int, char **); + ~FixPythonAceGridForce() override; + int setmask() override; + void end_of_step() override; + void post_force(int) override; + void pre_force(int) override; + double compute_scalar() override; // evaluate energy + + protected: + void base_allocate(); // allocate pairstyle arrays + void allocate_grid(); // create grid arrays + void allocate_py_beta(); // create beta arrays + void allocate_global(); //create global grid arrays + void grow_grid(int); // grow pace grid arrays + void deallocate_grid(); // free grid arrays + void deallocate_py_beta(); // free global python beta arrays + void deallocate_short(); // free short neighborlist arrays + void deallocate_global(); // free global grid arrays + void grid2x(int, int, int, double*); // convert local indices to coordinates + void grid2xglobal(int,double*); // convert global indices to coords + void set_grid_global(); // set global grid + void set_grid_local(); // set bounds for local grid + void assign_coords(); // assign coords for grid + void copy_gridlocal_to_local_array();// copy 4d gridlocal array to 2d local array + void compute_beta(); // get betas from someplace + void process_pyarr(PyObject*); + void compute(int, int); // get descriptors for grid & evaluate E, F + + int nx, ny, nz; // global grid dimensions + int nxlo, nxhi, nylo, nyhi, nzlo, nzhi; // local grid bounds, inclusive + int ngridlocal; // number of local grid points + int ngridglobal; // number of global grid points + int nvalues; // number of values per grid point + double ****gridlocal; // local grid, redundant w.r.t. alocal + double **alocal; // pointer to local array + int triclinic; // triclinic flag + double *boxlo, *prd; // box info (units real/ortho or reduced/tri) + double *sublo, *subhi; // subdomain info (units real/ortho or reduced/tri) + double delxinv,delyinv,delzinv; // inverse grid spacing + double delx,dely,delz; // grid spacing + double **beta; // lammps-generated betas for all local grid points in list + double **py_beta; // betas for all local grid points in list + double *py_beta_contig; // contiguous beta array from python + double *e_grid; // energy per grid site (global) + double *e_grid_all; // energy for all grid sites (global) + double cutmax; // max cutoff for radial functions + int ndesc; // # of descriptors + int ndesc_base; // base # of descriptors + struct ACEFimpl *acefimpl; // ace grid implementation from external c++ code + double ** gridneigh; + int *gridinside; + int *gridtype; + + private: + void *lmpPtr; + void *pFunc; + int selected_callback; + int base_allocated; + int short_allocated; //allocated short neighbor lists? + int allocated_global; + int allocated_py_beta; + int gridlocal_allocated; + int *map; // map types to [0,nelements) + int gridtypeflagl; // flag to use unique type for ACE grid points + int base_array_rows; + bigint lasttime; + int nelements; + int nmax; + int size_global_array_rows; // rows for global grid + int size_global_array_cols; // columns for global grid + +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/compute_pe.cpp b/src/compute_pe.cpp index f4207408f96..d3dc0dab338 100644 --- a/src/compute_pe.cpp +++ b/src/compute_pe.cpp @@ -87,6 +87,11 @@ double ComputePE::compute_scalar() if (update->eflag_global != invoked_scalar) error->all(FLERR, "Energy was not tallied on needed timestep"); + int vflag = 0; + if (modify->n_pre_force) { + modify->pre_force(vflag); + } + double one = 0.0; if (pairflag && force->pair) one += force->pair->eng_vdwl + force->pair->eng_coul; From 00eade101a7ec2e8401626e1331437e1c041edd2 Mon Sep 17 00:00:00 2001 From: James Michael Goff Date: Mon, 5 Aug 2024 10:10:44 -0600 Subject: [PATCH 05/12] updated gridforce example to print average net force --- build_note.sh | 27 +++++++- examples/python/in.fix_gridforce_dedb | 15 +++-- .../log.8Aug24.fix_gridforce_dedb.g++.1 | 66 +++++++++++++++++++ 3 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 examples/python/log.8Aug24.fix_gridforce_dedb.g++.1 diff --git a/build_note.sh b/build_note.sh index 1dfbd19218c..989957244ad 100644 --- a/build_note.sh +++ b/build_note.sh @@ -1,11 +1,10 @@ #!/bin/bash +mkdir build && cd build +# Build and compile to use the fix python/gridforceace #NOTE first add your numpy include dir to your cplus include path export CPLUS_INCLUDE_PATH=$(python -c "import numpy; print(numpy.get_include())") - -mkdir build && cd build - cmake ../cmake -DLAMMPS_EXCEPTIONS=yes \ -DBUILD_SHARED_LIBS=yes \ -DBUILD_MPI=no \ @@ -22,6 +21,28 @@ cmake ../cmake -DLAMMPS_EXCEPTIONS=yes \ make -j make install-python +# To compile and build when only using the ace grid computes + +cmake ../cmake -DLAMMPS_EXCEPTIONS=yes \ + -DBUILD_SHARED_LIBS=yes \ + -DBUILD_MPI=yes \ + -DBUILD_OMP=yes \ + -DPKG_PYTHON=yes \ + -DPKG_ML-SNAP=yes \ + -DPKG_ML-PACE=yes \ + -DPKG_ML-IAP=yes \ + -DPKG_MLIAP_ENABLE_PYTHON=yes \ + -DPYTHON_EXECUTABLE:FILEPATH=`which python` \ + -DPYTHON_INCLUDE_DIR=$(python -c "import sysconfig; print(sysconfig.get_path('include'))") \ + -DPYTHON_LIBRARY=$(python -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))") + +make -j +make install-python + +#NOTE that the following dflags were optional in both cases above: +# -DPKG_ML-IAP=yes \ +# -DPKG_MLIAP_ENABLE_PYTHON=yes \ + #tested with: #cmake version 3.26.5 #Python 3.10.13 diff --git a/examples/python/in.fix_gridforce_dedb b/examples/python/in.fix_gridforce_dedb index e3bd7a06c47..f934f59ff11 100644 --- a/examples/python/in.fix_gridforce_dedb +++ b/examples/python/in.fix_gridforce_dedb @@ -36,7 +36,7 @@ variable rcutfac equal 6.0 # define rcutfac for pairstyle_zero (must be b variable ace_options string "coupling_coefficients.yace ugridtype 1" -#velocity all create 3.0 87287 +velocity all create 0.001 87287 pair_style zero ${rcutfac} # null pairstyle so that lammps will still evolve system in time/run computes pair_coeff * * @@ -49,19 +49,26 @@ neigh_modify every 1 delay 0 check yes #define lammps python command python pre_force_callback file dedb_python.py +fix 1 all nve fix 4 all python/acegridforce ${nfreq} pre_force pre_force_callback grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} # the fix can evaluate the energy if linear or quasi-linear model parameters are provided #fix_modify 4 energy yes compute mygridlocal all pace/grid/local grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} -thermo ${nfreq} +variable fsq atom fx^2+fy^2+fz^2 +compute favsq all reduce ave v_fsq + +thermo ${nfreq} -thermo_style custom step temp pe etotal press +# print the average square force in the output +thermo_style custom step temp pe etotal press c_favsq #You may dump the structure to view the dynamics #dump 4 all custom 1 qdump.xyz id type x y z -run 0 +run 10 +variable fa equal c_favsq +print "last step average square force ${fa}" diff --git a/examples/python/log.8Aug24.fix_gridforce_dedb.g++.1 b/examples/python/log.8Aug24.fix_gridforce_dedb.g++.1 new file mode 100644 index 00000000000..5c2dab0e0c9 --- /dev/null +++ b/examples/python/log.8Aug24.fix_gridforce_dedb.g++.1 @@ -0,0 +1,66 @@ +LAMMPS (15 Jun 2023 - Development - 67ab67281f-modified) +Lattice spacing in x,y,z = 3.316 3.316 3.316 +Created orthogonal box = (0 0 0) to (3.316 3.316 3.316) + 1 by 1 by 1 MPI processor grid +Created 2 atoms + using lattice units in orthogonal box = (0 0 0) to (3.316 3.316 3.316) + create_atoms CPU = 0.000 seconds +2 atoms in group acegroup +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.3 + ghost atom cutoff = 6.3 + binsize = 3.15, bins = 2 2 2 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.0005 +Per MPI rank memory allocation (min/avg/max) = 3.461 | 3.461 | 3.461 Mbytes + Step Temp PotEng TotEng Press c_favsq + 0 0.001 0 1.2926015e-07 0.0037865193 0.020190444 + 1 0.049560409 0 6.4061857e-06 -37534.664 0.38601429 + 2 0.41078254 0 5.3097811e-05 -37530.036 0.38603065 + 3 1.1226313 0 0.00014511149 -37520.969 0.38606229 + 4 2.1851573 0 0.00028245375 -37507.462 0.38610921 + 5 3.5984363 0 0.0004651344 -37489.514 0.3861714 + 6 5.3625694 0 0.0006931665 -37467.124 0.38624887 + 7 7.477683 0 0.00096656639 -37440.291 0.38634162 + 8 9.9942666 0 0.0012918603 -38715.12 0.41625157 + 9 13.940458 0 0.0018019456 -181074.17 25.704824 + 10 27.882746 0 0.0036041278 -150546.22 13.790936 +Loop time of 0.212751 on 1 procs for 10 steps with 2 atoms + +Performance: 2.031 ns/day, 11.819 hours/ns, 47.003 timesteps/s, 94.007 atom-step/s +96.6% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.1821e-05 | 1.1821e-05 | 1.1821e-05 | 0.0 | 0.01 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 1.9471e-05 | 1.9471e-05 | 1.9471e-05 | 0.0 | 0.01 +Output | 0.10673 | 0.10673 | 0.10673 | 0.0 | 50.17 +Modify | 0.10597 | 0.10597 | 0.10597 | 0.0 | 49.81 +Other | | 2.236e-05 | | | 0.01 + +Nlocal: 2 ave 2 max 2 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 187 ave 187 max 187 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 58 ave 58 max 58 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 58 +Ave neighs/atom = 29 +Neighbor list builds = 0 +Dangerous builds = 0 +last step average square force 13.7909357177282 +Total wall time: 0:00:00 From a4a134e387ab3c8503dd9f6b57bd8fcdabf1cc19 Mon Sep 17 00:00:00 2001 From: James Michael Goff Date: Mon, 5 Aug 2024 16:36:41 -0600 Subject: [PATCH 06/12] updates and debugging --- src/PYTHON/fix_python_gridforceace.cpp | 125 ++++++++++++++++++++----- src/PYTHON/fix_python_gridforceace.h | 6 +- 2 files changed, 105 insertions(+), 26 deletions(-) diff --git a/src/PYTHON/fix_python_gridforceace.cpp b/src/PYTHON/fix_python_gridforceace.cpp index faef0816b7f..8ed35203748 100644 --- a/src/PYTHON/fix_python_gridforceace.cpp +++ b/src/PYTHON/fix_python_gridforceace.cpp @@ -51,6 +51,7 @@ #define INTERFACE_NUMPY 1 #define INTERFACE_PTR 0 #define MPI_NUMPY 0 +#define TAG_J_ADD 0 namespace LAMMPS_NS { struct ACEFimpl { @@ -120,7 +121,7 @@ FixPythonAceGridForce::FixPythonAceGridForce(LAMMPS *lmp, int narg, char **arg) error->all(FLERR, "Illegal compute grid command"); ngridglobal = nx * ny * nz; - base_array_rows = 0; + base_array_rows = 1; size_global_array_rows = ngridglobal + base_array_rows; //without force //size_global_array_rows = ngridglobal + base_array_rows; @@ -171,6 +172,7 @@ FixPythonAceGridForce::FixPythonAceGridForce(LAMMPS *lmp, int narg, char **arg) set_grid_global(); set_grid_local(); allocate_global(); + size_local_array_rows = ngridlocal + base_array_rows; // get Python function PyUtils::GIL lock; @@ -268,8 +270,10 @@ void FixPythonAceGridForce::allocate_py_beta() if (allocated_py_beta){ deallocate_py_beta(); } - memory->create(py_beta, size_global_array_rows, ndesc-ndesc_base, "python/acegridforce:py_beta"); - memory->create(py_beta_contig, size_global_array_rows*(ndesc-ndesc_base), "python/acegridforce:py_beta_contig"); + memory->create(py_beta, size_local_array_rows, ndesc-ndesc_base, "python/acegridforce:py_beta"); + memory->create(py_beta_contig, size_local_array_rows*(ndesc-ndesc_base), "python/acegridforce:py_beta_contig"); + //memory->create(py_beta, size_global_array_rows, ndesc-ndesc_base, "python/acegridforce:py_beta"); + //memory->create(py_beta_contig, size_global_array_rows*(ndesc-ndesc_base), "python/acegridforce:py_beta_contig"); allocated_py_beta = 1; } @@ -278,8 +282,11 @@ void FixPythonAceGridForce::allocate_global() if (allocated_global){ deallocate_global(); } - memory->create(e_grid, ngridglobal, "python/acegridforce:e_grid"); - memory->create(e_grid_all, ngridglobal, "python/acegridforce:e_grid_all"); + memory->create(e_grid, ngridlocal, "python/acegridforce:e_grid"); + memory->create(e_grid_all, ngridlocal, "python/acegridforce:e_grid_all"); + memory->create(e_grid_global, ngridglobal, "python/acegridforce:e_grid_global"); + //memory->create(e_grid, ngridglobal, "python/acegridforce:e_grid"); + //memory->create(e_grid_all, ngridglobal, "python/acegridforce:e_grid_all"); allocated_global = 1; } @@ -302,6 +309,7 @@ void FixPythonAceGridForce::deallocate_global() if (allocated_global){ memory->destroy(e_grid); memory->destroy(e_grid_all); + memory->destroy(e_grid_global); } allocated_global = 0; } @@ -520,6 +528,19 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) int * const type = atom->type; const int ntotal = atom->nlocal + atom->nghost; + //zero out forces + for (int jk = 0; jk < ntotal; jk++){ + f[jk][0] =0.; + f[jk][1] =0.; + f[jk][2] =0.; + } + + // zero energy grid arrays + for (int ik=0; ik < ngridglobal; ik++){ + e_grid[ik] = 0.0; + e_grid_all[ik] = 0.0; + } + // grow grid arrays to match possible # of grid neighbors (analogous to jnum) nmax = ntotal + 1; grow_grid(nmax); @@ -584,7 +605,7 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) // but will be omitted in a later push int ninside = 0; for (int j = 0; j < ntotal; j++) { - if (!(mask[j] & groupbit)) continue; + //if (!(mask[j] & groupbit)) continue; const double delxlg = xtmp - x[j][0]; const double delylg = ytmp - x[j][1]; const double delzlg = ztmp - x[j][2]; @@ -605,11 +626,28 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) const double rnormd = sqrt(rsqd); const double rnormg = sqrt(rsqg); const double rnormx = sqrt(rsqx); - if (rnormd < (thiscut) && rnorm > 1.e-20) { - gridneigh[ninside][0] = x[j][0]; - gridneigh[ninside][1] = x[j][1]; - gridneigh[ninside][2] = x[j][2]; + //if (rnormd < (thiscut) && rnorm > 1.e-20) { + //if (rnorm < (thiscut) && rnorm > 1.e-20) { + //if (rnorm < (thiscut) && rnorm > 1.e-20) { + //printf("thiscut %f, rnorm %f, rnormd %f, rnormx %f \n ",thiscut,rnorm,rnormd,rnormx); + if (rnorm <= (thiscut) && rnorm > 1.e-20) { + //if (rnorm <= (thiscut) && rnorm > 1.e-20) { + //gridneigh[ninside][0] = delxlg; + //gridneigh[ninside][1] = delylg; + //gridneigh[ninside][2] = delzlg; + // + gridneigh[ninside][0] = -x[j][0]; + gridneigh[ninside][1] = -x[j][1]; + gridneigh[ninside][2] = -x[j][2]; + // + //gridneigh[ninside][0] = x[j][0]; + //gridneigh[ninside][1] = x[j][1]; + //gridneigh[ninside][2] = x[j][2]; + //gridneigh[ninside][0] = delxg; + //gridneigh[ninside][1] = delyg; + //gridneigh[ninside][2] = delzg; gridinside[ninside] = ninside; + //gridinside[ninside] = j; gridtype[ninside] = jtype; ninside++; } @@ -620,32 +658,60 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) const int baseind = 0; gridinside[ninside]=ninside; - gridneigh[ninside][0] = xtmp; + //gridneigh[ninside][0] = 0.0; + //gridneigh[ninside][1] = 0.0; + //gridneigh[ninside][2] = 0.0; + //gridneigh[ninside][0] = xtmpg; //bad + //gridneigh[ninside][1] = ytmpg; + //gridneigh[ninside][2] = ztmpg; + // + gridneigh[ninside][0] = xtmp; //good first gridneigh[ninside][1] = ytmp; gridneigh[ninside][2] = ztmp; gridtype[ninside]=itype; + //printf("igrid %d | xtmp %f ytmp %f ztmp %f \n",igrid,xtmp,ytmp,ztmp); + //printf("igrid_g %d | xtmpg %f ytmpg %f ztmpg %f \n",igrid_global,xtmpg,ytmpg,ztmpg); // perform ACE evaluation with short neighbor list acefimpl->ace->resize_neighbours_cache(ninside); + //acefimpl->ace->resize_neighbours_cache(ntotal); acefimpl->ace->compute_atom(ninside, gridneigh, gridtype, ninside, gridinside); Array1D Bs = acefimpl->ace->projections; + //Array2D forces = acefimpl->ace->neighbours_forces; // linear contributions for (int icoeff = 0; icoeff < ndesc; icoeff++){ #if INTERFACE_NUMPY - alocal[igrid][ndesc_base + icoeff] += Bs(icoeff); + //alocal[igrid][ndesc_base + icoeff] += Bs(icoeff); + //e_grid[igrid_global] += Bs(icoeff)*py_beta[0][icoeff]; + gridlocal[ndesc_base + icoeff][iz][iy][ix] = Bs(icoeff); e_grid[igrid_global] += Bs(icoeff)*py_beta[0][icoeff]; #endif } + //e_grid[igrid_global] = acefimpl->ace->e_atom; // sum over neighbors jj // sum over descriptor indices k=iicoeff // multiply dE_I/dB_I * dB_I^k/drj - for (int jj =0; jj < ninside;jj++){ + //double fac = 1.0;//1.;//0.5/atom->natoms; + //printf("ninside %d ngridglobal %d \n",ninside,ngridglobal); + double fac = 1.0/ngridlocal; + for (int jj =0; jj < ninside-1;jj++){ + //for (int jj =0; jj < ntotal;jj++){ for (int iicoeff = 0; iicoeff < ndesc; iicoeff++){ DOUBLE_TYPE fx_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,0); DOUBLE_TYPE fy_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,1); DOUBLE_TYPE fz_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,2); - f[jj][0] -= fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - f[jj][1] -= fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - f[jj][2] -= fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; +#if !TAG_J_ADD + f[jj][0] += fac*fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[jj][1] += fac*fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[jj][2] += fac*fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + //f[atom->tag[jj]][0] -= fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + //f[atom->tag[jj]][1] -= fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + //f[atom->tag[jj]][2] -= fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; +#endif +#if TAG_J_ADD + f[atom->tag[jj]][0] += fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[atom->tag[jj]][1] += fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[atom->tag[jj]][2] += fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; +#endif } } @@ -653,8 +719,9 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) } #ifdef DEBUG_GRID_FORCE - for (int jj =0; jj < atom->nlocal;jj++){ + for (int jj =0; jj < atom->natoms;jj++){ printf("tallied forces for atom %d %f %f %f \n",jj,f[jj][0],f[jj][1],f[jj][2]); + //printf("tallied forces for atom %d %f %f %f \n",jj,f[atom->tag[jj]][0],f[atom->tag[jj]][1],f[atom->tag[jj]][2]); } #endif @@ -666,11 +733,20 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) double FixPythonAceGridForce::compute_scalar() { +#if MPI_NUMPY MPI_Allreduce(e_grid, e_grid_all, ngridglobal, MPI_DOUBLE, MPI_SUM, world); double etot = 0.0; for (int kk = 0; kk < ngridglobal; kk++){ etot += e_grid_all[kk]; } +#endif +#if !MPI_NUMPY + double etot = 0.0; + for (int kk = 0; kk < ngridglobal; kk++){ + etot += e_grid[kk]/ngridglobal; + //etot += e_grid[kk]; + } +#endif return etot; } @@ -704,9 +780,10 @@ void FixPythonAceGridForce::end_of_step() void FixPythonAceGridForce::process_pyarr(PyObject* arr) { - int prank; + int prank = 0; +#if MPI_NUMPY MPI_Comm_rank(MPI_COMM_WORLD, &prank); - +#endif if (prank == 0 ){ double* pybeta = (double*)PyArray_DATA(arr); @@ -763,7 +840,7 @@ void FixPythonAceGridForce::post_force(int vflag) void FixPythonAceGridForce::pre_force(int vflag) { - if (update->ntimestep % nevery != 0) return; + //if (update->ntimestep % nevery != 0) return; PyUtils::GIL lock; @@ -776,10 +853,10 @@ void FixPythonAceGridForce::pre_force(int vflag) allocate_grid(); // zero energy grid arrays - for (int ik=0; ik < ngridglobal; ik++){ - e_grid[ik] = 0.0; - e_grid_all[ik] = 0.0; - } + //for (int ik=0; ik < ngridglobal; ik++){ + // e_grid[ik] = 0.0; + // e_grid_all[ik] = 0.0; + //} // directly process python beta array process_pyarr(result); diff --git a/src/PYTHON/fix_python_gridforceace.h b/src/PYTHON/fix_python_gridforceace.h index 9bd7455b9dc..db8113b6594 100644 --- a/src/PYTHON/fix_python_gridforceace.h +++ b/src/PYTHON/fix_python_gridforceace.h @@ -71,8 +71,9 @@ class FixPythonAceGridForce : public Fix { double **beta; // lammps-generated betas for all local grid points in list double **py_beta; // betas for all local grid points in list double *py_beta_contig; // contiguous beta array from python - double *e_grid; // energy per grid site (global) - double *e_grid_all; // energy for all grid sites (global) + double *e_grid; // energy per grid site (local) + double *e_grid_all; // energy for all grid sites (local) + double *e_grid_global; // energy for all grid sites (global) double cutmax; // max cutoff for radial functions int ndesc; // # of descriptors int ndesc_base; // base # of descriptors @@ -97,6 +98,7 @@ class FixPythonAceGridForce : public Fix { int nelements; int nmax; int size_global_array_rows; // rows for global grid + int size_local_array_rows; // rows for local grid int size_global_array_cols; // columns for global grid }; From 514f941a0c725b980569b836ea655fb6f9c48c56 Mon Sep 17 00:00:00 2001 From: James Michael Goff Date: Mon, 5 Aug 2024 16:37:48 -0600 Subject: [PATCH 07/12] removed incomplete example log file for fix grid forces --- .../log.8Aug24.fix_gridforce_dedb.g++.1 | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 examples/python/log.8Aug24.fix_gridforce_dedb.g++.1 diff --git a/examples/python/log.8Aug24.fix_gridforce_dedb.g++.1 b/examples/python/log.8Aug24.fix_gridforce_dedb.g++.1 deleted file mode 100644 index 5c2dab0e0c9..00000000000 --- a/examples/python/log.8Aug24.fix_gridforce_dedb.g++.1 +++ /dev/null @@ -1,66 +0,0 @@ -LAMMPS (15 Jun 2023 - Development - 67ab67281f-modified) -Lattice spacing in x,y,z = 3.316 3.316 3.316 -Created orthogonal box = (0 0 0) to (3.316 3.316 3.316) - 1 by 1 by 1 MPI processor grid -Created 2 atoms - using lattice units in orthogonal box = (0 0 0) to (3.316 3.316 3.316) - create_atoms CPU = 0.000 seconds -2 atoms in group acegroup -Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule -Neighbor list info ... - update: every = 1 steps, delay = 0 steps, check = yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.3 - ghost atom cutoff = 6.3 - binsize = 3.15, bins = 2 2 2 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair zero, perpetual - attributes: half, newton on - pair build: half/bin/atomonly/newton - stencil: half/bin/3d - bin: standard -Setting up Verlet run ... - Unit style : metal - Current step : 0 - Time step : 0.0005 -Per MPI rank memory allocation (min/avg/max) = 3.461 | 3.461 | 3.461 Mbytes - Step Temp PotEng TotEng Press c_favsq - 0 0.001 0 1.2926015e-07 0.0037865193 0.020190444 - 1 0.049560409 0 6.4061857e-06 -37534.664 0.38601429 - 2 0.41078254 0 5.3097811e-05 -37530.036 0.38603065 - 3 1.1226313 0 0.00014511149 -37520.969 0.38606229 - 4 2.1851573 0 0.00028245375 -37507.462 0.38610921 - 5 3.5984363 0 0.0004651344 -37489.514 0.3861714 - 6 5.3625694 0 0.0006931665 -37467.124 0.38624887 - 7 7.477683 0 0.00096656639 -37440.291 0.38634162 - 8 9.9942666 0 0.0012918603 -38715.12 0.41625157 - 9 13.940458 0 0.0018019456 -181074.17 25.704824 - 10 27.882746 0 0.0036041278 -150546.22 13.790936 -Loop time of 0.212751 on 1 procs for 10 steps with 2 atoms - -Performance: 2.031 ns/day, 11.819 hours/ns, 47.003 timesteps/s, 94.007 atom-step/s -96.6% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.1821e-05 | 1.1821e-05 | 1.1821e-05 | 0.0 | 0.01 -Neigh | 0 | 0 | 0 | 0.0 | 0.00 -Comm | 1.9471e-05 | 1.9471e-05 | 1.9471e-05 | 0.0 | 0.01 -Output | 0.10673 | 0.10673 | 0.10673 | 0.0 | 50.17 -Modify | 0.10597 | 0.10597 | 0.10597 | 0.0 | 49.81 -Other | | 2.236e-05 | | | 0.01 - -Nlocal: 2 ave 2 max 2 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 187 ave 187 max 187 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 58 ave 58 max 58 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 58 -Ave neighs/atom = 29 -Neighbor list builds = 0 -Dangerous builds = 0 -last step average square force 13.7909357177282 -Total wall time: 0:00:00 From 5aacc096c90628a157d7a5d6eb7ba34ed211b7fb Mon Sep 17 00:00:00 2001 From: James Michael Goff Date: Wed, 7 Aug 2024 12:41:32 -0600 Subject: [PATCH 08/12] new mapping for ace force neighbors --- src/PYTHON/fix_python_gridforceace.cpp | 100 +++++++------------------ src/PYTHON/fix_python_gridforceace.h | 1 + 2 files changed, 26 insertions(+), 75 deletions(-) diff --git a/src/PYTHON/fix_python_gridforceace.cpp b/src/PYTHON/fix_python_gridforceace.cpp index 8ed35203748..e4b07a5c379 100644 --- a/src/PYTHON/fix_python_gridforceace.cpp +++ b/src/PYTHON/fix_python_gridforceace.cpp @@ -13,7 +13,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing author: Richard Berger (Temple U) + Contributing author: James Goff (Sandia National Laboratories) ------------------------------------------------------------------------- */ #include "fix_python_gridforceace.h" @@ -328,6 +328,7 @@ void FixPythonAceGridForce::deallocate_short() if (short_allocated){ memory->destroy(gridneigh); memory->destroy(gridinside); + memory->destroy(gridj); memory->destroy(gridtype); } short_allocated=0; @@ -496,10 +497,12 @@ void FixPythonAceGridForce::grow_grid(int newnmax) if (short_allocated) { memory->destroy(gridneigh); memory->destroy(gridinside); + memory->destroy(gridj); memory->destroy(gridtype); } memory->create(gridneigh, nmax, 3, "python/acegridforce:gridneigh"); memory->create(gridinside, nmax, "python/acegridforce:gridinside"); + memory->create(gridj, nmax, "python/acegridforce:gridj"); memory->create(gridtype, nmax, "python/acegridforce:gridtype"); short_allocated = 1; //populate short lists with 0s @@ -508,6 +511,7 @@ void FixPythonAceGridForce::grow_grid(int newnmax) gridneigh[jz][1] = 0.00000000; gridneigh[jz][2] = 0.00000000; gridinside[jz] = 0; + gridj[jz] = 0; gridtype[jz] = 0; } gridlocal_allocated = 1; @@ -552,22 +556,14 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) for (int ix = nxlo; ix <= nxhi; ix++) { const int igrid_global = iz * (nx * ny) + iy * nx + ix; double xgrid[3]; - double xgridglobal[3]; + //double xgridglobal[3]; grid2x(ix, iy, iz, xgrid); const double xtmp = xgrid[0]; const double ytmp = xgrid[1]; const double ztmp = xgrid[2]; const int igrid_g = iz * (nx * ny) + iy * nx + ix; - grid2xglobal(igrid_g,xgridglobal); - const double xtmpg = xgridglobal[0]; - const double ytmpg = xgridglobal[1]; - const double ztmpg = xgridglobal[2]; + //grid2xglobal(igrid_g,xgridglobal); - // default, all grid points are type 1 - // - later we may want to set up lammps_user_pace interface such that the - // real atom types begin at 2 and reserve type 1 specifically for the - // grid entries. This will allow us to only evaluate ACE for atoms around - // a grid point, but with no contributions from other grid points int ielem = 0; if (gridtypeflagl){ ielem = nelements-1; @@ -597,57 +593,23 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) } } - // rij[][3] = displacements between atom I and those neighbors - // inside = indices of neighbors of I within cutoff - // typej = types of neighbors of I within cutoff - // - // note that extra quantities have been calculated here for debugging purposes - // but will be omitted in a later push int ninside = 0; for (int j = 0; j < ntotal; j++) { - //if (!(mask[j] & groupbit)) continue; + if (!(mask[j] & groupbit)) continue; const double delxlg = xtmp - x[j][0]; const double delylg = ytmp - x[j][1]; const double delzlg = ztmp - x[j][2]; - const double delxg = xtmpg - x[j][0]; - const double delyg = ytmpg - x[j][1]; - const double delzg = ztmpg - x[j][2]; const double rsq = delxlg * delxlg + delylg * delylg + delzlg * delzlg; - const double rsqg = delxg * delxg + delyg * delyg + delzg * delzg; - const double rxtmp = x[j][0]; - const double rytmp = x[j][1]; - const double rztmp = x[j][2]; - const double rsqd = rxtmp * rxtmp + rytmp * rytmp + rztmp * rztmp; - const double rsqx = pow(rxtmp,2) + pow(rytmp,2) + pow(rztmp,2); int jtype = type[j]; int jelem = map[jtype]; double thiscut = acefimpl->basis_set->radial_functions->cut(ielem,jelem); const double rnorm = sqrt(rsq); - const double rnormd = sqrt(rsqd); - const double rnormg = sqrt(rsqg); - const double rnormx = sqrt(rsqx); - //if (rnormd < (thiscut) && rnorm > 1.e-20) { - //if (rnorm < (thiscut) && rnorm > 1.e-20) { - //if (rnorm < (thiscut) && rnorm > 1.e-20) { - //printf("thiscut %f, rnorm %f, rnormd %f, rnormx %f \n ",thiscut,rnorm,rnormd,rnormx); if (rnorm <= (thiscut) && rnorm > 1.e-20) { - //if (rnorm <= (thiscut) && rnorm > 1.e-20) { - //gridneigh[ninside][0] = delxlg; - //gridneigh[ninside][1] = delylg; - //gridneigh[ninside][2] = delzlg; - // - gridneigh[ninside][0] = -x[j][0]; - gridneigh[ninside][1] = -x[j][1]; - gridneigh[ninside][2] = -x[j][2]; - // - //gridneigh[ninside][0] = x[j][0]; - //gridneigh[ninside][1] = x[j][1]; - //gridneigh[ninside][2] = x[j][2]; - //gridneigh[ninside][0] = delxg; - //gridneigh[ninside][1] = delyg; - //gridneigh[ninside][2] = delzg; + gridneigh[ninside][0] = x[j][0]; + gridneigh[ninside][1] = x[j][1]; + gridneigh[ninside][2] = x[j][2]; gridinside[ninside] = ninside; - //gridinside[ninside] = j; + gridj[ninside] = j; gridtype[ninside] = jtype; ninside++; } @@ -658,25 +620,14 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) const int baseind = 0; gridinside[ninside]=ninside; - //gridneigh[ninside][0] = 0.0; - //gridneigh[ninside][1] = 0.0; - //gridneigh[ninside][2] = 0.0; - //gridneigh[ninside][0] = xtmpg; //bad - //gridneigh[ninside][1] = ytmpg; - //gridneigh[ninside][2] = ztmpg; - // gridneigh[ninside][0] = xtmp; //good first gridneigh[ninside][1] = ytmp; gridneigh[ninside][2] = ztmp; gridtype[ninside]=itype; - //printf("igrid %d | xtmp %f ytmp %f ztmp %f \n",igrid,xtmp,ytmp,ztmp); - //printf("igrid_g %d | xtmpg %f ytmpg %f ztmpg %f \n",igrid_global,xtmpg,ytmpg,ztmpg); // perform ACE evaluation with short neighbor list acefimpl->ace->resize_neighbours_cache(ninside); - //acefimpl->ace->resize_neighbours_cache(ntotal); acefimpl->ace->compute_atom(ninside, gridneigh, gridtype, ninside, gridinside); Array1D Bs = acefimpl->ace->projections; - //Array2D forces = acefimpl->ace->neighbours_forces; // linear contributions for (int icoeff = 0; icoeff < ndesc; icoeff++){ #if INTERFACE_NUMPY @@ -686,31 +637,30 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) e_grid[igrid_global] += Bs(icoeff)*py_beta[0][icoeff]; #endif } - //e_grid[igrid_global] = acefimpl->ace->e_atom; // sum over neighbors jj // sum over descriptor indices k=iicoeff - // multiply dE_I/dB_I * dB_I^k/drj - //double fac = 1.0;//1.;//0.5/atom->natoms; + // multiply dE_I/dB_I * dB_I^k/drj and add to atom->f //printf("ninside %d ngridglobal %d \n",ninside,ngridglobal); - double fac = 1.0/ngridlocal; - for (int jj =0; jj < ninside-1;jj++){ - //for (int jj =0; jj < ntotal;jj++){ + //double fac = 1.0/ngridglobal; + double fac = 1.0; + for (int jj =0; jj < ninside;jj++){ + int mj = gridj[jj]; for (int iicoeff = 0; iicoeff < ndesc; iicoeff++){ DOUBLE_TYPE fx_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,0); DOUBLE_TYPE fy_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,1); DOUBLE_TYPE fz_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,2); #if !TAG_J_ADD - f[jj][0] += fac*fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - f[jj][1] += fac*fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - f[jj][2] += fac*fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[mj][0] -= fac*fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[mj][1] -= fac*fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[mj][2] -= fac*fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; //f[atom->tag[jj]][0] -= fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; //f[atom->tag[jj]][1] -= fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; //f[atom->tag[jj]][2] -= fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; #endif #if TAG_J_ADD - f[atom->tag[jj]][0] += fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - f[atom->tag[jj]][1] += fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - f[atom->tag[jj]][2] += fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[atom->tag[mj]][0] -= fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[atom->tag[mj]][1] -= fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[atom->tag[mj]][2] -= fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; #endif } } @@ -743,8 +693,8 @@ double FixPythonAceGridForce::compute_scalar() #if !MPI_NUMPY double etot = 0.0; for (int kk = 0; kk < ngridglobal; kk++){ - etot += e_grid[kk]/ngridglobal; - //etot += e_grid[kk]; + //etot += e_grid[kk]/ngridglobal; + etot += e_grid[kk]; } #endif return etot; diff --git a/src/PYTHON/fix_python_gridforceace.h b/src/PYTHON/fix_python_gridforceace.h index db8113b6594..cdf3ad35863 100644 --- a/src/PYTHON/fix_python_gridforceace.h +++ b/src/PYTHON/fix_python_gridforceace.h @@ -80,6 +80,7 @@ class FixPythonAceGridForce : public Fix { struct ACEFimpl *acefimpl; // ace grid implementation from external c++ code double ** gridneigh; int *gridinside; + int *gridj; int *gridtype; private: From f70df7834e38b71600472f0443436e95d0d11f28 Mon Sep 17 00:00:00 2001 From: James Michael Goff Date: Wed, 7 Aug 2024 13:42:26 -0600 Subject: [PATCH 09/12] validated ace grid forces in serial --- examples/python/betas_python.py | 69 +++++++++ examples/python/force_error.dump | 36 +++++ examples/python/in.force_interface | 76 ++++++++++ .../python/log.7Aug24.force_interface.g++.1 | 143 ++++++++++++++++++ src/PYTHON/fix_python_gridforceace.cpp | 63 ++------ 5 files changed, 334 insertions(+), 53 deletions(-) create mode 100644 examples/python/betas_python.py create mode 100644 examples/python/force_error.dump create mode 100644 examples/python/in.force_interface create mode 100644 examples/python/log.7Aug24.force_interface.g++.1 diff --git a/examples/python/betas_python.py b/examples/python/betas_python.py new file mode 100644 index 00000000000..50dcf56bcc3 --- /dev/null +++ b/examples/python/betas_python.py @@ -0,0 +1,69 @@ +from __future__ import print_function +from lammps import lammps +import ctypes +import numpy as np +from ctypes import * + +#NOTE you may import mala functions here +#import mala. + +flat_beta = True +def get_grid(ngrid): + igrid = 0 + for nx in range(ngrid): + for ny in range(ngrid): + for nz in range(ngrid): + igrid += 1 + return igrid + +from numpy.random import RandomState +def pre_force_callback(lmp): + L = lammps(ptr=lmp) + + def _extract_compute_np(lmp, name, compute_style, result_type, array_shape=None): + if array_shape is None: + array_np = lmp.numpy.extract_compute(name,compute_style, result_type) + else: + ptr = lmp.extract_compute(name, compute_style, result_type) + if result_type == 0: + + # no casting needed, lammps.py already works + + return ptr + if result_type == 2: + ptr = ptr.contents + total_size = np.prod(array_shape) + buffer_ptr = ctypes.cast(ptr, ctypes.POINTER(ctypes.c_double * total_size)) + array_np = np.frombuffer(buffer_ptr.contents, dtype=float) + array_np.shape = array_shape + return array_np + + #------------------------------------------------------------- + # variables to access fix pointer in python if needed + #------------------------------------------------------------- + #fid = 'python/gridforceace' # id for the fix + fid = '4' + ftype = 2 # 0 for scalar 1 for vector 2 for array + result_type = 2 + compute_style = 0 + fstyle = 0 + + ncolbase = 0 + nrow = (get_grid(ngrid=3)) #for now add a dE_I/dB_{I,K}row for ALL gridpoints (global) + ncoef = int(368/2) #number of ace descriptors per atom - may be obtained from ACE functions in mala + ncol = ncoef + ncolbase + base_array_rows = 1 + #------------------------------------------------------------- + # dummy function to get dE_I/dB_{I,k} for a + #------------------------------------------------------------- + prng = RandomState(3481) + betas_row = prng.uniform(-1,1,ncoef)*1.e-2 #np.arange(ncoef)*1.e-6 + betas = np.repeat(np.array([betas_row]),repeats = nrow+base_array_rows,axis=0) + + #------------------------------------------------------------- + if flat_beta: + betas = betas.flatten() + return np.ascontiguousarray(betas) + else: + return betas + diff --git a/examples/python/force_error.dump b/examples/python/force_error.dump new file mode 100644 index 00000000000..78c642b4b4d --- /dev/null +++ b/examples/python/force_error.dump @@ -0,0 +1,36 @@ +ITEM: TIMESTEP +0 +ITEM: NUMBER OF ATOMS +27 +ITEM: BOX BOUNDS pp pp pp +0.0000000000000000e+00 1.2299999999999999e+01 +0.0000000000000000e+00 1.2299999999999999e+01 +0.0000000000000000e+00 1.2299999999999999e+01 +ITEM: ATOMS v_ferrx v_ferry v_ferrz v_fnumx v_fnumy v_fnumz fx fy fz +-6.19951e-11 -7.58713e-11 1.0302e-10 -0.042581 -0.0447679 -0.0182386 -0.042581 -0.0447679 -0.0182386 +-1.15324e-09 -6.83069e-10 -1.11442e-09 -0.0685422 -0.0250869 -0.00250979 -0.0685422 -0.0250869 -0.00250979 +-1.31218e-11 7.08604e-11 -3.40421e-11 -0.0373417 -0.0419013 -0.0383014 -0.0373417 -0.0419013 -0.0383014 +4.8847e-10 6.83388e-11 -5.1978e-10 -0.00624131 -0.0747882 -0.0242476 -0.00624131 -0.0747882 -0.0242476 +-9.74319e-11 6.80062e-12 -1.05518e-11 -0.0269083 -0.0406272 -0.0692912 -0.0269083 -0.0406272 -0.0692912 +5.19803e-10 1.0873e-10 3.74081e-11 -0.0460113 -0.0261854 -0.0573406 -0.0460113 -0.0261854 -0.0573406 +3.74026e-11 -1.00672e-11 7.25404e-11 -0.00952708 -0.0376781 -0.0198265 -0.00952708 -0.0376781 -0.0198265 +2.87645e-10 -2.22802e-11 1.15998e-09 -0.0345894 -0.0559887 -0.0909081 -0.0345894 -0.0559887 -0.0909081 +3.4453e-10 -5.8103e-10 -3.43775e-10 -0.0727851 -0.0172051 -0.048487 -0.0727851 -0.0172051 -0.048487 +7.45302e-10 1.12808e-09 8.00453e-10 -0.00887339 -0.0819892 -0.0174709 -0.00887339 -0.0819892 -0.0174709 +6.31626e-10 -1.02371e-09 8.11185e-10 -0.0560607 -0.0364868 -0.0201497 -0.0560607 -0.0364868 -0.0201497 +3.41092e-10 1.63982e-10 6.13433e-11 -0.0175509 -0.00722611 -0.0433399 -0.0175509 -0.00722611 -0.0433399 +-4.26137e-11 -4.01836e-11 -1.33615e-11 -0.0280835 -0.037304 -0.0114681 -0.0280835 -0.037304 -0.0114681 +1.10312e-10 3.10779e-10 9.48799e-12 -0.0347123 -0.0446915 -0.0556344 -0.0347123 -0.0446915 -0.0556344 +-1.11901e-10 -3.10003e-10 1.14926e-11 -0.0675452 0.00910991 -0.0169141 -0.0675452 0.00910991 -0.0169141 +1.26165e-10 -2.15417e-11 1.26727e-10 -0.0247542 -0.0378673 -0.00845793 -0.0247542 -0.0378673 -0.00845793 +-9.67592e-11 -1.15635e-11 6.50399e-11 -0.036231 -0.0133096 -0.0199342 -0.036231 -0.0133096 -0.0199342 +4.18669e-10 -4.19505e-11 1.85127e-10 -0.0530658 0.00729906 -0.0337315 -0.0530658 0.00729906 -0.0337315 +-6.6372e-11 -8.01041e-11 -6.00919e-11 -0.0149293 -0.0404705 -0.00540582 -0.0149293 -0.0404705 -0.00540582 +-3.02678e-10 -1.42272e-10 -5.45316e-10 -0.0264333 -0.0376757 -0.0167649 -0.0264333 -0.0376757 -0.0167649 +1.52977e-09 -6.56218e-09 -4.88754e-09 0.00649436 0.0262364 -0.149893 0.00649436 0.0262364 -0.149893 +5.2414e-11 -1.16705e-10 3.04346e-11 -0.0457751 -0.0610119 -0.00380956 -0.0457751 -0.0610119 -0.00380956 +7.04813e-11 -6.09063e-11 1.59339e-11 -0.0413175 -0.0512686 -0.0361505 -0.0413175 -0.0512686 -0.0361505 +-1.61692e-10 -1.21797e-10 -1.59258e-10 -0.0362753 -0.00313249 -0.036646 -0.0362753 -0.00313249 -0.036646 +4.09459e-10 5.84354e-10 -9.71514e-11 -0.0335889 -0.0837681 -0.00491028 -0.0335889 -0.0837681 -0.00491028 +9.99178e-10 2.2583e-10 4.27024e-10 -0.0840318 -0.0736804 -0.0219763 -0.0840318 -0.0736804 -0.0219763 +1.04547e-11 -2.77425e-10 2.3405e-10 -0.0296852 -0.00747613 -0.0777974 -0.0296852 -0.00747613 -0.0777974 diff --git a/examples/python/in.force_interface b/examples/python/in.force_interface new file mode 100644 index 00000000000..d1063c5e993 --- /dev/null +++ b/examples/python/in.force_interface @@ -0,0 +1,76 @@ +# example with unique grid type + +variable nfreq equal 1 # how frequently to run fix (should be every step) +variable ngrid equal 3 # how many grid points +variable nthermo equal 1 #frequency for printing thermodynamic data +variable nrep index 3 # number of repeated unit cells for Ca +variable a index 4.1 # fake lattice constant +variable fdelta index 1.0e-5 # displacement size +variable nugget equal 1.0e-12 # regularization for relerr +variable ndump index 50 # dump output interval + +units metal +atom_modify map hash + +variable nx equal ${nrep} +variable ny equal ${nrep} +variable nz equal ${nrep} + +boundary p p p + +#make a fictitious system to test grid force calculations +lattice custom $a & + a1 1 0 0 & + a2 0 1 0 & + a3 0 0 1 & + basis 0.01 0.01 0.01 + +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 1 box +create_atoms 1 box basis 1 1 + +mass 1 35.453 + +group acegroup type 1 +variable rcutfac equal 6.0 # define rcutfac for pairstyle_zero (must be bigger than radial cutoffs in coupling_coefficients.yace + + +variable ace_options string "coupling_coefficients.yace ugridtype 1" + +displace_atoms all random 0.01 0.01 0.01 3542 + +pair_style zero ${rcutfac} # null pairstyle so that lammps will still evolve system in time +pair_coeff * * + +timestep 0.5e-3 +neighbor 0.3 bin +neigh_modify every 1 delay 0 check yes + + +#define lammps python command +python pre_force_callback file betas_python.py + +fix 4 all python/acegridforce ${nfreq} pre_force pre_force_callback grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} +fix_modify 4 energy yes + +thermo ${nthermo} + +# add numdiff (numerical differentiation) forces to validate fix python/gridforceace +fix numforce all numdiff ${nfreq} ${fdelta} +variable ferrx atom f_numforce[1]-fx +variable ferry atom f_numforce[2]-fy +variable ferrz atom f_numforce[3]-fz +variable fnumx atom f_numforce[1] +variable fnumy atom f_numforce[2] +variable fnumz atom f_numforce[3] +variable ferrsq atom v_ferrx^2+v_ferry^2+v_ferrz^2 +compute faverrsq all reduce ave v_ferrsq +variable fsq atom fx^2+fy^2+fz^2 +compute favsq all reduce ave v_fsq +variable frelerr equal sqrt(c_faverrsq/(c_favsq+${nugget})) +dump errors all custom ${ndump} force_error.dump v_ferrx v_ferry v_ferrz v_fnumx v_fnumy v_fnumz fx fy fz + + +thermo_style custom step temp pe etotal press v_frelerr c_faverrsq c_favsq + +run 0 diff --git a/examples/python/log.7Aug24.force_interface.g++.1 b/examples/python/log.7Aug24.force_interface.g++.1 new file mode 100644 index 00000000000..caed823df2b --- /dev/null +++ b/examples/python/log.7Aug24.force_interface.g++.1 @@ -0,0 +1,143 @@ +LAMMPS (15 Jun 2023 - Development - 5aacc096c9-modified) +# example with unique grid type + +variable nfreq equal 1 # how frequently to run fix (should be every step) +variable ngrid equal 3 # how many grid points +variable nthermo equal 50 +variable nrep index 3 # number of repeated unit cells for Ca +variable a index 4.1 +variable fdelta index 1.0e-5 # displacement size +variable nugget equal 1.0e-12 # regularization for relerr +variable ndump index 50 # dump output interval + +units metal +atom_modify map hash + +variable nx equal ${nrep} +variable nx equal 3 +variable ny equal ${nrep} +variable ny equal 3 +variable nz equal ${nrep} +variable nz equal 3 + +boundary p p p + +#make a fictitious system to test grid force calculations +lattice custom $a a1 1 0 0 a2 0 1 0 a3 0 0 1 basis 0.01 0.01 0.01 +lattice custom 4.1 a1 1 0 0 a2 0 1 0 a3 0 0 1 basis 0.01 0.01 0.01 +Lattice spacing in x,y,z = 4.1 4.1 4.1 + +region box block 0 ${nx} 0 ${ny} 0 ${nz} +region box block 0 3 0 ${ny} 0 ${nz} +region box block 0 3 0 3 0 ${nz} +region box block 0 3 0 3 0 3 +create_box 1 box +Created orthogonal box = (0 0 0) to (12.3 12.3 12.3) + 1 by 1 by 1 MPI processor grid +create_atoms 1 box basis 1 1 +Created 27 atoms + using lattice units in orthogonal box = (0 0 0) to (12.3 12.3 12.3) + create_atoms CPU = 0.000 seconds + +mass 1 35.453 + +group acegroup type 1 +27 atoms in group acegroup +variable rcutfac equal 6.0 # define rcutfac for pairstyle_zero (must be bigger than radial cutoffs in coupling_coefficients.yace + + +variable ace_options string "coupling_coefficients.yace ugridtype 1" + +displace_atoms all random 0.01 0.01 0.01 3542 +Displacing atoms ... + +pair_style zero ${rcutfac} # null pairstyle so that lammps will still evolve system in time +pair_style zero 6 +pair_coeff * * + +timestep 0.5e-3 +neighbor 0.3 bin +neigh_modify every 1 delay 0 check yes + + +#define lammps python command +python pre_force_callback file betas_python.py + +fix 4 all python/acegridforce ${nfreq} pre_force pre_force_callback grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} +fix 4 all python/acegridforce 1 pre_force pre_force_callback grid ${ngrid} ${ngrid} ${ngrid} ${ace_options} +fix 4 all python/acegridforce 1 pre_force pre_force_callback grid 3 ${ngrid} ${ngrid} ${ace_options} +fix 4 all python/acegridforce 1 pre_force pre_force_callback grid 3 3 ${ngrid} ${ace_options} +fix 4 all python/acegridforce 1 pre_force pre_force_callback grid 3 3 3 ${ace_options} +fix 4 all python/acegridforce 1 pre_force pre_force_callback grid 3 3 3 coupling_coefficients.yace ugridtype 1 +fix_modify 4 energy yes + +thermo ${nfreq} +thermo 1 + +# add numdiff (numerical differentiation) forces to validate fix python/gridforceace +fix numforce all numdiff ${nfreq} ${fdelta} +fix numforce all numdiff 1 ${fdelta} +fix numforce all numdiff 1 1.0e-5 +variable ferrx atom f_numforce[1]-fx +variable ferry atom f_numforce[2]-fy +variable ferrz atom f_numforce[3]-fz +variable fnumx atom f_numforce[1] +variable fnumy atom f_numforce[2] +variable fnumz atom f_numforce[3] +variable ferrsq atom v_ferrx^2+v_ferry^2+v_ferrz^2 +compute faverrsq all reduce ave v_ferrsq +variable fsq atom fx^2+fy^2+fz^2 +compute favsq all reduce ave v_fsq +variable frelerr equal sqrt(c_faverrsq/(c_favsq+${nugget})) +variable frelerr equal sqrt(c_faverrsq/(c_favsq+1e-12)) +dump errors all custom ${ndump} force_error.dump v_ferrx v_ferry v_ferrz v_fnumx v_fnumy v_fnumz fx fy fz +dump errors all custom 50 force_error.dump v_ferrx v_ferry v_ferrz v_fnumx v_fnumy v_fnumz fx fy fz + + +thermo_style custom step temp pe etotal press v_frelerr c_faverrsq c_favsq + +run 0 +WARNING: No fixes with time integration, atoms won't move (src/verlet.cpp:60) +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.3 + ghost atom cutoff = 6.3 + binsize = 3.15, bins = 4 4 4 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard +WARNING: Dump errors includes no atom IDs and is not sorted by ID. This may complicate post-processing tasks or visualization (src/dump.cpp:221) +Per MPI rank memory allocation (min/avg/max) = 4.69 | 4.69 | 4.69 Mbytes + Step Temp PotEng TotEng Press v_frelerr c_faverrsq c_favsq + 0 0 2.6520001 2.6520001 0 2.2633547e-08 3.0655485e-18 0.0059841564 +Loop time of 3.986e-06 on 1 procs for 0 steps with 27 atoms + +100.4% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 3.986e-06 | | |100.00 + +Nlocal: 27 ave 27 max 27 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 189 ave 189 max 189 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 243 ave 243 max 243 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 243 +Ave neighs/atom = 9 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:03 diff --git a/src/PYTHON/fix_python_gridforceace.cpp b/src/PYTHON/fix_python_gridforceace.cpp index e4b07a5c379..12f43225ca0 100644 --- a/src/PYTHON/fix_python_gridforceace.cpp +++ b/src/PYTHON/fix_python_gridforceace.cpp @@ -44,14 +44,8 @@ #define BETA_CONST 1.0e-5 #define BETA_IGRID 1.0e-6 #define BETA_ICOL 1.0e-6 -//#define DEBUG_GRID 0 -//#define DEBUG_GRID_FORCE 1 -//#define DEBUG_NUMPY_INTERFACE 1 -#define DEBUG_BETA_INDICES 0 #define INTERFACE_NUMPY 1 -#define INTERFACE_PTR 0 #define MPI_NUMPY 0 -#define TAG_J_ADD 0 namespace LAMMPS_NS { struct ACEFimpl { @@ -111,20 +105,18 @@ FixPythonAceGridForce::FixPythonAceGridForce(LAMMPS *lmp, int narg, char **arg) int iarg0 = 6; int iarg = iarg0; if (strcmp(arg[iarg], "grid") == 0) { - if (iarg + 4 > narg) error->all(FLERR, "Illegal compute grid command"); + if (iarg + 4 > narg) error->all(FLERR, "Illegal fix python/gridforceace grid command"); nx = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); ny = utils::inumeric(FLERR, arg[iarg + 2], false, lmp); nz = utils::inumeric(FLERR, arg[iarg + 3], false, lmp); if (nx <= 0 || ny <= 0 || nz <= 0) error->all(FLERR, "All grid dimensions must be positive"); iarg += 4; } else - error->all(FLERR, "Illegal compute grid command"); + error->all(FLERR, "Illegal fix python/gridforceace grid command"); ngridglobal = nx * ny * nz; base_array_rows = 1; size_global_array_rows = ngridglobal + base_array_rows; - //without force - //size_global_array_rows = ngridglobal + base_array_rows; char * potential_file_name = arg[10]; iarg = nargmin; @@ -282,6 +274,7 @@ void FixPythonAceGridForce::allocate_global() if (allocated_global){ deallocate_global(); } + //TODO - redo global vs local gridpoints to take betas of shape (ngridlocal,ncoeff) from python memory->create(e_grid, ngridlocal, "python/acegridforce:e_grid"); memory->create(e_grid_all, ngridlocal, "python/acegridforce:e_grid_all"); memory->create(e_grid_global, ngridglobal, "python/acegridforce:e_grid_global"); @@ -628,53 +621,32 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) acefimpl->ace->resize_neighbours_cache(ninside); acefimpl->ace->compute_atom(ninside, gridneigh, gridtype, ninside, gridinside); Array1D Bs = acefimpl->ace->projections; - // linear contributions + // Accumulate descriptors on grid array + // Accumulate energy (linear model for debugging) for (int icoeff = 0; icoeff < ndesc; icoeff++){ -#if INTERFACE_NUMPY //alocal[igrid][ndesc_base + icoeff] += Bs(icoeff); //e_grid[igrid_global] += Bs(icoeff)*py_beta[0][icoeff]; gridlocal[ndesc_base + icoeff][iz][iy][ix] = Bs(icoeff); e_grid[igrid_global] += Bs(icoeff)*py_beta[0][icoeff]; -#endif } + //Accumulate forces // sum over neighbors jj // sum over descriptor indices k=iicoeff // multiply dE_I/dB_I * dB_I^k/drj and add to atom->f - //printf("ninside %d ngridglobal %d \n",ninside,ngridglobal); - //double fac = 1.0/ngridglobal; - double fac = 1.0; for (int jj =0; jj < ninside;jj++){ int mj = gridj[jj]; for (int iicoeff = 0; iicoeff < ndesc; iicoeff++){ DOUBLE_TYPE fx_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,0); DOUBLE_TYPE fy_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,1); DOUBLE_TYPE fz_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,2); -#if !TAG_J_ADD - f[mj][0] -= fac*fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - f[mj][1] -= fac*fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - f[mj][2] -= fac*fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - //f[atom->tag[jj]][0] -= fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - //f[atom->tag[jj]][1] -= fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - //f[atom->tag[jj]][2] -= fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; -#endif -#if TAG_J_ADD - f[atom->tag[mj]][0] -= fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - f[atom->tag[mj]][1] -= fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - f[atom->tag[mj]][2] -= fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; -#endif + f[atom->tag[mj]-1][0] -= fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[atom->tag[mj]-1][1] -= fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[atom->tag[mj]-1][2] -= fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; } } igrid++; } - -#ifdef DEBUG_GRID_FORCE - for (int jj =0; jj < atom->natoms;jj++){ - printf("tallied forces for atom %d %f %f %f \n",jj,f[jj][0],f[jj][1],f[jj][2]); - //printf("tallied forces for atom %d %f %f %f \n",jj,f[atom->tag[jj]][0],f[atom->tag[jj]][1],f[atom->tag[jj]][2]); - } -#endif - } /* ---------------------------------------------------------------------- @@ -693,7 +665,6 @@ double FixPythonAceGridForce::compute_scalar() #if !MPI_NUMPY double etot = 0.0; for (int kk = 0; kk < ngridglobal; kk++){ - //etot += e_grid[kk]/ngridglobal; etot += e_grid[kk]; } #endif @@ -736,17 +707,12 @@ void FixPythonAceGridForce::process_pyarr(PyObject* arr) #endif if (prank == 0 ){ + //TODO - finish version that can take local dEdB from python with shape (ngridlocal,ncoeff) double* pybeta = (double*)PyArray_DATA(arr); deallocate_py_beta(); allocate_py_beta(); int pyrows = size_global_array_rows; int pycols = ndesc-ndesc_base; -#if DEBUG_BETA_INDICES - printf("pydims %d \n",pyrows); - printf("pycols %d \n",pycols); - printf("ngridlocal %d ngridglobal %d \n",ngridlocal,size_global_array_rows); - printf("lammps cols %d \n", (ndesc-ndesc_base)); -#endif #if MPI_NUMPY MPI_Allreduce(pybeta, py_beta_contig, (size_global_array_rows*(ndesc-ndesc_base)), MPI_DOUBLE, MPI_SUM, world); #endif @@ -802,12 +768,6 @@ void FixPythonAceGridForce::pre_force(int vflag) deallocate_grid(); allocate_grid(); - // zero energy grid arrays - //for (int ik=0; ik < ngridglobal; ik++){ - // e_grid[ik] = 0.0; - // e_grid_all[ik] = 0.0; - //} - // directly process python beta array process_pyarr(result); // compute ace descriptors on the grid @@ -816,9 +776,6 @@ void FixPythonAceGridForce::pre_force(int vflag) if (!result) { PyUtils::Print_Errors(); error->all(FLERR,"Fix python/acegridforce pre_force() method failed"); -#ifdef DEBUG_GRID - printf("WARNING - null result for py command with result: %s \n",result); -#endif } Py_CLEAR(result); From cd7ad207614f187ca7632307c1b9b0558bd51b0b Mon Sep 17 00:00:00 2001 From: James Michael Goff Date: Tue, 24 Sep 2024 13:11:00 -0600 Subject: [PATCH 10/12] added flag to build with or without extra linearized energy row --- src/PYTHON/fix_python_gridforceace.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/PYTHON/fix_python_gridforceace.cpp b/src/PYTHON/fix_python_gridforceace.cpp index 12f43225ca0..839e8911f9c 100644 --- a/src/PYTHON/fix_python_gridforceace.cpp +++ b/src/PYTHON/fix_python_gridforceace.cpp @@ -47,6 +47,9 @@ #define INTERFACE_NUMPY 1 #define MPI_NUMPY 0 +// define for linearized energy calculation +#define ENERGY_ROW 1 + namespace LAMMPS_NS { struct ACEFimpl { ACEFimpl() : basis_set(nullptr), ace(nullptr) {} @@ -115,7 +118,10 @@ FixPythonAceGridForce::FixPythonAceGridForce(LAMMPS *lmp, int narg, char **arg) error->all(FLERR, "Illegal fix python/gridforceace grid command"); ngridglobal = nx * ny * nz; + base_array_rows = 0; +#if ENERGY_ROW base_array_rows = 1; +#endif size_global_array_rows = ngridglobal + base_array_rows; char * potential_file_name = arg[10]; @@ -627,7 +633,9 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) //alocal[igrid][ndesc_base + icoeff] += Bs(icoeff); //e_grid[igrid_global] += Bs(icoeff)*py_beta[0][icoeff]; gridlocal[ndesc_base + icoeff][iz][iy][ix] = Bs(icoeff); +#if ENERGY_ROW e_grid[igrid_global] += Bs(icoeff)*py_beta[0][icoeff]; +#endif } //Accumulate forces // sum over neighbors jj From 352224b9dc47c785b3056e75cd4a41fa8f7f386a Mon Sep 17 00:00:00 2001 From: James Michael Goff Date: Tue, 24 Sep 2024 13:13:05 -0600 Subject: [PATCH 11/12] update python callback for grid based force calculation without row for linearized energy model calculation --- examples/python/betas_python.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/python/betas_python.py b/examples/python/betas_python.py index 50dcf56bcc3..4f7a2ab5ccf 100644 --- a/examples/python/betas_python.py +++ b/examples/python/betas_python.py @@ -52,7 +52,9 @@ def _extract_compute_np(lmp, name, compute_style, result_type, array_shape=None) nrow = (get_grid(ngrid=3)) #for now add a dE_I/dB_{I,K}row for ALL gridpoints (global) ncoef = int(368/2) #number of ace descriptors per atom - may be obtained from ACE functions in mala ncol = ncoef + ncolbase - base_array_rows = 1 + # set to 1 if including energy row + #base_array_rows = 1 + base_array_rows=0 #------------------------------------------------------------- # dummy function to get dE_I/dB_{I,k} for a #------------------------------------------------------------- From 05f66d61aab6640eeba2bacf526faa3c67bc5bd0 Mon Sep 17 00:00:00 2001 From: James Michael Goff Date: Thu, 9 Jan 2025 11:49:10 -0700 Subject: [PATCH 12/12] updated grid based python interface to handle more standard cmake format --- cmake/Modules/Packages/PYTHON.cmake | 31 ++++++++++ src/PYTHON/fix_python_gridforceace.cpp | 80 +++++++++++++++++++++----- 2 files changed, 96 insertions(+), 15 deletions(-) diff --git a/cmake/Modules/Packages/PYTHON.cmake b/cmake/Modules/Packages/PYTHON.cmake index 4a2925fe315..7d392ac6ae8 100644 --- a/cmake/Modules/Packages/PYTHON.cmake +++ b/cmake/Modules/Packages/PYTHON.cmake @@ -1,3 +1,18 @@ +set(PYTHON_ENABLE_GRIDFORCE_DEFAULT OFF) +if(PKG_ML-PACE) + if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.14) + find_package(Python COMPONENTS NumPy QUIET) + else() + # assume we have NumPy + set(Python_NumPy_FOUND ON) + endif() + if(Python_NumPy_FOUND) + set(PYTHON_ENABLE_GRIDFORCE_DEFAULT ON) + endif() +endif() + +option(PYTHON_ENABLE_GRIDFORCE "Build PYTHON package with grid ace support" ${PYTHON_ENABLE_GRIDFORCE_DEFAULT}) + if(CMAKE_VERSION VERSION_LESS 3.12) if(NOT PYTHON_VERSION_STRING) set(Python_ADDITIONAL_VERSIONS 3.12 3.11 3.10 3.9 3.8 3.7 3.6) @@ -27,3 +42,19 @@ else() target_link_libraries(lammps PRIVATE Python::Python) endif() target_compile_definitions(lammps PRIVATE -DLMP_PYTHON) + +if(PYTHON_ENABLE_GRIDFORCE) + if(NOT PKG_ML-PACE) + message(FATAL_ERROR "Must enable ML-PACE package for including grid-based descriptor support in PYTHON") + endif() + execute_process( + COMMAND python -c "import numpy; print(numpy.get_include())" + OUTPUT_VARIABLE npOUTPUT + ) + string(STRIP ${npOUTPUT} npOUTPUT) + target_include_directories(lammps + PRIVATE + ${npOUTPUT} + ) + target_compile_definitions(lammps PRIVATE -DPYTHON_GRIDFORCE) +endif() diff --git a/src/PYTHON/fix_python_gridforceace.cpp b/src/PYTHON/fix_python_gridforceace.cpp index 839e8911f9c..eccdf7da7a0 100644 --- a/src/PYTHON/fix_python_gridforceace.cpp +++ b/src/PYTHON/fix_python_gridforceace.cpp @@ -15,6 +15,7 @@ /* ---------------------------------------------------------------------- Contributing author: James Goff (Sandia National Laboratories) ------------------------------------------------------------------------- */ +#ifdef PYTHON_GRIDFORCE #include "fix_python_gridforceace.h" @@ -48,7 +49,13 @@ #define MPI_NUMPY 0 // define for linearized energy calculation -#define ENERGY_ROW 1 +#define ENERGY_ROW 0 + +//defines for debugging +//#define DEBUG_NUMPY_INTERFACE +#define DEBUG_ARRAY_SIZE +//#define DEBUG_FORCES +//#define DEBUG_FORCES_INDS namespace LAMMPS_NS { struct ACEFimpl { @@ -156,12 +163,17 @@ FixPythonAceGridForce::FixPythonAceGridForce(LAMMPS *lmp, int narg, char **arg) if (gridtypeflagl){ ielem = nelements-1; } +#ifdef DEBUG_ARRAY_SIZE + printf("nelements, %d | ielem, %d \n",nelements,ielem); +#endif int n_r1, n_rp = 0; n_r1 = acefimpl->basis_set->total_basis_size_rank1[ielem]; n_rp = acefimpl->basis_set->total_basis_size[ielem]; int ncoeff = n_r1 + n_rp; - +#ifdef DEBUG_ARRAY_SIZE + printf("ncoeff (a.k.a. num descs) %d \n",ncoeff); +#endif //ndesc_base = 6; ndesc_base = 0; nvalues = ncoeff; @@ -171,7 +183,7 @@ FixPythonAceGridForce::FixPythonAceGridForce(LAMMPS *lmp, int narg, char **arg) set_grid_local(); allocate_global(); size_local_array_rows = ngridlocal + base_array_rows; - + printf("ngridlocal %d size_local_array_rows %d size_global_array_rows %d ndesc %d \n",ngridlocal,size_local_array_rows,size_global_array_rows,ndesc); // get Python function PyUtils::GIL lock; @@ -529,14 +541,16 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) double **f = atom->f; const int* const mask = atom->mask; int * const type = atom->type; + //TODO check local vs ghost atom counts const int ntotal = atom->nlocal + atom->nghost; + //const int ntotal = atom->nlocal;// + atom->nghost; //zero out forces - for (int jk = 0; jk < ntotal; jk++){ - f[jk][0] =0.; - f[jk][1] =0.; - f[jk][2] =0.; - } + //for (int jk = 0; jk < ntotal; jk++){ + // f[jk][0] =0.; + // f[jk][1] =0.; + // f[jk][2] =0.; + //} // zero energy grid arrays for (int ik=0; ik < ngridglobal; ik++){ @@ -624,7 +638,11 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) gridneigh[ninside][2] = ztmp; gridtype[ninside]=itype; // perform ACE evaluation with short neighbor list - acefimpl->ace->resize_neighbours_cache(ninside); +#ifdef DEBUG_FORCES_INDS + printf("ninside %d, nmax %d, ninsidegrid %d \n",ninside,nmax,ninsidegrid); +#endif + //acefimpl->ace->resize_neighbours_cache(ninside); + acefimpl->ace->resize_neighbours_cache(nmax); acefimpl->ace->compute_atom(ninside, gridneigh, gridtype, ninside, gridinside); Array1D Bs = acefimpl->ace->projections; // Accumulate descriptors on grid array @@ -644,12 +662,29 @@ void FixPythonAceGridForce::compute(int eflag, int vflag) for (int jj =0; jj < ninside;jj++){ int mj = gridj[jj]; for (int iicoeff = 0; iicoeff < ndesc; iicoeff++){ + //float cval = std::ceil(py_beta[igrid_global+base_array_rows][iicoeff] * 1000000000000.0) / 1000000000000.0; + float cval = std::ceil(py_beta[igrid_global+base_array_rows][iicoeff] * 1.0E12) / 1.0E12; + //cval = cval/ngridglobal; + //cval = cval/ninside; + // + // + //cval = cval/ntotal; DOUBLE_TYPE fx_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,0); DOUBLE_TYPE fy_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,1); DOUBLE_TYPE fz_dB = acefimpl->ace->neighbours_dB(iicoeff,jj,2); - f[atom->tag[mj]-1][0] -= fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - f[atom->tag[mj]-1][1] -= fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; - f[atom->tag[mj]-1][2] -= fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + f[atom->tag[mj]-1][0] -= fx_dB *cval; + f[atom->tag[mj]-1][1] -= fy_dB *cval; + f[atom->tag[mj]-1][2] -= fz_dB *cval; + //f[atom->tag[mj]-1][0] -= fx_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + //f[atom->tag[mj]-1][1] -= fy_dB *py_beta[igrid_global+base_array_rows][iicoeff]; + //f[atom->tag[mj]-1][2] -= fz_dB *py_beta[igrid_global+base_array_rows][iicoeff]; +#ifdef DEBUG_FORCES + float bval = std::ceil(py_beta[igrid_global+base_array_rows][iicoeff] * 1000000000000.0) / 1000000000000.0; + //if (py_beta[igrid_global+base_array_rows][iicoeff] != 0.0) { + if (bval != 0.0){ + printf("fx_dB %f fx_pybeta_cont %f prod %f %d \n",fx_dB,py_beta[igrid_global+base_array_rows][iicoeff],fx_dB*py_beta[igrid_global+base_array_rows][iicoeff],igrid_global); + } +#endif } } @@ -721,6 +756,12 @@ void FixPythonAceGridForce::process_pyarr(PyObject* arr) allocate_py_beta(); int pyrows = size_global_array_rows; int pycols = ndesc-ndesc_base; + // zero pybeta array + for (int pyi =0; pyi < pyrows; pyi++){ + for (int pyj =0; pyj < pycols; pyj++){ + py_beta[pyi][pyj] = 0.0; + } + } #if MPI_NUMPY MPI_Allreduce(pybeta, py_beta_contig, (size_global_array_rows*(ndesc-ndesc_base)), MPI_DOUBLE, MPI_SUM, world); #endif @@ -764,7 +805,9 @@ void FixPythonAceGridForce::post_force(int vflag) void FixPythonAceGridForce::pre_force(int vflag) { - //if (update->ntimestep % nevery != 0) return; + if (update->ntimestep % nevery != 0) return; + //printf("ntimestep, %d \n",update->ntimestep); + //if (update->ntimestep == 0) return; PyUtils::GIL lock; @@ -777,14 +820,21 @@ void FixPythonAceGridForce::pre_force(int vflag) allocate_grid(); // directly process python beta array - process_pyarr(result); + //process_pyarr(result); // compute ace descriptors on the grid - compute(1,0); + //compute(1,0); if (!result) { PyUtils::Print_Errors(); error->all(FLERR,"Fix python/acegridforce pre_force() method failed"); } + // directly process python beta array + process_pyarr(result); + // compute ace descriptors on the grid + compute(1,0); + Py_CLEAR(result); } + +#endif