diff --git a/.github/actions/alf_test/action.yml b/.github/actions/alf_test/action.yml index ef6759193..b4c970cf4 100644 --- a/.github/actions/alf_test/action.yml +++ b/.github/actions/alf_test/action.yml @@ -9,25 +9,40 @@ runs: using: "composite" steps: - name: macOS Toolchain install - if: runner.os == 'macOS' + id: mac_toolchain shell: bash run: | brew update - brew install gcc cmake open-mpi + brew install mpich gcc_version=$(brew list --versions gcc | grep -o '[0-9]\+' | head -1) bindir=$(brew --prefix)/bin ln -fs ${bindir}/gfortran-${gcc_version} /usr/local/bin/gfortran ln -fs ${bindir}/gcc-${gcc_version} /usr/local/bin/gcc ln -fs ${bindir}/g++-${gcc_version} /usr/local/bin/g++ + echo "gcc_version=$gcc_version" >> $GITHUB_OUTPUT - - name: Build & Test + - name: Get number of processors + shell: bash + run: | + if [[ $(uname) == "Darwin" ]]; then + NPROC=$(sysctl -n hw.ncpu) + else + NPROC=$(nproc) + fi + echo "There are $NPROC processors available." + + - name: Restore HDF5 cache + if: runner.os == 'macOS' + uses: actions/cache@v5 + with: + key: macos-HDF5-${{ steps.mac_toolchain.outputs.gcc_version }} + path: HDF5/*/ + - name: Build & Test shell: bash env: ARGS: ${{ inputs.args }} - OMPI_ALLOW_RUN_AS_ROOT: 1 # needed for mpi runnig as root, needed by github runner - OMPI_ALLOW_RUN_AS_ROOT_CONFIRM: 1 run: | . ./configure.sh $ARGS echo $ALF_FC @@ -42,7 +57,9 @@ runs: if echo "$MODE" | grep -iq -e "serial" -e "noMPI"; then "$ALF_DIR/Prog/ALF.out" else - mpiexec -n 2 "$ALF_DIR/Prog/ALF.out" # only 2 cores available in githubs runners + MPI_OPTS="-n 4" + mpiexec --version | grep -iq -e 'Open MPI' -e 'OpenRTE' && MPI_OPTS="$MPI_OPTS --use-hwthread-cpus" + mpiexec $MPI_OPTS "$ALF_DIR/Prog/ALF.out" fi if echo "$MODE" | grep -iq -e "TEMPERING" -e "PARALLEL_PARAMS"; then cd Temp_0; fi if echo "$CONFIG_ARGS" | grep -iq "HDF5"; then @@ -50,10 +67,17 @@ runs: else "$ALF_DIR/Analysis/ana.out" * fi + + - name: Run unit tests + shell: bash + env: + ARGS: ${{ inputs.args }} + run: | + . ./configure.sh $ARGS mkdir -p "$ALF_DIR/testsuite/tests" cd "$ALF_DIR/testsuite/tests" if echo "$ALF_FC" | grep -q "mpiifort -fc=ifx"; then exit 0; fi cmake .. cmake --build . --target all --config Release ctest -VV -O log.txt - grep "tests passed" log.txt | cut -d " " -f 1 \ No newline at end of file + grep "tests passed" log.txt | cut -d " " -f 1 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 62c5cd931..50e77b86d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,10 +1,11 @@ name: CI on: - push: - branches: ["**"] - pull_request: - branches: ["**"] + workflow_dispatch: +# push: +# branches: ["**"] +# pull_request: +# branches: ["**"] permissions: contents: read @@ -20,7 +21,7 @@ concurrency: jobs: lint_stopcommands: name: Lint Fortran STOP statements - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - uses: actions/checkout@v4 - name: Check for forbidden STOP/ERROR STOP @@ -62,7 +63,7 @@ jobs: create_doxygen: name: Generate Doxygen HTML - runs-on: ubuntu-latest + runs-on: ubuntu-slim needs: [lint_stopcommands] steps: - uses: actions/checkout@v4 @@ -82,7 +83,7 @@ jobs: deploy_pages: name: Deploy GitHub Pages (master only) - runs-on: ubuntu-latest + runs-on: ubuntu-slim needs: [create_doc, create_doxygen] if: github.ref == 'refs/heads/master' environment: @@ -116,97 +117,33 @@ jobs: # Linux tests # ====================== - test_linux_gnu: - name: ${{ matrix.image_minor }} · ${{ matrix.mode }} · ${{ matrix.devel }} · ${{ matrix.config }} + test_linux: + name: ${{ matrix.image_minor[0] }} · ${{ matrix.mode }} · ${{ matrix.devel }} · ${{ matrix.config }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: - image_minor: [bullseye, bookworm, trixie] + image_minor: + - [bullseye, GNU] + - [bookworm, GNU] + - [trixie, GNU] + - [bullseye-openblas, GNU] + # - [tumbleweed, GNU] + - [bullseye-pgi-21-03, PGI] + - [bookworm-pgi-24-09, PGI] + - [bullseye-intel, INTEL] + - [bookworm-intel-2024.2, INTEL] + - [bookworm-intel, INTELLLVM] mode: [noMPI, MPI, TEMPERING, PARALLEL_PARAMS] devel: ["", "Devel"] config: ["", "HDF5"] container: - image: ghcr.io/alf-qmc/alf-container/alf-requirements/${{ matrix.image_minor }} - options: --user 0 + image: ghcr.io/alf-qmc/alf-container/alf-requirements/${{ matrix.image_minor[0] }} steps: - uses: actions/checkout@v4 - uses: ./.github/actions/alf_test with: - args: GNU ${{ matrix.mode }} ${{ matrix.devel }} ${{ matrix.config }} - - test_linux_gnu_openblas: - name: bullseye-openblas · ${{ matrix.devel }} · ${{ matrix.config }} - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - devel: ["", "Devel"] - config: ["", "HDF5"] - container: - image: ghcr.io/alf-qmc/alf-container/alf-requirements/bullseye-openblas - options: --user 0 - steps: - - uses: actions/checkout@v4 - - uses: ./.github/actions/alf_test - with: - args: GNU ${{ matrix.mode }} ${{ matrix.devel }} ${{ matrix.config }} - - test_linux_pgi: - name: bullseye-pgi-21-03 · ${{ matrix.mode }} · ${{ matrix.devel }} · ${{ matrix.config }} - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - mode: [noMPI, MPI, TEMPERING, PARALLEL_PARAMS] - devel: ["", "Devel"] - config: ["", "HDF5"] - container: - image: ghcr.io/alf-qmc/alf-container/alf-requirements/bullseye-pgi-21-03 - options: --user 0 - steps: - - uses: actions/checkout@v4 - - uses: ./.github/actions/alf_test - with: - with: - args: PGI ${{ matrix.mode }} ${{ matrix.devel }} ${{ matrix.config }} - - test_linux_intel: - name: ${{ matrix.image_minor }} · ${{ matrix.mode }} · ${{ matrix.devel }} · ${{ matrix.config }} - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - image_minor: [bullseye-intel, bookworm-intel-2024.2] - mode: [noMPI, MPI, TEMPERING, PARALLEL_PARAMS] - devel: ["", "Devel"] - config: ["", "HDF5"] - container: - image: ghcr.io/alf-qmc/alf-container/alf-requirements/${{ matrix.image_minor }} - options: --user 0 - steps: - - uses: actions/checkout@v4 - - uses: ./.github/actions/alf_test - with: - args: INTEL ${{ matrix.mode }} ${{ matrix.devel }} ${{ matrix.config }} - - test_linux_intelllvm: - name: bookworm-intel · ${{ matrix.mode }} · ${{ matrix.devel }} · ${{ matrix.config }} - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - mode: [noMPI, MPI, TEMPERING, PARALLEL_PARAMS] - devel: ["", "Devel"] - config: ["", "HDF5"] - container: - image: ghcr.io/alf-qmc/alf-container/alf-requirements/bookworm-intel - options: --user 0 - steps: - - uses: actions/checkout@v4 - - uses: ./.github/actions/alf_test - with: - args: INTELLLVM ${{ matrix.mode }} ${{ matrix.devel }} ${{ matrix.config }} + args: ${{ matrix.image_minor[1] }} ${{ matrix.mode }} ${{ matrix.devel }} ${{ matrix.config }} test_macos: name: macOS · ${{ matrix.mode }} · ${{ matrix.devel }} @@ -216,6 +153,7 @@ jobs: matrix: mode: [noMPI, MPI, TEMPERING, PARALLEL_PARAMS] devel: ["", "Devel"] + config: ["", "HDF5"] steps: - uses: actions/checkout@v4 - uses: ./.github/actions/alf_test @@ -230,13 +168,11 @@ jobs: runs-on: ubuntu-latest container: image: ghcr.io/alf-qmc/alf-container/alf-requirements/bullseye - options: --user 0 steps: - uses: actions/checkout@v4 - name: Run Valgrind shell: bash run: | - apt-get update && apt-get install -y valgrind . ./configure.sh GNU devel serial gfortran -v make lib diff --git a/.github/workflows/test-branch.yaml b/.github/workflows/test-branch.yaml new file mode 100644 index 000000000..aa6786bc5 --- /dev/null +++ b/.github/workflows/test-branch.yaml @@ -0,0 +1,110 @@ +name: Test vs main branch + +on: workflow_dispatch + +jobs: + test_branch: + # needs: prepare + runs-on: ubuntu-latest + container: + image: ghcr.io/alf-qmc/alf-container/pyalf-requirements/${{ matrix.image[0] }} + strategy: + fail-fast: false + matrix: + image: + - [bullseye, GNU] + - [bookworm, GNU] + - [trixie, GNU] + # - [bullseye-openblas, GNU] + # - [tumbleweed, GNU] + - [bullseye-pgi-21-03, PGI] + - [bookworm-pgi-24-09, PGI] + - [bullseye-intel, INTEL] + - [bookworm-intel-2024.2, INTEL] + - [bookworm-intel, INTELLLVM] + steps: + - name: Install pyALF + run: pip install --no-deps pyALF + - uses: actions/checkout@v6 + with: + ref: master + - uses: actions/checkout@v6 + with: + ref: ${{ github.event.inputs.test_branch || github.ref_name }} + - name: Check if mpiexec supports --use-hwthread-cpus + id: mpi_flag_check + run: mpiexec --version | grep -iq -e 'Open MPI' -e 'OpenRTE' && + echo "value='--mpiexec_args=--use-hwthread-cpus'" >> $GITHUB_OUTPUT || + echo "No Open MPI, so --use-hwthread-cpus not needed" + - name: Run ALF test vs main branch + run: alf_test_branch + --alfdir $PWD + --sim_pars $PWD/testsuite/test_branch_parameters.json + --machine ${{ matrix.image[1] }} + --mpi + --n_mpi 4 + --branch_T ${{ github.event.inputs.test_branch || github.ref_name }} + --branch_R master + --devel + ${{ steps.mpi_flag_check.outputs.value }} + - name: Upload test branch results + if: always() + uses: actions/upload-artifact@v6 + with: + name: test-branch-results-${{ matrix.image[0] }}-${{ matrix.image[1] }} + path: + test.txt + + test_branch_macos: + runs-on: macos-latest + strategy: + fail-fast: false + matrix: + compiler: [GNU] + steps: + - name: Install pyALF + run: pipx install pyALF + + - name: macOS Toolchain install + id: mac_toolchain + run: | + brew update + brew install mpich + gcc_version=$(brew list --versions gcc | grep -o '[0-9]\+' | head -1) + bindir=$(brew --prefix)/bin + ln -fs ${bindir}/gfortran-${gcc_version} /usr/local/bin/gfortran + ln -fs ${bindir}/gcc-${gcc_version} /usr/local/bin/gcc + ln -fs ${bindir}/g++-${gcc_version} /usr/local/bin/g++ + echo "gcc_version=$gcc_version" >> $GITHUB_OUTPUT + + - uses: actions/checkout@v6 + with: + ref: master + - uses: actions/checkout@v6 + with: + ref: ${{ github.event.inputs.test_branch || github.ref_name }} + + - name: Restore HDF5 cache + uses: actions/cache@v5 + with: + key: macos-HDF5-${{ steps.mac_toolchain.outputs.gcc_version }} + path: HDF5/*/ + + - name: Run ALF test vs main branch on macOS + run: alf_test_branch + --alfdir $PWD + --sim_pars $PWD/testsuite/test_branch_parameters.json + --machine ${{ matrix.compiler }} + --mpi + --n_mpi 4 + --branch_T ${{ github.event.inputs.test_branch || github.ref_name }} + --branch_R master + --devel + + - name: Upload test branch results macOS + if: always() + uses: actions/upload-artifact@v6 + with: + name: test-branch-results-macos-${{ matrix.compiler }} + path: + test.txt \ No newline at end of file diff --git a/.github/workflows/test-vs-ed.yaml b/.github/workflows/test-vs-ed.yaml new file mode 100644 index 000000000..988e99799 --- /dev/null +++ b/.github/workflows/test-vs-ed.yaml @@ -0,0 +1,106 @@ +name: Test vs given ED reference results +on: + workflow_dispatch: + push: + branches: ["adapt-test-branch"] + +jobs: + prepare_matrix: + runs-on: ubuntu-latest + outputs: + compile_matrix: ${{ steps.set-matrix.outputs.compile_matrix }} + simulation_matrix: ${{ steps.set-matrix.outputs.simulation_matrix }} + steps: + - uses: actions/checkout@v6 + + - id: set-matrix + run: ./testsuite/test_vs_ed/prep_test.py + + - name: Upload prepared test directories + uses: actions/upload-artifact@v6 + with: + name: prepared-test-directories + path: testsuite/test_vs_ed/*/ + compile: + needs: prepare_matrix + runs-on: ubuntu-latest + container: + image: ${{ matrix.image }} + strategy: + fail-fast: false + matrix: + include: ${{ fromJson(needs.prepare_matrix.outputs.compile_matrix) }} + steps: + - name: Install pyALF + run: pip install --no-deps pyALF + - uses: actions/checkout@v6 + - name: Download prepared test directories + uses: actions/download-artifact@v7 + with: + name: prepared-test-directories + path: testsuite/test_vs_ed/ + - run: ls -la $PWD + - run: ls -la testsuite/test_vs_ed/ + - run: ls -la testsuite/test_vs_ed/${{ matrix.test_name }}_${{ matrix.env_name }} + - name: Compile ALF + run: cd testsuite/test_vs_ed/${{ matrix.test_name }}_${{ matrix.env_name }} && ../compile.py ${{ matrix.machine }} + - name: Upload compiled ALF binary and test directory + uses: actions/upload-artifact@v6 + with: + name: simdir-${{ matrix.test_name }}-${{ matrix.env_name }}-${{ matrix.machine }} + path: testsuite/test_vs_ed/${{ matrix.test_name }}_${{ matrix.env_name }} + + simulate: + needs: [prepare_matrix, compile] + runs-on: ubuntu-latest + container: + image: ${{ matrix.image }} + strategy: + fail-fast: false + matrix: + include: ${{ fromJson(needs.prepare_matrix.outputs.simulation_matrix) }} + steps: + - name: Download compiled ALF binary + uses: actions/download-artifact@v7 + with: + name: simdir-${{ matrix.test_name }}-${{ matrix.env_name }}-${{ matrix.machine }} + path: testsuite/test_vs_ed/${{ matrix.test_name }}_${{ matrix.env_name }} + - run: ls -la $PWD + - run: ls -la testsuite/test_vs_ed/ + - run: ls -la testsuite/test_vs_ed/${{ matrix.test_name }}_${{ matrix.env_name }} + - run: chmod +x testsuite/test_vs_ed/${{ matrix.test_name }}_${{ matrix.env_name }}/ALF.out + - name: Run ALF test vs main branch + run: cd testsuite/test_vs_ed/${{ matrix.test_name }}_${{ matrix.env_name }}/${{ matrix.CI_NODE_INDEX }} && mpiexec -n 2 ../ALF.out + + - name: Upload simulation results + uses: actions/upload-artifact@v6 + with: + name: simulation-results-${{ matrix.test_name }}-${{ matrix.env_name }}-${{ matrix.machine }}-${{ matrix.CI_NODE_INDEX }} + path: testsuite/test_vs_ed/ + + analyze: + needs: simulate + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Install pyALF + run: pip install --no-deps pyALF + - name: Download simulation results + uses: actions/download-artifact@v7 + with: + path: testsuite/test_vs_ed/ + - name: Analyze simulation results + run: | + cd testsuite/test_vs_ed + for dir in */; do + cd "$dir" && ../analysis.py + cd .. + done + # - name: Upload compiled ALF binary and test directory + # uses: actions/upload-artifact@v6 + # with: + # name: simdir-${{ matrix.test_dir }}-${{ matrix.image[0] }}-${{ matrix.image[1] }} + # path: | + # ${{ matrix.test_dir }}/results.json + # ${{ matrix.test_dir }}/test.png + # ${{ matrix.test_dir }}/spec.yaml diff --git a/Documentation/Makefile b/Documentation/Makefile new file mode 100644 index 000000000..0db8a54ea --- /dev/null +++ b/Documentation/Makefile @@ -0,0 +1,5 @@ +.PHONY: doc.pdf + +doc.pdf: + latexmk -pdf doc.tex + ./create-hash.sh diff --git a/Documentation/create-hash.sh b/Documentation/create-hash.sh new file mode 100755 index 000000000..233e1d29f --- /dev/null +++ b/Documentation/create-hash.sh @@ -0,0 +1,5 @@ +#!/bin/sh +# Create a SHA256 hash of all relevant documentation files. +# Useful for checking if the document has changed. + +cat ./*.tex $(find Figures -name "*.pdf" | sort) $(find Figures -name "*.png" | sort) doc.bib fassaad.bib | sha256sum | cut -f1 -d' ' > doc.hash diff --git a/Documentation/doc.hash b/Documentation/doc.hash new file mode 100644 index 000000000..77fabb67c --- /dev/null +++ b/Documentation/doc.hash @@ -0,0 +1 @@ +823813a7a17a2ad994f11df8036bfad765930fea36c15967c2babdf79ca0229e diff --git a/testsuite/test_branch_generate_config.py b/testsuite/test_branch_generate_config.py index e0a6e8d30..69f0f2335 100755 --- a/testsuite/test_branch_generate_config.py +++ b/testsuite/test_branch_generate_config.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -import sys +import argparse import json import copy import yaml @@ -155,12 +155,15 @@ def prep_runs(test_specs, env_name, env_spec): } if __name__ == "__main__": - try: - specs_file = sys.argv[1] - except IndexError: - specs_file = "testsuite/test_branch_parameters.json" + parser = argparse.ArgumentParser() + parser.add_argument('specs_file', nargs='?', default="testsuite/test_branch_parameters.json") + parser.add_argument('--github', action='store_true', + help="Generate matrix for GitHub Actions workflow instead of GitLab CI config") + args = parser.parse_args() + if args.github: + raise NotImplementedError("GitHub Actions config generation not implemented yet.") - with open(specs_file, 'r', encoding='UTF-8') as f: + with open(args.specs_file, 'r', encoding='UTF-8') as f: test_specs = json.load(f) for env_name, env_spec in ENVIRONMENTS.items(): diff --git a/testsuite/test_vs_ed/compile.py b/testsuite/test_vs_ed/compile.py index 0b40c18d9..eae589a51 100755 --- a/testsuite/test_vs_ed/compile.py +++ b/testsuite/test_vs_ed/compile.py @@ -10,7 +10,7 @@ if __name__ == "__main__": machine = sys.argv[1] with open("spec.yaml", 'r', encoding='UTF-8') as f: - spec = yaml.load(f, yaml.Loader) + spec = yaml.safe_load(f) alf_src = ALF_source(alf_dir='../../..') sims = [] @@ -22,6 +22,7 @@ sim_root='.', sim_dir=f'{i+1}', machine=machine, + mpi=True, ) sims.append(sim) diff --git a/testsuite/test_vs_ed/prep_test.py b/testsuite/test_vs_ed/prep_test.py index 8cf1b96d2..619a8b979 100755 --- a/testsuite/test_vs_ed/prep_test.py +++ b/testsuite/test_vs_ed/prep_test.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 +import json import os import sys import yaml import copy -pipeline_config = yaml.load(""" +pipeline_config = yaml.safe_load(""" default: tags: - k8s @@ -72,7 +73,7 @@ - $TEST_DIR/test.png - $TEST_DIR/spec.yaml when: always -""", yaml.Loader) +""") def prep_runs(test_name, test_spec, env_name, env_spec): @@ -115,11 +116,33 @@ def prep_runs(test_name, test_spec, env_name, env_spec): except IndexError: specs_file = "testsuite/test_vs_ed/test_specs.yaml" with open(specs_file, 'r', encoding='UTF-8') as f: - test_specs = yaml.load(f, yaml.Loader) + test_specs = yaml.safe_load(f) + + compile_matrix = [] + simulation_matrix = [] + analysis_matrix = [] for test_name, test_spec in test_specs.items(): for env_name, env_spec in test_spec['environments'].items(): prep_runs(test_name, test_spec, env_name, env_spec) + compile_matrix.append({ + 'test_name': test_name, + 'env_name': env_name, + 'machine': env_spec['variables']['MACHINE'], + 'image': env_spec['image'], + }) + for i, _ in enumerate(test_spec["sim_dicts"]): + simulation_matrix.append({ + 'test_name': test_name, + 'env_name': env_name, + 'machine': env_spec['variables']['MACHINE'], + 'image': env_spec['image'], + 'CI_NODE_INDEX': i+1, + }) + + with open(os.getenv('GITHUB_OUTPUT', 'test.json'), 'w+', encoding='UTF-8') as f: + f.write(f'compile_matrix={json.dumps(compile_matrix)}\n') + f.write(f'simulation_matrix={json.dumps(simulation_matrix)}') with open('generated-config.yml', 'w', encoding='UTF-8') as f: f.write(yaml.dump(pipeline_config)) diff --git a/testsuite/test_vs_ed/test_specs.yaml b/testsuite/test_vs_ed/test_specs.yaml index f94982d4c..fcd439dad 100644 --- a/testsuite/test_vs_ed/test_specs.yaml +++ b/testsuite/test_vs_ed/test_specs.yaml @@ -1,26 +1,26 @@ hubbard_finT_chain: environments: &environments Bullseye: - image: git.physik.uni-wuerzburg.de:25812/alf/alf_docker/pyalf-requirements/bullseye + image: ghcr.io/alf-qmc/alf-container/pyalf-requirements/bullseye variables: {MACHINE: GNU} Bookworm: - image: git.physik.uni-wuerzburg.de:25812/alf/alf_docker/pyalf-requirements/bookworm + image: ghcr.io/alf-qmc/alf-container/pyalf-requirements/bookworm variables: {MACHINE: GNU} Intel21: - image: git.physik.uni-wuerzburg.de:25812/alf/alf_docker/pyalf-requirements/bullseye-intel + image: ghcr.io/alf-qmc/alf-container/pyalf-requirements/bullseye-intel variables: {MACHINE: INTEL} Intel-2024.2: - image: git.physik.uni-wuerzburg.de:25812/alf/alf_docker/pyalf-requirements/bookworm-intel-2024.2 + image: ghcr.io/alf-qmc/alf-container/pyalf-requirements/bookworm-intel-2024.2 variables: {MACHINE: INTEL} IntelLLVM-Latest: - image: git.physik.uni-wuerzburg.de:25812/alf/alf_docker/pyalf-requirements/bookworm-intel + image: ghcr.io/alf-qmc/alf-container/pyalf-requirements/bookworm-intel variables: {MACHINE: IntelLLVM} PGI-21-03: - image: git.physik.uni-wuerzburg.de:25812/alf/alf_docker/pyalf-requirements/bullseye-pgi-21-03 + image: ghcr.io/alf-qmc/alf-container/pyalf-requirements/bullseye-pgi-21-03 variables: {MACHINE: PGI} - macGNU: - tags: ['macos'] - variables: {MACHINE: GNU} + # macGNU: + # tags: ['macos'] + # variables: {MACHINE: GNU} ham_name: "Hubbard" ed_energy: -1.47261997 max_sigma: 3