diff --git a/.github/workflows/calkit-run.yml b/.github/workflows/calkit-run.yml new file mode 100644 index 0000000..0114070 --- /dev/null +++ b/.github/workflows/calkit-run.yml @@ -0,0 +1,55 @@ +name: Run Calkit pipeline + +on: + push: + branches: + - main + pull_request: + +permissions: + contents: write + +# Make sure we only ever run one per branch so we don't have issues pushing +# after running the pipeline +concurrency: + group: calkit-run-${{ github.ref }} + cancel-in-progress: true + +jobs: + main: + name: Run + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + # For PRs, checkout the head ref to avoid detached HEAD + ref: ${{ github.head_ref || github.ref_name }} + token: ${{ secrets.GITHUB_TOKEN }} + submodules: true + - name: Configure Git credentials + run: | + git config user.name github-actions[bot] + git config user.email 41898282+github-actions[bot]@users.noreply.github.com + - name: Setup uv + uses: astral-sh/setup-uv@v5 + - name: Install Calkit + run: uv tool install calkit-python + - name: Setup matlab + uses: matlab-actions/setup-matlab@v2 + with: + cache: true + release: R2024b + products: > + Parallel_Computing_Toolbox + Global_Optimization_Toolbox + Optimization_Toolbox + Statistics_and_Machine_Learning_Toolbox + MATLAB_Report_Generator + Simulink + Simscape + Simscape_Multibody + - name: Run Calkit + uses: calkit/run-action@378d217f814687b57b1b71fd710c43e8c75dfdef + with: + dvc_token: ${{ secrets.CALKIT_DVC_TOKEN }} + matlab: true diff --git a/calkit.yaml b/calkit.yaml index 352016b..8cbde5e 100644 --- a/calkit.yaml +++ b/calkit.yaml @@ -2,24 +2,24 @@ title: MATLAB example description: > This project shows how to incorporate MATLAB into a reproducible research project. -environments: - matlab: - kind: matlab - version: R2024b - products: - - Statistics_and_Machine_Learning_Toolbox - - Parallel_Computing_Toolbox +# environments: +# matlab: +# kind: matlab +# version: R2024b +# products: +# - Statistics_and_Machine_Learning_Toolbox +# - Parallel_Computing_Toolbox pipeline: stages: collect-data: kind: matlab-script - environment: matlab + environment: _system script_path: scripts/collect_data.m outputs: - data/raw/data.parquet plot-data: kind: matlab-script - environment: matlab + environment: _system script_path: scripts/plot_data.m outputs: - figures/plot.png diff --git a/dvc.lock b/dvc.lock index 1940ead..088b710 100644 --- a/dvc.lock +++ b/dvc.lock @@ -13,50 +13,44 @@ stages: md5: 0b2be6aa89192942ea0e1263f9f7e55c size: 384 plot-data: - cmd: calkit xenv -n matlab --no-check -- "run('scripts/plot_data.m');" + cmd: matlab -batch "run('scripts/plot_data.m');" deps: - - path: .calkit/env-locks/matlab.json - hash: md5 - md5: 074a6771582255a621b5fda8cb2cc2d3 - size: 5082 - path: data/raw/data.parquet hash: md5 - md5: 7d4fadae29fbf5fdf9eedc81a9f0cc9e + md5: e901c02a1a54165d5e6d5d5973d594e6 size: 9853 - path: scripts/plot_data.m hash: md5 - md5: dd5ffb54107b06b64d0f3fb5be4429f9 - size: 144 + md5: ba7e2fcc376bc1f4b17fca546082cf7b + size: 148 outs: - path: figures/plot.png hash: md5 - md5: 0459648a57a7fd45c8264e4902a15494 - size: 79715 + md5: 8d280eaa88e1604646333ac52bbc2cc1 + size: 39730 collect-data: - cmd: calkit xenv -n matlab --no-check -- "run('scripts/collect_data.m');" + cmd: matlab -batch "run('scripts/collect_data.m');" deps: - - path: .calkit/env-locks/matlab.json - hash: md5 - md5: 074a6771582255a621b5fda8cb2cc2d3 - size: 5082 - path: scripts/collect_data.m hash: md5 - md5: e9f0c4b4277e253b9034dbc7e5495058 - size: 142 + md5: 990ebc3af464a6d91033e2450c9522e3 + size: 174 outs: - path: data/raw/data.parquet hash: md5 - md5: 7d4fadae29fbf5fdf9eedc81a9f0cc9e + md5: e901c02a1a54165d5e6d5d5973d594e6 size: 9853 _check_env_matlab: - cmd: calkit check matlab-env --name matlab --output .calkit/env-locks/matlab.json + cmd: calkit check matlab-env --name matlab --output + .calkit/env-locks/matlab.json outs: - path: .calkit/env-locks/matlab.json hash: md5 md5: 71c8f7b71fac0c8a028a0b11a25cb685 size: 806 _check-env-matlab: - cmd: calkit check matlab-env --name matlab --output .calkit/env-locks/matlab.json + cmd: calkit check matlab-env --name matlab --output + .calkit/env-locks/matlab.json outs: - path: .calkit/env-locks/matlab.json hash: md5 diff --git a/dvc.yaml b/dvc.yaml index 3c8ba3a..ff1d1b7 100644 --- a/dvc.yaml +++ b/dvc.yaml @@ -1,24 +1,18 @@ stages: - _check-env-matlab: - cmd: calkit check matlab-env --name matlab --output .calkit/env-locks/matlab.json - deps: [] - outs: - - .calkit/env-locks/matlab.json: - cache: false - persist: true - always_changed: true collect-data: - cmd: calkit xenv -n matlab --no-check -- "run('scripts/collect_data.m');" + cmd: matlab -batch "run('scripts/collect_data.m');" deps: - scripts/collect_data.m - - .calkit/env-locks/matlab.json outs: - data/raw/data.parquet + desc: Automatically generated from the 'collect-data' stage in + calkit.yaml. Changes made here will be overwritten. plot-data: - cmd: calkit xenv -n matlab --no-check -- "run('scripts/plot_data.m');" + cmd: matlab -batch "run('scripts/plot_data.m');" deps: - scripts/plot_data.m - data/raw/data.parquet - - .calkit/env-locks/matlab.json outs: - figures/plot.png + desc: Automatically generated from the 'plot-data' stage in + calkit.yaml. Changes made here will be overwritten. diff --git a/scripts/collect_data.m b/scripts/collect_data.m index 17f2d67..3da333c 100644 --- a/scripts/collect_data.m +++ b/scripts/collect_data.m @@ -1,5 +1,11 @@ disp("Processing data"); + +% Set random seed +rng(432); + voltage = rand(1000, 1); data = table(voltage); + mkdir("../data/raw"); -parquetwrite("../data/raw/data.parquet", data); \ No newline at end of file + +parquetwrite("../data/raw/data.parquet", data); diff --git a/scripts/plot_data.m b/scripts/plot_data.m index 05acca2..8ba509b 100644 --- a/scripts/plot_data.m +++ b/scripts/plot_data.m @@ -1,5 +1,8 @@ disp("Plotting"); + data = parquetread("../data/raw/data.parquet"); + plot(data, "voltage"); + mkdir("../figures"); -saveas(gcf, "../figures/plot.png") \ No newline at end of file +saveas(gcf, "../figures/plot.png")