diff --git a/.github/workflows/recursive_test_matlab.yml b/.github/workflows/recursive_test_matlab.yml index e64b74d53c..10177c5c53 100644 --- a/.github/workflows/recursive_test_matlab.yml +++ b/.github/workflows/recursive_test_matlab.yml @@ -126,3 +126,116 @@ jobs: - name: Miscellaneous setup run: bash .github/scripts/misc_setup + - name: Decide gfortran version for MATLAB on Linux + if: startsWith(matrix.os, 'ubuntu') + run: | + GFVER=12 + if [[ "${{ matrix.os }}" = "ubuntu-20.04" ]] ; then + GFVER=11 + fi + if [[ "${{ matrix.matlab }}" = "R2020b" || "${{ matrix.matlab }}" = "R2021a" ]] ; then + GFVER=9 + fi + echo "GFVER=$GFVER" >> $GITHUB_ENV + - name: Set up gfortran on Linux + if: startsWith(matrix.os, 'ubuntu') + uses: fortran-lang/setup-fortran@main + with: + compiler: gcc + version: ${{ env.GFVER }} + - name: Check gfortran version on Linux + if: startsWith(matrix.os, 'ubuntu') + run: which gfortran && gfortran --version + + - name: Decide the version of oneAPI to use + shell: bash + run: | + ONEAPI_VERSION= + if [[ "${{ matrix.os }}" = "windows-"* ]] ; then + if [[ "${{ matrix.matlab }}" = "R2020"* || "${{ matrix.matlab }}" = "R2021"* || "${{ matrix.matlab }}" = "R2022"* || "${{ matrix.matlab }}" = "R2023"* ]] ; then + ONEAPI_VERSION=2023 + fi + fi + echo "ONEAPI_VERSION=$ONEAPI_VERSION" >> $GITHUB_ENV + echo "ONEAPI_VERSION:" $ONEAPI_VERSION + + - name: Install Intel oneAPI on macOS + if: startsWith(matrix.os, 'macos') + run: bash .github/scripts/install_oneapi_macos.sh $ONEAPI_VERSION + + - name: Install Intel oneAPI on Windows + if: startsWith(matrix.os, 'windows') + run: cmd.exe "/K" '".github\scripts\install_oneapi_windows.bat %ONEAPI_VERSION%"' + + - name: Set up MATLAB with optimization toolbox + uses: matlab-actions/setup-matlab@v2.1.2 + with: + release: ${{ matrix.matlab }} + cache: true + products: Optimization_Toolbox Parallel_Computing_Toolbox + + - name: Conduct the test + uses: matlab-actions/run-command@v2.1.1 + with: + command: | + ver; + root_dir = pwd(); + cd(fullfile(root_dir, 'matlab/tests')); + options = struct(); + if ~isempty('${{ inputs.random-seed }}') + options.seed = str2num('${{ inputs.random-seed }}'); + end + if ~isempty('${{ inputs.dimension }}') + options.n = str2num('${{ inputs.dimension }}'); + end + if ~isempty('${{ inputs.depth }}') + options.depth = str2num('${{ inputs.depth }}'); + end + options + + % Conduct the test multiple times, in case some errors occur not during the first time but later. + exception = []; + try + recursive('${{ matrix.solver }}', options); + options.compile = false; + % Test parallel invocation of the solvers + parfor i = 1 : 2 + recursive('${{ matrix.solver }}', options); + end + catch exception + end + + % Copy the crash dump files to root_dir if exceptions occur. + if ~isempty(exception) + copy_crash_dump_files(root_dir) + dir(root_dir) + rethrow(exception); + end + + + - name: Store artifacts + uses: actions/upload-artifact@v4.3.1 + if: always() # Always run even if the workflow is canceled manually or due to overtime. + with: + name: ${{ matrix.solver }} + path: | + matlab_crash_dump* + + + + # The following job check whether the tests were successful or cancelled due to timeout. + # N.B.: Remember to specify `continue-on-error: true` for the job of the tests. + check_success_timeout: + runs-on: ubuntu-latest + if: ${{ !cancelled() }} + needs: test + steps: + - name: Clone the GitHub actions scripts + uses: actions/checkout@v4 + with: + repository: equipez/github_actions_scripts + ssh-key: ${{ secrets.SSH_PRIVATE_KEY_ACT }} # This forces checkout to use SSH, not HTTPS + path: scripts + + - name: Check whether the tests were successful or cancelled due to timeout + run: bash scripts/check_success_timeout ${{ secrets.GITHUB_TOKEN }} ${{ github.repository }} ${{ github.run_id }} diff --git a/.github/workflows/stress_test_matlab.yml b/.github/workflows/stress_test_matlab.yml index e5cad11b0b..5323092194 100644 --- a/.github/workflows/stress_test_matlab.yml +++ b/.github/workflows/stress_test_matlab.yml @@ -124,3 +124,94 @@ jobs: - name: Miscellaneous setup run: bash .github/scripts/misc_setup + - name: Decide gfortran version for MATLAB on Linux + if: startsWith(matrix.os, 'ubuntu') + run: | + GFVER=12 + if [[ "${{ matrix.os }}" = "ubuntu-20.04" ]] ; then + GFVER=11 + fi + if [[ "${{ matrix.matlab }}" = "R2020b" || "${{ matrix.matlab }}" = "R2021a" ]] ; then + GFVER=9 + fi + echo "GFVER=$GFVER" >> $GITHUB_ENV + - name: Set up gfortran on Linux + if: startsWith(matrix.os, 'ubuntu') + uses: fortran-lang/setup-fortran@main + with: + compiler: gcc + version: ${{ env.GFVER }} + - name: Check gfortran version on Linux + if: startsWith(matrix.os, 'ubuntu') + run: which gfortran && gfortran --version + + - name: Decide the version of oneAPI to use + shell: bash + run: | + ONEAPI_VERSION= + if [[ "${{ matrix.os }}" = "windows-"* ]] ; then + if [[ "${{ matrix.matlab }}" = "R2020"* || "${{ matrix.matlab }}" = "R2021"* || "${{ matrix.matlab }}" = "R2022"* || "${{ matrix.matlab }}" = "R2023"* ]] ; then + ONEAPI_VERSION=2023 + fi + fi + echo "ONEAPI_VERSION=$ONEAPI_VERSION" >> $GITHUB_ENV + echo "ONEAPI_VERSION:" $ONEAPI_VERSION + + - name: Install Intel oneAPI on macOS + if: startsWith(matrix.os, 'macos') + run: bash .github/scripts/install_oneapi_macos.sh $ONEAPI_VERSION + + - name: Install Intel oneAPI on Windows + if: startsWith(matrix.os, 'windows') + run: cmd.exe "/K" '".github\scripts\install_oneapi_windows.bat %ONEAPI_VERSION%"' + + - name: Set up MATLAB with optimization toolbox + uses: matlab-actions/setup-matlab@v2.1.2 + with: + release: ${{ matrix.matlab }} + cache: true + products: Optimization_Toolbox Parallel_Computing_Toolbox + + - name: Revise the Fortran code to alternate the integer kind. + shell: bash + run: | + IK=$(( 2**(4 + $(date +%-d) % 3) )) + $SEDI "s|#define PRIMA_INTEGER_KIND 0|#define PRIMA_INTEGER_KIND ${IK}|g" fortran/common/ppf.h + cat fortran/common/ppf.h + + - name: Conduct the test + uses: matlab-actions/run-command@v2.1.1 + with: + command: | + ver; + root_dir = pwd(); + cd(fullfile(root_dir, 'matlab/tests')); + options = struct(); + if ~isempty('${{ inputs.random-seed }}') + options.seed = str2num('${{ inputs.random-seed }}'); + end + options.tough = strcmp('${{ matrix.test }}', 'tough'); + if ~isempty('${{ inputs.precision }}') + options.precision = '${{ inputs.precision }}'; + else + options.precision = 'date'; + end + stress('${{ matrix.solver }}', options); + + + # The following job check whether the tests were successful or cancelled due to timeout. + # N.B.: Remember to specify `continue-on-error: true` for the job of the tests. + check_success_timeout: + runs-on: ubuntu-latest + if: ${{ !cancelled() }} + needs: test + steps: + - name: Clone the GitHub actions scripts + uses: actions/checkout@v4 + with: + repository: equipez/github_actions_scripts + ssh-key: ${{ secrets.SSH_PRIVATE_KEY_ACT }} # This forces checkout to use SSH, not HTTPS + path: scripts + + - name: Check whether the tests were successful or cancelled due to timeout + run: bash scripts/check_success_timeout ${{ secrets.GITHUB_TOKEN }} ${{ github.repository }} ${{ github.run_id }} diff --git a/.github/workflows/test_matlab.yml b/.github/workflows/test_matlab.yml index b553ebd42e..3e8b4a0cee 100644 --- a/.github/workflows/test_matlab.yml +++ b/.github/workflows/test_matlab.yml @@ -119,3 +119,56 @@ jobs: # $SEDI "s/cstrv = maxval(\[ZERO, -constr\])/cstrv = maxval([\ZERO, -constr\])\n write(*,*) 'x = ', x(1:n)\n write(*,*) 'f = ', f\n write(*,*) 'constr = ', constr(1:m)\n write(*,*) 'cstrv = ', cstrv/" cobylb.f # cat cobylb.f + - name: Decide gfortran version for MATLAB on Linux + if: startsWith(matrix.os, 'ubuntu') + run: | + GFVER=${{ env.GFORTRAN_VERSION }} + if [[ "${{ matrix.os }}" = "ubuntu-20.04" ]] ; then + GFVER=11 + fi + if [[ "${{ matrix.matlab }}" = "R2020b" || "${{ matrix.matlab }}" = "R2021a" || "${{ matrix.matlab }}" = "R2021b" ]] ; then + GFVER=9 + fi + echo "GFVER=$GFVER" >> $GITHUB_ENV + - name: Set up gfortran on Linux + if: startsWith(matrix.os, 'ubuntu') + uses: fortran-lang/setup-fortran@main + with: + compiler: gcc + version: ${{ env.GFVER }} + - name: Check gfortran version on Linux + if: startsWith(matrix.os, 'ubuntu') + run: which gfortran && gfortran --version + + - name: Decide the version of oneAPI to use + shell: bash + run: | + ONEAPI_VERSION= + if [[ "${{ matrix.os }}" = "windows-"* ]] ; then + if [[ "${{ matrix.matlab }}" = "R2020"* || "${{ matrix.matlab }}" = "R2021"* || "${{ matrix.matlab }}" = "R2022"* || "${{ matrix.matlab }}" = "R2023"* ]] ; then + ONEAPI_VERSION=2023 + fi + fi + echo "ONEAPI_VERSION=$ONEAPI_VERSION" >> $GITHUB_ENV + echo "ONEAPI_VERSION:" $ONEAPI_VERSION + + - name: Install Intel oneAPI on macOS + if: startsWith(matrix.os, 'macos') + run: bash .github/scripts/install_oneapi_macos.sh $ONEAPI_VERSION + + - name: Install Intel oneAPI on Windows + if: startsWith(matrix.os, 'windows') + run: cmd.exe "/K" '".github\scripts\install_oneapi_windows.bat %ONEAPI_VERSION%"' + + - name: Set up MATLAB + uses: matlab-actions/setup-matlab@v2.1.2 + with: + release: ${{ matrix.matlab }} + cache: true + products: Parallel_Computing_Toolbox + + - name: Conduct the test + uses: matlab-actions/run-command@v2.1.1 + with: + command: | + cd matlab/tests; testprima_ex(); diff --git a/.github/workflows/test_matlab_linux.yml b/.github/workflows/test_matlab_linux.yml index 5b5ac853b2..1a18c9fe7b 100644 --- a/.github/workflows/test_matlab_linux.yml +++ b/.github/workflows/test_matlab_linux.yml @@ -64,3 +64,56 @@ jobs: $SEDI "s/max(\[0, chist\]) > 0)/max(\[0, chist\]) > 0)\nprobinfo.raw_data\noutput\nchist/" postprima.m cat postprima.m + - name: Decide gfortran version for MATLAB on Linux + if: startsWith(matrix.os, 'ubuntu') + run: | + GFVER=${{ env.GFORTRAN_VERSION }} + if [[ "${{ matrix.os }}" = "ubuntu-20.04" ]] ; then + GFVER=11 + fi + if [[ "${{ matrix.matlab }}" = "R2020b" || "${{ matrix.matlab }}" = "R2021a" || "${{ matrix.matlab }}" = "R2021b" ]] ; then + GFVER=9 + fi + echo "GFVER=$GFVER" >> $GITHUB_ENV + - name: Set up gfortran on Linux + if: startsWith(matrix.os, 'ubuntu') + uses: fortran-lang/setup-fortran@main + with: + compiler: gcc + version: ${{ env.GFVER }} + - name: Check gfortran version on Linux + if: startsWith(matrix.os, 'ubuntu') + run: which gfortran && gfortran --version + + - name: Decide the version of oneAPI to use + shell: bash + run: | + ONEAPI_VERSION= + if [[ "${{ matrix.os }}" = "windows-"* ]] ; then + if [[ "${{ matrix.matlab }}" = "R2020"* || "${{ matrix.matlab }}" = "R2021"* || "${{ matrix.matlab }}" = "R2022"* || "${{ matrix.matlab }}" = "R2023"* ]] ; then + ONEAPI_VERSION=2023 + fi + fi + echo "ONEAPI_VERSION=$ONEAPI_VERSION" >> $GITHUB_ENV + echo "ONEAPI_VERSION:" $ONEAPI_VERSION + + - name: Install Intel oneAPI on macOS + if: startsWith(matrix.os, 'macos') + run: bash .github/scripts/install_oneapi_macos.sh $ONEAPI_VERSION + + - name: Install Intel oneAPI on Windows + if: startsWith(matrix.os, 'windows') + run: cmd.exe "/K" '".github\scripts\install_oneapi_windows.bat %ONEAPI_VERSION%"' + + - name: Set up MATLAB + uses: matlab-actions/setup-matlab@v2.1.2 + with: + release: ${{ matrix.matlab }} + cache: true + products: Parallel_Computing_Toolbox + + - name: Conduct the test + uses: matlab-actions/run-command@v2.1.1 + with: + command: | + cd matlab/tests; testprima_ex(); diff --git a/.github/workflows/test_matlab_mac_intel.yml b/.github/workflows/test_matlab_mac_intel.yml index 69d9ec4e90..991e22e6aa 100644 --- a/.github/workflows/test_matlab_mac_intel.yml +++ b/.github/workflows/test_matlab_mac_intel.yml @@ -64,3 +64,35 @@ jobs: $SEDI "s/max(\[0, chist\]) > 0)/max(\[0, chist\]) > 0)\nprobinfo.raw_data\noutput\nchist/" postprima.m cat postprima.m + - name: Decide the version of oneAPI to use + shell: bash + run: | + ONEAPI_VERSION= + if [[ "${{ matrix.os }}" = "windows-"* ]] ; then + if [[ "${{ matrix.matlab }}" = "R2020"* || "${{ matrix.matlab }}" = "R2021"* || "${{ matrix.matlab }}" = "R2022"* || "${{ matrix.matlab }}" = "R2023"* ]] ; then + ONEAPI_VERSION=2023 + fi + fi + echo "ONEAPI_VERSION=$ONEAPI_VERSION" >> $GITHUB_ENV + echo "ONEAPI_VERSION:" $ONEAPI_VERSION + + - name: Install Intel oneAPI on macOS + if: startsWith(matrix.os, 'macos') + run: bash .github/scripts/install_oneapi_macos.sh $ONEAPI_VERSION + + - name: Install Intel oneAPI on Windows + if: startsWith(matrix.os, 'windows') + run: cmd.exe "/K" '".github\scripts\install_oneapi_windows.bat %ONEAPI_VERSION%"' + + - name: Set up MATLAB + uses: matlab-actions/setup-matlab@v2.1.2 + with: + release: ${{ matrix.matlab }} + cache: true + products: Parallel_Computing_Toolbox + + - name: Conduct the test + uses: matlab-actions/run-command@v2.1.1 + with: + command: | + cd matlab/tests; testprima_ex(); diff --git a/.github/workflows/test_matlab_windows.yml b/.github/workflows/test_matlab_windows.yml index 0f5861e9ce..2a0f586448 100644 --- a/.github/workflows/test_matlab_windows.yml +++ b/.github/workflows/test_matlab_windows.yml @@ -64,3 +64,35 @@ jobs: $SEDI "s/max(\[0, chist\]) > 0)/max(\[0, chist\]) > 0)\nprobinfo.raw_data\noutput\nchist/" postprima.m cat postprima.m + - name: Decide the version of oneAPI to use + shell: bash + run: | + ONEAPI_VERSION= + if [[ "${{ matrix.os }}" = "windows-"* ]] ; then + if [[ "${{ matrix.matlab }}" = "R2020"* || "${{ matrix.matlab }}" = "R2021"* || "${{ matrix.matlab }}" = "R2022"* || "${{ matrix.matlab }}" = "R2023"* ]] ; then + ONEAPI_VERSION=2023 + fi + fi + echo "ONEAPI_VERSION=$ONEAPI_VERSION" >> $GITHUB_ENV + echo "ONEAPI_VERSION:" $ONEAPI_VERSION + + - name: Install Intel oneAPI on macOS + if: startsWith(matrix.os, 'macos') + run: bash .github/scripts/install_oneapi_macos.sh $ONEAPI_VERSION + + - name: Install Intel oneAPI on Windows + if: startsWith(matrix.os, 'windows') + run: cmd.exe "/K" '".github\scripts\install_oneapi_windows.bat %ONEAPI_VERSION%"' + + - name: Set up MATLAB + uses: matlab-actions/setup-matlab@v2.1.2 + with: + release: ${{ matrix.matlab }} + cache: true + products: Parallel_Computing_Toolbox + + - name: Conduct the test + uses: matlab-actions/run-command@v2.1.1 + with: + command: | + cd matlab/tests; testprima_ex();