name: valgrind-hipo

on: [push, pull_request]

jobs:
  unit_tests:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      
      - name: Install Valgrind
        run: sudo apt-get update && sudo apt-get install valgrind

      - name: Checkout METIS
        uses: actions/checkout@v4
        with:
          repository: galabovaa/METIS
          ref: 510-ts
          path: METIS

      - name: Create installs dir
        working-directory: ${{runner.workspace}}
        run: |
          mkdir installs
          ls

      - name: Install METIS
        run: |
          cmake \
          -S $GITHUB_WORKSPACE/METIS \
          -B build \
          -DGKLIB_PATH=${{ github.workspace }}/METIS/GKlib \
          -DCMAKE_INSTALL_PREFIX=${{ runner.workspace }}/installs
          cmake --build build --parallel
          cmake --install build

      # no default blas available on runner

      - name: Cache APT packages
        uses: actions/cache@v4
        with:
          path: |
            /var/cache/apt/archives
            /var/lib/apt/lists
          key: ${{ runner.os }}-apt-libopenblas

      - name: Install OpenBLAS
        shell: bash
        run: |
          sudo apt update
          sudo apt install libopenblas-dev
      - name: Create Build Environment
        run: cmake -E make_directory ${{runner.workspace}}/build

      - name: Configure CMake
        shell: bash
        working-directory: ${{runner.workspace}}/build
        run: |
          cmake $GITHUB_WORKSPACE -DHIPO=ON \
          -DCMAKE_BUILD_TYPE=Debug \
          -DALL_TESTS=ON \
          -DBLA_VENDOR=OpenBLAS \
          -DMETIS_ROOT=${{runner.workspace}}/installs

      - name: Build
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: |
          cmake --build . -j2

      - name: Test
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: |
          valgrind \
          --leak-check=full \
          --show-leak-kinds=all \
          --track-origins=yes \
          -s \
          ./bin/unit_tests \
          2>&1 | tee logfile

      - name: Check log for Errors
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: |
          cat logfile
          OUTPUT='ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)'
          if grep -q "$OUTPUT" logfile; then
            exit 0
          fi
          exit 1

  instance_tests:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest]

    steps:
      - uses: actions/checkout@v4

      - name: Install Valgrind
        run: sudo apt-get update && sudo apt-get install valgrind

      - name: Checkout METIS
        uses: actions/checkout@v4
        with:
          repository: galabovaa/METIS
          ref: 510-ts
          path: METIS

      - name: Create installs dir
        working-directory: ${{runner.workspace}}
        run: |
          mkdir installs
          ls

      - name: Install METIS
        run: |
          cmake \
          -S $GITHUB_WORKSPACE/METIS \
          -B build \
          -DGKLIB_PATH=${{ github.workspace }}/METIS/GKlib \
          -DCMAKE_INSTALL_PREFIX=${{ runner.workspace }}/installs
          cmake --build build --parallel
          cmake --install build

      # no default blas available on runner

      - name: Cache APT packages
        uses: actions/cache@v4
        with:
          path: |
            /var/cache/apt/archives
            /var/lib/apt/lists
          key: ${{ runner.os }}-apt-libopenblas

      - name: Install OpenBLAS
        shell: bash
        run: |
          sudo apt update
          sudo apt install libopenblas-dev
      - name: Create Build Environment
        run: cmake -E make_directory ${{runner.workspace}}/build

      - name: Create Build Environment
        run: cmake -E make_directory ${{runner.workspace}}/build

      - name: Configure CMake
        shell: bash
        working-directory: ${{runner.workspace}}/build
        run: |
          cmake $GITHUB_WORKSPACE -DHIPO=ON \
          -DCMAKE_BUILD_TYPE=Debug \
          -DALL_TESTS=ON \
          -DBLA_VENDOR=OpenBLAS \
          -DMETIS_ROOT=${{runner.workspace}}/installs

      - name: Build
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: |
          cmake --build . -j2

      - name: Test
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: |
          valgrind \
          --leak-check=full \
          --show-leak-kinds=all \
          --track-origins=yes \
          -s \
          ctest -E unit.* \
          --timeout 1000 \
          --output-on-failure \
          2>&1 | tee logfile2

      - name: Check log for Errors
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: |
          cat logfile2
          OUTPUT='ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)'
          if grep -q "$OUTPUT" logfile2; then
            exit 0
          fi
          exit 1

  examples:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest]

    steps:
      - uses: actions/checkout@v4

      - name: Install Valgrind
        run: sudo apt-get update && sudo apt-get install valgrind
      
      - name: Checkout METIS
        uses: actions/checkout@v4
        with:
          repository: galabovaa/METIS
          ref: 510-ts
          path: METIS

      - name: Create installs dir
        working-directory: ${{runner.workspace}}
        run: |
          mkdir installs
          ls

      - name: Install METIS
        run: |
          cmake \
          -S $GITHUB_WORKSPACE/METIS \
          -B build \
          -DGKLIB_PATH=${{ github.workspace }}/METIS/GKlib \
          -DCMAKE_INSTALL_PREFIX=${{ runner.workspace }}/installs
          cmake --build build --parallel
          cmake --install build

      # no default blas available on runner

      - name: Cache APT packages
        uses: actions/cache@v4
        with:
          path: |
            /var/cache/apt/archives
            /var/lib/apt/lists
          key: ${{ runner.os }}-apt-libopenblas

      - name: Install OpenBLAS
        shell: bash
        run: |
          sudo apt update
          sudo apt install libopenblas-dev
      - name: Create Build Environment
        run: cmake -E make_directory ${{runner.workspace}}/build

      - name: Create Build Environment
        run: cmake -E make_directory ${{runner.workspace}}/build

      - name: Configure CMake
        shell: bash
        working-directory: ${{runner.workspace}}/build
        run: |
          cmake $GITHUB_WORKSPACE -DHIPO=ON \
          -DCMAKE_BUILD_TYPE=Debug \
          -DALL_TESTS=ON \
          -DBLA_VENDOR=OpenBLAS \
          -DMETIS_ROOT=${{runner.workspace}}/installs


      - name: Build
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: |
          cmake --build . -j2

      - name: Test cpp example
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: |
          valgrind \
          --leak-check=full \
          --show-leak-kinds=all \
          --track-origins=yes \
          -s \
          ./bin/call_highs_from_cpp \
          --timeout 1000 \
          --output-on-failure \
          2>&1 | tee logfile2

      - name: Check log for Errors
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: |
          cat logfile2
          OUTPUT='ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)'
          if grep -q "$OUTPUT" logfile2; then
            exit 0
          fi
          exit 1
      
      - name: Test C example
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: |
          valgrind \
          --leak-check=full \
          --show-leak-kinds=all \
          --track-origins=yes \
          -s \
          ./bin/call_highs_from_c_minimal \
          --timeout 1000 \
          --output-on-failure \
          2>&1 | tee logfile2

      - name: Check log for Errors
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: |
          cat logfile2
          OUTPUT='ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)'
          if grep -q "$OUTPUT" logfile2; then
            exit 0
          fi
          exit 1