Skip to content

Add exatn cpp binding #4295

Add exatn cpp binding

Add exatn cpp binding #4295

name: Testing::x86_64::LQubit::Python
on:
workflow_call:
inputs:
lightning-version:
type: string
required: true
description: The version of Lightning to use. Valid values are either 'release' (most recent release candidate), 'stable' (most recent git-tag) or 'latest' (most recent commit from master)
pennylane-version:
type: string
required: true
description: The version of PennyLane to use. Valid values are either 'release' (most recent release candidate), 'stable' (most recent git-tag) or 'latest' (most recent commit from master)
pull_request:
types:
- opened
- reopened
- synchronize
- ready_for_review
push:
branches:
- master
env:
TF_VERSION: 2.10.0
TORCH_VERSION: 1.11.0+cpu
COVERAGE_FLAGS: "--cov=pennylane_lightning --cov-report=term-missing --no-flaky-report -p no:warnings --tb=native"
GCC_VERSION: 11
OMP_NUM_THREADS: "2"
OMP_PROC_BIND: "false"
concurrency:
group: tests_lqcpu_python-${{ github.ref }}-${{ github.event_name }}-${{ inputs.lightning-version }}-${{ inputs.pennylane-version }}
cancel-in-progress: true
jobs:
build_lightning_qubit_wheels:
strategy:
matrix:
pl_backend: ["lightning_qubit"]
blas: ["OFF", "ON"]
timeout-minutes: 60
name: Build (${{ matrix.pl_backend }}, blas-${{ matrix.blas }})
runs-on: pl-4-core-large-runner
steps:
- name: Make disk space
run: |
sudo apt-get autoremove -y && sudo apt-get autoclean -y && sudo apt-get clean -y
for DIR in /usr/share/dotnet /usr/local/share/powershell /usr/share/swift; do
sudo du -sh $DIR || echo $DIR not found
sudo rm -rf $DIR
done
- uses: actions/setup-python@v5
name: Install Python
with:
python-version: '3.10'
- name: Checkout PennyLane-Lightning
uses: actions/checkout@v4
with:
fetch-tags: true
- name: Switch to release build of Lightning
if: inputs.lightning-version == 'release'
run: |
git fetch --all
git checkout $(git branch -a --list "origin/v0.*rc*" | sort | tail -1)
- name: Switch to stable build of Lightning
if: inputs.lightning-version == 'stable'
run: |
git fetch --tags --force
git checkout latest_release
git log -1 --format='%H'
git status
- name: Install dependencies
run: |
sudo apt-get update && sudo apt-get -y -q install cmake gcc-$GCC_VERSION g++-$GCC_VERSION libopenblas-base libopenblas-dev
python -m pip install scipy wheel
- name: Get required Python packages
run: |
python -m pip install -r requirements-dev.txt
- name: Create device wheel ${{ inputs.lightning-version }}
run: |
PL_BACKEND=${{ matrix.pl_backend }} python scripts/configure_pyproject_toml.py
CMAKE_ARGS="-DENABLE_BLAS=${{ matrix.blas }} -DLQ_ENABLE_KERNEL_OMP=ON -DENABLE_PYTHON=ON" python -m build
cd dist
WHEEL_NAME=$(ls *.whl)
cp $WHEEL_NAME ${{ github.workspace }}/wheel_${{ matrix.pl_backend }}-${{ matrix.blas }}.whl
echo $WHEEL_NAME > ${{ github.workspace }}/${{ matrix.pl_backend }}-${{ matrix.blas }}_name.txt
- name: Send wheel name
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.pl_backend }}-${{ matrix.blas }}_name.txt
retention-days: 1
if-no-files-found: error
include-hidden-files: true
path: ${{ github.workspace }}/${{ matrix.pl_backend }}-${{ matrix.blas }}_name.txt
- name: Cache wheel directories
uses: actions/upload-artifact@v4
with:
name: wheel_${{ matrix.pl_backend }}-${{ matrix.blas }}.whl
retention-days: 1
if-no-files-found: error
include-hidden-files: true
path: |
${{ github.workspace }}/wheel_${{ matrix.pl_backend }}-${{ matrix.blas }}.whl
test_lightning_qubit_wheels:
needs: [build_lightning_qubit_wheels]
strategy:
matrix:
pl_backend: ["lightning_qubit"]
blas: ["OFF", "ON"]
group: [1, 2, 3, 4]
timeout-minutes: 60
name: Python Tests (${{ matrix.pl_backend }}, blas-${{ matrix.blas }}, test-group-${{ matrix.group }})
runs-on: pl-4-core-large-runner
steps:
- uses: actions/setup-python@v5
name: Install Python
with:
python-version: '3.10'
- name: Checkout PennyLane-Lightning
uses: actions/checkout@v4
with:
fetch-tags: true
- uses: actions/download-artifact@v4
with:
name: ${{ matrix.pl_backend }}-${{ matrix.blas }}_name.txt
path: ${{ github.workspace }}
- uses: actions/download-artifact@v4
with:
name: wheel_${{ matrix.pl_backend }}-${{ matrix.blas }}.whl
path: ${{ github.workspace }}
- name: Get required Python packages
run: |
WHEEL_NAME=$(cat ${{ github.workspace }}/${{ matrix.pl_backend }}-${{ matrix.blas }}_name.txt)
mv ${{ github.workspace }}/wheel_${{ matrix.pl_backend }}-${{ matrix.blas }}.whl ${{ github.workspace }}/$WHEEL_NAME
python -m pip install -r requirements-dev.txt
python -m pip install openfermionpyscf
python -m pip install semantic-version
python -m pip install ${{ github.workspace }}/$WHEEL_NAME --no-deps --force-reinstall
- name: Checkout PennyLane for release or latest build
if: inputs.pennylane-version == 'release' || inputs.pennylane-version == 'latest'
uses: actions/checkout@v4
with:
path: pennylane
repository: PennyLaneAI/pennylane
- name: Switch to latest build of PennyLane
if: inputs.pennylane-version == 'latest'
run: |
cd pennylane
git checkout master
python -m pip uninstall -y pennylane && python -m pip install . -vv --no-deps
- name: Switch to release build of PennyLane
if: inputs.pennylane-version == 'release'
run: |
cd pennylane
git fetch --all
git checkout $(git branch -a --list "origin/v0.*rc*" | sort | tail -1)
python -m pip uninstall -y pennylane && python -m pip install . -vv --no-deps
- name: Install Stable PennyLane
if: inputs.pennylane-version == 'stable'
run: |
python -m pip uninstall -y pennylane && python -m pip install -U pennylane --no-deps
- name: Install ML libraries for interfaces
run: |
python -m pip install --upgrade torch==$TORCH_VERSION -f https://download.pytorch.org/whl/cpu/torch_stable.html
python -m pip install --upgrade "jax[cpu]" # This also installs jaxlib
python -m pip install --upgrade tensorflow~=$TF_VERSION keras~=$TF_VERSION
- name: Switch to stable tag of Lightning
if: inputs.lightning-version == 'stable'
run: |
git fetch --tags --force
git checkout latest_release
git log -1 --format='%H'
git status
- name: Run PennyLane-Lightning unit tests
run: |
DEVICENAME=`echo ${{ matrix.pl_backend }} | sed "s/_/./g"`
# Remove `python -m` to avoid running tests with relative modules
OMP_NUM_THREADS=1 PL_DEVICE=${DEVICENAME} pytest -n auto tests/ -k "not unitary_correct" \
$COVERAGE_FLAGS --splits 4 --group ${{ matrix.group }} \
--durations-path='.github/workflows/python_lightning_qubit_test_durations.json' --splitting-algorithm=least_duration
PL_DEVICE=${DEVICENAME} pytest tests/ -k "unitary_correct" $COVERAGE_FLAGS --cov-append
pl-device-test --device ${DEVICENAME} --skip-ops --shots=20000 $COVERAGE_FLAGS --cov-append
pl-device-test --device ${DEVICENAME} --shots=None --skip-ops $COVERAGE_FLAGS --cov-append
mv .coverage ${{ github.workspace }}/.coverage-${{ github.job }}-${{ matrix.pl_backend }}-${{ matrix.blas }}-${{ matrix.group }}
- name: Upload code coverage results
uses: actions/upload-artifact@v4
with:
name: .coverage-${{ github.job }}-${{ matrix.pl_backend }}-${{ matrix.blas }}-${{ matrix.group }}
path: |
${{ github.workspace }}/.coverage-${{ github.job }}-${{ matrix.pl_backend }}-${{ matrix.blas }}-${{ matrix.group }}
retention-days: 1
if-no-files-found: error
include-hidden-files: true
upload-to-codecov-linux-python:
if: github.event_name == 'pull_request'
needs: [test_lightning_qubit_wheels]
name: Upload python coverage data to codecov
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-tags: true
- name: Download coverage reports
uses: actions/download-artifact@v4
with:
pattern: .coverage-*
merge-multiple: true
- name: Combine coverage files
run: |
python -m pip install coverage
python -m coverage combine .coverage-*
# Added cov xml -i to ignore "No source for code" random errors
# https://stackoverflow.com/questions/2386975/no-source-for-code-message-in-coverage-py
python -m coverage xml -i -o coverage-${{ github.job }}.xml
- name: Upload to Codecov
uses: codecov/codecov-action@v4
with:
fail_ci_if_error: true
verbose: true
token: ${{ secrets.CODECOV_TOKEN }}