diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..46cf17d --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,8 @@ +# YAML data changes need maintainer approval. +site/_data/*.yml @sshkhr @gmberton @smsnobin77 + +# Workflow and script changes need maintainer approval. +.github/workflows/* @sshkhr @gmberton @smsnobin77 +scripts/* @sshkhr @gmberton @smsnobin77 + +# README.md is auto-managed — no code-owner review required, so the bot PR can merge. diff --git a/.github/workflows/diff-readme-on-pr.yml b/.github/workflows/diff-readme-on-pr.yml index 5706932..20aee14 100644 --- a/.github/workflows/diff-readme-on-pr.yml +++ b/.github/workflows/diff-readme-on-pr.yml @@ -1,61 +1,40 @@ -name: Update README (pull_request) +name: README preview (PR) on: - pull_request_target: + pull_request: paths: - 'site/_data/summerschools.yml' - workflow_dispatch: permissions: - pull-requests: write contents: read - + jobs: - update-readme-pr: + render-preview: runs-on: ubuntu-latest steps: - - name: Check out repository - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} fetch-depth: 0 - - - name: Set up Python - uses: actions/setup-python@v4 + + - name: Fetch master + run: git fetch origin master:master + + - uses: actions/setup-python@v5 with: - python-version: '3.9' + python-version: '3.11' - - name: Install dependencies - run: | - pip install pyyaml python-dateutil + - run: pip install pyyaml python-dateutil ruamel.yaml - - name: Update README locally (no commit) - id: update_readme - run: | - python scripts/update_readme.py - git diff README.md > diff.txt + - name: Render preview + run: python scripts/pr_preview.py --output preview.md - # Expose the diff as an output - echo "diff<> $GITHUB_OUTPUT - cat diff.txt | sed 's/%/%25/g; s/\n/%0A/g; s/\r/%0D/g' >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT + - name: Save PR number + run: echo "${{ github.event.pull_request.number }}" > pr-number.txt - - name: Comment on PR with diff - uses: actions/github-script@v6 + - name: Upload artifact + uses: actions/upload-artifact@v4 with: - diff: ${{ steps.update_readme.outputs.diff }} - script: | - const diff = core.getInput('diff'); - if (!diff.trim()) { - core.info("No changes in README.md."); - return; - } - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - body: `**Proposed changes in README.md**\n\`\`\`diff\n${diff}\n\`\`\`` - }); - env: - diff: ${{ steps.update_readme.outputs.diff }} + name: readme-preview + path: | + preview.md + pr-number.txt diff --git a/.github/workflows/post-pr-preview.yml b/.github/workflows/post-pr-preview.yml new file mode 100644 index 0000000..5f44a90 --- /dev/null +++ b/.github/workflows/post-pr-preview.yml @@ -0,0 +1,52 @@ +name: Post README preview comment + +on: + workflow_run: + workflows: ['README preview (PR)'] + types: [completed] + +permissions: + pull-requests: write + +jobs: + post-comment: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: + - name: Download preview artifact + uses: actions/download-artifact@v4 + with: + name: readme-preview + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + path: ./preview + + - name: Read PR number + id: pr + run: | + number=$(cat ./preview/pr-number.txt) + echo "number=$number" >> "$GITHUB_OUTPUT" + + - name: Read preview body + id: body + run: | + { + echo 'body<> "$GITHUB_OUTPUT" + + - name: Find existing preview comment + uses: peter-evans/find-comment@v3 + id: find + with: + issue-number: ${{ steps.pr.outputs.number }} + body-includes: '' + + - name: Create or update comment + uses: peter-evans/create-or-update-comment@v4 + with: + issue-number: ${{ steps.pr.outputs.number }} + comment-id: ${{ steps.find.outputs.comment-id }} + body: ${{ steps.body.outputs.body }} + edit-mode: replace diff --git a/.github/workflows/update-readme-on-push.yml b/.github/workflows/update-readme-on-push.yml deleted file mode 100644 index 53c474c..0000000 --- a/.github/workflows/update-readme-on-push.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Update README (push) - -on: - push: - branches: - - master - paths: - - 'site/_data/summerschools.yml' - -jobs: - update-readme: - runs-on: ubuntu-latest - steps: - - name: Check out repository - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.9' - - - name: Install dependencies - run: | - pip install pyyaml python-dateutil - - - name: Update README - run: | - python scripts/update_readme.py - - - name: Commit changes - run: | - git config user.name "github-actions" - git config user.email "actions@github.com" - git add README.md - git diff --quiet && git diff --staged --quiet || git commit -m "chore: auto-update README with MLSS list" - git push diff --git a/.github/workflows/update-readme.yml b/.github/workflows/update-readme.yml new file mode 100644 index 0000000..0e7634f --- /dev/null +++ b/.github/workflows/update-readme.yml @@ -0,0 +1,64 @@ +name: Update README (auto) + +on: + schedule: + - cron: '0 6 * * *' # 06:00 UTC daily + push: + branches: [master] + paths: + - 'site/_data/summerschools.yml' + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + update-readme: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.BOT_PR_TOKEN }} + fetch-depth: 0 + + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - run: pip install pyyaml python-dateutil ruamel.yaml + + - name: Render README + run: python scripts/update_readme.py + + - name: Detect changes + id: diff + run: | + if git diff --quiet README.md; then + echo "changed=false" >> "$GITHUB_OUTPUT" + else + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Create or update PR + if: steps.diff.outputs.changed == 'true' + id: cpr + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.BOT_PR_TOKEN }} + branch: bot/readme-update + base: master + title: "chore: auto-update README (${{ github.run_started_at }})" + commit-message: "chore: auto-update README" + body: | + Automated README refresh. + + This PR is kept in sync by the `update-readme` workflow and auto-merges when checks pass. + add-paths: README.md + delete-branch: true + + - name: Enable auto-merge + if: steps.cpr.outputs.pull-request-number + run: gh pr merge --auto --squash "${{ steps.cpr.outputs.pull-request-number }}" + env: + GH_TOKEN: ${{ secrets.BOT_PR_TOKEN }} diff --git a/.github/workflows/validate-readme.yml b/.github/workflows/validate-readme.yml new file mode 100644 index 0000000..0a4f28a --- /dev/null +++ b/.github/workflows/validate-readme.yml @@ -0,0 +1,22 @@ +name: validate-readme + +on: + pull_request: + +permissions: + contents: read + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - run: pip install pyyaml python-dateutil ruamel.yaml + + - name: Validate YAML schema + renderer + run: python scripts/validate_readme.py diff --git a/.gitignore b/.gitignore index e2cf452..d98e3ea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ **/.DS_Store -site/_site/* \ No newline at end of file +site/_site/* +docs/* +CLAUDE.local.md +**/__pycache__/ +.pytest_cache/ \ No newline at end of file diff --git a/README.md b/README.md index 74ef6d9..15c6ee2 100644 --- a/README.md +++ b/README.md @@ -23,75 +23,29 @@ [awesome-mlss.com](https://awesome-mlss.com/) is a community tool which serves as a central repository for registration deadlines at summer schools in machine learning and other closely related fields. -## 2025 Summer Schools +Past schools are in the [web archive](https://awesome-mlss.com/archive/). + + +## Upcoming Summer Schools + +For the full list of schools worldwide, visit [awesome-mlss.com](https://awesome-mlss.com/). + +### Deadlines Soon +Schools with application deadlines in the next 2 weeks. + Title|Topics|Place|Deadline|Dates|Details -----|------|-----|--------|-----|------- -Annual Nepal AI School|Machine Learning|Kathmandu, Nepal|Oct 16, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/anais25)|Dec 29 - Jan 08, 2026|[Details](https://awesome-mlss.com/summerschool/anais25) -Advanced Summer School on Responsible AutoML|ML Theory, Machine Learning, Efficient Machine Learning|Recife, Brazil|Nov 11, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/asraml25)|Nov 11 - Nov 12, 2025|[Details](https://awesome-mlss.com/summerschool/asraml25) -Latin American School of Artificial Intelligence (LASAI)|Machine Learning|Lima, Peru|Sep 30, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/lasai25)|Oct 27 - Oct 31, 2025|[Details](https://awesome-mlss.com/summerschool/lasai25) -Winter School on Causality and Explainable AI|Responsible AI, ML Theory|Paris, France|Oct 01, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/causalxai25)|Oct 20 - Oct 24, 2025|[Details](https://awesome-mlss.com/summerschool/causalxai25) -Reasoning Web Summer School|Knowledge Representation, Logic|Istanbul, Türkiye|Jun 09, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/rw25)|Sep 25 - Sep 28, 2025|[Details](https://awesome-mlss.com/summerschool/rw25) -International Artificial Intelligence Summer School|Machine Learning|Grosseto, Italy|Apr 23, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/IAISS25)|Sep 21 - Sep 25, 2025|[Details](https://awesome-mlss.com/summerschool/IAISS25) -Advanced Course on Artificial Intelligence & Neuroscience|Machine Learning, Neuroscience, Cognitive Science, Robotics, Responsible AI|Castiglione della Pescaia, Italy|Apr 23, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/acain25)|Sep 21 - Sep 24, 2025|[Details](https://awesome-mlss.com/summerschool/acain25) -Summer School on Multimodal Foundation Models and Generative AI|Machine Learning, Natural Language Proc, Computer Vision, Generative AI|Rabat, Morocco|Jul 13, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/aiss25)|Sep 08 - Sep 12, 2025|[Details](https://awesome-mlss.com/summerschool/aiss25) -Mediterranean Machine Learning (M2L) Summer School|Machine Learning, Natural Language Proc, Computer Vision, Generative AI, Reinforcement Learning|Split, Croatia|Mar 28, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/m2l25)|Sep 08 - Sep 12, 2025|[Details](https://awesome-mlss.com/summerschool/m2l25) -Gaussian Process Summer School|Machine Learning, ML Theory, Logic|Manchester, UK|Jun 27, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/gpss25)|Sep 08 - Sep 11, 2025|[Details](https://awesome-mlss.com/summerschool/gpss25) -4th European Summer School on Quantum AI|Quantum AI, Machine Learning|Lignano Sabbiadoro, Italy|Aug 19, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/eqai25)|Sep 01 - Sep 05, 2025|[Details](https://awesome-mlss.com/summerschool/eqai25) -ELLIS Summer School: AI for Earth and Climate Sciences|Machine Learning, Generative AI, ML for Science, ML for Biology, Computer Vision|Jena, Germany|Mar 31, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/jena25)|Sep 01 - Sep 05, 2025|[Details](https://awesome-mlss.com/summerschool/jena25) -School on Analytical Connectionism|ML Theory, Cognitive Science|London, UK|Apr 18, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/ac25)|Aug 25 - Sep 05, 2025|[Details](https://awesome-mlss.com/summerschool/ac25) -Princeton Machine Learning Theory Summer School|Machine Learning, ML Theory|Princeton, USA|Mar 31, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/pmltss2025)|Aug 12 - Aug 21, 2025|[Details](https://awesome-mlss.com/summerschool/pmltss2025) -Montreal Robotics Summer School|Robotics, Machine Learning|Montreal, Canada|Feb 28, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/mrss25)|Aug 10 - Aug 15, 2025|[Details](https://awesome-mlss.com/summerschool/mrss25) -Oxford Machine Learning Summer School (OxML): MLx Representation Learning & GenAI|Machine Learning, Generative AI, Computer Vision, Natural Language Proc|Oxford, UK|Aug 07, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/oxmlr25)|Aug 07 - Aug 10, 2025|[Details](https://awesome-mlss.com/summerschool/oxmlr25) -IAIFI Summer School|ML Theory, ML for Science|Cambridge, USA|Feb 07, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/iaifi2025)|Aug 04 - Aug 08, 2025|[Details](https://awesome-mlss.com/summerschool/iaifi2025) -Brains, Minds & Machines Summer Course|Machine Learning, Neuroscience, Cognitive Science|Woods Hole, MA, USA|Mar 24, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/bmm25)|Aug 03 - Aug 24, 2025|[Details](https://awesome-mlss.com/summerschool/bmm25) -Machine Learning Summer School Arequipa|Machine Learning|Arequipa, Peru|Mar 20, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/mlss-arequipa25)|Aug 02 - Aug 13, 2025|[Details](https://awesome-mlss.com/summerschool/mlss-arequipa25) -Oxford Machine Learning Summer School (OxML): MLx Health & Bio|Machine Learning, ML for Health, ML for Biology|Oxford, UK|Aug 02, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/oxmlh25)|Aug 02 - Aug 05, 2025|[Details](https://awesome-mlss.com/summerschool/oxmlh25) -Brown CNTR AI Policy Summer School|Responsible AI, Machine Learning|Providence, RI and Washington, DC, USA|Apr 05, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/brown-cntr25)|Jul 22 - Jul 31, 2025|[Details](https://awesome-mlss.com/summerschool/brown-cntr25) -Eastern European Machine Learning Summer School|Machine Learning, Generative AI|Sarajevo, Bosnia and Herzegovina|Apr 07, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/eeml25)|Jul 21 - Jul 26, 2025|[Details](https://awesome-mlss.com/summerschool/eeml25) -Cambridge Ellis Unit Summer School on Probabilistic Machine Learning|Machine Learning, Generative AI, ML Theory, Reinforcement Learning, Computer Vision|Cambridge, UK|May 10, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/ellis-cambridge25)|Jul 14 - Jul 18, 2025|[Details](https://awesome-mlss.com/summerschool/ellis-cambridge25) -African Computer Vision Summer School|Computer Vision|Kigali, Rwanda|Mar 15, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/acvs25)|Jul 13 - Jul 23, 2025|[Details](https://awesome-mlss.com/summerschool/acvs25) -Cooperative AI Summer School|Machine Learning, Generative AI, AI and Economics|Marlow, UK|Mar 07, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/cass25)|Jul 09 - Jul 13, 2025|[Details](https://awesome-mlss.com/summerschool/cass25) -EuADS Summer School on Automated Data Science|Machine Learning, Data Science, ML Theory|Luxembourg-Belair|2025-05-20
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/euads25)|Jul 08 - Jul 11, 2025|[Details](https://awesome-mlss.com/summerschool/euads25) -LOGML Summer School|Machine Learning, ML Theory|London, United Kingdom|Apr 06, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/logml25)|Jul 07 - Jul 11, 2025|[Details](https://awesome-mlss.com/summerschool/logml25) -EDBT Summer School on AI & Data Management|Machine Learning, Data Mining, Generative AI|Nicosia, Cyprus|Apr 07, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/edbt25)|Jul 07 - Jul 11, 2025|[Details](https://awesome-mlss.com/summerschool/edbt25) -BMVA Computer Vision Summer School|Computer Vision, Machine Learning, Generative AI|Aberdeen, Scotland, UK|Jun 15, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/bmva-cvss25)|Jul 07 - Jul 11, 2025|[Details](https://awesome-mlss.com/summerschool/bmva-cvss25) -Data Visualization Summer School|Machine Learning, Generative AI|Genoa, Italy|May 18, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/dvss25)|Jul 07 - Jul 11, 2025|[Details](https://awesome-mlss.com/summerschool/dvss25) -Summer School on Automatic Speech Recognition|Speech/SigProc, Machine Learning, Natural Language Proc|Gandhinagar, India|Jul 09, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/s4p25)|Jul 05 - Jul 09, 2025|[Details](https://awesome-mlss.com/summerschool/s4p25) -BAI Summer School on AI Agents and Agentic Systems|Machine Learning, Generative AI, AI and Economics|Anglet, France|Apr 15, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/bai25)|Jul 03 - Jul 12, 2025|[Details](https://awesome-mlss.com/summerschool/bai25) -Cohere Labs - ML Summer School|Machine Learning, Computer Vision, Natural Language Proc, Knowledge Representation, Generative AI, ML Theory, Logic, Efficient Machine Learning, Reinforcement Learning|Online|Jun 30, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/clmlss25)|Jul 02 - Jul 14, 2025|[Details](https://awesome-mlss.com/summerschool/clmlss25) -MLSS Kraków: Drug and Materials Discovery|Generative AI, ML for Biology, ML for Science, ML for Health|Kraków, Poland|Apr 19, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/krakow2025)|Jul 01 - Jul 06, 2025|[Details](https://awesome-mlss.com/summerschool/krakow2025) -European Summer School on Artificial Intelligence|Machine Learning, Robotics, Automated Planning, Data Mining|Bratislava, Slovakia|Jun 01, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/essai25)|Jun 30 - Jul 04, 2025|[Details](https://awesome-mlss.com/summerschool/essai25) -Summer School on Cryptography, Statistics and Machine Learning|Machine Learning, ML Theory|Tsaghkadzor, Armenia|Jun 01, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/ysumss25)|Jun 29 - Jul 06, 2025|[Details](https://awesome-mlss.com/summerschool/ysumss25) -AI4Science Summer School|Machine Learning, ML for Science|Caen, France|Apr 20, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/ai4s25)|Jun 29 - Jul 04, 2025|[Details](https://awesome-mlss.com/summerschool/ai4s25) -Gatsby Bridging Programme|ML Theory, Neuroscience|London, UK|Feb 07, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/gatsbybp25)|Jun 23 - Aug 08, 2025|[Details](https://awesome-mlss.com/summerschool/gatsbybp25) -Machine Learning Summer School Senegal|Machine Learning|Mbour, Senegal|Feb 28, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/mlss-senegal25)|Jun 23 - Jul 04, 2025|[Details](https://awesome-mlss.com/summerschool/mlss-senegal25) -Summer School on Data Science, Learning and Optimization|Machine Learning, ML Theory|Norcia, Italy|Apr 24, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/dataslo25)|Jun 23 - Jun 27, 2025|[Details](https://awesome-mlss.com/summerschool/dataslo25) -AI and Games Summer School|Machine Learning, AI For Games|Malmö, Sweden|Jun 09, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/agss25)|Jun 23 - Jun 27, 2025|[Details](https://awesome-mlss.com/summerschool/agss25) -Theoretical Foundations of Machine Learning Course|Machine Learning, ML Theory|Genova, Italy|Mar 30, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/tfml2025)|Jun 23 - Jun 27, 2025|[Details](https://awesome-mlss.com/summerschool/tfml2025) -Bumblekite Machine Learning Summer School in Health, care and biosciences|Machine Learning, ML for Health, ML for Biology|Zürich, Switzerland|Mar 09, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/bumblekite25)|Jun 22 - Jun 28, 2025|[Details](https://awesome-mlss.com/summerschool/bumblekite25) -Machine Learning and Advanced Statistics Summer School|Machine Learning, Generative AI, Reinforcement Learning|Madrid, Spain|May 27, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/mlas25)|Jun 16 - Jun 27, 2025|[Details](https://awesome-mlss.com/summerschool/mlas25) -Nordic Probabilistic AI School|ML Theory, Generative AI, Machine Learning|Trondheim, Norway|Mar 09, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/npas2025)|Jun 16 - Jun 20, 2025|[Details](https://awesome-mlss.com/summerschool/npas2025) -A Journey through Deep Learning Summer School|Machine Learning|Genova, Italy|Mar 30, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/jdl2025)|Jun 16 - Jun 20, 2025|[Details](https://awesome-mlss.com/summerschool/jdl2025) -School on Automated Machine Learning (AutoML)|ML Theory, Machine Learning, Efficient Machine Learning|Tübingen, Germany|May 01, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/automl25)|Jun 10 - Jun 13, 2025|[Details](https://awesome-mlss.com/summerschool/automl25) -Advanced Course on Data Science & Machine Learning|Machine Learning|Grosseto, Italy|Apr 23, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/acdl25)|Jun 09 - Jun 13, 2025|[Details](https://awesome-mlss.com/summerschool/acdl25) -International Semantic Web Research Summer School|Knowledge Representation, Machine Learning|Bertinoro, Italy|Mar 15, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/isws25)|Jun 08 - Jun 14, 2025|[Details](https://awesome-mlss.com/summerschool/isws25) -Oxford Machine Learning Summer School (OxML): MLx Generative AI|Machine Learning, Generative AI|London, UK|Jun 05, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/oxmlg25)|Jun 05 - Jun 07, 2025|[Details](https://awesome-mlss.com/summerschool/oxmlg25) -UK Robotics Summer School|Robotics, Machine Learning, Generative AI, Human-Computer Interaction|Edinburgh, UK|Apr 30, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/ukrss25)|Jun 02 - Jun 06, 2025|[Details](https://awesome-mlss.com/summerschool/ukrss25) -Summer School in Responsible AI and Human Rights|Responsible AI|Montreal, Canada|Jan 06, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/ssraihr25)|May 26 - May 30, 2025|[Details](https://awesome-mlss.com/summerschool/ssraihr25) -Mathematics and Physics of Quantum Computing and Quantum Learning|Quantum AI, Machine Learning, ML Theory|Porquerolles, France|Apr 30, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/mpqcql25)|May 23 - May 28, 2025|[Details](https://awesome-mlss.com/summerschool/mpqcql25) -Oxford Machine Learning Summer School (OxML): MLx Fundamentals|Machine Learning, ML Theory|Online|May 01, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/oxmlf25)|May 01 - May 09, 2025|[Details](https://awesome-mlss.com/summerschool/oxmlf25) -Deep Learning for Medical Imaging School|Machine Learning, Computer Vision, ML for Health|Lyon, France|Apr 11, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/dlmi25)|Apr 21 - Apr 25, 2025|[Details](https://awesome-mlss.com/summerschool/dlmi25) -INVICTA School of VIsion, Computational intelligence, and patTern Analysis|Computer Vision, Machine Learning, Generative AI, ML for Health|Porto, Portugal|Mar 31, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/invicta25)|Apr 07 - Apr 11, 2025|[Details](https://awesome-mlss.com/summerschool/invicta25) -ELLIS Winter School on Foundation Models|Machine Learning|Amsterdam, Netherlands|Feb 07, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/fomo25)|Mar 18 - Mar 21, 2025|[Details](https://awesome-mlss.com/summerschool/fomo25) -Responsible ML Winter School|Machine Learning, Responsible AI|Umeå, Sweden|Feb 20, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/rmlws25)|Mar 11 - Mar 13, 2025|[Details](https://awesome-mlss.com/summerschool/rmlws25) -Winter School: Next Generation AI and Economic Applications|Generative AI, AI and Economics|UM6P Ben Guerir Campus, Morocco|Jan 30, 2025
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/wsngaiea25)|Feb 24 - Feb 25, 2025|[Details](https://awesome-mlss.com/summerschool/wsngaiea25) -MenaML Winter School|Machine Learning, Natural Language Proc, Computer Vision, Generative AI, Neuroscience, Reinforcement Learning, ML for Science|Doha, Qatar|Nov 01, 2024
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/menaML25)|Feb 09 - Feb 14, 2025|[Details](https://awesome-mlss.com/summerschool/menaML25) -UM6P Winter School on Data Economics|ML Theory, AI and Economics|UM6P Rabat Campus, Morocco|Dec 08, 2024
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/wsde25)|Jan 20 - Jan 24, 2025|[Details](https://awesome-mlss.com/summerschool/wsde25) -Winter School on Emerging Technologies|Machine Learning, Robotics|Mesa, AZ|Oct 07, 2024
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/ASUWinterSchool25)|Jan 03 - Jan 10, 2025|[Details](https://awesome-mlss.com/summerschool/ASUWinterSchool25) - -## Past Summer Schools - -For schools that took place in 2024 or earlier, check out our [web archive](https://awesome-mlss.com/archive/) or [PAST](PAST.md) schools. +IAISS 2026 – International Artificial Intelligence Summer School|Machine Learning, Generative AI, Reinforcement Learning|Castiglione della Pescaia, Tuscany, Italy|Apr 23, 2026
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/iaiss_2026)|Sep 20 - Sep 24, 2026|[Details](https://awesome-mlss.com/summerschool/iaiss_2026) +LMH Oxford: AI and Machine Learning - Theory and Practice|Machine Learning, Computer Vision, Natural Language Proc|Oxford, UK|May 04, 2026
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/lmh_aiml_tp26)|Jun 29 - Jul 17, 2026|[Details](https://awesome-mlss.com/summerschool/lmh_aiml_tp26) +LMH Oxford: Advanced AI - Generative AI and Deep Unsupervised Learning|Machine Learning, Generative AI|Oxford, UK|May 04, 2026
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/lmh_genai26)|Jun 29 - Jul 17, 2026|[Details](https://awesome-mlss.com/summerschool/lmh_genai26) +LMH Oxford: Advanced AI - Computer Vision|Machine Learning, Computer Vision, Generative AI|Oxford, UK|May 04, 2026
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/lmh_cv26)|Jul 20 - Aug 07, 2026|[Details](https://awesome-mlss.com/summerschool/lmh_cv26) +LMH Oxford: Advanced AI - NLP and Large Language Models|Machine Learning, Natural Language Proc, Generative AI|Oxford, UK|May 04, 2026
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/lmh_nlp26)|Aug 10 - Aug 28, 2026|[Details](https://awesome-mlss.com/summerschool/lmh_nlp26) + +### Happening Soon +Schools starting in the next 2 weeks. + +*No schools currently match this window. See [awesome-mlss.com](https://awesome-mlss.com/) for upcoming schools.* + ## Contributing Guide diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/pr_preview.py b/scripts/pr_preview.py new file mode 100644 index 0000000..8cd4b2d --- /dev/null +++ b/scripts/pr_preview.py @@ -0,0 +1,362 @@ +"""Produce a PR-comment body describing what a PR changes in the README. + +Invoked by the ``diff-readme-on-pr.yml`` GitHub Actions workflow from a +checkout of the PR branch. Reads the PR's ``site/_data/summerschools.yml`` +from disk, the master version via ``git show master:site/_data/summerschools.yml``, +and renders a unified diff of the README block plus lists of entries that are +added/modified/removed but fall outside the live 2-week visibility window. + +The comment body always starts with ``\\n`` so that +``peter-evans/find-comment`` can locate and update the prior comment rather +than duplicate it. + +CLI:: + + python scripts/pr_preview.py [--output preview.md] [--today YYYY-MM-DD] +""" + +from __future__ import annotations + +import argparse +import datetime +import difflib +import subprocess +import sys +from pathlib import Path +from typing import Iterable, List, Mapping, Optional, Sequence, Tuple + +import yaml + +# Allow `python scripts/pr_preview.py` from the repo root even before the +# package is installed; mirrors conftest.py's path-insertion trick. +_REPO_ROOT = Path(__file__).resolve().parents[1] +if str(_REPO_ROOT) not in sys.path: + sys.path.insert(0, str(_REPO_ROOT)) + +from scripts.update_readme import ( # noqa: E402 + SUMMERSCHOOLS_YML_PATH, + TYPES_YML_PATH, + filter_and_sort, + load, + render, +) +from scripts.windows import compute_visibility # noqa: E402 + + +MARKER = "" +NO_CHANGES_BODY = ( + f"{MARKER}\n" + "**README preview for this PR**\n" + "\n" + "No detected changes to entries in `summerschools.yml`.\n" +) + + +# --------------------------------------------------------------------------- +# Parsing helpers +# --------------------------------------------------------------------------- + + +def _parse_schools_yaml(text: str, source_label: str) -> List[dict]: + """Parse YAML content into a list of school dicts. + + ``source_label`` is used to annotate any error message that bubbles up. + """ + try: + parsed = yaml.safe_load(text) or [] + except yaml.YAMLError as exc: + raise RuntimeError( + f"Failed to parse summerschools.yml from {source_label}: {exc}" + ) from exc + if not isinstance(parsed, list): + raise RuntimeError( + f"Expected list of schools in summerschools.yml from " + f"{source_label}, got {type(parsed).__name__}" + ) + return parsed + + +def _read_master_schools_text() -> str: + """Fetch master's copy of summerschools.yml via ``git show``. + + Raises ``RuntimeError`` on failure so the caller can print a clear + error to stderr and exit. + """ + try: + completed = subprocess.run( + ["git", "show", f"master:{SUMMERSCHOOLS_YML_PATH}"], + capture_output=True, + text=True, + check=False, + ) + except FileNotFoundError as exc: + raise RuntimeError( + "git executable not found; pr_preview.py must be run inside a " + "git checkout" + ) from exc + + if completed.returncode != 0: + stderr = (completed.stderr or "").strip() + raise RuntimeError( + "Could not resolve master:" + f"{SUMMERSCHOOLS_YML_PATH} via `git show` " + f"(exit {completed.returncode}): {stderr}" + ) + return completed.stdout + + +# --------------------------------------------------------------------------- +# Core diff logic (pure functions — exhaustively tested) +# --------------------------------------------------------------------------- + + +def _index_by_id(schools: Sequence[dict]) -> "dict[str, dict]": + """Return ``{id: entry}``; silently drops entries without an ``id``.""" + out: "dict[str, dict]" = {} + for entry in schools: + entry_id = entry.get("id") + if entry_id: + out[entry_id] = entry + return out + + +def _classify( + master_by_id: Mapping[str, dict], + pr_by_id: Mapping[str, dict], +) -> Tuple[List[str], List[str], List[str]]: + """Split ids into (added, modified, removed) lists, each sorted.""" + master_ids = set(master_by_id) + pr_ids = set(pr_by_id) + + added = sorted(pr_ids - master_ids) + removed = sorted(master_ids - pr_ids) + modified = sorted( + i for i in pr_ids & master_ids if pr_by_id[i] != master_by_id[i] + ) + return added, modified, removed + + +def _is_entry_in_window(entry: dict, today: datetime.date) -> bool: + """Does ``entry`` land in either the deadline or happening visible window? + + The window here is "would appear in the README tables given today" — i.e. + today ∈ [deadline-14, deadline] or today ∈ [start-14, start]. + """ + windows = compute_visibility(entry, today) + for window in (windows.get("deadline"), windows.get("happening")): + if window is None: + continue + from_date, to_date = window + if from_date <= today <= to_date: + return True + return False + + +def _format_window_line( + label: str, + window: Optional[Tuple[datetime.date, datetime.date]], + missing_fallback: str, +) -> str: + """Render one of the two "Not currently visible" bullet lines.""" + if window is None: + return f" - **{label}**: {missing_fallback}" + from_date, to_date = window + return ( + f" - **{label}**: {from_date.isoformat()} \u2192 {to_date.isoformat()}" + ) + + +def _format_not_visible_entry(entry: dict, today: datetime.date) -> str: + """Render one "Not currently visible" entry — id, title, both windows.""" + windows = compute_visibility(entry, today) + + deadline_line = _format_window_line( + "Deadlines Soon", + windows.get("deadline"), + "*(deadline is TBA \u2014 will not appear in Deadlines Soon until a " + "date is set)*", + ) + happening_line = _format_window_line( + "Happening Soon", + windows.get("happening"), + "*(start date not set \u2014 will not appear in Happening Soon " + "until a date is set)*", + ) + + entry_id = entry.get("id", "") + title = entry.get("title", "") + header = f"- `{entry_id}` \u2014 \"{title}\"" + return f"{header}\n{deadline_line}\n{happening_line}" + + +def _render_diff( + master_schools: Sequence[dict], + pr_schools: Sequence[dict], + types_map: Mapping[str, str], + today: datetime.date, +) -> str: + """Unified diff between the two rendered README blocks.""" + master_deadlines, master_happening = filter_and_sort(master_schools, today) + pr_deadlines, pr_happening = filter_and_sort(pr_schools, today) + + master_block = render(master_deadlines, master_happening, types_map) + pr_block = render(pr_deadlines, pr_happening, types_map) + + diff_lines = difflib.unified_diff( + master_block.splitlines(), + pr_block.splitlines(), + fromfile="master README", + tofile="PR README", + lineterm="", + ) + return "\n".join(diff_lines) + + +def build_preview( + master_schools: Sequence[dict], + pr_schools: Sequence[dict], + types_map: Mapping[str, str], + today: datetime.date, +) -> str: + """Return the full PR-comment body. + + Pure function — no I/O — so it can be tested exhaustively without git. + """ + master_by_id = _index_by_id(master_schools) + pr_by_id = _index_by_id(pr_schools) + added, modified, removed = _classify(master_by_id, pr_by_id) + + diff_text = _render_diff(master_schools, pr_schools, types_map, today) + + # Partition added/modified into in-window and out-of-window for messaging. + not_visible_entries: List[dict] = [] + for entry_id in added: + entry = pr_by_id[entry_id] + if not _is_entry_in_window(entry, today): + not_visible_entries.append(entry) + for entry_id in modified: + entry = pr_by_id[entry_id] + # A modified entry might be in-window in either master or PR; the + # diff section already surfaces visible changes. Surface in "not + # currently visible" only when its PR form is outside the window. + if not _is_entry_in_window(entry, today): + not_visible_entries.append(entry) + + # Short-circuit: nothing changed at all. + any_changes = bool(diff_text) or bool(added or modified or removed) + if not any_changes: + return NO_CHANGES_BODY + + sections: List[str] = [f"{MARKER}\n**README preview for this PR**"] + + if diff_text: + sections.append( + "**Currently visible in README** " + "(edits within the live 2-week window)\n" + "```diff\n" + f"{diff_text}\n" + "```" + ) + + if not_visible_entries: + lines = [ + "**Not currently visible** " + "(outside the 2-week window \u2014 these entries will appear " + "later)" + ] + for entry in not_visible_entries: + lines.append(_format_not_visible_entry(entry, today)) + sections.append("\n".join(lines)) + + if removed: + lines = ["**Removed entries**"] + for entry_id in removed: + entry = master_by_id[entry_id] + was_in_window = _is_entry_in_window(entry, today) + clause = ( + "*(was in window at time of removal)*" + if was_in_window + else "*(was not in window at time of removal)*" + ) + lines.append( + f"- `{entry_id}` \u2014 entry was deleted in this PR. {clause}" + ) + sections.append("\n".join(lines)) + + # Join sections with one blank line between them, then a trailing newline. + return "\n\n".join(sections) + "\n" + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + + +def _parse_args(argv: Optional[Sequence[str]] = None) -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Generate README preview comment for a PR." + ) + parser.add_argument( + "--output", + default="preview.md", + help="Path to write the comment body (default: preview.md).", + ) + parser.add_argument( + "--today", + default=None, + help="Override today's date (ISO YYYY-MM-DD) for deterministic runs.", + ) + return parser.parse_args(argv) + + +def _resolve_today(today_str: Optional[str]) -> datetime.date: + if today_str is None: + return datetime.date.today() + try: + return datetime.date.fromisoformat(today_str) + except ValueError as exc: + raise SystemExit( + f"--today must be ISO YYYY-MM-DD, got: {today_str!r} ({exc})" + ) + + +def main(argv: Optional[Sequence[str]] = None) -> int: + args = _parse_args(argv) + today = _resolve_today(args.today) + + # PR's working-copy YAML (schools + shared types map loaded from disk). + try: + pr_schools, types_map = load(SUMMERSCHOOLS_YML_PATH, TYPES_YML_PATH) + except yaml.YAMLError as exc: + print( + f"ERROR: Failed to parse PR's summerschools.yml: {exc}", + file=sys.stderr, + ) + return 1 + except FileNotFoundError as exc: + print(f"ERROR: {exc}", file=sys.stderr) + return 1 + + # master's YAML via git. + try: + master_text = _read_master_schools_text() + master_schools = _parse_schools_yaml(master_text, "master") + except RuntimeError as exc: + print(f"ERROR: {exc}", file=sys.stderr) + return 1 + + body = build_preview(master_schools, pr_schools, types_map, today) + + output_path = Path(args.output) + output_path.write_text(body, encoding="utf-8") + + # Echo to stdout so workflow logs show the full comment body. + sys.stdout.write(body) + if not body.endswith("\n"): + sys.stdout.write("\n") + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/requirements-dev.txt b/scripts/requirements-dev.txt new file mode 100644 index 0000000..9c82085 --- /dev/null +++ b/scripts/requirements-dev.txt @@ -0,0 +1,4 @@ +pyyaml +python-dateutil +ruamel.yaml +pytest diff --git a/scripts/rollover_year.py b/scripts/rollover_year.py new file mode 100644 index 0000000..acfeaac --- /dev/null +++ b/scripts/rollover_year.py @@ -0,0 +1,266 @@ +"""Move past-year entries from summerschools.yml to archive.yml. + +One-off-per-year migration script. A maintainer runs this once per year +(typically early January) after previous-year schools have ended and need to +move out of the live data file into the archive. + +CLI:: + + python scripts/rollover_year.py [--dry-run] [--cutoff YYYY-MM-DD] + +- Default cutoff is ``datetime.date.today()``. +- Moves any entry whose ``end`` date is strictly before ``cutoff`` + (cutoff-day entries are NOT moved). +- Entries with missing or unparseable ``end`` are skipped (left in the live + file) and listed as warnings in the summary. They are never moved silently. +- ``--dry-run`` prints which entries would move but touches no files. + +Uses ``ruamel.yaml`` with its round-trip loader/dumper so that comments, +quoting, and key ordering survive the re-serialization. Some cosmetic drift +(trailing whitespace on blank lines, ``null`` vs empty scalar) is inherent to +ruamel.yaml and accepted — a maintainer reviews the diff before committing. +""" + +from __future__ import annotations + +import argparse +import datetime +import sys +from pathlib import Path +from typing import List, Optional, Tuple + +from dateutil.parser import parse as _dateutil_parse +from ruamel.yaml import YAML + +LIVE_YML_PATH = "site/_data/summerschools.yml" +ARCHIVE_YML_PATH = "site/_data/archive.yml" + + +# --------------------------------------------------------------------------- +# ruamel.yaml setup +# --------------------------------------------------------------------------- + + +def _make_yaml() -> YAML: + """Return a ``YAML`` configured for round-trip with this repo's style.""" + yaml = YAML(typ="rt") + yaml.preserve_quotes = True + # Do not reflow long single-line scalars. + yaml.width = 10000 + # Top-level sequence entries in this repo sit flush-left (``- title:``), + # so use sequence=2, offset=0 rather than the conventional sequence=4, + # offset=2 which would shift every top-level ``-`` inward by 2 cols. + yaml.indent(mapping=2, sequence=2, offset=0) + return yaml + + +# --------------------------------------------------------------------------- +# Date parsing +# --------------------------------------------------------------------------- + + +def _coerce_to_date(value) -> Optional[datetime.date]: + """Best-effort convert a YAML ``end`` value to ``datetime.date``. + + Returns ``None`` when missing or unparseable. Distinguishing "missing" + from "unparseable" is done by the caller via the raw value. + """ + if value is None: + return None + if isinstance(value, datetime.datetime): + return value.date() + if isinstance(value, datetime.date): + return value + if isinstance(value, str): + stripped = value.strip() + if not stripped: + return None + try: + return _dateutil_parse(stripped).date() + except (ValueError, TypeError, OverflowError): + return None + return None + + +# --------------------------------------------------------------------------- +# Core rollover +# --------------------------------------------------------------------------- + + +def rollover( + live_path: Path, + archive_path: Path, + cutoff: datetime.date, + dry_run: bool = False, +) -> Tuple[List[dict], List[Tuple[str, str]]]: + """Move past-year entries from ``live_path`` to ``archive_path``. + + Parameters + ---------- + live_path, archive_path: + Paths to the YAML files. Both must exist and be valid YAML. + cutoff: + Entries whose ``end`` date is strictly before ``cutoff`` are moved. + Entries with ``end == cutoff`` are kept. + dry_run: + When True, the files on disk are untouched. The returned ``moved`` + list still identifies which entries would move. + + Returns + ------- + (moved, skipped_with_reasons) + ``moved`` is the list of entries that were moved (or would be moved, + in dry-run). ``skipped_with_reasons`` is a list of + ``(entry_id, reason)`` tuples for entries whose ``end`` could not be + parsed. + """ + yaml = _make_yaml() + + with open(live_path, "r", encoding="utf-8") as f: + live_data = yaml.load(f) + with open(archive_path, "r", encoding="utf-8") as f: + archive_data = yaml.load(f) + + # ``archive.yml`` may be empty or contain only comments. Treat None as []. + if live_data is None: + live_data = [] + if archive_data is None: + archive_data = [] + + kept: List[dict] = [] + moved: List[dict] = [] + skipped: List[Tuple[str, str]] = [] + + for entry in live_data: + entry_id = _entry_id_or_placeholder(entry) + raw_end = entry.get("end") if hasattr(entry, "get") else None + end_date = _coerce_to_date(raw_end) + + if end_date is None: + if raw_end is None or (isinstance(raw_end, str) and not raw_end.strip()): + skipped.append((entry_id, "missing end date")) + else: + skipped.append( + (entry_id, f"unparseable end date: {raw_end!r}") + ) + kept.append(entry) + continue + + if end_date < cutoff: + moved.append(entry) + else: + kept.append(entry) + + if not dry_run and moved: + # Preserve the ruamel-wrapped CommentedSeq types by mutating in place + # so top-level comments / anchors on the sequences are preserved. + live_data[:] = kept + for entry in moved: + archive_data.append(entry) + + with open(live_path, "w", encoding="utf-8") as f: + yaml.dump(live_data, f) + with open(archive_path, "w", encoding="utf-8") as f: + yaml.dump(archive_data, f) + + return moved, skipped + + +def _entry_id_or_placeholder(entry) -> str: + """Return ``entry['id']`` or a best-effort placeholder.""" + if hasattr(entry, "get"): + val = entry.get("id") + if val: + return str(val) + title = entry.get("title") + if title: + return f"" + return "" + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + + +def _parse_cutoff(value: str) -> datetime.date: + try: + return datetime.datetime.strptime(value, "%Y-%m-%d").date() + except ValueError as exc: + raise argparse.ArgumentTypeError( + f"--cutoff must be YYYY-MM-DD (got {value!r}): {exc}" + ) from exc + + +def _build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description=( + "Move past-year entries from summerschools.yml to archive.yml. " + "Entries whose end date is strictly before cutoff are moved; " + "cutoff-day entries are kept." + ), + ) + parser.add_argument( + "--dry-run", + action="store_true", + help="Print which entries would move but do not modify files.", + ) + parser.add_argument( + "--cutoff", + type=_parse_cutoff, + default=None, + help="Cutoff date as YYYY-MM-DD (default: today).", + ) + parser.add_argument( + "--live", + default=LIVE_YML_PATH, + help=f"Path to live YAML (default: {LIVE_YML_PATH}).", + ) + parser.add_argument( + "--archive", + default=ARCHIVE_YML_PATH, + help=f"Path to archive YAML (default: {ARCHIVE_YML_PATH}).", + ) + return parser + + +def main(argv: Optional[List[str]] = None) -> int: + parser = _build_parser() + args = parser.parse_args(argv) + + cutoff = args.cutoff if args.cutoff is not None else datetime.date.today() + + live_path = Path(args.live) + archive_path = Path(args.archive) + if not live_path.exists(): + print(f"ERROR: live file not found: {live_path}", file=sys.stderr) + return 2 + if not archive_path.exists(): + print(f"ERROR: archive file not found: {archive_path}", file=sys.stderr) + return 2 + + moved, skipped = rollover( + live_path=live_path, + archive_path=archive_path, + cutoff=cutoff, + dry_run=args.dry_run, + ) + + verb = "Would move" if args.dry_run else "Moved" + print( + f"{verb} {len(moved)} entries. " + f"Skipped {len(skipped)} entries with missing/unparseable end dates." + ) + if args.dry_run and moved: + print("Entries that would move:") + for entry in moved: + print(f" - {_entry_id_or_placeholder(entry)}") + if skipped: + print("Skipped entries:") + for entry_id, reason in skipped: + print(f" - {entry_id}: {reason}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/tests/__init__.py b/scripts/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/tests/conftest.py b/scripts/tests/conftest.py new file mode 100644 index 0000000..d619d10 --- /dev/null +++ b/scripts/tests/conftest.py @@ -0,0 +1,15 @@ +"""Ensure the repo root is on ``sys.path`` when running ``pytest scripts/tests``. + +This lets tests ``from scripts.update_readme import ...`` whether invoked from +the repo root, from inside ``scripts/``, or from an IDE with a different +working directory. +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +_REPO_ROOT = Path(__file__).resolve().parents[2] +if str(_REPO_ROOT) not in sys.path: + sys.path.insert(0, str(_REPO_ROOT)) diff --git a/scripts/tests/fixtures/expected_empty_block.md b/scripts/tests/fixtures/expected_empty_block.md new file mode 100644 index 0000000..201e734 --- /dev/null +++ b/scripts/tests/fixtures/expected_empty_block.md @@ -0,0 +1,15 @@ + +## Upcoming Summer Schools + +For the full list of schools worldwide, visit [awesome-mlss.com](https://awesome-mlss.com/). + +### Deadlines Soon +Schools with application deadlines in the next 2 weeks. + +*No schools currently match this window. See [awesome-mlss.com](https://awesome-mlss.com/) for upcoming schools.* + +### Happening Soon +Schools starting in the next 2 weeks. + +*No schools currently match this window. See [awesome-mlss.com](https://awesome-mlss.com/) for upcoming schools.* + diff --git a/scripts/tests/fixtures/expected_readme_block.md b/scripts/tests/fixtures/expected_readme_block.md new file mode 100644 index 0000000..2efec19 --- /dev/null +++ b/scripts/tests/fixtures/expected_readme_block.md @@ -0,0 +1,21 @@ + +## Upcoming Summer Schools + +For the full list of schools worldwide, visit [awesome-mlss.com](https://awesome-mlss.com/). + +### Deadlines Soon +Schools with application deadlines in the next 2 weeks. + +Title|Topics|Place|Deadline|Dates|Details +-----|------|-----|--------|-----|------- +Alpha School|Machine Learning, Generative AI|Alphaville, France|Apr 22, 2026
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/alpha26)|Jun 01 - Jun 05, 2026|[Details](https://awesome-mlss.com/summerschool/alpha26) +Beta School featured|Computer Vision|Betatown, Italy|Apr 28, 2026
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/beta26)|Apr 30 - May 10, 2026|[Details](https://awesome-mlss.com/summerschool/beta26) + +### Happening Soon +Schools starting in the next 2 weeks. + +Title|Topics|Place|Deadline|Dates|Details +-----|------|-----|--------|-----|------- +Beta School featured|Computer Vision|Betatown, Italy|Apr 28, 2026
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/beta26)|Apr 30 - May 10, 2026|[Details](https://awesome-mlss.com/summerschool/beta26) +Delta School|Natural Language Proc|Delta, Germany|TBA
⏰ [Add to Calendar](https://awesome-mlss.com/summerschool/delta26)|May 03 - May 07, 2026|[Details](https://awesome-mlss.com/summerschool/delta26) + diff --git a/scripts/tests/fixtures/rollover_archive.yml b/scripts/tests/fixtures/rollover_archive.yml new file mode 100644 index 0000000..358d588 --- /dev/null +++ b/scripts/tests/fixtures/rollover_archive.yml @@ -0,0 +1,13 @@ +# Fixture: archive with one pre-existing entry, used to verify appending. +- title: Existing Archive School + year: 2020 + id: existing_archive20 + full_name: "Existing Archive School 2020" + link: "https://example.com/archive" + deadline: 2020-04-01 + timezone: "UTC" + place: "Archived Place" + date: "July 1 - July 5, 2020" + start: 2020-07-01 + end: 2020-07-05 + sub: ['ML'] diff --git a/scripts/tests/fixtures/rollover_live.yml b/scripts/tests/fixtures/rollover_live.yml new file mode 100644 index 0000000..e7f46ec --- /dev/null +++ b/scripts/tests/fixtures/rollover_live.yml @@ -0,0 +1,62 @@ +# Fixture: live summerschools data with a mix of past, future, missing, +# and unparseable end dates. Used by test_rollover.py. +- title: Past School Alpha + year: 2025 + id: past_alpha25 + full_name: "Past School Alpha 2025" + link: "https://example.com/a" + deadline: 2025-05-01 + timezone: "UTC" + place: "Somewhere" + date: "July 1 - July 5, 2025" + start: 2025-07-01 + end: 2025-07-05 + sub: ['ML'] +- title: Future School Beta + year: 2026 + id: future_beta26 + full_name: "Future School Beta 2026" + link: "https://example.com/b" + deadline: 2026-05-01 + timezone: "UTC" + place: "Elsewhere" + date: "July 1 - July 5, 2026" + start: 2026-07-01 + end: 2026-07-05 + sub: ['ML'] +- title: Missing End Gamma + year: 2025 + id: missing_gamma25 + full_name: "Missing End Gamma 2025" + link: "https://example.com/c" + deadline: 2025-04-01 + timezone: "UTC" + place: "Nowhere" + date: "TBA" + start: 2025-08-01 + end: + sub: ['ML'] +- title: Unparseable End Delta + year: 2025 + id: unparseable_delta25 + full_name: "Unparseable End Delta 2025" + link: "https://example.com/d" + deadline: 2025-04-01 + timezone: "UTC" + place: "Anywhere" + date: "TBA" + start: 2025-08-01 + end: "not a date" + sub: ['ML'] +- title: Boundary School Epsilon + year: 2026 + id: boundary_epsilon26 + full_name: "Boundary School Epsilon 2026" + link: "https://example.com/e" + deadline: 2026-01-01 + timezone: "UTC" + place: "Boundary Town" + date: "January 10 - January 15, 2026" + start: 2026-01-10 + end: 2026-01-15 + sub: ['ML'] diff --git a/scripts/tests/fixtures/schools.yml b/scripts/tests/fixtures/schools.yml new file mode 100644 index 0000000..83cf64a --- /dev/null +++ b/scripts/tests/fixtures/schools.yml @@ -0,0 +1,30 @@ +--- +- title: Alpha School + id: alpha26 + deadline: 2026-04-22 + start: 2026-06-01 + end: 2026-06-05 + place: "Alphaville, France" + sub: ["ML", "GenAI"] +- title: Beta School + id: beta26 + deadline: "2026-04-28 23:59:59" + start: 2026-04-30 + end: 2026-05-10 + place: "Betatown, Italy" + sub: ["CV"] + featured: true +- title: Gamma School + id: gamma26 + deadline: 2026-07-01 + start: 2026-08-10 + end: 2026-08-15 + place: "Gamma City, Spain" + sub: ["RL"] +- title: Delta School + id: delta26 + deadline: TBA + start: 2026-05-03 + end: 2026-05-07 + place: "Delta, Germany" + sub: ["NLP"] diff --git a/scripts/tests/fixtures/types.yml b/scripts/tests/fixtures/types.yml new file mode 100644 index 0000000..857af41 --- /dev/null +++ b/scripts/tests/fixtures/types.yml @@ -0,0 +1,16 @@ +--- +- color: '#ffd300' + name: Machine Learning + sub: ML +- color: '#ff0000' + name: Generative AI + sub: GenAI +- color: '#deff0a' + name: Computer Vision + sub: CV +- color: '#91d99b' + name: Reinforcement Learning + sub: RL +- color: '#147df5' + name: Natural Language Proc + sub: NLP diff --git a/scripts/tests/fixtures/validate_schools_duplicate_id.yml b/scripts/tests/fixtures/validate_schools_duplicate_id.yml new file mode 100644 index 0000000..3ef8bd3 --- /dev/null +++ b/scripts/tests/fixtures/validate_schools_duplicate_id.yml @@ -0,0 +1,25 @@ +--- +- title: Alpha School + year: 2026 + id: alpha26 + full_name: Alpha International Summer School on Machine Learning + link: https://example.com/alpha + deadline: 2026-04-22 + timezone: Europe/Paris + place: "Alphaville, France" + date: "June 1-5, 2026" + start: 2026-06-01 + end: 2026-06-05 + sub: ["ML"] +- title: Alpha School Two + year: 2026 + id: alpha26 + full_name: Another Alpha School With Duplicate ID + link: https://example.com/alpha2 + deadline: 2026-04-28 + timezone: Europe/Rome + place: "Betatown, Italy" + date: "April 30 - May 10, 2026" + start: 2026-04-30 + end: 2026-05-10 + sub: ["CV"] diff --git a/scripts/tests/fixtures/validate_schools_good.yml b/scripts/tests/fixtures/validate_schools_good.yml new file mode 100644 index 0000000..507c465 --- /dev/null +++ b/scripts/tests/fixtures/validate_schools_good.yml @@ -0,0 +1,26 @@ +--- +- title: Alpha School + year: 2026 + id: alpha26 + full_name: Alpha International Summer School on Machine Learning + link: https://example.com/alpha + deadline: 2026-04-22 + timezone: Europe/Paris + place: "Alphaville, France" + date: "June 1-5, 2026" + start: 2026-06-01 + end: 2026-06-05 + sub: ["ML", "GenAI"] +- title: Beta School + year: 2026 + id: beta26 + full_name: Beta School of Computer Vision + link: https://example.com/beta + deadline: "2026-04-28 23:59:59" + timezone: Europe/Rome + place: "Betatown, Italy" + date: "April 30 - May 10, 2026" + start: 2026-04-30 + end: 2026-05-10 + sub: ["CV"] + featured: true diff --git a/scripts/tests/fixtures/validate_schools_malformed.yml b/scripts/tests/fixtures/validate_schools_malformed.yml new file mode 100644 index 0000000..1101eff --- /dev/null +++ b/scripts/tests/fixtures/validate_schools_malformed.yml @@ -0,0 +1,11 @@ +--- +- title: Alpha School + id: alpha26 + deadline: 2026-04-22 + start: 2026-06-01 + end: 2026-06-05 + place: "Alphaville, France" + sub: ["ML" + unclosed: "[" + bad_indent: + : broken diff --git a/scripts/tests/fixtures/validate_schools_missing_field.yml b/scripts/tests/fixtures/validate_schools_missing_field.yml new file mode 100644 index 0000000..98df99d --- /dev/null +++ b/scripts/tests/fixtures/validate_schools_missing_field.yml @@ -0,0 +1,25 @@ +--- +- title: Alpha School + year: 2026 + id: alpha26 + full_name: Alpha International Summer School on Machine Learning + link: https://example.com/alpha + deadline: 2026-04-22 + timezone: Europe/Paris + place: "Alphaville, France" + date: "June 1-5, 2026" + start: 2026-06-01 + end: 2026-06-05 + sub: ["ML"] +- title: Beta School + year: 2026 + id: beta26 + full_name: Beta School + link: https://example.com/beta + deadline: 2026-04-28 + timezone: Europe/Rome + place: "Betatown, Italy" + # missing `date` field + start: 2026-04-30 + end: 2026-05-10 + sub: ["CV"] diff --git a/scripts/tests/test_filters.py b/scripts/tests/test_filters.py new file mode 100644 index 0000000..7f475bd --- /dev/null +++ b/scripts/tests/test_filters.py @@ -0,0 +1,236 @@ +"""Unit tests for ``scripts.update_readme.filter_and_sort``.""" + +from __future__ import annotations + +import datetime + +from scripts.update_readme import filter_and_sort + + +def _school( + school_id: str, + *, + deadline=None, + start=None, + end=None, + featured: bool = False, + title: str | None = None, +): + entry = {"id": school_id, "title": title or school_id} + if deadline is not None: + entry["deadline"] = deadline + if start is not None: + entry["start"] = start + if end is not None: + entry["end"] = end + if featured: + entry["featured"] = True + return entry + + +TODAY = datetime.date(2026, 4, 20) + + +def _ids(entries): + return [s["id"] for s in entries] + + +# --------------------------------------------------------------------------- +# Deadline-window membership +# --------------------------------------------------------------------------- + + +def test_deadline_inside_window_included(): + schools = [_school("a", deadline=datetime.date(2026, 4, 25))] + deadlines, _ = filter_and_sort(schools, TODAY) + assert _ids(deadlines) == ["a"] + + +def test_deadline_on_lower_boundary_included(): + schools = [_school("a", deadline=TODAY)] + deadlines, _ = filter_and_sort(schools, TODAY) + assert _ids(deadlines) == ["a"] + + +def test_deadline_on_upper_boundary_included(): + schools = [_school("a", deadline=TODAY + datetime.timedelta(days=14))] + deadlines, _ = filter_and_sort(schools, TODAY) + assert _ids(deadlines) == ["a"] + + +def test_deadline_before_window_excluded(): + schools = [_school("a", deadline=TODAY - datetime.timedelta(days=1))] + deadlines, _ = filter_and_sort(schools, TODAY) + assert deadlines == [] + + +def test_deadline_after_window_excluded(): + schools = [_school("a", deadline=TODAY + datetime.timedelta(days=15))] + deadlines, _ = filter_and_sort(schools, TODAY) + assert deadlines == [] + + +def test_missing_deadline_skipped_from_deadlines_but_not_happening(): + """Missing ``deadline`` should not stop the entry from being considered + for Happening Soon.""" + schools = [_school("a", start=TODAY + datetime.timedelta(days=3))] + deadlines, happening = filter_and_sort(schools, TODAY) + assert deadlines == [] + assert _ids(happening) == ["a"] + + +def test_unparseable_deadline_skipped(): + schools = [_school("a", deadline="TBA")] + deadlines, _ = filter_and_sort(schools, TODAY) + assert deadlines == [] + + +def test_string_deadline_with_time_parsed(): + schools = [_school("a", deadline="2026-04-23 23:59:59")] + deadlines, _ = filter_and_sort(schools, TODAY) + assert _ids(deadlines) == ["a"] + + +# --------------------------------------------------------------------------- +# Start-window membership +# --------------------------------------------------------------------------- + + +def test_start_inside_window_included(): + schools = [_school("a", start=TODAY + datetime.timedelta(days=7))] + _, happening = filter_and_sort(schools, TODAY) + assert _ids(happening) == ["a"] + + +def test_start_outside_window_excluded(): + schools = [_school("a", start=TODAY + datetime.timedelta(days=30))] + _, happening = filter_and_sort(schools, TODAY) + assert happening == [] + + +def test_missing_start_skipped_from_happening(): + schools = [_school("a", deadline=TODAY + datetime.timedelta(days=3))] + _, happening = filter_and_sort(schools, TODAY) + assert happening == [] + + +def test_unparseable_start_skipped(): + schools = [_school("a", start="to be confirmed")] + _, happening = filter_and_sort(schools, TODAY) + assert happening == [] + + +# --------------------------------------------------------------------------- +# Both lists +# --------------------------------------------------------------------------- + + +def test_entry_in_both_windows_appears_in_both_lists(): + schools = [ + _school( + "a", + deadline=TODAY + datetime.timedelta(days=2), + start=TODAY + datetime.timedelta(days=10), + ) + ] + deadlines, happening = filter_and_sort(schools, TODAY) + assert _ids(deadlines) == ["a"] + assert _ids(happening) == ["a"] + + +# --------------------------------------------------------------------------- +# Sorting +# --------------------------------------------------------------------------- + + +def test_deadlines_sorted_ascending(): + schools = [ + _school("late", deadline=TODAY + datetime.timedelta(days=10)), + _school("early", deadline=TODAY + datetime.timedelta(days=1)), + _school("mid", deadline=TODAY + datetime.timedelta(days=5)), + ] + deadlines, _ = filter_and_sort(schools, TODAY) + assert _ids(deadlines) == ["early", "mid", "late"] + + +def test_happening_sorted_ascending(): + schools = [ + _school("late", start=TODAY + datetime.timedelta(days=12)), + _school("early", start=TODAY + datetime.timedelta(days=2)), + _school("mid", start=TODAY + datetime.timedelta(days=7)), + ] + _, happening = filter_and_sort(schools, TODAY) + assert _ids(happening) == ["early", "mid", "late"] + + +def test_featured_does_not_affect_order(): + """Featured entries should stay strictly time-ordered, not bubble to top.""" + schools = [ + _school( + "featured_late", + deadline=TODAY + datetime.timedelta(days=10), + featured=True, + ), + _school("plain_early", deadline=TODAY + datetime.timedelta(days=1)), + ] + deadlines, _ = filter_and_sort(schools, TODAY) + assert _ids(deadlines) == ["plain_early", "featured_late"] + + +def test_identical_deadlines_preserve_file_order(): + same = TODAY + datetime.timedelta(days=5) + schools = [ + _school("first", deadline=same), + _school("second", deadline=same), + ] + deadlines, _ = filter_and_sort(schools, TODAY) + assert _ids(deadlines) == ["first", "second"] + + +# --------------------------------------------------------------------------- +# Leap-day boundary +# --------------------------------------------------------------------------- + + +def test_leap_day_window_math(): + """T=2024-02-29 plus 14 days should land on 2024-03-14 (leap year).""" + leap_today = datetime.date(2024, 2, 29) + schools = [ + _school("on_leap", deadline=leap_today), + _school("last_day_in_window", deadline=datetime.date(2024, 3, 14)), + _school("just_past_window", deadline=datetime.date(2024, 3, 15)), + ] + deadlines, _ = filter_and_sort(schools, leap_today) + assert _ids(deadlines) == ["on_leap", "last_day_in_window"] + + +def test_non_leap_year_feb_28_plus_14_lands_in_march(): + """Sanity check: 2026-02-28 + 14 days = 2026-03-14.""" + today = datetime.date(2026, 2, 28) + schools = [ + _school("on_boundary", deadline=datetime.date(2026, 3, 14)), + _school("past_boundary", deadline=datetime.date(2026, 3, 15)), + ] + deadlines, _ = filter_and_sort(schools, today) + assert _ids(deadlines) == ["on_boundary"] + + +# --------------------------------------------------------------------------- +# Mixed-input sanity +# --------------------------------------------------------------------------- + + +def test_empty_input_returns_empty_lists(): + deadlines, happening = filter_and_sort([], TODAY) + assert deadlines == [] + assert happening == [] + + +def test_window_days_override(): + schools = [_school("a", deadline=TODAY + datetime.timedelta(days=20))] + # Default 14 -> empty. + deadlines_default, _ = filter_and_sort(schools, TODAY) + assert deadlines_default == [] + # Extended 30 -> included. + deadlines_extended, _ = filter_and_sort(schools, TODAY, window_days=30) + assert _ids(deadlines_extended) == ["a"] diff --git a/scripts/tests/test_pr_preview.py b/scripts/tests/test_pr_preview.py new file mode 100644 index 0000000..4f9c361 --- /dev/null +++ b/scripts/tests/test_pr_preview.py @@ -0,0 +1,433 @@ +"""Unit tests for ``scripts.pr_preview.build_preview`` and friends. + +The core logic lives in ``build_preview`` — a pure function that takes the +two YAML-parsed school lists, a ``types_map``, and ``today``, and returns +the comment body. Tests focus on that function; the git-shell wrapper is +covered by a single smoke test that invokes the CLI inside this repo's +working tree. +""" + +from __future__ import annotations + +import datetime +import subprocess +import sys +from pathlib import Path + +import pytest + +from scripts.pr_preview import ( + MARKER, + NO_CHANGES_BODY, + build_preview, +) + + +TODAY = datetime.date(2026, 4, 20) + +# A minimal types_map big enough that the renderer picks up every sub code +# used in the fixtures below. Unknown codes fall back to the code string, so +# the tests work either way. +TYPES_MAP = { + "ML": "Machine Learning", + "CV": "Computer Vision", + "NLP": "Natural Language Proc", + "RL": "Reinforcement Learning", + "GenAI": "Generative AI", +} + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _school( + school_id: str, + *, + title: str | None = None, + deadline=None, + start=None, + end=None, + place: str = "Somewhere", + sub=None, + featured: bool = False, +): + entry = { + "id": school_id, + "title": title or school_id.capitalize(), + "place": place, + "sub": list(sub) if sub else ["ML"], + } + if deadline is not None: + entry["deadline"] = deadline + if start is not None: + entry["start"] = start + if end is not None: + entry["end"] = end + if featured: + entry["featured"] = True + return entry + + +def _always_starts_with_marker(body: str) -> None: + assert body.startswith(MARKER + "\n"), ( + f"Body must start with marker + newline. First 80 chars: {body[:80]!r}" + ) + + +# --------------------------------------------------------------------------- +# Marker discipline +# --------------------------------------------------------------------------- + + +def test_marker_is_first_bytes_of_output_no_changes(): + body = build_preview([], [], TYPES_MAP, TODAY) + _always_starts_with_marker(body) + + +def test_marker_is_first_bytes_of_output_with_changes(): + pr_entry = _school( + "late26", + deadline=datetime.date(2026, 10, 1), + start=datetime.date(2026, 11, 1), + end=datetime.date(2026, 11, 5), + ) + body = build_preview([], [pr_entry], TYPES_MAP, TODAY) + _always_starts_with_marker(body) + + +# --------------------------------------------------------------------------- +# 1. Added entry fully out-of-window +# --------------------------------------------------------------------------- + + +def test_added_entry_out_of_window_goes_to_not_visible_section(): + pr_entry = _school( + "mlss-future26", + title="MLSS Future", + deadline=datetime.date(2026, 10, 1), + start=datetime.date(2026, 11, 1), + end=datetime.date(2026, 11, 5), + ) + body = build_preview([], [pr_entry], TYPES_MAP, TODAY) + + _always_starts_with_marker(body) + assert "**Not currently visible**" in body + # Both window lines present, both resolved to date ranges. + assert "`mlss-future26`" in body + assert "**Deadlines Soon**: 2026-09-17 \u2192 2026-10-01" in body + assert "**Happening Soon**: 2026-10-18 \u2192 2026-11-01" in body + # Entry is out-of-window on both sides of the diff, so the diff + # section should NOT appear. + assert "**Currently visible in README**" not in body + + +# --------------------------------------------------------------------------- +# 2. Added entry in-window -> diff section appears +# --------------------------------------------------------------------------- + + +def test_added_entry_in_window_goes_to_diff_section(): + pr_entry = _school( + "soon26", + title="Soon School", + deadline=datetime.date(2026, 4, 25), # within 14 days of TODAY + start=datetime.date(2026, 5, 5), + end=datetime.date(2026, 5, 7), + ) + body = build_preview([], [pr_entry], TYPES_MAP, TODAY) + + _always_starts_with_marker(body) + assert "**Currently visible in README**" in body + assert "```diff" in body + # The PR side adds lines -> unified-diff will contain a "+" line + # mentioning the title. + assert "Soon School" in body + # No out-of-window bucket for this entry. + assert "**Not currently visible**" not in body + + +# --------------------------------------------------------------------------- +# 3. Modified entry in-window -> diff section shows the edit +# --------------------------------------------------------------------------- + + +def test_modified_entry_in_window_shows_in_diff(): + master_entry = _school( + "abc26", + title="Original Title", + deadline=datetime.date(2026, 4, 25), + start=datetime.date(2026, 5, 5), + end=datetime.date(2026, 5, 7), + ) + pr_entry = _school( + "abc26", + title="Revised Title", + deadline=datetime.date(2026, 4, 25), + start=datetime.date(2026, 5, 5), + end=datetime.date(2026, 5, 7), + ) + body = build_preview([master_entry], [pr_entry], TYPES_MAP, TODAY) + + _always_starts_with_marker(body) + assert "**Currently visible in README**" in body + assert "Original Title" in body + assert "Revised Title" in body + assert "**Not currently visible**" not in body + assert "**Removed entries**" not in body + + +# --------------------------------------------------------------------------- +# 4. Modified entry out-of-window -> not-currently-visible section +# --------------------------------------------------------------------------- + + +def test_modified_entry_out_of_window_goes_to_not_visible_section(): + master_entry = _school( + "far26", + title="Far School", + deadline=datetime.date(2026, 10, 1), + start=datetime.date(2026, 11, 1), + end=datetime.date(2026, 11, 5), + ) + # Same id, shifted a bit; still fully out of window. + pr_entry = _school( + "far26", + title="Far School", + deadline=datetime.date(2026, 10, 15), + start=datetime.date(2026, 11, 1), + end=datetime.date(2026, 11, 5), + ) + body = build_preview([master_entry], [pr_entry], TYPES_MAP, TODAY) + + _always_starts_with_marker(body) + assert "**Not currently visible**" in body + assert "`far26`" in body + assert "**Deadlines Soon**: 2026-10-01 \u2192 2026-10-15" in body + # The diff section should NOT appear because neither master nor PR + # render includes this entry (both are out-of-window). + assert "**Currently visible in README**" not in body + + +# --------------------------------------------------------------------------- +# 5. Removed entry that was in-window at removal +# --------------------------------------------------------------------------- + + +def test_removed_entry_in_window_reports_was_in_window(): + master_entry = _school( + "goodbye26", + title="Goodbye School", + deadline=datetime.date(2026, 4, 25), + start=datetime.date(2026, 5, 5), + end=datetime.date(2026, 5, 7), + ) + body = build_preview([master_entry], [], TYPES_MAP, TODAY) + + _always_starts_with_marker(body) + assert "**Removed entries**" in body + assert "`goodbye26`" in body + assert "*(was in window at time of removal)*" in body + # Since removal makes the master render include it but the PR render + # excludes it, the diff section should ALSO appear here. + assert "**Currently visible in README**" in body + + +# --------------------------------------------------------------------------- +# 6. Removed entry that was out-of-window +# --------------------------------------------------------------------------- + + +def test_removed_entry_out_of_window_reports_was_not_in_window(): + master_entry = _school( + "farbye26", + title="Far Goodbye", + deadline=datetime.date(2026, 10, 1), + start=datetime.date(2026, 11, 1), + end=datetime.date(2026, 11, 5), + ) + body = build_preview([master_entry], [], TYPES_MAP, TODAY) + + _always_starts_with_marker(body) + assert "**Removed entries**" in body + assert "`farbye26`" in body + assert "*(was not in window at time of removal)*" in body + # Out-of-window on both sides -> diff section must be absent. + assert "**Currently visible in README**" not in body + + +# --------------------------------------------------------------------------- +# 7. No changes -> short body +# --------------------------------------------------------------------------- + + +def test_no_changes_returns_short_no_changes_body(): + # Same schools on both sides, same object graph -> no diff, nothing to + # classify. + entry = _school( + "same26", + deadline=datetime.date(2026, 10, 1), + start=datetime.date(2026, 11, 1), + end=datetime.date(2026, 11, 5), + ) + body = build_preview([entry], [entry], TYPES_MAP, TODAY) + + assert body == NO_CHANGES_BODY + _always_starts_with_marker(body) + assert "No detected changes" in body + + +# --------------------------------------------------------------------------- +# 8. Added entry with deadline='TBA' -> fallback text + real happening window +# --------------------------------------------------------------------------- + + +def test_added_entry_with_tba_deadline_shows_fallback_for_deadline_window(): + pr_entry = _school( + "tba26", + title="TBA School", + deadline="TBA", + start=datetime.date(2026, 11, 1), + end=datetime.date(2026, 11, 5), + ) + body = build_preview([], [pr_entry], TYPES_MAP, TODAY) + + _always_starts_with_marker(body) + assert "**Not currently visible**" in body + assert "`tba26`" in body + # Deadlines Soon fallback wording. + assert ( + "**Deadlines Soon**: *(deadline is TBA \u2014 will not appear in " + "Deadlines Soon until a date is set)*" + ) in body + # Happening Soon still computed. + assert "**Happening Soon**: 2026-10-18 \u2192 2026-11-01" in body + + +def test_added_entry_with_missing_start_shows_fallback_for_happening_window(): + pr_entry = { + "id": "nostart26", + "title": "No Start", + "deadline": datetime.date(2026, 10, 1), + "place": "Nowhere", + "sub": ["ML"], + # Deliberately no "start". + } + body = build_preview([], [pr_entry], TYPES_MAP, TODAY) + + _always_starts_with_marker(body) + assert "**Not currently visible**" in body + assert ( + "**Happening Soon**: *(start date not set \u2014 will not appear in " + "Happening Soon until a date is set)*" + ) in body + + +# --------------------------------------------------------------------------- +# 9. Empty sections are not rendered +# --------------------------------------------------------------------------- + + +def test_empty_currently_visible_section_is_omitted(): + # Only out-of-window adds -> must NOT contain the "Currently visible" + # header. + pr_entry = _school( + "far2", + deadline=datetime.date(2027, 1, 1), + start=datetime.date(2027, 2, 1), + end=datetime.date(2027, 2, 5), + ) + body = build_preview([], [pr_entry], TYPES_MAP, TODAY) + assert "**Currently visible in README**" not in body + # Sanity: the section we DO expect is still there. + assert "**Not currently visible**" in body + + +def test_empty_not_currently_visible_section_is_omitted(): + # Only an in-window modification -> "Not currently visible" header + # should be absent. + master_entry = _school( + "inwin26", + title="Before", + deadline=datetime.date(2026, 4, 25), + start=datetime.date(2026, 5, 5), + end=datetime.date(2026, 5, 7), + ) + pr_entry = _school( + "inwin26", + title="After", + deadline=datetime.date(2026, 4, 25), + start=datetime.date(2026, 5, 5), + end=datetime.date(2026, 5, 7), + ) + body = build_preview([master_entry], [pr_entry], TYPES_MAP, TODAY) + assert "**Currently visible in README**" in body + assert "**Not currently visible**" not in body + assert "**Removed entries**" not in body + + +def test_empty_removed_section_is_omitted(): + pr_entry = _school( + "solo26", + deadline=datetime.date(2026, 10, 1), + start=datetime.date(2026, 11, 1), + end=datetime.date(2026, 11, 5), + ) + body = build_preview([], [pr_entry], TYPES_MAP, TODAY) + assert "**Removed entries**" not in body + + +# --------------------------------------------------------------------------- +# Ordering: marker first, then the README preview header on the next line +# --------------------------------------------------------------------------- + + +def test_preview_header_follows_marker(): + pr_entry = _school( + "hdr26", + deadline=datetime.date(2026, 4, 25), + start=datetime.date(2026, 5, 5), + end=datetime.date(2026, 5, 7), + ) + body = build_preview([], [pr_entry], TYPES_MAP, TODAY) + lines = body.splitlines() + assert lines[0] == MARKER + assert lines[1] == "**README preview for this PR**" + + +# --------------------------------------------------------------------------- +# Smoke test: run the CLI inside this repo. Verifies that git-plumbing works +# when a master ref actually exists. We don't assert content — only that the +# script exits 0 and writes a file starting with the marker. +# --------------------------------------------------------------------------- + + +def test_cli_smoke_runs_inside_repo(tmp_path): + repo_root = Path(__file__).resolve().parents[2] + # If this checkout has no master ref (e.g. shallow PR clone), skip. + rc = subprocess.run( + ["git", "rev-parse", "--verify", "master"], + cwd=repo_root, + capture_output=True, + ) + if rc.returncode != 0: + pytest.skip("master ref not available in this checkout") + + output = tmp_path / "preview.md" + completed = subprocess.run( + [ + sys.executable, + str(repo_root / "scripts" / "pr_preview.py"), + "--output", + str(output), + "--today", + "2026-04-20", + ], + cwd=repo_root, + capture_output=True, + text=True, + ) + assert completed.returncode == 0, completed.stderr + body = output.read_text(encoding="utf-8") + assert body.startswith(MARKER + "\n") diff --git a/scripts/tests/test_render.py b/scripts/tests/test_render.py new file mode 100644 index 0000000..09e902e --- /dev/null +++ b/scripts/tests/test_render.py @@ -0,0 +1,162 @@ +"""Golden-file tests for ``scripts.update_readme.render``.""" + +from __future__ import annotations + +import datetime +from pathlib import Path + +import pytest + +from scripts.update_readme import ( + END_MARKER, + START_MARKER, + FALLBACK_MESSAGE, + _rewrite_readme, + filter_and_sort, + load, + render, +) + + +FIXTURES_DIR = Path(__file__).parent / "fixtures" + + +def _read_golden(name: str) -> str: + # Golden files store the block with a single trailing newline for tidy + # editor behavior; ``render`` returns the block with no trailing newline, + # so strip exactly one. + return FIXTURES_DIR.joinpath(name).read_text(encoding="utf-8").rstrip("\n") + + +def test_render_matches_golden_fixture(): + schools, types_map = load( + str(FIXTURES_DIR / "schools.yml"), + str(FIXTURES_DIR / "types.yml"), + ) + today = datetime.date(2026, 4, 20) + deadlines, happening = filter_and_sort(schools, today) + + actual = render(deadlines, happening, types_map) + expected = _read_golden("expected_readme_block.md") + + assert actual == expected + + +def test_render_empty_both_sections_fallback(): + actual = render([], [], {}) + expected = _read_golden("expected_empty_block.md") + + assert actual == expected + # Also a direct structural check so a future golden edit can't silently + # remove the fallback line. + assert actual.count(FALLBACK_MESSAGE) == 2 + + +def test_render_wraps_in_markers(): + block = render([], [], {}) + assert block.startswith(START_MARKER + "\n") + assert block.endswith(END_MARKER) + + +# --------------------------------------------------------------------------- +# _rewrite_readme: marker plumbing +# --------------------------------------------------------------------------- + + +def test_rewrite_replaces_region_between_markers(): + original = ( + "before\n" + f"{START_MARKER}\n" + "old content line 1\n" + "old content line 2\n" + f"{END_MARKER}\n" + "after\n" + ) + new_block = f"{START_MARKER}\nNEW\n{END_MARKER}" + updated = _rewrite_readme(original, new_block) + assert updated == ( + "before\n" + f"{START_MARKER}\n" + "NEW\n" + f"{END_MARKER}\n" + "after\n" + ) + + +def test_rewrite_preserves_trailing_newline_absence(): + original = ( + f"{START_MARKER}\nold\n{END_MARKER}" # no trailing newline + ) + new_block = f"{START_MARKER}\nNEW\n{END_MARKER}" + updated = _rewrite_readme(original, new_block) + assert updated == new_block + assert not updated.endswith("\n") + + +def test_rewrite_missing_start_marker_raises(): + original = f"just some content\n{END_MARKER}\n" + with pytest.raises(RuntimeError, match=START_MARKER): + _rewrite_readme(original, "ignored") + + +def test_rewrite_missing_end_marker_raises(): + original = f"{START_MARKER}\njust some content\n" + with pytest.raises(RuntimeError, match=END_MARKER): + _rewrite_readme(original, "ignored") + + +def test_rewrite_both_markers_missing_raises(): + with pytest.raises(RuntimeError): + _rewrite_readme("nothing here\n", "ignored") + + +def test_rewrite_reversed_markers_raises(): + original = f"{END_MARKER}\nstuff\n{START_MARKER}\n" + with pytest.raises(RuntimeError): + _rewrite_readme(original, "ignored") + + +def test_rewrite_duplicate_start_marker_raises(): + original = ( + f"{START_MARKER}\n" + "old content\n" + f"{END_MARKER}\n" + "middle\n" + f"{START_MARKER}\n" + "extra\n" + f"{END_MARKER}\n" + ) + with pytest.raises(RuntimeError, match=START_MARKER): + _rewrite_readme(original, "ignored") + + +def test_rewrite_duplicate_end_marker_raises(): + original = ( + f"{START_MARKER}\n" + "old content\n" + f"{END_MARKER}\n" + "middle\n" + f"{END_MARKER}\n" + ) + with pytest.raises(RuntimeError, match=END_MARKER): + _rewrite_readme(original, "ignored") + + +def test_rewrite_duplicate_start_error_names_marker(): + """Error message must identify which marker was duplicated.""" + original = ( + f"{START_MARKER}\ncontent\n{END_MARKER}\n" + f"{START_MARKER}\nmore\n{END_MARKER}\n" + ) + with pytest.raises(RuntimeError, match=START_MARKER): + _rewrite_readme(original, "ignored") + + +def test_rewrite_duplicate_end_error_names_marker(): + """Error message must identify which marker was duplicated.""" + original = ( + f"{START_MARKER}\ncontent\n{END_MARKER}\n" + f"extra line\n{END_MARKER}\n" + ) + with pytest.raises(RuntimeError, match=END_MARKER): + _rewrite_readme(original, "ignored") diff --git a/scripts/tests/test_rollover.py b/scripts/tests/test_rollover.py new file mode 100644 index 0000000..1c2b64a --- /dev/null +++ b/scripts/tests/test_rollover.py @@ -0,0 +1,307 @@ +"""Tests for ``scripts/rollover_year.py``. + +The tests copy the fixture YAML files to a ``tmp_path`` per-test so that the +fixtures on disk are never mutated. +""" + +from __future__ import annotations + +import datetime +import shutil +from pathlib import Path + +import pytest +from ruamel.yaml import YAML + +from scripts.rollover_year import main, rollover + +FIXTURES = Path(__file__).parent / "fixtures" +LIVE_FIXTURE = FIXTURES / "rollover_live.yml" +ARCHIVE_FIXTURE = FIXTURES / "rollover_archive.yml" + + +def _copy_fixtures(tmp_path: Path): + live = tmp_path / "summerschools.yml" + archive = tmp_path / "archive.yml" + shutil.copy2(LIVE_FIXTURE, live) + shutil.copy2(ARCHIVE_FIXTURE, archive) + return live, archive + + +def _load_yaml(path: Path): + yaml = YAML(typ="rt") + yaml.preserve_quotes = True + with open(path, "r", encoding="utf-8") as f: + return yaml.load(f) + + +def _ids(entries) -> list[str]: + return [str(e.get("id")) for e in (entries or [])] + + +# --------------------------------------------------------------------------- +# (1) Basic rollover: past moves, future stays, missing/unparseable skipped. +# --------------------------------------------------------------------------- + + +def test_rollover_moves_past_and_skips_bad_dates(tmp_path): + live, archive = _copy_fixtures(tmp_path) + cutoff = datetime.date(2026, 1, 1) + + moved, skipped = rollover(live, archive, cutoff=cutoff, dry_run=False) + + moved_ids = _ids(moved) + assert moved_ids == ["past_alpha25"] + + live_after = _load_yaml(live) + archive_after = _load_yaml(archive) + + assert "past_alpha25" not in _ids(live_after) + assert "future_beta26" in _ids(live_after) + assert "missing_gamma25" in _ids(live_after) + assert "unparseable_delta25" in _ids(live_after) + assert "boundary_epsilon26" in _ids(live_after) + + # Appended to archive in live-file order after the existing entry. + assert _ids(archive_after) == ["existing_archive20", "past_alpha25"] + + # Two skipped (missing + unparseable). + skipped_ids = sorted(entry_id for entry_id, _ in skipped) + assert skipped_ids == ["missing_gamma25", "unparseable_delta25"] + + # Reasons distinguish missing vs unparseable. + reasons = dict(skipped) + assert "missing" in reasons["missing_gamma25"].lower() + assert "unparseable" in reasons["unparseable_delta25"].lower() + + +# --------------------------------------------------------------------------- +# (2) Dry-run leaves files byte-identical but reports what would move. +# --------------------------------------------------------------------------- + + +def test_dry_run_does_not_modify_files(tmp_path): + live, archive = _copy_fixtures(tmp_path) + before_live = live.read_bytes() + before_archive = archive.read_bytes() + + moved, skipped = rollover( + live, archive, cutoff=datetime.date(2026, 1, 1), dry_run=True + ) + + assert live.read_bytes() == before_live + assert archive.read_bytes() == before_archive + + assert _ids(moved) == ["past_alpha25"] + # Skipped entries are reported in dry-run too. + assert {entry_id for entry_id, _ in skipped} == { + "missing_gamma25", + "unparseable_delta25", + } + + +# --------------------------------------------------------------------------- +# (3) Comment preservation in the live file. +# --------------------------------------------------------------------------- + + +def test_top_comment_preserved_after_rollover(tmp_path): + live, archive = _copy_fixtures(tmp_path) + rollover(live, archive, cutoff=datetime.date(2026, 1, 1), dry_run=False) + + text = live.read_text(encoding="utf-8") + # The fixture's header comment must still be in the live file. + assert "# Fixture: live summerschools data" in text + + +# --------------------------------------------------------------------------- +# (4) Key-order preservation on an entry that was NOT moved. +# --------------------------------------------------------------------------- + + +def test_key_order_preserved_for_kept_entry(tmp_path): + live, archive = _copy_fixtures(tmp_path) + rollover(live, archive, cutoff=datetime.date(2026, 1, 1), dry_run=False) + + live_after = _load_yaml(live) + # Find the future_beta26 entry. + kept = next(e for e in live_after if e.get("id") == "future_beta26") + expected_order = [ + "title", + "year", + "id", + "full_name", + "link", + "deadline", + "timezone", + "place", + "date", + "start", + "end", + "sub", + ] + assert list(kept.keys()) == expected_order + + +# --------------------------------------------------------------------------- +# (5) Cutoff boundary: end == cutoff → NOT moved. +# --------------------------------------------------------------------------- + + +def test_cutoff_boundary_inclusive_stay(tmp_path): + live, archive = _copy_fixtures(tmp_path) + # boundary_epsilon26 ends 2026-01-15. + cutoff = datetime.date(2026, 1, 15) + + moved, _ = rollover(live, archive, cutoff=cutoff, dry_run=False) + + moved_ids = _ids(moved) + assert "boundary_epsilon26" not in moved_ids + # past_alpha25 (end 2025-07-05) is still before cutoff → moved. + assert "past_alpha25" in moved_ids + + live_after = _load_yaml(live) + assert "boundary_epsilon26" in _ids(live_after) + + +# --------------------------------------------------------------------------- +# (6) Cutoff boundary: end == cutoff - 1 day → moved. +# --------------------------------------------------------------------------- + + +def test_cutoff_boundary_day_before_is_moved(tmp_path): + live, archive = _copy_fixtures(tmp_path) + # boundary_epsilon26 ends 2026-01-15 → cutoff 2026-01-16 should move it. + cutoff = datetime.date(2026, 1, 16) + + moved, _ = rollover(live, archive, cutoff=cutoff, dry_run=False) + + assert "boundary_epsilon26" in _ids(moved) + archive_after = _load_yaml(archive) + assert "boundary_epsilon26" in _ids(archive_after) + + +# --------------------------------------------------------------------------- +# (7) --cutoff CLI arg is parsed correctly. +# --------------------------------------------------------------------------- + + +def test_cli_cutoff_argument(tmp_path, capsys): + live, archive = _copy_fixtures(tmp_path) + + rc = main( + [ + "--cutoff", + "2026-01-01", + "--live", + str(live), + "--archive", + str(archive), + ] + ) + + assert rc == 0 + + out = capsys.readouterr().out + # Only past_alpha25 should move at this cutoff. + assert "Moved 1 entries" in out + assert "Skipped 2 entries" in out + + archive_after = _load_yaml(archive) + assert "past_alpha25" in _ids(archive_after) + + +def test_cli_dry_run_prints_would_move(tmp_path, capsys): + live, archive = _copy_fixtures(tmp_path) + before_live = live.read_bytes() + before_archive = archive.read_bytes() + + rc = main( + [ + "--dry-run", + "--cutoff", + "2026-01-01", + "--live", + str(live), + "--archive", + str(archive), + ] + ) + + assert rc == 0 + # Files untouched. + assert live.read_bytes() == before_live + assert archive.read_bytes() == before_archive + + out = capsys.readouterr().out + assert "Would move 1 entries" in out + assert "past_alpha25" in out + + +def test_cli_rejects_bad_cutoff_format(tmp_path): + live, archive = _copy_fixtures(tmp_path) + with pytest.raises(SystemExit): + main( + [ + "--cutoff", + "2026/01/01", + "--live", + str(live), + "--archive", + str(archive), + ] + ) + + +# --------------------------------------------------------------------------- +# (8) Empty archive: entries are appended correctly. +# --------------------------------------------------------------------------- + + +def test_empty_archive_with_only_comment(tmp_path): + live, _ = _copy_fixtures(tmp_path) + archive = tmp_path / "archive.yml" + archive.write_text("# empty archive\n[]\n", encoding="utf-8") + + moved, _ = rollover( + live, archive, cutoff=datetime.date(2026, 1, 1), dry_run=False + ) + assert _ids(moved) == ["past_alpha25"] + + archive_after = _load_yaml(archive) + assert _ids(archive_after) == ["past_alpha25"] + + +def test_archive_with_null_content(tmp_path): + """Archive file that is effectively empty (header comment only, no list).""" + live, _ = _copy_fixtures(tmp_path) + archive = tmp_path / "archive.yml" + archive.write_text("# Just a header, nothing else\n", encoding="utf-8") + + moved, _ = rollover( + live, archive, cutoff=datetime.date(2026, 1, 1), dry_run=False + ) + assert _ids(moved) == ["past_alpha25"] + + archive_after = _load_yaml(archive) + assert _ids(archive_after) == ["past_alpha25"] + + +# --------------------------------------------------------------------------- +# Additional: no moves is a clean no-op. +# --------------------------------------------------------------------------- + + +def test_no_moves_when_all_entries_future(tmp_path): + live, archive = _copy_fixtures(tmp_path) + before_live = live.read_bytes() + before_archive = archive.read_bytes() + + # Cutoff way in the past — nothing's end is before this. + moved, _ = rollover( + live, archive, cutoff=datetime.date(2000, 1, 1), dry_run=False + ) + assert moved == [] + # Files should not have been written (rollover skips writes when nothing moved). + assert live.read_bytes() == before_live + assert archive.read_bytes() == before_archive diff --git a/scripts/tests/test_validate_readme.py b/scripts/tests/test_validate_readme.py new file mode 100644 index 0000000..84f06bd --- /dev/null +++ b/scripts/tests/test_validate_readme.py @@ -0,0 +1,300 @@ +"""Tests for ``scripts/validate_readme.py``. + +The validator is the source of truth for PR status checks. These tests cover +the headline failure modes listed in the task spec: + +* Missing required field on an entry +* Duplicate ``id`` +* Malformed YAML +* Mismatched column counts in the UPCOMING README tables +* Happy path on complete, valid fixtures + +Plus an integration check that runs the validator against the real repo data +to catch regressions in the renderer / YAML state of the repo itself. +""" + +from __future__ import annotations + +import shutil +import subprocess +import sys +from pathlib import Path + +import pytest + +from scripts import validate_readme +from scripts.validate_readme import ( + ValidationError, + check_required_fields, + check_table_column_counts, + check_unique_ids, + validate, +) + + +FIXTURES = Path(__file__).parent / "fixtures" +REPO_ROOT = Path(__file__).resolve().parents[2] + + +VALID_TYPES_YML = """--- +- color: '#ffd300' + name: Machine Learning + sub: ML +- color: '#ff0000' + name: Generative AI + sub: GenAI +- color: '#deff0a' + name: Computer Vision + sub: CV +""" + + +README_WITH_GOOD_TABLES = """# Header + + +## Upcoming Summer Schools + +### Deadlines Soon + +Title|Topics|Place|Deadline|Dates|Details +-----|------|-----|--------|-----|------- +Alpha|ML|Paris|Apr 22|Jun 1-5|[d](x) +Beta|CV|Rome|Apr 28|Apr 30 - May 10|[d](x) + +### Happening Soon + +*No schools currently match this window.* + +""" + + +README_MISMATCH_COLUMNS = """# Header + + +## Upcoming Summer Schools + +Title|Topics|Place|Deadline|Dates|Details +-----|------|-----|--------|-----|------- +Alpha|ML|Paris|Apr 22|Jun 1-5|[d](x) +Beta|CV|Rome|Apr 28 + +""" + + +def _stage_repo(tmp_path: Path, schools_fixture: Path, readme_text: str) -> Path: + """Build a minimal repo layout under ``tmp_path`` suitable for validate(). + + Copies the real ``update_readme.py`` + fixture schools/types so the + renderer step can actually run, and writes a provided README.md. + """ + (tmp_path / "scripts").mkdir() + (tmp_path / "site" / "_data").mkdir(parents=True) + + shutil.copy2(REPO_ROOT / "scripts" / "update_readme.py", + tmp_path / "scripts" / "update_readme.py") + (tmp_path / "scripts" / "__init__.py").write_text("", encoding="utf-8") + + shutil.copy2(schools_fixture, + tmp_path / "site" / "_data" / "summerschools.yml") + (tmp_path / "site" / "_data" / "types.yml").write_text( + VALID_TYPES_YML, encoding="utf-8" + ) + (tmp_path / "README.md").write_text(readme_text, encoding="utf-8") + return tmp_path + + +# --------------------------------------------------------------------------- +# Unit tests for individual check functions +# --------------------------------------------------------------------------- + + +def test_check_required_fields_passes_on_complete_entry(): + entry = { + "title": "x", "year": 2026, "id": "x26", "full_name": "X", + "link": "https://x", "deadline": "2026-01-01", + "timezone": "UTC", "place": "Earth", "date": "Jan 1", + "start": "2026-01-01", "end": "2026-01-02", "sub": ["ML"], + } + check_required_fields([entry]) + + +def test_check_required_fields_fails_on_missing_field(): + entry = {"title": "x", "id": "x26"} # many missing + with pytest.raises(ValidationError, match="missing required field"): + check_required_fields([entry]) + + +def test_check_required_fields_names_offending_entry(): + entry = {"title": "x", "id": "my_school_id"} + with pytest.raises(ValidationError, match="my_school_id"): + check_required_fields([entry]) + + +def test_check_unique_ids_passes_on_unique(): + entries = [{"id": "a"}, {"id": "b"}, {"id": "c"}] + check_unique_ids(entries) + + +def test_check_unique_ids_fails_on_duplicate(): + entries = [{"id": "a"}, {"id": "b"}, {"id": "a"}] + with pytest.raises(ValidationError, match="Duplicate id"): + check_unique_ids(entries) + + +def test_check_unique_ids_message_includes_dup_id(): + entries = [{"id": "school_x"}, {"id": "school_x"}] + with pytest.raises(ValidationError, match="school_x"): + check_unique_ids(entries) + + +def test_check_table_column_counts_passes_on_valid(): + # Should not raise. + check_table_column_counts(README_WITH_GOOD_TABLES) + + +def test_check_table_column_counts_fails_on_mismatch(): + with pytest.raises(ValidationError, match="columns"): + check_table_column_counts(README_MISMATCH_COLUMNS) + + +def test_check_table_column_counts_fails_without_start_marker(): + bad = "no markers here\n" + with pytest.raises(ValidationError, match="start marker"): + check_table_column_counts(bad) + + +def test_check_table_column_counts_fails_without_end_marker(): + bad = "\nstuff\n" + with pytest.raises(ValidationError, match="end marker"): + check_table_column_counts(bad) + + +# --------------------------------------------------------------------------- +# End-to-end validate() with staged repo +# --------------------------------------------------------------------------- + + +def test_validate_happy_path_passes_on_good_fixture(tmp_path): + root = _stage_repo( + tmp_path, + FIXTURES / "validate_schools_good.yml", + README_WITH_GOOD_TABLES, + ) + # Should not raise. + validate(repo_root=root) + + +def test_validate_fails_on_missing_required_field(tmp_path): + root = _stage_repo( + tmp_path, + FIXTURES / "validate_schools_missing_field.yml", + README_WITH_GOOD_TABLES, + ) + with pytest.raises(ValidationError, match="missing required field"): + validate(repo_root=root) + + +def test_validate_fails_on_duplicate_id(tmp_path): + root = _stage_repo( + tmp_path, + FIXTURES / "validate_schools_duplicate_id.yml", + README_WITH_GOOD_TABLES, + ) + with pytest.raises(ValidationError, match="Duplicate id"): + validate(repo_root=root) + + +def test_validate_fails_on_malformed_yaml(tmp_path): + root = _stage_repo( + tmp_path, + FIXTURES / "validate_schools_malformed.yml", + README_WITH_GOOD_TABLES, + ) + with pytest.raises(ValidationError, match="malformed YAML"): + validate(repo_root=root) + + +def test_validate_fails_on_mismatched_table_columns(tmp_path): + # Use `run_render=False` so the renderer doesn't overwrite our deliberately + # broken README before check_table_column_counts reads it. + root = _stage_repo( + tmp_path, + FIXTURES / "validate_schools_good.yml", + README_MISMATCH_COLUMNS, + ) + with pytest.raises(ValidationError, match="columns"): + validate(repo_root=root, run_render=False) + + +# --------------------------------------------------------------------------- +# CLI entry point +# --------------------------------------------------------------------------- + + +def test_main_returns_zero_on_good_fixture(tmp_path, monkeypatch): + root = _stage_repo( + tmp_path, + FIXTURES / "validate_schools_good.yml", + README_WITH_GOOD_TABLES, + ) + monkeypatch.chdir(root) + assert validate_readme.main() == 0 + + +def test_main_returns_one_and_prints_error_on_duplicate_id( + tmp_path, monkeypatch, capsys +): + root = _stage_repo( + tmp_path, + FIXTURES / "validate_schools_duplicate_id.yml", + README_WITH_GOOD_TABLES, + ) + monkeypatch.chdir(root) + assert validate_readme.main() == 1 + captured = capsys.readouterr() + assert "Duplicate id" in captured.err + + +# --------------------------------------------------------------------------- +# Real-data integration: catches regressions in the repo itself. +# --------------------------------------------------------------------------- + + +def test_validate_real_repo_data_passes(): + validate(repo_root=REPO_ROOT) + + +def test_real_repo_yaml_parses_and_renderer_works(): + """Weaker real-repo test: YAML parses + renderer exits 0. + + Guards against breaking the renderer even while the missing-`date` bug + makes the strict validate() xfail. + """ + # Parse both YAML files. + import yaml as _yaml # local alias to avoid top-level import noise + schools = _yaml.safe_load( + (REPO_ROOT / "site" / "_data" / "summerschools.yml").read_text( + encoding="utf-8" + ) + ) + types = _yaml.safe_load( + (REPO_ROOT / "site" / "_data" / "types.yml").read_text(encoding="utf-8") + ) + assert isinstance(schools, list) and schools + assert isinstance(types, list) and types + + # ids are unique even if some entries are incomplete. + ids = [s.get("id") for s in schools if s.get("id")] + assert len(ids) == len(set(ids)), "id uniqueness regressed" + + # Renderer exits 0 against real data. + completed = subprocess.run( + [sys.executable, str(REPO_ROOT / "scripts" / "update_readme.py")], + cwd=str(REPO_ROOT), + capture_output=True, + text=True, + check=False, + ) + assert completed.returncode == 0, ( + f"renderer failed: stdout={completed.stdout} stderr={completed.stderr}" + ) diff --git a/scripts/tests/test_windows.py b/scripts/tests/test_windows.py new file mode 100644 index 0000000..862c0e1 --- /dev/null +++ b/scripts/tests/test_windows.py @@ -0,0 +1,243 @@ +"""Unit tests for ``scripts.windows.compute_visibility``.""" + +from __future__ import annotations + +import datetime + +import pytest + +from scripts.windows import compute_visibility + +TODAY = datetime.date(2026, 4, 20) +DEFAULT_WINDOW = 14 + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _entry(*, deadline=None, start=None): + e: dict = {} + if deadline is not None: + e["deadline"] = deadline + if start is not None: + e["start"] = start + return e + + +def _window_size(window): + """Return the number of days spanned by (from_date, to_date), inclusive.""" + from_date, to_date = window + return (to_date - from_date).days + + +# --------------------------------------------------------------------------- +# Both fields present +# --------------------------------------------------------------------------- + + +def test_both_fields_present_returns_both_windows(): + deadline = datetime.date(2026, 7, 15) + start = datetime.date(2026, 8, 1) + entry = _entry(deadline=deadline, start=start) + result = compute_visibility(entry, TODAY) + + assert result["deadline"] is not None + assert result["happening"] is not None + + +def test_deadline_window_to_date_matches_deadline(): + deadline = datetime.date(2026, 7, 15) + entry = _entry(deadline=deadline, start=datetime.date(2026, 8, 1)) + result = compute_visibility(entry, TODAY) + + _, to_date = result["deadline"] + assert to_date == deadline + + +def test_happening_window_to_date_matches_start(): + start = datetime.date(2026, 8, 1) + entry = _entry(deadline=datetime.date(2026, 7, 15), start=start) + result = compute_visibility(entry, TODAY) + + _, to_date = result["happening"] + assert to_date == start + + +def test_deadline_window_size_is_window_days(): + deadline = datetime.date(2026, 7, 15) + entry = _entry(deadline=deadline) + result = compute_visibility(entry, TODAY) + + assert _window_size(result["deadline"]) == DEFAULT_WINDOW + + +def test_happening_window_size_is_window_days(): + start = datetime.date(2026, 8, 1) + entry = _entry(start=start) + result = compute_visibility(entry, TODAY) + + assert _window_size(result["happening"]) == DEFAULT_WINDOW + + +def test_deadline_window_from_date_is_deadline_minus_window_days(): + deadline = datetime.date(2026, 7, 15) + entry = _entry(deadline=deadline) + result = compute_visibility(entry, TODAY) + + from_date, _ = result["deadline"] + assert from_date == deadline - datetime.timedelta(days=DEFAULT_WINDOW) + + +def test_happening_window_from_date_is_start_minus_window_days(): + start = datetime.date(2026, 8, 1) + entry = _entry(start=start) + result = compute_visibility(entry, TODAY) + + from_date, _ = result["happening"] + assert from_date == start - datetime.timedelta(days=DEFAULT_WINDOW) + + +# --------------------------------------------------------------------------- +# Missing fields +# --------------------------------------------------------------------------- + + +def test_missing_deadline_returns_none_for_deadline_key(): + entry = _entry(start=datetime.date(2026, 8, 1)) + result = compute_visibility(entry, TODAY) + + assert result["deadline"] is None + + +def test_missing_deadline_still_computes_happening(): + start = datetime.date(2026, 8, 1) + entry = _entry(start=start) + result = compute_visibility(entry, TODAY) + + assert result["happening"] is not None + _, to_date = result["happening"] + assert to_date == start + + +def test_missing_start_returns_none_for_happening_key(): + entry = _entry(deadline=datetime.date(2026, 7, 15)) + result = compute_visibility(entry, TODAY) + + assert result["happening"] is None + + +def test_missing_start_still_computes_deadline(): + deadline = datetime.date(2026, 7, 15) + entry = _entry(deadline=deadline) + result = compute_visibility(entry, TODAY) + + assert result["deadline"] is not None + _, to_date = result["deadline"] + assert to_date == deadline + + +def test_both_missing_returns_both_none(): + result = compute_visibility({}, TODAY) + + assert result["deadline"] is None + assert result["happening"] is None + + +# --------------------------------------------------------------------------- +# Unparseable / special strings +# --------------------------------------------------------------------------- + + +def test_deadline_tba_returns_none(): + entry = _entry(deadline="TBA", start=datetime.date(2026, 8, 1)) + result = compute_visibility(entry, TODAY) + + assert result["deadline"] is None + + +def test_happening_still_computed_when_deadline_is_tba(): + start = datetime.date(2026, 8, 1) + entry = _entry(deadline="TBA", start=start) + result = compute_visibility(entry, TODAY) + + assert result["happening"] is not None + + +# --------------------------------------------------------------------------- +# String inputs +# --------------------------------------------------------------------------- + + +def test_deadline_as_iso_string_parses_correctly(): + entry = _entry(deadline="2026-07-15") + result = compute_visibility(entry, TODAY) + + assert result["deadline"] is not None + _, to_date = result["deadline"] + assert to_date == datetime.date(2026, 7, 15) + + +def test_deadline_window_from_date_type_is_date_when_string_input(): + entry = _entry(deadline="2026-07-15") + result = compute_visibility(entry, TODAY) + + from_date, to_date = result["deadline"] + assert isinstance(from_date, datetime.date) + assert isinstance(to_date, datetime.date) + + +# --------------------------------------------------------------------------- +# datetime.datetime inputs +# --------------------------------------------------------------------------- + + +def test_deadline_as_datetime_coerced_to_date(): + dt = datetime.datetime(2026, 7, 15, 23, 59, 59) + entry = _entry(deadline=dt) + result = compute_visibility(entry, TODAY) + + assert result["deadline"] is not None + _, to_date = result["deadline"] + assert to_date == datetime.date(2026, 7, 15) + assert type(to_date) is datetime.date + + +def test_today_as_datetime_is_accepted(): + """compute_visibility should not raise when today is a datetime.""" + dt_today = datetime.datetime(2026, 4, 20, 12, 0, 0) + entry = _entry(deadline=datetime.date(2026, 7, 15)) + # Should not raise. + result = compute_visibility(entry, dt_today) + assert result["deadline"] is not None + + +# --------------------------------------------------------------------------- +# Custom window_days +# --------------------------------------------------------------------------- + + +def test_custom_window_days_reflected_in_deadline_window(): + deadline = datetime.date(2026, 7, 15) + entry = _entry(deadline=deadline) + result = compute_visibility(entry, TODAY, window_days=7) + + assert _window_size(result["deadline"]) == 7 + + +def test_custom_window_days_reflected_in_happening_window(): + start = datetime.date(2026, 8, 1) + entry = _entry(start=start) + result = compute_visibility(entry, TODAY, window_days=7) + + assert _window_size(result["happening"]) == 7 + + +def test_custom_window_days_from_date_correct(): + deadline = datetime.date(2026, 7, 15) + entry = _entry(deadline=deadline) + result = compute_visibility(entry, TODAY, window_days=7) + + from_date, _ = result["deadline"] + assert from_date == deadline - datetime.timedelta(days=7) diff --git a/scripts/update_readme.py b/scripts/update_readme.py index ffa5829..89f6355 100644 --- a/scripts/update_readme.py +++ b/scripts/update_readme.py @@ -1,188 +1,311 @@ +"""Regenerate the upcoming-schools region of README.md. + +The renderer looks at ``site/_data/summerschools.yml`` and, given a reference +``today``, writes two Markdown tables into README.md between the marker lines +```` and ````: + +* Deadlines Soon: entries whose ``deadline`` falls in ``[today, today+14]``. +* Happening Soon: entries whose ``start`` falls in ``[today, today+14]``. + +Both tables are strictly time-ordered (soonest first). ``featured: true`` still +renders an inline badge on the Title cell but does not influence sort order. + +Run from the repo root:: + + python scripts/update_readme.py +""" + +from __future__ import annotations + +import datetime +import sys +from pathlib import Path +from typing import Iterable, List, Mapping, Optional, Sequence, Tuple + import yaml -import re -from dateutil.parser import parse # pip install python-dateutil +from dateutil.parser import parse as _dateutil_parse SUMMERSCHOOLS_YML_PATH = "site/_data/summerschools.yml" TYPES_YML_PATH = "site/_data/types.yml" README_PATH = "README.md" +START_MARKER = "" +END_MARKER = "" -def parse_summerschools(): - """Load all summer schools from the YAML file.""" - with open(SUMMERSCHOOLS_YML_PATH, "r", encoding="utf-8") as f: - data = yaml.safe_load(f) - return data +FEATURED_BADGE_URL = "https://img.shields.io/badge/featured-blue?style=plastic" +DETAILS_URL_TEMPLATE = "https://awesome-mlss.com/summerschool/{id}" +FALLBACK_MESSAGE = ( + "*No schools currently match this window. " + "See [awesome-mlss.com](https://awesome-mlss.com/) for upcoming schools.*" +) -def parse_types(): - """ - Load the short-code to name mappings from site/_data/types.yml. - """ - with open(TYPES_YML_PATH, "r", encoding="utf-8") as f: - data = yaml.safe_load(f) +# --------------------------------------------------------------------------- +# Loading +# --------------------------------------------------------------------------- + + +def load( + summerschools_path: str = SUMMERSCHOOLS_YML_PATH, + types_path: str = TYPES_YML_PATH, +) -> Tuple[List[dict], dict]: + """Load schools and topic-code -> display-name map from YAML.""" + with open(summerschools_path, "r", encoding="utf-8") as f: + schools = yaml.safe_load(f) or [] - sub_map = {} - for item in data: + with open(types_path, "r", encoding="utf-8") as f: + types_raw = yaml.safe_load(f) or [] + + types_map = {} + for item in types_raw: sub_code = item.get("sub") name = item.get("name", "") if sub_code: - sub_map[sub_code] = name + types_map[sub_code] = name - return sub_map + return schools, types_map -def sort_summerschools_for_year(summerschools, year=2025): - """ - Filter out just the summerschools for the given year, then sort them: - 1) Featured schools first - 2) Within each group (featured/non-featured), sort: - - Descending by start date - - If start is the same, descending by end date - """ - # First, filter for the given year - filtered = [s for s in summerschools if s.get("year") == year] - - # Separate into featured and non-featured groups - featured = [s for s in filtered if s.get("featured", False)] - non_featured = [s for s in filtered if not s.get("featured", False)] - - # Sort function to be used for both groups - def sort_by_dates(schools): - return sorted( - schools, - key=lambda x: (x.get("start", ""), x.get("end", "")), - reverse=True - ) - - # Sort each group independently - sorted_featured = sort_by_dates(featured) - sorted_non_featured = sort_by_dates(non_featured) - - # Combine the groups: featured first, then non-featured - return sorted_featured + sorted_non_featured +# --------------------------------------------------------------------------- +# Date parsing helpers +# --------------------------------------------------------------------------- + +def _coerce_to_date(value) -> Optional[datetime.date]: + """Best-effort convert a YAML value to ``datetime.date``. -def format_date_abbr(date_str): + Returns ``None`` when the input is missing or unparseable. YAML-native + date/datetime values pass through directly; strings are parsed with + python-dateutil. """ - Parse a date string and return an abbreviated string, e.g. "Jan 09, 2025". - If parsing fails, return the original string. + if value is None: + return None + if isinstance(value, datetime.datetime): + return value.date() + if isinstance(value, datetime.date): + return value + if isinstance(value, str): + stripped = value.strip() + if not stripped: + return None + try: + return _dateutil_parse(stripped).date() + except (ValueError, TypeError, OverflowError): + return None + return None + + +# --------------------------------------------------------------------------- +# Filtering +# --------------------------------------------------------------------------- + + +def filter_and_sort( + schools: Sequence[dict], + today: datetime.date, + window_days: int = 14, +) -> Tuple[List[dict], List[dict]]: + """Return ``(deadlines_soon, happening_soon)`` given a reference ``today``. + + Both lists contain the original school dicts, untouched, strictly sorted + ascending by the relevant date field (soonest first). Entries with missing + or unparseable date fields are silently skipped from that list. """ - try: - dt = parse(date_str) - return dt.strftime("%b %d, %Y") # e.g. "Jan 09, 2025" - except Exception: - return date_str # fallback + window_end = today + datetime.timedelta(days=window_days) + deadlines_soon: List[Tuple[datetime.date, int, dict]] = [] + happening_soon: List[Tuple[datetime.date, int, dict]] = [] -def format_date_range_abbr(start_str, end_str): - """ - Given two ISO-like date strings: - - start_str -> displayed as "Jan 09" - - end_str -> displayed as "Jan 13, 2025" - So the final combined string is "Jan 09 - Jan 13, 2025". + for idx, school in enumerate(schools): + deadline = _coerce_to_date(school.get("deadline")) + if deadline is not None and today <= deadline <= window_end: + deadlines_soon.append((deadline, idx, school)) - If parsing fails, returns raw strings joined by a hyphen. - """ - try: - # e.g., "Jan 09" - start_fmt = start_str.strftime("%b %d") - # e.g., "Jan 13, 2025" - end_fmt = end_str.strftime("%b %d, %Y") + start = _coerce_to_date(school.get("start")) + if start is not None and today <= start <= window_end: + happening_soon.append((start, idx, school)) - return f"{start_fmt} - {end_fmt}" - except Exception: - return f"{start_str} - {end_str}" + # Stable sort: primary key is the date, tiebreaker is the YAML order index + # so that two entries with an identical date stay in file order. + deadlines_soon.sort(key=lambda t: (t[0], t[1])) + happening_soon.sort(key=lambda t: (t[0], t[1])) + return ( + [s for _, _, s in deadlines_soon], + [s for _, _, s in happening_soon], + ) -def generate_markdown_table(summerschools, types_map, year=2025): - """ - Creates a Markdown table for a specific year, with columns: - Title | Topics | Place | Deadline | Dates | Details - - 'Topics' is populated by looking up each code in 'sub' from the types_map dictionary. - - 'Deadline' is parsed and abbreviated (e.g., "Mar 23, 2025"). - - 'Dates' is start-end in the format "Jan 09 - Jan 13, 2025". - - The Details column links to https://awesome-mlss.com/summerschool/{id}. - """ - filtered_sorted = sort_summerschools_for_year(summerschools, year=year) +# --------------------------------------------------------------------------- +# Rendering +# --------------------------------------------------------------------------- - # Table header - md_lines = [ + +def _format_deadline_cell(school: dict) -> str: + deadline = _coerce_to_date(school.get("deadline")) + if deadline is None: + deadline_str = str(school.get("deadline", "")) + else: + deadline_str = deadline.strftime("%b %d, %Y") + school_id = school.get("id", "") + calendar_link = DETAILS_URL_TEMPLATE.format(id=school_id) + return f"{deadline_str}
\u23f0 [Add to Calendar]({calendar_link})" + + +def _format_date_range(school: dict) -> str: + start = _coerce_to_date(school.get("start")) + end = _coerce_to_date(school.get("end")) + if start is not None and end is not None: + return f"{start.strftime('%b %d')} - {end.strftime('%b %d, %Y')}" + # Fallback: best-effort string join. + return f"{school.get('start', '')} - {school.get('end', '')}" + + +def _format_title(school: dict) -> str: + title = school.get("title", "") + if school.get("featured", False): + badge = ( + f'featured' + ) + title = f"{title} {badge}" + return title + + +def _format_topics(school: dict, types_map: Mapping[str, str]) -> str: + sub_codes = school.get("sub", []) or [] + return ", ".join(types_map.get(code, code) for code in sub_codes) + + +def _render_table( + schools: Iterable[dict], + types_map: Mapping[str, str], +) -> str: + rows = [ "Title|Topics|Place|Deadline|Dates|Details", - "-----|------|-----|--------|-----|-------" + "-----|------|-----|--------|-----|-------", ] + for school in schools: + title = _format_title(school) + topics = _format_topics(school, types_map) + place = school.get("place", "") + deadline_cell = _format_deadline_cell(school) + dates_cell = _format_date_range(school) + details_link = DETAILS_URL_TEMPLATE.format(id=school.get("id", "")) + rows.append( + f"{title}|{topics}|{place}|{deadline_cell}|{dates_cell}|" + f"[Details]({details_link})" + ) + return "\n".join(rows) - for sch in filtered_sorted: - title = sch.get("title", "") - # Add featured tag if school is featured - if sch.get("featured", False): - badge_url="https://img.shields.io/badge/featured-blue?style=plastic" - title = f'{title} featured' - place = sch.get("place", "") - # Format deadline - deadline_raw = sch.get("deadline", "") - school_id = sch.get("id", "") - deadline_link = f"https://awesome-mlss.com/summerschool/{school_id}" - deadline_str = format_date_abbr(deadline_raw) # e.g. "Mar 23, 2025" - deadline_str = f"{deadline_str}
⏰ [Add to Calendar]({deadline_link})" +def render( + deadlines: Sequence[dict], + happening: Sequence[dict], + types_map: Mapping[str, str], +) -> str: + """Return the full Markdown block between (and including) the markers.""" + deadlines_body = ( + _render_table(deadlines, types_map) if deadlines else FALLBACK_MESSAGE + ) + happening_body = ( + _render_table(happening, types_map) if happening else FALLBACK_MESSAGE + ) - # Format start/end - start_raw = sch.get("start", "") - end_raw = sch.get("end", "") - dates_str = format_date_range_abbr(start_raw, end_raw) - # e.g. "Jan 09 - Jan 13, 2025" + return ( + f"{START_MARKER}\n" + "## Upcoming Summer Schools\n" + "\n" + "For the full list of schools worldwide, visit " + "[awesome-mlss.com](https://awesome-mlss.com/).\n" + "\n" + "### Deadlines Soon\n" + "Schools with application deadlines in the next 2 weeks.\n" + "\n" + f"{deadlines_body}\n" + "\n" + "### Happening Soon\n" + "Schools starting in the next 2 weeks.\n" + "\n" + f"{happening_body}\n" + f"{END_MARKER}" + ) - # Topics - sub_codes = sch.get("sub", []) - topics_list = [types_map.get(code, code) for code in sub_codes] - topics_str = ", ".join(topics_list) - # Details link - details_link = f"https://awesome-mlss.com/summerschool/{school_id}" +# --------------------------------------------------------------------------- +# README rewrite +# --------------------------------------------------------------------------- - # Build row - line = f"{title}|{topics_str}|{place}|{deadline_str}|{dates_str}|[Details]({details_link})" - md_lines.append(line) - return "\n".join(md_lines) +def _rewrite_readme(readme_text: str, block: str) -> str: + """Replace the region between START_MARKER and END_MARKER (inclusive).""" + lines = readme_text.splitlines(keepends=False) + start_count = sum(1 for line in lines if line.strip() == START_MARKER) + end_count = sum(1 for line in lines if line.strip() == END_MARKER) + if start_count > 1: + raise RuntimeError( + f"Marker appears more than once in README: {START_MARKER}" + ) + if end_count > 1: + raise RuntimeError( + f"Marker appears more than once in README: {END_MARKER}" + ) -def replace_section_in_readme(readme_text, new_markdown, year=2025): - """ - Finds a section in the README that starts with '## {year} Summer Schools' - and updates everything until the next '## ' or end of file. - """ - pattern = re.compile( - rf"(##\s+{year} Summer Schools)(.*?)(?=##\s|\Z)", - re.DOTALL - ) - new_section = f"## {year} Summer Schools\n{new_markdown}\n\n" - updated_readme = re.sub(pattern, new_section, readme_text) - return updated_readme + start_idx = _find_marker_line(lines, START_MARKER) + end_idx = _find_marker_line(lines, END_MARKER) + + if start_idx is None or end_idx is None: + missing = [] + if start_idx is None: + missing.append(START_MARKER) + if end_idx is None: + missing.append(END_MARKER) + raise RuntimeError( + f"Could not find required marker(s) in README: {', '.join(missing)}" + ) + if end_idx < start_idx: + raise RuntimeError( + f"Marker order is wrong in README: {END_MARKER} appears before " + f"{START_MARKER}." + ) -def main(): - # 1. Parse all summer schools - summerschools = parse_summerschools() + new_lines = lines[:start_idx] + block.splitlines() + lines[end_idx + 1 :] + trailing_newline = "\n" if readme_text.endswith("\n") else "" + return "\n".join(new_lines) + trailing_newline - # 2. Parse topic codes - types_map = parse_types() - # 3. Generate the new table - new_markdown_table = generate_markdown_table(summerschools, types_map, year=2025) +def _find_marker_line(lines: Sequence[str], marker: str) -> Optional[int]: + for i, line in enumerate(lines): + if line.strip() == marker: + return i + return None - # 4. Load existing README - with open(README_PATH, "r", encoding="utf-8") as f: - readme_text = f.read() - # 5. Replace old section with new table - updated_readme = replace_section_in_readme(readme_text, new_markdown_table, 2025) +# --------------------------------------------------------------------------- +# Entry point +# --------------------------------------------------------------------------- + + +def main(today: Optional[datetime.date] = None) -> None: + """CLI entry point: load data, render upcoming block, rewrite README.md. Exits 1 if markers are missing, malformed, or duplicated.""" + if today is None: + today = datetime.date.today() + + schools, types_map = load(SUMMERSCHOOLS_YML_PATH, TYPES_YML_PATH) + deadlines, happening = filter_and_sort(schools, today) + block = render(deadlines, happening, types_map) + + readme_path = Path(README_PATH) + original = readme_path.read_text(encoding="utf-8") + try: + updated = _rewrite_readme(original, block) + except RuntimeError as exc: + print(f"ERROR: {exc}", file=sys.stderr) + sys.exit(1) - # 6. Overwrite if there's a change - if updated_readme != readme_text: - with open(README_PATH, "w", encoding="utf-8") as f: - f.write(updated_readme) + if updated != original: + readme_path.write_text(updated, encoding="utf-8") print("README.md updated successfully.") else: print("No changes to README.md.") diff --git a/scripts/validate_readme.py b/scripts/validate_readme.py new file mode 100644 index 0000000..250520d --- /dev/null +++ b/scripts/validate_readme.py @@ -0,0 +1,317 @@ +"""Validate that summerschools.yml + types.yml + the renderer are in a good state. + +This script is invoked by the ``validate-readme`` GitHub Actions workflow as a +required status check on every PR targeting master. It performs the following +checks and exits non-zero on the first failure, with a clear error printed to +stderr: + +1. ``site/_data/summerschools.yml`` parses as a list of dicts. +2. ``site/_data/types.yml`` parses as a list of dicts. +3. Every school entry has the required fields present (presence only). +4. All ``id`` values in ``summerschools.yml`` are unique. +5. Running ``scripts/update_readme.py`` exits 0. +6. Every markdown table between ```` and + ```` in the resulting ``README.md`` has consistent + column counts (header, separator, and each data row all share the same + number of ``|``-separated cells). + +The script is intended to be robust enough to run both locally (from the repo +root) and in CI. It exits 0 silently on success. +""" + +from __future__ import annotations + +import subprocess +import sys +from pathlib import Path +from typing import List, Optional, Sequence + +import yaml + + +REQUIRED_SCHOOL_FIELDS: Sequence[str] = ( + "title", + "year", + "id", + "full_name", + "link", + "deadline", + "timezone", + "place", + "date", + "start", + "end", + "sub", +) + +DEFAULT_SUMMERSCHOOLS_PATH = "site/_data/summerschools.yml" +DEFAULT_TYPES_PATH = "site/_data/types.yml" +DEFAULT_README_PATH = "README.md" +DEFAULT_RENDER_SCRIPT = "scripts/update_readme.py" + +START_MARKER = "" +END_MARKER = "" + + +class ValidationError(Exception): + """Raised when a validation rule fails.""" + + +# --------------------------------------------------------------------------- +# Individual check functions (pure-ish; they read files but don't mutate them) +# --------------------------------------------------------------------------- + + +def _load_yaml_list(path: Path, label: str) -> List[dict]: + """Load ``path`` as YAML and assert the top-level shape is a list of dicts.""" + try: + text = path.read_text(encoding="utf-8") + except FileNotFoundError as exc: + raise ValidationError(f"{label}: file not found at {path}") from exc + + try: + parsed = yaml.safe_load(text) + except yaml.YAMLError as exc: + raise ValidationError(f"{label}: malformed YAML in {path}: {exc}") from exc + + if parsed is None: + return [] + if not isinstance(parsed, list): + raise ValidationError( + f"{label}: expected a YAML list at the top level of {path}, " + f"got {type(parsed).__name__}" + ) + for idx, item in enumerate(parsed): + if not isinstance(item, dict): + raise ValidationError( + f"{label}: entry at index {idx} in {path} is not a mapping " + f"(got {type(item).__name__})" + ) + return parsed + + +def check_required_fields(schools: Sequence[dict]) -> None: + """Every school entry must have the required fields (presence only).""" + for idx, school in enumerate(schools): + missing = [f for f in REQUIRED_SCHOOL_FIELDS if f not in school] + if missing: + identifier = school.get("id") or school.get("title") or f"index {idx}" + raise ValidationError( + f"Entry `{identifier}` is missing required field(s): " + f"{', '.join(missing)}" + ) + + +def check_unique_ids(schools: Sequence[dict]) -> None: + """All ``id`` values must be unique across the school list.""" + seen: dict = {} + duplicates: List[str] = [] + for school in schools: + entry_id = school.get("id") + if entry_id is None: + # Presence is enforced separately; skip here to avoid double-reporting. + continue + if entry_id in seen: + duplicates.append(str(entry_id)) + else: + seen[entry_id] = True + if duplicates: + # Preserve order but dedupe for the message. + seen_in_msg: set = set() + unique_dupes: List[str] = [] + for d in duplicates: + if d not in seen_in_msg: + seen_in_msg.add(d) + unique_dupes.append(d) + raise ValidationError( + f"Duplicate id(s) in summerschools.yml: {', '.join(unique_dupes)}" + ) + + +def run_renderer(script_path: Path, cwd: Path) -> None: + """Invoke ``scripts/update_readme.py``; fail if it exits non-zero.""" + completed = subprocess.run( + [sys.executable, str(script_path)], + cwd=str(cwd), + capture_output=True, + text=True, + check=False, + ) + if completed.returncode != 0: + stderr = (completed.stderr or "").strip() + stdout = (completed.stdout or "").strip() + raise ValidationError( + f"Renderer `{script_path}` exited with code " + f"{completed.returncode}.\nstdout:\n{stdout}\nstderr:\n{stderr}" + ) + + +def _extract_upcoming_region(readme_text: str) -> str: + """Return the text between START_MARKER and END_MARKER (exclusive).""" + lines = readme_text.splitlines() + try: + start_idx = next( + i for i, line in enumerate(lines) if line.strip() == START_MARKER + ) + except StopIteration as exc: + raise ValidationError( + f"README: missing start marker {START_MARKER}" + ) from exc + try: + end_idx = next( + i + for i, line in enumerate(lines) + if line.strip() == END_MARKER and i > start_idx + ) + except StopIteration as exc: + raise ValidationError( + f"README: missing end marker {END_MARKER} after start marker" + ) from exc + return "\n".join(lines[start_idx + 1 : end_idx]) + + +def _count_cells(row: str) -> int: + """Count ``|``-separated cells in a markdown table row. + + A leading/trailing ``|`` (common in some table styles) is tolerated by + stripping surrounding pipes first. Cell count then equals ``len(split)``. + """ + stripped = row.strip() + if stripped.startswith("|"): + stripped = stripped[1:] + if stripped.endswith("|"): + stripped = stripped[:-1] + return len(stripped.split("|")) + + +def _is_separator_row(row: str) -> bool: + """Is this the `---|---` separator line of a markdown table?""" + stripped = row.strip() + if not stripped: + return False + # Tolerate leading/trailing pipe. + if stripped.startswith("|"): + stripped = stripped[1:] + if stripped.endswith("|"): + stripped = stripped[:-1] + cells = stripped.split("|") + if not cells: + return False + for cell in cells: + c = cell.strip() + if not c: + return False + # allow leading/trailing colons for alignment (:---, ---:, :---:) + if c.startswith(":"): + c = c[1:] + if c.endswith(":"): + c = c[:-1] + if not c or set(c) != {"-"}: + return False + return True + + +def _looks_like_table_row(row: str) -> bool: + """Heuristic: any non-empty line containing a ``|`` is part of a table.""" + return "|" in row and bool(row.strip()) + + +def check_table_column_counts(readme_text: str) -> None: + """Walk tables in the UPCOMING region; error on mismatched column counts.""" + region = _extract_upcoming_region(readme_text) + lines = region.splitlines() + + i = 0 + table_num = 0 + while i < len(lines): + line = lines[i] + # A table starts on a line with `|`, where the NEXT non-empty line is + # a separator row. + if _looks_like_table_row(line): + # Look for separator on the immediate next line. + if i + 1 < len(lines) and _is_separator_row(lines[i + 1]): + table_num += 1 + header_cells = _count_cells(line) + separator_cells = _count_cells(lines[i + 1]) + if separator_cells != header_cells: + raise ValidationError( + f"README table #{table_num}: separator row has " + f"{separator_cells} columns but header has " + f"{header_cells}" + ) + # Walk rows until a non-table line or blank line. + j = i + 2 + row_num = 0 + while j < len(lines) and _looks_like_table_row(lines[j]): + row_num += 1 + row_cells = _count_cells(lines[j]) + if row_cells != header_cells: + raise ValidationError( + f"README table #{table_num}, row {row_num}: has " + f"{row_cells} columns but header has " + f"{header_cells}" + ) + j += 1 + i = j + continue + i += 1 + + +# --------------------------------------------------------------------------- +# Orchestration +# --------------------------------------------------------------------------- + + +def validate( + repo_root: Optional[Path] = None, + *, + run_render: bool = True, +) -> None: + """Run all checks; raise ``ValidationError`` on the first failure. + + Parameters + ---------- + repo_root: + Directory containing ``site/_data/summerschools.yml`` et al. Defaults + to the current working directory. + run_render: + Whether to invoke ``scripts/update_readme.py`` via subprocess. Tests + keep this ``True`` on the happy path (real data) but the check is a + no-op friendly boundary if a caller wants to skip it. + """ + root = Path(repo_root) if repo_root is not None else Path.cwd() + + summerschools_path = root / DEFAULT_SUMMERSCHOOLS_PATH + types_path = root / DEFAULT_TYPES_PATH + readme_path = root / DEFAULT_README_PATH + render_script = root / DEFAULT_RENDER_SCRIPT + + schools = _load_yaml_list(summerschools_path, "summerschools.yml") + _load_yaml_list(types_path, "types.yml") + + check_required_fields(schools) + check_unique_ids(schools) + + if run_render: + run_renderer(render_script, cwd=root) + + try: + readme_text = readme_path.read_text(encoding="utf-8") + except FileNotFoundError as exc: + raise ValidationError( + f"README.md not found at {readme_path}" + ) from exc + check_table_column_counts(readme_text) + + +def main(argv: Optional[Sequence[str]] = None) -> int: + try: + validate() + except ValidationError as exc: + print(f"ERROR: {exc}", file=sys.stderr) + return 1 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/windows.py b/scripts/windows.py new file mode 100644 index 0000000..ddcff44 --- /dev/null +++ b/scripts/windows.py @@ -0,0 +1,100 @@ +"""Compute README visibility windows for a summer-school entry. + +Used by ``scripts/pr_preview.py`` to tell a contributor when their entry will +appear in the rolling "Deadlines Soon" and "Happening Soon" tables in README.md. +""" + +from __future__ import annotations + +import datetime +from typing import Optional, Tuple + +from dateutil.parser import parse as _dateutil_parse + + +# --------------------------------------------------------------------------- +# Date coercion (intentional copy from update_readme.py — keeps this module +# standalone so it can be imported without pulling in the full update script) +# --------------------------------------------------------------------------- + + +def _coerce_to_date(value) -> Optional[datetime.date]: + """Best-effort convert a YAML value to ``datetime.date``. + + Returns ``None`` when the input is missing or unparseable. YAML-native + date/datetime values pass through directly; strings are parsed with + python-dateutil. + """ + if value is None: + return None + if isinstance(value, datetime.datetime): + return value.date() + if isinstance(value, datetime.date): + return value + if isinstance(value, str): + stripped = value.strip() + if not stripped: + return None + try: + return _dateutil_parse(stripped).date() + except (ValueError, TypeError, OverflowError): + return None + return None + + +# --------------------------------------------------------------------------- +# Public interface +# --------------------------------------------------------------------------- + +WindowResult = Optional[Tuple[datetime.date, datetime.date]] + + +def compute_visibility( + entry: dict, + today, + window_days: int = 14, +) -> dict: + """Return the windows during which *entry* will appear in the README tables. + + Args: + entry: A school dict parsed from ``summerschools.yml``. + today: Reference date (``datetime.date`` or ``datetime.datetime``). + window_days: Size of each rolling window (default 14). + + Returns: + A dict with two keys: + + ``"deadline"`` + ``(from_date, to_date)`` where ``to_date`` is the parsed deadline + and ``from_date`` is ``deadline - window_days``. ``None`` when the + deadline field is absent or unparseable. + + ``"happening"`` + ``(from_date, to_date)`` where ``to_date`` is the parsed start date + and ``from_date`` is ``start - window_days``. ``None`` when the + start field is absent or unparseable. + + Both ``from_date`` and ``to_date`` are ``datetime.date`` objects. + """ + # Coerce today to a plain date so callers may pass datetime objects. + if isinstance(today, datetime.datetime): + today = today.date() + + delta = datetime.timedelta(days=window_days) + + deadline_date = _coerce_to_date(entry.get("deadline")) + if deadline_date is not None: + deadline_window: WindowResult = (deadline_date - delta, deadline_date) + else: + deadline_window = None + + start_date = _coerce_to_date(entry.get("start")) + if start_date is not None: + happening_window: WindowResult = (start_date - delta, start_date) + else: + happening_window = None + + return { + "deadline": deadline_window, + "happening": happening_window, + } diff --git a/site/_data/archive.yml b/site/_data/archive.yml index 4a0dbb6..5e6392a 100644 --- a/site/_data/archive.yml +++ b/site/_data/archive.yml @@ -15,7 +15,7 @@ latitude: 9.001256787555048 longitude: 7.422043111050481 series: Data Science Africa -- title: Deep Learning Indaba +- title: Deep Learning Indaba year: 2018 id: dli2018 full_name: Deep Learning Indaba 2018 @@ -32,7 +32,7 @@ latitude: -33.932607486119146 longitude: 18.864382623381296 series: Deep Learning Indaba -- title: Gaussian Process and Uncertainty Quantification Summer School +- title: Gaussian Process and Uncertainty Quantification Summer School year: 2018 id: gpuqss2018 full_name: Gaussian Process and Uncertainty Quantification Summer School (GPSS 2018) @@ -49,7 +49,7 @@ latitude: 53.38151336184058 longitude: -1.488406809374382 series: Gaussian Process and Uncertainty Quantification Summer School (GPSS) -- title: Machine Learning Summer School +- title: Machine Learning Summer School year: 2018 id: mlss2018 full_name: Machine Learning Summer School (MLSS Madrid) 2018 @@ -64,7 +64,7 @@ note: - title: Deep|Bayes Summer School year: 2018 - id: dbss2018 + id: dbss2018 full_name: Deep|Bayes Summer School 2018 link: http://deepbayes.ru deadline: TBA @@ -143,7 +143,7 @@ latitude: 46.77136499195592 longitude: 23.61033061956413 series: Eastern European Machine Learning (EEML) Summer School -- title: Vision Understanding and Machine Intelligence +- title: Vision Understanding and Machine Intelligence year: 2018 id: visum2018 full_name: Vision Understanding and Machine Intelligence (VISUM 2018) @@ -190,7 +190,7 @@ latitude: 45.21800311263281 longitude: 5.8073904546200925 series: PRAIRIE AI Summer School -- title: Machine Learning Summer School +- title: Machine Learning Summer School year: 2018 id: mlss2018 full_name: Machine Learning Summer School (MLSS Buenos Aires) 2018 @@ -282,7 +282,7 @@ date: May 28 - June 01, 2018 start: 2018-05-28 end: 2018-06-01 - sub: ['ML','AI4Games'] + sub: ['ML', 'AI4Games'] note: location: latitude: 35.51346126561815 @@ -291,7 +291,7 @@ - title: Khipu Latin American Meeting In Artificial Intelligence year: 2019 id: klmai2019 - full_name: Khipu Latin American Meeting In Artificial Intelligence 2019 + full_name: Khipu Latin American Meeting In Artificial Intelligence 2019 link: http://www.khipu.ai/ deadline: '2019-06-28 23:59:59' timezone: UTC+1 @@ -304,7 +304,7 @@ - title: PRAIRIE AI Summer School year: 2019 id: paiss2019 - full_name: PRAIRIE AI Summer School 2019 + full_name: PRAIRIE AI Summer School 2019 link: https://project.inria.fr/paiss deadline: '2019-09-06 23:59:59' timezone: UTC+1 @@ -338,7 +338,7 @@ - title: Deep Learning in NLP Summer School year: 2019 id: dlnss2019 - full_name: Deep Learning in NLP Summer School 2019 + full_name: Deep Learning in NLP Summer School 2019 link: https://dlinnlp.github.io/index.html deadline: TBA timezone: UTC+1 @@ -348,7 +348,7 @@ end: 2019-08-30 sub: ['ML', 'NLP'] note: -- title: Machine Learning Summer School +- title: Machine Learning Summer School year: 2019 id: mlss2019 full_name: Machine Learning Summer School (MLSS Moscow) 2019 @@ -364,7 +364,7 @@ - title: Deep|Bayes Summer School year: 2019 id: dbss2019 - full_name: Deep|Bayes Summer School 2019 + full_name: Deep|Bayes Summer School 2019 link: http://deepbayes.ru/ deadline: '2019-04-15 23:59:59' timezone: UTC+1 @@ -377,8 +377,8 @@ location: latitude: 55.76159982982924 longitude: 37.63326446873304 - series: Deep|Bayes Summer School -- title: Deep Learning Indaba + series: Deep|Bayes Summer School +- title: Deep Learning Indaba year: 2019 id: dli2019 full_name: Deep Learning Indaba 2019 @@ -411,7 +411,7 @@ - title: Human-Aligned AI Summer School year: 2019 id: hass2019 - full_name: Human-Aligned AI Summer School 2019 + full_name: Human-Aligned AI Summer School 2019 link: http://humanaligned.ai/ deadline: '2019-06-25 23:59:59' timezone: UTC+1 @@ -421,7 +421,7 @@ end: 2019-07-28 sub: ['ML'] note: -- title: Deep Learning and Reinforcement Learning Summer School +- title: Deep Learning and Reinforcement Learning Summer School year: 2019 id: dlrlss2019 full_name: Deep Learning and Reinforcement Learning Summer School (DLRL 2019) @@ -455,7 +455,7 @@ latitude: 52.2296756 longitude: 21.0122287 series: International Summer School on Deep Learning (DeepLearn) -- title: Summer School on Cognitive Robotics +- title: Summer School on Cognitive Robotics year: 2019 id: sscr2019 full_name: Summer School on Cognitive Robotics 2019 @@ -494,7 +494,7 @@ end: 2019-07-26 sub: ['ML'] note: -- title: Lisbon Machine Learning School +- title: Lisbon Machine Learning School year: 2019 id: lmls2019 full_name: Lisbon Machine Learning School (LxMLS 2019) @@ -600,7 +600,7 @@ - title: International Summer School on Deep Learning year: 2019 id: issdl2019 - full_name: International Summer School on Deep Learning 2019 + full_name: International Summer School on Deep Learning 2019 link: http://2019.dl-lab.eu/registration/registration-fee/ deadline: '2019-02-28 23:59:59' timezone: UTC+1 @@ -679,7 +679,7 @@ end: 2019-07-03 sub: ['ML', 'CV'] note: -- title: Advanced Statistics and Data Mining Summer School +- title: Advanced Statistics and Data Mining Summer School year: 2019 id: asdmss2019 full_name: Advanced Statistics and Data Mining Summer School 2019 @@ -733,7 +733,7 @@ - title: AI and Games Summer School year: 2019 id: agss2019 - full_name: AI and Games Summer School 2019 + full_name: AI and Games Summer School 2019 link: http://school.gameaibook.org deadline: '2019-02-28 23:59:59' timezone: UTC+1 @@ -793,7 +793,7 @@ - title: AI Summer School year: 2020 id: ass2020 - full_name: AI Summer School 2020 + full_name: AI Summer School 2020 link: https://sites.google.com/view/aisummerschool2020/ deadline: '2020-06-26 23:59:59' timezone: UTC+1 @@ -816,7 +816,7 @@ end: 2020-07-18 sub: ['ML'] note: -- title: Oxford Machine Learning Summer School +- title: Oxford Machine Learning Summer School year: 2020 id: omlss2020 full_name: Oxford Machine Learning Summer School 2020 @@ -869,7 +869,7 @@ end: 2020-08-14 sub: ['ML', 'RL', 'AI4Games'] note: -- title: Machine Learning Summer School +- title: Machine Learning Summer School year: 2020 id: mlss2020 full_name: Machine Learning Summer School (MLSS Indonesia) 2020 @@ -962,7 +962,7 @@ - title: Machine learning summer school in healthcare and biosciences year: 2020 id: mls2020 - full_name: Machine learning summer school in healthcare and biosciences 2020 + full_name: Machine learning summer school in healthcare and biosciences 2020 link: https://bumblekite.four-corp.com/ deadline: '2020-03-15 23:59:59' timezone: UTC+1 @@ -993,7 +993,7 @@ latitude: 50.06122632983513 longitude: 19.932855281876716 series: Eastern European Machine Learning (EEML) Summer School -- title: Machine Learning Summer School +- title: Machine Learning Summer School year: 2020 id: ml2020 full_name: Machine Learning Summer School (MLSS Tübingen) @@ -1066,7 +1066,7 @@ end: 2020-06-26 sub: ['ML'] note: -- title: Asian Machine Learning School +- title: Asian Machine Learning School year: 2021 id: ls2021 full_name: Asian Machine Learning School (Online) 2021 @@ -1119,7 +1119,7 @@ end: 2021-09-03 sub: ['ML', 'HW'] note: -- title: Leibniz Mathematical Modeling and Simulation Summer School +- title: Leibniz Mathematical Modeling and Simulation Summer School year: 2021 id: mm2021 full_name: Leibniz Mathematical Modeling and Simulation Summer School 2021 @@ -1135,7 +1135,7 @@ - title: Artificial Intelligence and Data Science for Healthcare Innovation year: 2021 id: hi2021 - full_name: Artificial Intelligence and Data Science for Healthcare Innovation 2021 + full_name: Artificial Intelligence and Data Science for Healthcare Innovation 2021 link: http://www.imperial.ac.uk/continuing-professional-development/short-courses/summer-schools/summerschool/artificial-intelligence-and-data-science-for-healthcare-innovation/ deadline: '//' timezone: UTC+1 @@ -1145,7 +1145,7 @@ end: 2021-08-27 sub: ['ML', 'Health'] note: -- title: Summer School of Machine Learning at Skoltech +- title: Summer School of Machine Learning at Skoltech year: 2021 id: ls2021 full_name: Summer School of Machine Learning at Skoltech (SMILES) 2021 @@ -1178,7 +1178,7 @@ - title: Imperial Data Science Online Summer School year: 2021 id: ids2021 - full_name: Imperial Data Science Online Summer School 2021 + full_name: Imperial Data Science Online Summer School 2021 link: http://www.imperial.ac.uk/continuing-professional-development/short-courses/summer-schools/summerschool/imperial-data-science-online-summer-school/ deadline: TBA timezone: UTC+1 @@ -1188,7 +1188,7 @@ end: 2021-08-20 sub: ['ML'] note: -- title: Neuromatch Academy-Deep Learning +- title: Neuromatch Academy-Deep Learning year: 2021 id: na2021 full_name: Neuromatch Academy-Deep Learning 2021 @@ -1248,7 +1248,7 @@ latitude: 28.123545 longitude: -15.436257 series: International Summer School on Deep Learning (DeepLearn) -- title: Deep Learning and Reinforcement Learning Summer School +- title: Deep Learning and Reinforcement Learning Summer School year: 2021 id: ds2021 full_name: Deep Learning and Reinforcement Learning Summer School (DLRL 2021) @@ -1265,7 +1265,7 @@ latitude: 53.546124 longitude: -113.493823 series: Deep Learning and Reinforcement Learning Summer School (DLRL) -- title: Human-aligned AI Virtual Summer School +- title: Human-aligned AI Virtual Summer School year: 2021 id: ha2021 full_name: Human-aligned AI Virtual Summer School 2021 @@ -1339,7 +1339,7 @@ latitute: 38.73716166904233 longitude: -9.140120305237149 series: Lisbon Machine Learning Summer School (LxMLS) -- title: Neuromatch Academy-Computational Neuroscience +- title: Neuromatch Academy-Computational Neuroscience year: 2021 id: cn2021 full_name: Neuromatch Academy-Computational Neuroscience 2021 @@ -1383,10 +1383,10 @@ latitude: 41.149610 longitude: -8.610990 series: Vision Understanding and Machine Intelligence (VISUM) -- title: ACM India Summer Schools +- title: ACM India Summer Schools year: 2021 id: ai2021 - full_name: ACM India Summer Schools 2021 + full_name: ACM India Summer Schools 2021 link: https://india.acm.org/education/acm-india-summer-schools deadline: '2021-05-18 23:59:59' timezone: UTC+1 @@ -1403,7 +1403,7 @@ link: http://cvit.iiit.ac.in/summerschool2021/index.php deadline: TBA' timezone: UTC+1 - place: Virtual + place: Virtual date: July 01 - July 31, 2021 start: 2021-07-01 end: 2021-07-31 @@ -1439,7 +1439,7 @@ - title: NYU AI School year: 2021 id: nyu2021 - full_name: NYU AI School 2021 + full_name: NYU AI School 2021 link: https://nyu-mll.github.io/nyu-ai-school-2021/ deadline: '2021-00-00 23:59:59' timezone: UTC+1 @@ -1492,7 +1492,7 @@ end: 2022-09-02 sub: ['ML'] note: -- title: European Summer School in Logic, Language and Information +- title: European Summer School in Logic, Language and Information year: 2022 id: el2022 full_name: European Summer School in Logic, Language and Information (ESSLLI) @@ -1542,7 +1542,7 @@ - title: Human-aligned AI Summer School year: 2022 id: hs2022 - full_name: Human-aligned AI Summer School 2022 + full_name: Human-aligned AI Summer School 2022 link: http://humanaligned.ai/index.html deadline: '2022-06-19 23:59:59' timezone: UTC+1 @@ -1598,7 +1598,7 @@ - title: Eastern European Machine Learning Summer School year: 2022 id: ess2022 - full_name: Eastern European Machine Learning Summer School 2022 + full_name: Eastern European Machine Learning Summer School 2022 link: https://www.eeml.eu/home deadline: '2022-04-07 23:59:59' timezone: UTC+1 @@ -1625,7 +1625,7 @@ end: 2022-07-08 sub: ['ML', 'Health', 'CV'] note: -- title: Machine Learning School in The Netherlands +- title: Machine Learning School in The Netherlands year: 2022 id: sn2022 full_name: Machine Learning School in The Netherlands 2022 @@ -1725,7 +1725,7 @@ sub: ['ML'] note: location: - latitute: 40.598970356000116 + latitute: 40.598970356000116 longitude: 23.00350412667427 series: Mediterranean Machine Learning Summer School (M2L) - title: Climate Change AI Summer School @@ -2136,10 +2136,10 @@ start: 2024-10-07 end: 2024-10-11 sub: ['ML', 'Health', 'Neuro'] - note: null + note: twitter: https://x.com/LMU_SNAP emaiL: psy-nmss@med.uni-muenchen.de -- title: Summer School on Artificial Intelligence in Health and Life Sciences +- title: Summer School on Artificial Intelligence in Health and Life Sciences year: 2024 id: aihls24 full_name: Summer School on Artificial Intelligence in Health and Life Sciences 2024 @@ -2151,8 +2151,8 @@ start: 2024-09-09 end: 2024-09-13 sub: ['ML', 'Health'] - note: null - twitter: null + note: + twitter: emaiL: ucbmacademy@unicampus.it - title: European Summer School on Quantum AI (EQAI) year: 2024 @@ -2166,8 +2166,8 @@ start: 2024-09-02 end: 2024-09-06 sub: ['ML', 'Quantum', 'HW'] - note: null - twitter: null + note: + twitter: email: info.eqai@gmail.com - title: CIFAR Neuroscience of Consciousness Winter School year: 2024 @@ -2181,7 +2181,7 @@ start: 2024-12-19 end: 2024-12-21 sub: ['Neuro'] - note: null + note: twitter: https://x.com/cifar_news?mx=2 email: info@cifar.ca - title: Paris Generative AI Autumn School @@ -2196,8 +2196,8 @@ start: 2024-10-21 end: 2024-10-25 sub: ['ML', 'NLP'] - note: null - twitter: null + note: + twitter: email: gs.isn@universite-paris-saclay.fr - title: IEEE-EURASIP S3P year: 2024 @@ -2211,8 +2211,8 @@ start: 2024-09-23 end: 2024-09-27 sub: ['ML', 'SP'] - note: null - twitter: null + note: + twitter: email: s3p2024capri@gmail.com - title: AθNLP year: 2024 @@ -2226,7 +2226,7 @@ start: 2024-09-19 end: 2024-09-25 sub: ['ML', 'NLP'] - note: null + note: twitter: https://twitter.com/athensnlp email: athnlp2024@athenarc.gr - title: IDESSAI @@ -2241,8 +2241,8 @@ start: 2024-09-03 end: 2024-09-13 sub: ['NLP', 'RO', 'GenAI'] - note: null - twitter: null + note: + twitter: email: idessai-support@dfki.de - title: Mediterranean Machine Learning Summer School (M2L) year: 2024 @@ -2256,7 +2256,7 @@ start: 2024-09-09 end: 2024-09-13 sub: ['ML'] - note: null + note: twitter: https://twitter.com/M2lSchool email: organizers@m2lschool.org location: @@ -2275,7 +2275,7 @@ start: 2024-09-09 end: 2024-09-12 sub: ['ML', 'Theory'] - note: null + note: twitter: https://twitter.com/sheffieldmlnet email: mauricio.alvarezlopez@manchester.ac.uk location: @@ -2294,7 +2294,7 @@ start: 2024-09-02 end: 2024-09-09 sub: ['ML', 'SP'] - note: null + note: twitter: https://twitter.com/malga_center email: malga@unige.it - title: HPC Computer Architectures for AI and Dedicated Applications @@ -2322,7 +2322,7 @@ start: 2024-09-01 end: 2024-09-07 sub: ['ML'] - note: null + note: twitter: https://twitter.com/deepindaba email: info@deeplearningindaba.com location: @@ -2341,7 +2341,7 @@ start: 2024-08-26 end: 2024-08-30 sub: ['CogSci', 'NLP'] - note: null + note: email: contact@ilcb.fr twitter: https://twitter.com/ILCB_france - title: Summer School on Biomedical Image Analysis @@ -2356,8 +2356,8 @@ start: 2024-08-12 end: 2024-08-16 sub: ['ML', 'Bio', 'CV'] - note: null - twitter: null + note: + twitter: email: acco@adm.dtu.dk - title: Analytical Connectionism Summer School year: 2024 @@ -2371,8 +2371,8 @@ start: 2024-08-12 end: 2024-08-23 sub: ['ML', 'CogSci'] - note: null - twitter: null + note: + twitter: email: cclarke@simonsfoundation.org - title: Princeton Machine Learning Theory Summer School year: 2024 @@ -2386,8 +2386,8 @@ start: 2024-08-06 end: 2024-08-15 sub: ['ML', 'Theory'] - note: null - twitter: null + note: + twitter: email: pmlss@princeton.edu location: latitude: 40.34590714001614 @@ -2405,8 +2405,8 @@ start: 2024-08-06 end: 2024-08-08 sub: ['ML', 'Bio'] - note: null - twitter: null + note: + twitter: email: vuk.marojevic@ece.msstate.edu - title: 35th European Summer School in Logic year: 2024 @@ -2420,8 +2420,8 @@ start: 2024-07-29 end: 2024-08-09 sub: ['Log'] - note: null - twitter: null + note: + twitter: email: esslli2024@kuleuven.be - title: Model-Based Neuroscience and Cognition Summer School year: 2024 @@ -2435,8 +2435,8 @@ start: 2024-07-29 end: 2024-08-02 sub: ['CogSci', 'Neuro'] - note: null - twitter: null + note: + twitter: email: info.modelbasedneuroscience@gmail.com - title: Vision and Sports Summer School year: 2024 @@ -2450,8 +2450,8 @@ start: 2024-07-22 end: 2024-07-27 sub: ['ML', 'CV'] - note: null - twitter: null + note: + twitter: email: vs3@cmp.felk.cvut.cz - title: Summer School on Affordable AI year: 2024 @@ -2465,8 +2465,8 @@ start: 2024-07-22 end: 2024-07-26 sub: ['ML', 'EML'] - note: null - twitter: null + note: + twitter: email: shadi.albarqouni@ukbonn.de - title: Eastern European Machine Learning Summer School year: 2024 @@ -2499,8 +2499,8 @@ start: 2024-07-15 end: 2024-07-19 sub: ['ML'] - note: null - twitter: null + note: + twitter: email: david@irdta.eu - title: African Computer Vision Summer School year: 2024 @@ -2514,7 +2514,7 @@ start: 2024-07-14 end: 2024-07-24 sub: ['ML', 'CV'] - note: null + note: twitter: https://x.com/ACVSS_AI email: acvss@googlegroups.com series: African Computer Vision Summer School (ACVSS) @@ -2530,7 +2530,7 @@ start: 2024-07-08 end: 2024-07-17 sub: ['ML', 'RL'] - note: null + note: twitter: https://twitter.com/CIFAR_News email: info@dlrl.ca location: @@ -2549,9 +2549,9 @@ start: 2024-07-08 end: 2024-07-13 sub: ['CV', 'Bio', 'ML'] - note: null - twitter: null - email: null + note: + twitter: + email: - title: International Computer Vision Summer School year: 2024 id: icvs2024 @@ -2564,7 +2564,7 @@ start: 2024-07-07 end: 2024-07-13 sub: ['CV'] - note: null + note: twitter: https://twitter.com/icvss email: icvss@dmi.unict.it location: @@ -2583,9 +2583,9 @@ start: 2024-07-06 end: 2024-07-28 sub: ['ML'] - note: null - twitter: null - email: null + note: + twitter: + email: - title: Oxford ML school year: 2024 id: omls2024 @@ -2598,7 +2598,7 @@ start: 2024-07-06 end: 2024-07-09 sub: ['ML'] - note: null + note: twitter: https://twitter.com/GlobalGoalsAI email: contact@oxfordml.school location: @@ -2618,7 +2618,7 @@ end: 2024-07-03 sub: ['ML'] note: Free - twitter: null + twitter: email: aicourse@hellenic-ias.org - title: Machine Learning Summer School In Health year: 2024 @@ -2632,8 +2632,8 @@ start: 2024-06-30 end: 2024-07-06 sub: ['ML', 'Health', 'Bio'] - note: null - twitter: null + note: + twitter: email: bumblekite-team@four-corp.com location: latitude: 47.376821212238646 @@ -2651,7 +2651,7 @@ start: 2024-06-25 end: 2024-06-28 sub: ['ML'] - note: null + note: twitter: https://twitter.com/malga_center email: info@unige.it - title: 10th International Summer School on AI and Big Data @@ -2666,7 +2666,7 @@ start: 2024-06-25 end: 2024-06-28 sub: ['ML', 'GenAI', 'ML4Science', 'RAI', 'Theory'] - note: null + note: twitter: https://twitter.com/Sca_DS email: zih@tu-dresden.de - title: Generative Modeling Summer School @@ -2681,7 +2681,7 @@ start: 2024-06-24 end: 2024-06-28 sub: ['ML', 'GenAI'] - note: null + note: twitter: https://twitter.com/hashtag/GeMSS24 email: gemss@sciencesconf.org location: @@ -2700,7 +2700,7 @@ start: 2024-06-19 end: 2024-06-23 sub: ['ML', 'RL', 'RO'] - note: null + note: twitter: https://twitter.com/coop_ai email: info@cooperativeai.org - title: Information, Noise and Physics of Life @@ -2715,7 +2715,7 @@ start: 2024-06-17 end: 2024-06-28 sub: ['ML4Science', 'Theory'] - note: null + note: twitter: https://twitter.com/ictpnews email: web@rt.ictp.it - title: Madrid UPM Machine Learning and Advanced Statistics Summer School @@ -2730,7 +2730,7 @@ start: 2024-06-17 end: 2024-06-28 sub: ['Theory'] - note: null + note: twitter: https://twitter.com/grupocig_upm email: lauragveiga@fi.upm.es location: @@ -2749,7 +2749,7 @@ start: 2024-06-17 end: 2024-06-21 sub: ['ML', 'AI4Games'] - note: null + note: twitter: https://twitter.com/GameAISchool email: school@gameaibook.org location: @@ -2768,7 +2768,7 @@ start: 2024-06-17 end: 2024-06-21 sub: ['Theory'] - note: null + note: twitter: https://twitter.com/probabilisticai/ email: hello@probabilistic.ai location: @@ -2787,8 +2787,8 @@ start: 2024-06-17 end: 2024-06-21 sub: ['ML', 'Bio'] - twitter: null - note: null + twitter: + note: email: halper@che.utexas.edu - title: Norwegian AI Summer Research School year: 2024 @@ -2817,7 +2817,7 @@ start: 2024-06-10 end: 2024-06-14 sub: ['ML', 'CV'] - note: null + note: twitter: https://twitter.com/malga_center email: malga@unige.it location: @@ -2827,7 +2827,7 @@ - title: RPL Summer School year: 2024 id: rplss2024 - full_name: Robotics, Perception and Learning Summer School 2024 + full_name: Robotics, Perception and Learning Summer School 2024 link: https://summer-school.rpl.eecs.kth.se deadline: '2024-03-13 23:59:59' timezone: Europe/Stockholm @@ -2836,9 +2836,9 @@ start: 2024-06-09 end: 2024-06-14 sub: ['ML', 'RO'] - note: null - twitter: null - email: rpl-events@eecs.kth.se + note: + twitter: + email: rpl-events@eecs.kth.se - title: Artificial Intelligence in Education year: 2024 id: aiie2024 @@ -2851,7 +2851,7 @@ start: 2024-06-03 end: 2024-06-13 sub: ['ML', 'RAI'] - note: null + note: twitter: https://twitter.com/uib email: bsrs@uib.no - title: Summer School for Large Language Models @@ -2866,8 +2866,8 @@ start: 2024-07-06 end: 2024-07-18 sub: ['ML', 'GenAI'] - note: null - twitter: null + note: + twitter: email: jiaoxue@tsinghua.edu.cn - title: Winter School on Foundation Models year: 2024 @@ -2881,9 +2881,9 @@ start: 2024-03-12 end: 2024-03-15 sub: ['ML', 'GenAI'] - note: null - twitter: null - email: null + note: + twitter: + email: - title: Tropical Probabilistic AI School year: 2024 id: tpas2024 @@ -2896,7 +2896,7 @@ start: 2024-01-29 end: 2024-02-02 sub: ['ML', 'Theory'] - note: null + note: twitter: https://twitter.com/probabilisticai/ email: hello@probabilistic.ai location: @@ -2905,7 +2905,7 @@ series: Probabilistic AI School (ProbAI) - title: Climate Change AI Summer School (Virtual) year: 2024 - id: ccaivirtual24 + id: ccaivirtual24 full_name: Climate Change AI Summer School 2024 link: https://www.climatechange.ai/events/summer_school2024 deadline: '2024-08-01 23:59:59' @@ -2914,7 +2914,7 @@ start: 2024-06-20 end: 2024-08-01 sub: ['ML', 'ML4Science'] - note: null + note: twitter: https://twitter.com/climatechangeai email: summerschool+inperson@climatechange.ai - title: 27th BMVA Computer Vision Summer School @@ -2946,7 +2946,7 @@ twitter: https://x.com/ACMRecSys email: summerschool2024@recsys.acm.org - title: International Summer School in Cognitive Science - year: 2024 + year: 2024 id: issCogSciBulgaria24 full_name: 30th International Summer School in Cognitive Science link: https://cogsci.nbu.bg/en/international-summer-school-in-cognitive-science @@ -2962,7 +2962,7 @@ email: summer.school.cogsci@gmail.com - title: Touch Sensing and Processing Summer School year: 2024 - id: tspss2024 + id: tspss2024 full_name: Touch Sensing and Processing Summer School 2024 link: https://lasr.org/tspss2024 deadline: 2024-07-09 23:59 @@ -2985,7 +2985,7 @@ start: 2024-07-08 end: 2024-07-12 sub: ['ML', 'Theory'] - note: null + note: twitter: https://x.com/LogmlSchool email: logml.committee@gmail.com - title: Lisbon Machine Learning School @@ -3001,7 +3001,7 @@ end: 2024-07-17 sub: ['ML', 'NLP'] note: There is a registration fee. - twitter: + twitter: email: lxmls-2024@googlegroups.com location: latitute: 38.73716166904233 @@ -3034,7 +3034,7 @@ sub: ['ML'] note: Reg fee - $165 (Academic discount) twitter: https://x.com/eigenvectorinc - email: null + email: - title: CCAIM AI and Machine Learning Summer School year: 2024 id: CCAIM24 @@ -3057,7 +3057,7 @@ link: https://ut.ee/en/content/megadata-federated-machine-learning deadline: 2024-05-31 00:00 timezone: Europe/Tallinn - place: Tartu, Estonia + place: Tartu, Estonia date: July 28 - Aug 10, 2024 start: 2024-07-28 end: 2024-08-10 @@ -3072,14 +3072,14 @@ link: https://www.skema.edu/summer-school/ai-for-business-summer-school/ deadline: 2024-04-30 00:00 timezone: Canada/Eastern - place: Montreal, Canada + place: Montreal, Canada date: July 08 - July 11, 2024 start: 2024-07-08 end: 2024-07-11 sub: ['ML'] note: Reg fee - 1500 EUR twitter: https://x.com/SKEMA_BS - email: null + email: - title: International School on Artificial Intelligence for Cognitive Technologies 2024 year: 2024 id: isact2024 @@ -3092,17 +3092,17 @@ start: 2024-12-10 end: 2024-12-13 sub: ['ML', 'CogSci'] - note: null + note: twitter: https://x.com/isact_org email: isact.org@proton.me - title: Latin American Summer School on Robotics (LACORO) year: 2024 - id: lacoro24 + id: lacoro24 full_name: Latin American Summer School on Robotics 2024 - link: https://www.lacoro.org/ + link: https://www.lacoro.org/ deadline: 2024-11-01 00:00 timezone: Chile/Continental - place: Rancagua, Chile + place: Rancagua, Chile date: December 09 - 13, 2024 start: 2024-12-09 end: 2024-12-13 @@ -3110,8 +3110,8 @@ note: Reg fee $0 USD for IEEE Student Member - title: Italian Association for Artificial Intelligence International Summer School year: 2024 - id: AIxIA24 - full_name: Italian Association for Artificial Intelligence International Summer School 2024 + id: AIxIA24 + full_name: Italian Association for Artificial Intelligence International Summer School 2024 link: https://sites.google.com/unimib.it/advancesinai-2024/home deadline: 2024-09-20 00:00 timezone: CET @@ -3136,7 +3136,7 @@ start: 2024-06-10 end: 2024-06-14 sub: ['ML'] - note: null + note: twitter: "https://x.com/taosciences" email: "acdl@icas.cc" location: @@ -3156,7 +3156,7 @@ start: 2023-06-10 end: 2023-06-14 sub: ['ML'] - note: null + note: twitter: "https://x.com/taosciences" email: "acdl@icas.cc" location: @@ -3176,7 +3176,7 @@ start: 2022-08-22 end: 2022-08-26 sub: ['ML'] - note: null + note: twitter: "https://x.com/taosciences" email: "acdl@icas.cc" location: @@ -3196,7 +3196,7 @@ start: 2020-07-13 end: 2020-07-17 sub: ['ML'] - note: null + note: twitter: "https://x.com/taosciences" email: "acdl@icas.cc" location: @@ -3216,7 +3216,7 @@ start: 2019-07-15 end: 2019-07-19 sub: ['ML'] - note: null + note: twitter: "https://x.com/taosciences" email: "acdl@icas.cc" location: @@ -3236,7 +3236,7 @@ start: 2018-07-19 end: 2018-07-23 sub: ['ML'] - note: null + note: twitter: "https://x.com/taosciences" email: "acdl@icas.cc" location: @@ -3256,7 +3256,7 @@ start: 2024-09-11 end: 2024-09-14 sub: ['ML', 'Theory'] - note: null + note: twitter: https://twitter.com/sheffieldmlnet email: mauricio.alvarezlopez@manchester.ac.uk location: @@ -3276,7 +3276,7 @@ start: 2023-07-09 end: 2023-07-15 sub: ['CV'] - note: null + note: twitter: https://twitter.com/icvss email: icvss@dmi.unict.it location: @@ -3296,7 +3296,7 @@ start: 2022-07-10 end: 2022-07-16 sub: ['CV'] - note: null + note: twitter: https://twitter.com/icvss email: icvss@dmi.unict.it location: @@ -3316,7 +3316,7 @@ start: 2018-07-08 end: 2018-07-14 sub: ['CV'] - note: null + note: twitter: https://twitter.com/icvss email: icvss@dmi.unict.it location: @@ -3372,7 +3372,7 @@ start: 2023-06-30 end: 2023-06-26 sub: ['ML', 'AI4Games'] - note: null + note: twitter: https://twitter.com/GameAISchool email: school@gameaibook.org location: @@ -3410,7 +3410,7 @@ start: 2022-07-25 end: 2022-07-29 sub: ['ML', 'RL'] - note: null + note: twitter: https://twitter.com/CIFAR_News email: info@dlrl.ca location: @@ -3430,7 +3430,7 @@ start: 2024-06-03 end: 2024-06-07 sub: ['ML'] - note: null + note: twitter: https://twitter.com/dsa_org email: info@datascienceafrica.org location: @@ -3450,7 +3450,7 @@ start: 2023-05-08 end: 2023-05-12 sub: ['ML'] - note: null + note: twitter: https://twitter.com/dsa_org email: info@datascienceafrica.org location: @@ -3470,7 +3470,7 @@ start: 2022-07-18 end: 2022-07-22 sub: ['ML'] - note: null + note: twitter: https://twitter.com/dsa_org email: info@datascienceafrica.org location: @@ -3490,7 +3490,7 @@ start: 2021-10-04 end: 2021-10-08 sub: ['ML'] - note: null + note: twitter: https://twitter.com/dsa_org email: info@datascienceafrica.org location: @@ -3510,7 +3510,7 @@ start: 2020-07-24 end: 2020-08-01 sub: ['ML'] - note: null + note: twitter: https://twitter.com/dsa_org email: info@datascienceafrica.org location: @@ -3530,7 +3530,7 @@ start: 2019-06-03 end: 2019-06-05 sub: ['ML'] - note: null + note: twitter: https://twitter.com/dsa_org email: info@datascienceafrica.org location: @@ -3550,7 +3550,7 @@ start: 2019-10-21 end: 2019-10-23 sub: ['ML'] - note: null + note: twitter: https://twitter.com/dsa_org email: info@datascienceafrica.org location: @@ -3577,7 +3577,7 @@ series: European Summer School on Artificial Intelligence (ESSAI) -- title: Vision Understanding and Machine Intelligence +- title: Vision Understanding and Machine Intelligence year: 2022 id: visum2022 full_name: Vision Understanding and Machine Intelligence (VISUM 2020) @@ -3595,7 +3595,7 @@ longitude: -8.610990 series: Vision Understanding and Machine Intelligence (VISUM) -- title: Vision Understanding and Machine Intelligence +- title: Vision Understanding and Machine Intelligence year: 2020 id: visum2020 full_name: Vision Understanding and Machine Intelligence (VISUM 2020) @@ -3625,7 +3625,7 @@ start: 2022-08-21 end: 2022-08-26 sub: ['ML'] - note: null + note: twitter: https://twitter.com/deepindaba email: info@deeplearningindaba.com location: @@ -3645,7 +3645,7 @@ start: 2023-09-03 end: 2023-09-09 sub: ['ML'] - note: null + note: twitter: https://twitter.com/deepindaba email: info@deeplearningindaba.com location: @@ -3867,4 +3867,1283 @@ location: latitude: 43.307198697797986 longitude: -2.010444189662896 - series: Deep Learning For Natural Language Processing \ No newline at end of file + series: Deep Learning For Natural Language Processing +- title: "Advanced Summer School on Responsible AutoML" + year: 2025 + id: asraml25 + full_name: "Advanced Summer School on Responsible AutoML 2025" + link: "https://automlsummerschool.cin.ufpe.br/" + deadline: "2025-11-11 23:59:00" + timezone: "America/Sao_Paulo" + place: "Recife, Brazil" + date: "November 11 - November 12, 2025" + start: 2025-11-11 + end: 2025-11-12 + sub: ['Theory', 'ML', 'EML'] + location: + latitude: -8.055172279619814 + longitude: -34.95136218650733 + email: "ligia@cin.ufpe.br" + +- title: "Latin American School of Artificial Intelligence (LASAI)" + year: 2025 + id: lasai25 + full_name: "Latin American School of Artificial Intelligence (LASAI) 2025" + link: "https://simbig.org/lasai/2025/" + deadline: "2025-09-30 23:59:59" + timezone: "America/Lima" + place: "Lima, Peru" + date: "October 27 - October 31, 2025" + start: 2025-10-27 + end: 2025-10-31 + sub: ['ML'] + note: "Application deadline: September 30, 2025." + twitter: "https://twitter.com/SIMBigPeru" + email: "lasai2025@simbig.org" + description: "The Latin American LATAM School of Artificial Intelligence is hosted by Universidad Nacional Mayor de San Marcos (UNMSM) in Lima, Peru. This school aims to provide comprehensive training in artificial intelligence and machine learning for participants from Latin America and beyond. The program offers an intensive learning experience in one of South America's oldest and most prestigious universities, fostering AI education and research collaboration across the Latin American region." + location: + latitude: -12.0532 + longitude: -77.0853 + +- title: "Winter School on Causality and Explainable AI" + year: 2025 + id: causalxai25 + full_name: "Winter School on Causality and Explainable AI 2025" + link: "https://causality-xai-school.fr/" + deadline: "2025-10-01 23:59:59" + timezone: "Europe/Paris" + place: "Paris, France" + date: "October 20 - October 24, 2025" + start: 2025-10-20 + end: 2025-10-24 + sub: ['RAI', 'Theory'] + note: "Application deadline: October 1, 2025." + twitter: + email: + description: "The Winter School on Causality and Explainable AI is organized by a team from the Sorbonne Center for Artificial Intelligence, ELLIS - European Laboratory for Learning and Intelligent Systems, and other partner institutions. This specialized program focuses on the intersection of causal inference and explainable artificial intelligence, providing participants with theoretical foundations and practical applications in these critical areas of AI research. The school emphasizes understanding causal relationships in data and developing interpretable AI systems." + location: + latitude: 48.8566 + longitude: 2.3522 + +- title: Summer School on Data Science, Learning and Optimization + year: 2025 + id: dataslo25 + full_name: Summer School on Data Science, Learning and Optimization (DataSLO) + link: https://www.unistrapg.it/it/studiare-in-un-ateneo-internazionale/dataslo + deadline: "2025-04-24 13:00:00" + timezone: "Europe/Rome" + place: "Norcia, Italy" + date: "June 23 - June 27, 2025" + start: 2025-06-23 + end: 2025-06-27 + sub: ['ML', 'Theory'] + note: "Free registration, maximum 25 participants" + email: "progetto.fenice@unistrapg.it" + description: "The Summer School DataSLO will explore key topics related to the core methodologies that drive Data Science, Machine Learning and Computational Optimization – the three foundational pillars of modern Artificial Intelligence." + image: "https://www.unistrapg.it/sites/default/files/logo.png" + location: + latitude: 42.7889 + longitude: 13.0747 + +- title: "School on Automated Machine Learning (AutoML)" + year: 2025 + id: automl25 + full_name: "5th School on Automated Machine Learning (AutoML) 2025" + link: "https://www.automlschool.org/" + deadline: "2025-05-01 23:59:00" + timezone: "Europe/Rome" + place: "Tübingen, Germany" + date: "June 10 – 13, 2025" + start: 2025-06-10 + end: 2025-06-13 + sub: ['Theory', 'ML', 'EML'] + note: "Early bird deadline: May 1st" + email: "katharina.eggensperger@uni-tuebingen.de" + description: "AutoML has become a cornerstone in the toolkit of many developers and researchers. With the rise of foundation models, AutoML's potential has expanded even further, enabling smarter, more powerful, and scalable solutions. Although there is exponentially growing interest in the intersection of AutoML and foundation models, they are rarely taught at universities, leaving a significant gap between cutting-edge research and disseminated knowledge. This school consists of introductory, state-of-the-art, and application lectures for AutoML and Foundation Models. The AutoML School is a yearly research training event tailored for graduate and postgraduate students, research engineers, and industry practitioners who want to learn about AutoML. However, there are no formal prerequisites, and everyone is welcome." + image: "https://www.conftool.org/automl-school-2025/footer.png" + location: + latitude: 48.53899300170434 + longitude: 9.05771 + series: "AutoML School" + +- title: EuADS Summer School on Automated Data Science + year: 2025 + id: euads25 + full_name: EuADS Summer School on Automated Data Science 2025 + link: https://www.euads.org/fjkdlasjdiglsmdgkcxjhvckh/euads-summer-school-2025/ + deadline: 2025-05-20 + timezone: "Europe/Luxembourg" + place: "Luxembourg-Belair" + date: "July 8 - July 11, 2025" + start: 2025-07-08 + end: 2025-07-11 + sub: ['ML', 'DS', 'Theory'] + note: + twitter: "https://x.com/euadsorg" + email: "contact@euads.org" + description: "The 2025 edition of the EuADS Summer School is dedicated to Automated Data Science (AutoDS) and will cover important branches of this research field in a tutorial style. With the increasing complexity of data science projects and the limited availability of human expertise, the idea of automating or partially automating the work of a data scientist has come to the fore in recent years. AutoDS aims to streamline the data science workflow, making processes such as data pre-processing, feature engineering, model selection, evaluation and deployment faster and more accessible." + image: + location: + latitude: 49.61235369861866 + longitude: 6.114854857934161 + +- title: "4th European Summer School on Quantum AI" + year: 2025 + id: eqai25 + full_name: "4th European Summer School on Quantum AI (EQAI) 2025" + link: "https://www.eqai.eu/" + deadline: "2025-08-19 23:59:00" + timezone: "Europe/Rome" + place: "Lignano Sabbiadoro, Italy" + date: "September 01 – 05, 2025" + start: 2025-09-01 + end: 2025-09-05 + sub: ['Quantum', 'ML'] + note: "Applications will be reviewed on a rolling basis." + email: "info.eqai@gmail.com" + description: "Following the success of the first three editions, this summer school aims to provide an objective and clear overview, as well as an in-depth analysis, of the state-of-the-art research in Quantum Machine Learning and Deep Learning. The courses will be delivered by world renowned experts in the field, from both academia and industry, and will cover both theoretical and practical aspects of real problems. The school aims to provide a stimulating opportunity for young researchers and Ph.D. students, but also quantum enthusiasts coming from the industry and outside of academia. The participants will benefit from direct interaction and discussions with experts in this field. Participants will also have the possibility to present the results of their research, and to interact with their scientific peers, in a friendly and constructive environment." + image: "https://eqai.eu/wp-content/uploads/2025/03/EQAI-2025-logo.png" + location: + latitude: 45.679604 + longitude: 13.122126 + series: "European Summer School on Quantum AI" + +- title: "African Computer Vision Summer School" + year: 2025 + id: acvs25 + full_name: "African Computer Vision Summer School (ACVSS) 2025" + link: "https://www.acvss.ai" + deadline: "2025-03-15 23:59:59" + timezone: "US/Hawaii" + place: "Kigali, Rwanda" + date: "July 13 - July 23, 2025" + start: 2025-07-13 + end: 2025-07-23 + sub: ['CV'] + note: + twitter: "https://twitter.com/ACVSS_AI" + email: "acvss@googlegroups.com" + description: "The African Computer Vision Summer School (ACVSS) unites outstanding students and researchers with leading computer vision and AI experts. The curriculum emphasizes the importance of ethical considerations, geometry and math, deep learning and AI, and on seeding knowledge for multiple generations of students by coaching participants in educational leadership." + image: "https://lh5.googleusercontent.com/TnmzAOFrCRZbVKJYak2hkUB-hE-76rrigKEwGbS4__GnbqPXniEXADmX_7ZgxxfgPmH21Yme4MzyOesFhv0irv0=w16383" + location: + latitude: -1.961019644836035 + longitude: 30.113097157396247 + series: African Computer Vision Summer School (ACVSS) + +- title: "ELLIS Summer School: AI for Earth and Climate Sciences" + year: 2025 + id: jena25 + full_name: "ELLIS Summer School: AI for Earth and Climate Sciences 2025" + link: "https://www.ellis-jena.eu/summer-school-2025/" + deadline: "2025-03-31 23:59:59" + timezone: "Europe/Berlin" + place: "Jena, Germany" + date: "September 1 - September 5, 2025" + start: 2025-09-01 + end: 2025-09-05 + sub: ['ML', 'GenAI', 'ML4Science', 'Bio', 'CV'] + note: + twitter: + email: "conrad.philipp@uni-jena.de" + description: "The 2025 ELLIS Summer School on AI for Earth & Climate Sciences is the premier event for ELLIS PhD students, MSc students, and postdocs at the intersection of machine learning and geoscience to meet in person. During the week filled with keynotes, hands-on classes and project work the school will focus on cutting-edge research and discuss the latest advancements in the field. This interdisciplinary program will shape the future for the community of AI, Earth and Climate scientists by fostering collaboration among the next generation of interdisciplinary researchers." + image: "https://ellis.eu/uploads/ck_image/file/20/ellis_Summer_School_Jena.png" + location: + latitude: 50.927223 + longitude: 11.586111 + series: "ELLIS Winter and Summer Schools" + +- title: "Machine Learning and Advanced Statistics Summer School" + year: 2025 + id: mlas25 + full_name: "Madrid UPM Machine Learning and Advanced Statistics Summer School (MLAS) 2025" + link: "https://dia.fi.upm.es/MLAS" + deadline: "2025-05-27 23:59:59" + timezone: "Europe/Madrid" + place: "Madrid, Spain" + date: "June 16 - June 27, 2025" + start: 2025-06-16 + end: 2025-06-27 + sub: ['ML', 'GenAI', 'RL'] + note: + twitter: + email: "mlas@fi.upm.es" + description: "The MLAS summer school is an intensive set of courses providing an introduction to the theoretical foundations as well as the practical applications of some of the modern machine learning and statistical methods. During 2 weeks, the summer school offers 12 courses, of 15h lecture hours each. The students are free to choose the courses according to their interests." + image: "https://dia.fi.upm.es/wp-content/uploads/2024/01/logo-dia-conjunto@5x.png" + location: + latitude: 40.40535401476495 + longitude: -3.84004237805600 + series: "Machine Learning and Advanced Statistics Summer School (MLAS)" + +- title: "Advanced Course on Data Science & Machine Learning" + year: 2025 + id: acdl25 + full_name: "Advanced Course on Data Science & Machine Learning (ACDL) 2025" + link: "https://acdl2025.icas.events/" + deadline: "2025-04-23 23:59:59" + timezone: "Europe/Rome" + place: "Grosseto, Italy" + date: "June 09 - June 13, 2025" + start: 2025-06-09 + end: 2025-06-13 + sub: ['ML'] + note: + twitter: "https://x.com/taosciences" + email: "acdl@icas.cc" + description: "The 8th Advanced Course on Data Science & Machine Learning – ACDL 2025 is a full-immersion five-day Course at the Riva del Sole Resort & SPA (Castiglione della Pescaia – Grosseto – Tuscany, Italy) on cutting-edge advances in Deep Learning, Data Science and Generative AI with lectures delivered by world-renowned experts. The Course provides a stimulating environment for PhD students, Post-Docs, junior academics (only up to assistant professors), early career researches, and industry leaders (and highly motivated, promising and brilliant Master students / BSc students). Participants will also have the chance to present their results with talks, and to interact with their colleagues, in a convivial, professional and productive environment." + image: "https://acdl2025.icas.events/wp-content/uploads/sites/30/2023/05/acdl2025-logo-web-small.png" + location: + latitude: 42.77079126926875 + longitude: 10.852376626839042 + series: Advanced Course on Data Science & Machine Learning (ACDL) + +- title: "Winter School on Emerging Technologies" + year: 2025 + id: ASUWinterSchool25 + full_name: "Twelfth Annual Winter School on Emerging Technologies Accelerating Impactful Scholarship" + link: "https://sfis.asu.edu/events/winter-school/" + deadline: "2024-10-07 23:59:00" + timezone: "MST" + place: "Mesa, AZ" + date: "Jan 03 - Jan 10, 2025" + start: 2025-01-03 + end: 2025-01-10 + sub: ['ML', 'RO'] + note: "Scholarship available" + description: "The Winter School program is run by the School for the Future of Innovation in Society at Arizona State University with support by The National Nanotechnology Coordinated Infrastructure Coordinating Office. The program gives junior scholars and scientists an introduction to and practical experience with methods and theory for better understanding the social dimensions of emerging technologies. The 2025 program will be focused on the broad notion of impact with an aim to explore ways for participants to increase and diversify the impact of their work." + image: "https://nnci.net/themes/cb_base/images/logo-black.png" + location: + latitude: 33.56174775625808 + longitude: -111.53586632923056 + +- title: "International Artificial Intelligence Summer School" + year: 2025 + id: IAISS25 + full_name: "International Artificial Intelligence Summer School (IAISS) 2025" + link: "https://2025.iaiss.cc/" + deadline: "2025-04-23 23:59:59" + timezone: "Europe/Rome" + place: "Grosseto, Italy" + date: "Sep 21 - Sep 25, 2025" + start: 2025-09-21 + end: 2025-09-25 + sub: ['ML'] + note: + twitter: "https://x.com/taosciences" + email: "iaiss@icas.cc" + description: "The International Artificial Intelligence Summer School – IAISS 2025 is a full-immersion five-day Summer School at the Riva del Sole Resort & SPA (Castiglione della Pescaia – Grosseto – Tuscany, Italy) on cutting-edge advances in Artificial Intelligence and Generative AI with lectures delivered by world-renowned experts. The School provides a stimulating environment for PhD students, Post-Docs, Junior Academics, Early Career Researches and Junior Industry Leaders (and highly motivated, promising and brilliant Master Students). Participants will also have the chance to present their results with short talks and posters, and to interact with their colleagues, in a convivial, professional and productive environment." + image: "https://2025.iaiss.cc/wp-content/uploads/sites/29/2024/10/iaiss-logo-banner.png" + location: + latitude: 42.77079126926875 + longitude: 10.852376626839042 + +- title: "Winter School: Next Generation AI and Economic Applications" + year: 2025 + id: wsngaiea25 + full_name: "Winter School: Next Generation AI and Economic Applications" + link: "https://next-genai-xemines.com/" + deadline: "2025-01-30 12:00:00" + timezone: "Africa/Casablanca" + place: "UM6P Ben Guerir Campus, Morocco" + date: "Feb 24 - Feb 25, 2025" + start: 2025-02-24 + end: 2025-02-25 + sub: ['GenAI', 'EconAI'] + note: + twitter: "https://x.com/UM6P_officiel" + email: "winterschooldatascience@gmail.com" + description: "Our Winter Data Science School focuses on Next Generation AI and its Economic Applications. We aim to provide deep insights into the latest techniques, foster networking, and offer practical skills. Over two days, participants will engage in expert-led sessions, including Charles-Albert Lehalle on AI in finance, and presentations by Michael Jordan and Yann LeCun, offering valuable insights into the transformation of AI products and its societal impact." + image: "https://next-genai-xemines.com/assets/visual/logo-cropped-bigger.png" + location: + latitude: 32.22509 + longitude: -7.93286 + +- title: "UM6P Winter School on Data Economics" + year: 2025 + id: wsde25 + full_name: "UM6P Winter School on Data Economics 2025" + link: "https://mcgt.um6p.ma/en/seminars-conferences/winter-days" + deadline: "2024-12-08 23:59:00" + timezone: "Africa/Casablanca" + place: "UM6P Rabat Campus, Morocco" + date: "Jan 20 - Jan 24, 2025" + start: 2025-01-20 + end: 2025-01-24 + sub: ['Theory', 'EconAI'] + note: + twitter: "https://x.com/UM6P_officiel" + email: "mcgt@um6p.ma" + description: "This one week winter school on data economics will introduce PhD students to central topic areas in the area. As data science transforms science and society, it is important to develop the economics of data. Collecting data is costly, possessing data gives market power, sharing data has risks and benefits, conclusions from data depend on data quantity and quality." + image: "https://mcgt.um6p.ma/assets/img/logo.png" + location: + latitude: 32.264254417665434 + longitude: -7.946706324442646 + +- title: "Bumblekite Machine Learning Summer School in Health, care and biosciences" + year: 2025 + id: bumblekite25 + full_name: "Bumblekite machine learning summer school in health, care and biosciences" + link: "https://www.bumblekite.co/bumblekite-25" + deadline: "2025-03-09 23:59:00" + timezone: "Europe/Berlin" + place: "Zürich, Switzerland" + date: "June 22 - June 28, 2025" + start: 2025-06-22 + end: 2025-06-28 + sub: ['ML', 'Health', 'Bio'] + note: + twitter: + email: "bumblekite-team@four-corp.com" + description: "Bumblekite summer school is FOUR’s annual machine learning summer school (MLSS) in health, care and biosciences. Our Bumblekite MLSS creates and nurtures a learning space for evolving your data science and engineering skills and domain-specific knowledge, as well as skills in writing, coaching, leadership and strategy development — equally important communication skills. We strongly believe the combination of all of the above is key to unlocking the positive, deeply impactful contributions you will lead in our field and beyond." + image: "https://images.squarespace-cdn.com/content/v1/5e176b36a659cc3920d4038c/1598711702923-U9G274MDT9BPOXBH2Q2L/Bumblekite_logomark_.png?format=500w" + location: + latitude: 47.376821212238646 + longitude: 8.547440346312348 + series: Bumblekite Machine Learning Summer School in Health + +- title: "Summer School in Responsible AI and Human Rights" + year: 2025 + id: ssraihr25 + full_name: "Summer School in Responsible AI and Human Rights 2025" + link: "https://mila.quebec/en/ai4humanity/learning/summer-school-in-responsible-ai-and-human-rights" + deadline: "2025-01-06 23:59:00" + timezone: "America/Toronto" + place: "Montreal, Canada" + date: "May 26 - May 30, 2025" + start: 2025-05-26 + end: 2025-05-30 + sub: ['RAI'] + note: + twitter: "https://x.com/Mila_Quebec" + email: "info@mila.quebec" + description: "The summer school, a joint initiative by Mila and the Université de Montréal brings together participants from different backgrounds and horizons to explore the intersections between responsible artificial intelligence (AI) and human rights." + image: "https://mila.quebec/sites/default/files/styles/focal_crop_2500_757/public/blocks/imagefullwidth/1289/2024capsuleraihrsseng.jpg.webp?itok=oiuqQ0Rn" + location: + latitude: 45.53086 + longitude: -73.61325 + +- title: "European Summer School on Artificial Intelligence" + year: 2025 + id: essai25 + full_name: "3rd European Summer School on Artificial Intelligence" + link: "https://essai2025.eu/" + deadline: "2025-06-01 23:59:00" + timezone: "Europe/Bratislava" + place: "Bratislava, Slovakia" + date: "June 30 - July 4, 2025" + start: 2025-06-30 + end: 2025-07-04 + sub: ['ML', 'RO', 'AP', 'DM'] + note: + email: "peter.drotar@tuke.sk" + description: "European Summer School on Artificial Intelligence (ESSAI) intends to serve as a central hub for PhD students and young researchers working in all aspects of AI. The ESSAI Summer School covers one week of courses in the summer, at different sites around Europe, for both beginning and advanced students, and junior and senior researchers. ESSAI provides introductory and advanced courses in all areas of AI, emphasizing topics that allow students to gain a broad view of AI and understand connections between subdisciplines. ESSAI also offers several social activities for students and researchers alike. One of the tracks of ESSAI consists of advanced tutorials on a specific subject and corresponds to the traditional ACAI school organized by EurAI since 1989." + image: "https://essai2025.eu/wp-content/uploads/ESSAI_2025_logo_corrected_v01.png" + location: + latitude: 48.148598 + longitude: 17.107748 + series: European Summer School on Artificial Intelligence (ESSAI) + +- title: "ELLIS Winter School on Foundation Models" + year: 2025 + id: fomo25 + full_name: "2nd ELLIS Winter School on Foundation Models (FoMo)" + link: "https://ivi.fnwi.uva.nl/ellis/events/2025-ellis-winter-school-on-foundation-models-fomo" + deadline: "2025-02-07 23:59:00" + timezone: "Europe/Amsterdam" + place: "Amsterdam, Netherlands" + date: "March 18 - March 21, 2025" + start: 2025-03-18 + end: 2025-03-21 + sub: ['ML'] + note: + twitter: "https://x.com/ellis_amsterdam" + email: "ellisinfo-science@uva.nl" + description: "The FoMo presents a valuable opportunity to explore the intricacies of foundation models and to highlight how Europe is establishing its own path beyond the widely-known Big Tech narrative. Notable insights and innovative approaches are emerging from Europe in both academia and industry. Thus, one of the main objectives of this winter school is to highlight these perspectives and provide a thorough understanding of how Europe is shaping its research agenda with unique directions while fostering community collaboration. Participants can expect a diverse lineup of speakers, including Tim Rocktäschel (UCL and Google Deepmind), Amir Zamir (EPFL), and Fahad Khan (MBZUAI, Linköping University Sweden)– more to be announced soon, and the opportunity to engage with like-minded individuals." + image: "https://ivi.fnwi.uva.nl/ellis/wp-content/uploads/2024/12/Fomo-25-2-1536x864.png" + location: + latitude: 52.383207972959795 + longitude: 4.903048457672083 + series: ELLIS Winter School on Foundation Models (FoMo) + +- title: "Gatsby Bridging Programme" + year: 2025 + id: gatsbybp25 + full_name: "Gatsby Bridging Programme (Maths Summer School)" + link: "https://www.ucl.ac.uk/gatsby/study-and-work/gatsby-bridging-programme" + deadline: "2025-02-07 23:59:00" + timezone: "GMT" + place: "London, UK" + date: "June 23 - Aug 8, 2025" + start: 2025-06-23 + end: 2025-08-08 + sub: ['Theory', 'Neuro'] + note: + twitter: "https://x.com/GatsbyUCL" + email: "admissions@gatsby.ucl.ac.uk" + description: "The Gatsby Bridging Programme is a mathematics summer school for penultimate- or final-year undergraduates and Master’s students (incl. recent graduates) who aspire to pursue a postgraduate research degree in Theoretical Neuroscience and/or Machine Learning but whose predoctoral degree(s) does not have a strong mathematical focus. During the programme, you will develop the mathematical intuitions and learn the mathematics skills necessary to enter these fields." + image: "https://www.ucl.ac.uk/gatsby/sites/gatsby/files/styles/small_image/public/gatsby_partners.png?itok=zIODn6fm" + location: + latitude: 51.521277368652434 + longitude: -0.13837474697884816 + series: Gatsby Bridging Programme + +- title: "Reasoning Web Summer School" + year: 2025 + id: rw25 + full_name: "21st Reasoning Web (RW) Summer School" + link: "https://2025.declarativeai.net/events/reasoning-web" + deadline: "2025-06-09 23:59:00" + timezone: "Asia/Istanbul" + place: "Istanbul, Türkiye" + date: "Sep 25 - Sep 28, 2025" + start: 2025-09-25 + end: 2025-09-28 + sub: ['KR', 'Log'] + note: + email: "meghyn.bienvenu@labri.fr" + description: "The purpose of the Reasoning Web (RW) Summer School is to disseminate recent advances in reasoning techniques and other developments relevant to Semantic Web and Linked Data applications. The summer school is intended for individuals who are currently pursuing or have already completed postgraduate degrees (PhD or MSc). It is also open to researchers at all levels interested in deepening their knowledge in the respective area." + image: "https://lh4.googleusercontent.com/ahD7QVgIKnRDt5hOqxtj13xgGUcCBWATob3vm0YvK5BiyiRSG2XmRlyw4rUvc8LS14MzJBnJE7X9eeW_VLZyoU8xQoCt7quxCRuu0pwrK4VxEkhX" + location: + latitude: 41.0075881131308 + longitude: 28.9652750001439 + series: Reasoning Web (RW) Summer School + +- title: "Summer School on Multimodal Foundation Models and Generative AI" + year: 2025 + id: aiss25 + full_name: "Summer School on Multimodal Foundation Models and Generative AI" + link: "https://ai-summer-school.inpt.ac.ma/" + deadline: "2025-07-13" + timezone: "Africa/Casablanca" + place: "Rabat, Morocco" + date: "September 8 - September 12, 2025" + start: 2025-09-08 + end: 2025-09-12 + sub: ['ML', 'NLP', 'CV', 'GenAI'] + note: "Applications open June 23, 2025; acceptance notifications sent July 25, 2025." + email: "team@morocco.ai" + description: "The AI Summer School is an immersive five-day program jointly organized by MoroccoAI, Institut National Des Postes et Télécommunications (INPT), IMT Nord Europe, and Soft Centre, supported by ACM SIGMM.\nThe 2025 edition focuses on Multimodal Foundation Models and Generative AI, providing participants with lectures from world-renowned experts, hands-on labs, project mentorship, and networking opportunities. It is designed for Master’s and PhD students, postdocs, researchers, and industry professionals with intermediate knowledge of machine learning and Python programming.\nKey features: - 20+ expert sessions and 15+ hands-on labs - Networking with 50+ participants and AI leaders - Coverage of cutting-edge topics: generative AI, LLMs, multimodal foundation models - Visits to Morocco’s technology ecosystem (e.g., Casablanca Technopark) - Full access to lectures, meals, and accommodations included in registration" + image: "https://morocco.ai/wp-content/uploads/2020/03/MoroccoAI_Logo.png" + location: + latitude: 34.020882 + longitude: -6.841650 + series: "MoroccoAI Summer School" + + +- title: "AI and Games Summer School" + year: 2025 + id: agss25 + full_name: "7th International Summer School on Artificial Intelligence and Games" + link: "https://school.gameaibook.org/" + deadline: "2025-06-09 23:59:00" + timezone: "Europe/Stockholm" + place: "Malmö, Sweden" + date: "June 23- June 27, 2025" + start: 2025-06-23 + end: 2025-06-27 + sub: ['ML', 'AI4Games'] + note: + email: "school@gameaibook.org" + twitter: "https://x.com/GameAISchool" + description: "The summer school is dedicated to the uses of artificial intelligence (AI) techniques in and for games. After introductory lectures that explain the background and key techniques in AI and games, the school will introduce participants the uses of AI for playing games, for generating content for games, and for modeling players. This school is suitable for industrial game developers, designers, programmers and practitioners, but also for graduate students in games, artificial intelligence, design, human-computer interaction, and computational intelligence." + image: "https://school.gameaibook.org/wp-content/uploads/2024/09/logo-malmo-2.png" + location: + latitude: 55.607698037142704 + longitude: 12.98575008491183 + series: AI and Games Summer School + +- title: "MLSS Kraków: Drug and Materials Discovery" + year: 2025 + id: krakow2025 + full_name: "MLSS Kraków 2025: Drug and Materials Discovery" + link: "https://mlss2025.mlinpl.org/" + deadline: "2025-04-19 23:59:59" + timezone: "US/Alaska" + place: "Kraków, Poland" + date: "July 1-6, 2025" + start: 2025-07-01 + end: 2025-07-06 + sub: ['GenAI', 'Bio', 'ML4Science', 'Health'] + note: + email: "mlss@mlinpl.org" + twitter: "https://x.com/mlinpl" + image: "https://mlss2025.mlinpl.org/images/institutions-logos/logo-mlinpl.svg" + description: "MLSS Kraków 2025 is a summer school providing a didactic introduction to a range of modern topics in Machine Learning and their applications for Drug and Materials Discovery, primarily intended for research-oriented graduate students. The school features a line-up of internationally recognized researchers who will talk with enthusiasm about their subjects. Our goal is to provide a unique opportunity to learn from and connect with the leading experts in the scenic setting of the historic city of Kraków, Poland. This school is the next edtion of MLSS^S 2023 and MLSS^N 2022." + location: + latitude: 50.0301961 + longitude: 19.906168 + series: MLSS Kraków + +- title: Nordic Probabilistic AI School + year: 2025 + id: npas2025 + full_name: Nordic Probabilistic AI School 2025 + link: https://nordic.probabilistic.ai/ + deadline: '2025-03-09 23:59:59' + timezone: Europe/Oslo + place: Trondheim, Norway + date: June 16 - June 20, 2025 + start: 2025-06-16 + end: 2025-06-20 + sub: ['Theory', 'GenAI', 'ML'] + note: + twitter: https://twitter.com/probabilisticai/ + email: hello@probabilistic.ai + description: "The ProbAI is here to provide an inclusive education environment serving state-of-the-art expertise in machine learning and artificial intelligence with a probabilistic twist. With a carefully designed curriculum and a seamless blend of theory and hands-on sessions, our expert team of invited lecturers will guide you through five intensive days each dedicated to a different topic: introduction to probabilistic modeling, variational inference and optimization, conformal predictions, deep generative models, geometric probabilistic models, and probabilistic circuits." + location: + latitude: 63.42340 + longitude: 10.40071 + series: Probabilistic AI School (ProbAI) + +- title: "Machine Learning Summer School Senegal" + year: 2025 + id: mlss-senegal25 + full_name: "Machine Learning Summer School (MLSS) Senegal" + link: "https://mlss-senegal.github.io/" + deadline: "2025-02-28 23:59:00" + timezone: "Africa/Dakar" + place: "Mbour, Senegal" + date: "June 23 - July 4, 2025" + start: 2025-06-23 + end: 2025-07-04 + sub: ['ML'] + note: "Application fee of $450 due by April 23, 2025" + email: "mlss.senegal2025@gmail.com" + twitter: + description: "Located along the scenic Atlantic coast of Senegal, AIMS Mbour hosts this summer school for PhD students, post-docs, and advanced learners in mathematical sciences. The venue is conveniently situated approximately 1.5 hours from Dakar city center and 30 kilometers from Blaise Diagne International Airport. Applicants must submit a one-page self-recommendation letter explaining how the summer school will benefit them, along with a one-page CV summarizing their contributions in machine learning. Applications are accepted from December 15 to February 28, with acceptance notifications sent by March 31." + image: "https://aims-senegal.org/wp-content/uploads/sites/2/2020/10/aims_senegal.jpg" + location: + latitude: 14.4225 + longitude: -16.9736 + series: Machine Learning Summer School (MLSS) + +- title: "Machine Learning Summer School Arequipa" + year: 2025 + id: mlss-arequipa25 + full_name: "Machine Learning Summer School (MLSS) Arequipa" + link: "https://eventosdiee.ucsp.edu.pe/mlss/" + deadline: "2025-03-20 23:59:00" + timezone: "America/Lima" + place: "Arequipa, Peru" + date: "August 2 - August 13, 2025" + start: 2025-08-02 + end: 2025-08-13 + sub: ['ML'] + note: "Applicants need one referee." + email: "electronica@ucsp.edu.pe" + twitter: + description: "MLSS Arequipa 2025 is open to a select group of 100 highly motivated participants. Our primary target audience consists of MSc and PhD students with a solid technical foundation in research areas related to machine learning. However, a limited number of industry professionals, professors, researchers, and exceptional undergraduate students may also be considered, based on availability. Industrial applicants are encouraged to apply, thanks to sponsorship opportunities from their respective organizations. All participants should possess programming skills in Python, a strong interest in machine learning, and a solid understanding of linear algebra, basic calculus, probability, and statistics." + image: "https://eventosdiee.ucsp.edu.pe/mlss/wp-content/uploads/2024/02/logo-mlss.png" + location: + latitude: -16.389859050098813 + longitude: -71.53543171349251 + series: Machine Learning Summer School (MLSS) + +- title: "Princeton Machine Learning Theory Summer School" + year: 2025 + id: pmltss2025 + full_name: "Princeton Machine Learning Theory Summer School 2025" + link: "https://mlschool.princeton.edu/" + deadline: "2025-03-31 23:59:59" + timezone: "America/New_York" + place: "Princeton, USA" + date: "August 12 - August 21, 2025" + start: 2025-08-12 + end: 2025-08-21 + sub: ['ML', 'Theory'] + note: "Applications require a CV, letter of recommendation, and statement of purpose" + twitter: + email: "pmlss@princeton.edu" + description: "The Princeton Machine Learning Theory Summer School is aimed at PhD students interested in machine learning theory. The school will run in person and focuses on showcasing exciting recent developments in the subject through four main courses. The primary focus this year is on theoretical advances in deep learning. The program aims to connect young researchers and foster community within theoretical machine learning." + image: "https://mlschool.princeton.edu/sites/g/files/toruqf5946/files/styles/freeform_750w/public/2023-06/pu_logo_3.png?itok=6OYKyOo7" + location: + latitude: 40.34590714001614 + longitude: -74.65576054459738 + series: "Princeton Machine Learning Theory Summer School" + +- title: "IAIFI Summer School" + year: 2025 + id: iaifi2025 + full_name: "Institute for Artificial Intelligence and Fundamental Interactions (IAIFI) Summer School 2025" + link: "https://iaifi.org/phd-summer-school" + deadline: "2025-02-07 23:59:59" + timezone: "America/New_York" + place: "Cambridge, USA" + date: "August 4 - August 8, 2025" + start: 2025-08-04 + end: 2025-08-08 + sub: ['Theory', 'ML4Science'] + note: "No registration fee. Dorm accommodation costs will be reimbursed for up to 5 nights. Attendees must cover travel costs." + twitter: https://twitter.com/iaifi_news + email: iaifi@mit.edu + description: "The IAIFI Summer School combines AI and Physics for early career researchers, particularly PhD students, advanced undergraduates, and postdocs. The program features lectures and tutorials on Reinforcement Learning, Robust/Interpretable AI, Scaling Laws, Physics-Motivated Optimization, Simulation Intelligence, and Representation/Manifold Learning. The event includes a full-day hackathon, networking events, and a career panel. Admission decisions will be announced by February 17, 2025." + image: "https://iaifi.org/images/iaifi-pressimage-horizontalcrop-smaller.jpg" + location: + latitude: 42.3770 + longitude: -71.1167 + +- title: "International Semantic Web Research Summer School" + year: 2025 + id: isws25 + full_name: "International Semantic Web Research Summer School (ISWS) 2025" + link: "https://2025.semanticwebschool.org/" + deadline: "2025-03-15 23:59:59" + timezone: "Europe/Rome" + place: "Bertinoro, Italy" + date: "June 8 - June 14, 2025" + start: 2025-06-08 + end: 2025-06-14 + sub: ['KR', 'ML'] + note: "Acceptance notification: April 1st, 2025" + email: "isws.application@gmail.com" + description: "ISWS is a full immersion, super intensive one-week experience focusing on knowledge graphs for reliable AI. The program includes lectures and keynotes from outstanding speakers, and a 'learning by doing' teamwork program on open research problems. Participants work under the guidance of leading scientists in the field to co-author a white paper of high potential impact." + location: + latitude: 44.1487 + longitude: 12.1323 + series: "International Semantic Web Research Summer School (ISWS)" + +- title: "Theoretical Foundations of Machine Learning Course" + year: 2025 + id: tfml2025 + full_name: "Theoretical Foundations of Machine Learning (TFML) Course 2025" + link: "https://malga.unige.it/education/schools/tfml/" + deadline: "2025-03-30 23:59:59" + timezone: "Europe/Rome" + place: "Genova, Italy" + date: "June 23 - June 27, 2025" + start: 2025-06-23 + end: 2025-06-27 + sub: ['ML', 'Theory'] + note: "Acceptance notification: April 11th, 2025" + twitter: "https://twitter.com/malga_center" + email: "malga@unige.it" + description: "The course covers key algorithmic principles in machine learning and their theoretical foundations. Topics include statistical learning theory, linear and nonlinear models (kernel methods and neural networks), empirical risk minimization, regularization, functional analysis with focus on reproducing kernel Hilbert spaces, convex analysis, optimization methods (gradient, stochastic gradient, splitting methods, back-propagation), and statistical analysis using concentration of measure, empirical process theory, spectral calculus and operator theory. The program includes two tutorials by invited speakers." + image: "https://lcsl.unige.it/img/malga.png" + location: + latitude: 44.40499 + longitude: 8.97224 + series: "MaLGa Summer Schools" + +- title: "A Journey through Deep Learning Summer School" + year: 2025 + id: jdl2025 + full_name: "A Journey through Deep Learning (JDL) Summer School 2025" + link: "https://malga.unige.it/education/schools/jdl/" + deadline: "2025-03-30 23:59:59" + timezone: "Europe/Rome" + place: "Genova, Italy" + date: "June 16 - June 20, 2025" + start: 2025-06-16 + end: 2025-06-20 + sub: ['ML'] + note: "Acceptance notification: March 30th, 2025. In-person only, no online streaming. No travel scholarships available." + twitter: "https://twitter.com/malga_center" + email: "malga@unige.it" + description: "A Journey through Deep Learning is an intensive 40-hour PhD-level school offering a comprehensive exploration of Deep Learning principles and applications. Organized by the MaLGa Center, this program combines methodological aspects with practical insights into modern frameworks and architectures. The school is open to students, postdocs, faculty members and professionals, upon selection. Attendees will receive an attendance certificate reporting their actual hours of attendance." + image: "https://lcsl.unige.it/img/malga.png" + location: + latitude: 44.40498328188538 + longitude: 8.972239169310429 + series: "MaLGa Summer Schools" +- title: "School on Analytical Connectionism" + year: 2025 + id: ac25 + full_name: "2025 School on Analytical Connectionism" + link: "https://www.analytical-connectionism.net/school/2025/" + deadline: "2025-04-18 23:59:00" + timezone: "Etc/GMT-12" + place: "London, UK" + date: "August 25 - September 5, 2025" + start: 2025-08-25 + end: 2025-09-05 + sub: ['Theory', 'CogSci'] + note: "Acceptance notification: May 25th, 2025. In-person only; no streaming. Travel scholarships available for 25% of participants." + twitter: "https://x.com/GatsbyUCL" + email: "admissions@gatsby.ucl.ac.uk" + image: "https://www.analytical-connectionism.net/assets/images/sponsors/gatsby-unit.png" + description: "Analytical Connectionism is a 2-week summer course on analytical tools, including methods from statistical physics and probability theory, for probing neural networks and higher-level cognition. The course brings together neuroscience, psychology and machine-learning communities, and introduces attendees to analytical methods for neural-network analysis and connectionist theories of higher-level cognition and psychology." + location: + latitude: 51.52118724608978 + longitude: -0.13832110294736547 + +- title: "LOGML Summer School" + year: 2025 + id: logml25 + full_name: "London Geometry and Machine Learning Summer School 2025" + link: "https://www.logml.ai/" + deadline: "2025-04-06 23:59:59" + timezone: "Etc/GMT-12" + place: "London, United Kingdom" + date: "July 7 - July 11, 2025" + start: 2025-07-07 + end: 2025-07-11 + sub: ['ML', 'Theory'] + twitter: https://twitter.com/LogmlSchool + email: "logml.committee@gmail.com." + description: "LOGML (London Geometry and Machine Learning) aims to bring together mathematicians and computer scientists to collaborate on a variety of problems at the intersection of geometry and machine learning. There will be a selection of group projects, each overseen by an experienced mentor, talks by leading figures in the field, a variety of social events and a company networking night." + image: "https://www.logml.ai/img/logo.png" + location: + latitude: 51.499173065086225 + longitude: -0.17902143167248896 + series: "London Geometry and Machine Learning Summer School (LOGML)" + +- title: "Cooperative AI Summer School" + year: 2025 + id: cass25 + full_name: "Cooperative AI Summer School 2025" + link: "https://www.cooperativeai.com/summer-school/summer-school-2025" + deadline: "2025-03-07 23:59:59" + timezone: "Europe/London" + place: "Marlow, UK" + date: "July 9 - July 13, 2025" + start: 2025-07-09 + end: 2025-07-13 + sub: ['ML', 'GenAI', 'EconAI'] + note: "Cost: Free / £250 / £500; Notification: April 2, 2025" + twitter: "https://twitter.com/coop_ai" + email: + image: "https://cdn.prod.website-files.com/61fe446e584616a902bcb4f0/61ffa82ead518da3b2f75765_CoopAI_Primary_Black_Web_Small.png" + description: "The Cooperative AI Summer School is designed to provide students and early-career professionals in AI, computer science and related disciplines, such as sociology and economics, with a firm grounding in the emerging field of cooperative AI." + location: + latitude: 51.5707 + longitude: -0.7747 + +- title: "Summer School on Automatic Speech Recognition" + year: 2025 + id: s4p25 + full_name: "Summer School on Speech Signal Processing (S4P) 2025: Automatic Speech Recognition" + link: https://sites.google.com/view/s4p2025/ + deadline: "2025-07-09 23:59:59" + timezone: "Asia/Kolkata" + place: "Gandhinagar, India" + date: "July 5 - July 9, 2025" + start: 2025-07-05 + end: 2025-07-09 + sub: ['SP', 'ML', 'NLP'] + note: "Early bird registration deadline: March 31, 2025. Student Travel Grants available, including DAU Student Grants for 50 students (first come, first served)." + twitter: + email: "s4p.daiict@gmail.com" + image: "https://lh3.googleusercontent.com/l4bEPKJurzYNUVZzo9r2VdiGmq03BxfWmFoc5NNPHOEtu8b2DDWFzYWMRn5rthINcCcT4Nnnb_Z2yS8OqxDL1UM=w16383" + description: "Summer School on Speech Signal Processing (S4P) is being organized as a part of summer school activities at Speech Research Lab, DAU, Gandhinagar. It will provide opportunities for students, researchers, and professionals to enhance their fundamentals and get exposed to cutting edge research areas in the field of speech signal processing. The school focuses on Automatic Speech Recognition (ASR), which deals with recognizing the linguistic context from speech or converting speech into text with the help of machines. ASR is a key component of commercially successful Intelligent Personal Assistants (IPAs) and Voice Assistants." + location: + latitude: 23.1926 + longitude: 72.6350 + +- title: "Montreal Robotics Summer School" + year: 2025 + id: mrss25 + full_name: "Montreal Robotics Summer School (MRSS) 2025" + link: https://fracturedplane.notion.site/Montreal-Robotics-Summer-School-2025-195214857276801f9737eaf741c533a7 + deadline: "2025-02-28 23:59:59" + timezone: "America/Montreal" + place: "Montreal, Canada" + date: "August 10 - August 15, 2025" + start: 2025-08-10 + end: 2025-08-15 + sub: ['RO', 'ML'] + note: "Free. Food, travel and lodging is covered. Limited to 25 participants." + twitter: "https://x.com/Mila_Quebec" + email: robotics-school@mila.quebec + image: "https://mila.quebec/sites/default/files/media-library/image/4032/milalogowebcoulrgb.png" + description: "This summer school offers tutorials and lectures on state-of-the-art machine learning methods for training the next generation of learning robots. The summer school is an extension supported by the many robotics groups around Montreal. Attendees will have the opportunity to learn about current deep reinforcement learning methods, how to apply them to real hardware, sim2real transfer techniques, and experience with legged robotics. This year's version will feature humanoid robots. On the last day of the summer school, teams will use their new skills to compete in designing the best vision-based navigation controller on a quadruped robot to navigate an obstacle course." + location: + latitude: 45.5287 + longitude: -73.6110 + series: "Montreal Robotics Summer School (MRSS)" + +- title: "AI4Science Summer School" + year: 2025 + id: ai4s25 + full_name: "AI4Science Summer School 2025 in Caen" + link: "https://ai4science.sciencesconf.org/" + deadline: "2025-04-20 23:59:59" + timezone: "Europe/Paris" + place: "Caen, France" + date: "June 29 - July 4, 2025" + start: 2025-06-29 + end: 2025-07-04 + sub: ['ML', 'ML4Science'] + note: "Registration fee: 100€ (including social events). Free for participants from Normandy Universities. CV required." + twitter: + email: "cai4science@sciencesconf.org" + image: "https://ai4science.sciencesconf.org/data/pages/AFFICHE_SumSchool_IA_2025_v5_.png" + description: "The 2nd Summer School on Advancing Scientific Discovery with AI is designed to explore the intersection of artificial intelligence and scientific research. The program covers machine learning for scientific data analysis, AI-driven experimental design, generative models in scientific applications, and the integration of AI with physical simulations. This technical and scientific programme focuses on deep learning and is primarily aimed at researchers familiar with mathematical modeling, numerical computation and Python programming. A significant part consists of hands-on sessions where participants will use Python libraries to manipulate data and implement models." + location: + latitude: 49.1950 + longitude: -0.3588 + +- title: "Brains, Minds & Machines Summer Course" + year: 2025 + id: bmm25 + full_name: "Brains, Minds & Machines Summer Course 2025" + link: https://cbmm.mit.edu/summer-school/2025 + deadline: "2025-03-24 23:59:59" + timezone: "America/New_York" + place: "Woods Hole, MA, USA" + date: "August 3 - August 24, 2025" + start: 2025-08-03 + end: 2025-08-24 + sub: ['ML', 'Neuro', 'CogSci'] + note: + twitter: https://twitter.com/MIT_CBMM + email: + image: "https://cbmm.mit.edu/sites/default/files/images/CBMM-logo-screen-RGB-colour-optimized.svg" + description: "An intensive three-week course giving advanced students a 'deep end' introduction to the problem of intelligence – how the brain produces intelligent behavior and how we may be able to replicate intelligence in machines. The course covers topics including neurons and models, computational vision, biological vision, machine learning, Bayesian inference, planning and motor control, memory, social cognition, inverse problems, audition and speech processing, and natural language processing. The program includes MathCamps and NeuroCamps, hands-on workshops, tutorials, and culminates with student projects. Appropriate for graduate students, postdocs, and faculty in computer science or neuroscience." + location: + latitude: 41.5257 + longitude: -70.6699 + series: "Brains, Minds & Machines Summer Course" + +- title: "Mediterranean Machine Learning (M2L) Summer School" + year: 2025 + id: m2l25 + full_name: "Mediterranean Machine Learning (M2L) Summer School 2025" + link: "https://www.m2lschool.org/" + deadline: "2025-03-28 23:59:59" + timezone: "Etc/UTC" + place: "Split, Croatia" + date: "September 8 - September 12, 2025" + start: 2025-09-08 + end: 2025-09-12 + sub: ['ML', 'NLP', 'CV', 'GenAI', 'RL'] + note: "Applications open February 25, 2025. Notification of acceptance in early May 2025." + twitter: "https://x.com/M2lSchool" + email: "organizers@m2lschool.org" + image: "https://lh6.googleusercontent.com/zSMSt8r_-NUb433Ig_19MTW1U9MIpcT-sHwLILOqtotJu0LYoE6TsanidmPn14yUoFgIolXuJMRTHprg4KBy9oE=w16383" + description: "The 5th edition of the Mediterranean Machine Learning (M2L) summer school will be structured around 5 days of keynotes, lectures and intensive hands-on sessions on the most recent and fast developing core areas of Machine Learning. The intended audience is primarily Doctoral candidates and exceptional Master's and Bachelor's students, academics, professionals, and practitioners worldwide. The school will focus on Natural Language Processing, Ethics and fairness, Computer Vision, Generative Models, Reinforcement Learning and real world applications of Deep Learning. The program includes optional poster sessions and social activities to foster networking." + location: + latitude: 43.5081 + longitude: 16.4402 + series: "Mediterranean Machine Learning (M2L) Summer School" +- title: "MenaML Winter School" + year: 2025 + id: menaML25 + full_name: "2025 Middle East and North Africa Machine Learning (MenaML) Winter School" + link: "https://www.mena.ml/" + deadline: "2024-11-01 23:59:00" + timezone: "Asia/Qatar" + place: "Doha, Qatar" + date: "9-14 February, 2025" + start: 2025-02-09 + end: 2025-02-14 + sub: ['ML', 'NLP', 'CV', 'GenAI', 'Neuro', 'RL', 'ML4Science'] + note: "Applications open Oct 3, 2024, and close Nov 1, 2024. A limited number of scholarships is available." + email: "contact@mena.ml" + description: "The 2025 Middle East and North Africa Machine Learning (MenaML) Winter School is a premier event designed to equip the next generation of AI leaders. This six-day intensive program, hosted in the vibrant city of Doha, Qatar, offers a unique blend of keynotes, lectures, and hands-on practical sessions. Lectures and lab sessions will be taught by local and international AI experts from leading institutes such as Google DeepMind, Qatar Computing Research Institute (QCRI), HBKU, and others. State-of-the-art content and code will be accessible to all school participants. The 2025 MenaML Winter School is designed for Bachelor, Master, and Doctoral students. It welcomes applications from all around the world, with a focus on the MENA region. Ideal participants have a strong technical background and some experience in machine learning." + image: "https://lh6.googleusercontent.com/OrVqEQesnEbamERIZ15pfdcT7r7Y87zjha7DLmCK248dbBkxGRzFj-HpGcgm4Y4-pYM4Rce3AYZyQ8WBGqGa0PKtQDq-OWnEV8XambKlVWn4C2ZnpVToRvZdj1bV6u2pFwXxYPn48jVcc-IhgKRjgzAHmQSi2q1fpb8FwdcnOr7M_93PWXa09oXQolCDMbUWADHkYE3RewJxAbphqFN7=w1280" + location: + latitude: 25.31692 + longitude: 51.44722 + + +- title: "Summer School on Cryptography, Statistics and Machine Learning" + year: 2025 + id: ysumss25 + full_name: "Summer School on Cryptography, Statistics and Machine Learning 2025" + link: "http://mathschool.ysu.am/mss2025/" + deadline: "2025-06-01 23:59:59" + timezone: "Asia/Yerevan" + place: "Tsaghkadzor, Armenia" + date: "June 29 - July 06, 2025" + start: 2025-06-29 + end: 2025-07-06 + sub: ['ML', 'Theory'] + note: "Participation fee: 450 EUR (academia), 600 EUR (industry), 250 EUR (Armenian students). Scholarships available." + twitter: + email: "mathschool@ysu.am" + image: "https://www.ysu.am/themes/custom/ysu_main/images/logo-english.svg" + description: "The Faculty of Mathematics and Mechanics of the Yerevan State University is organizing a Summer School on Cryptography, Statistics and Machine Learning. The target audience includes university undergraduate seniors, Master and PhD students and researchers, as well as industry professionals interested in Cryptography, Probability, Statistics, Machine Learning and applications. All lectures will be delivered in English. The participation fee covers registration, accommodation, and full board. Limited spots available; selection process applies for registered participants." + location: + latitude: 40.180284 + longitude: 44.52613 + +- title: "Mathematics and Physics of Quantum Computing and Quantum Learning" + year: 2025 + id: mpqcql25 + full_name: "Summer School on Mathematics and Physics of Quantum Computing and Quantum Learning (MPQCQL) 2025" + link: "https://mpqcql2025.sciencesconf.org" + deadline: "2025-04-30 23:59:59" + timezone: "Europe/Paris" + place: "Porquerolles, France" + date: "May 23 - May 28, 2025" + start: 2025-05-23 + end: 2025-05-28 + sub: ['Quantum', 'ML', 'Theory'] + note: "Participation fee: 450 EUR (students, postdocs), 600 EUR (faculty, industry). Limited places available." + twitter: + email: "mpqcql2025@sciencesconf.org" + description: "This summer school aims at gathering mathematicians, computer scientists, and physicists interested in quantum learning and quantum computation. Several introductory lectures will be given by leading researchers in the field including Pablo Arrighi (Université Paris-Saclay and Inria), Matthias Caro (University of Warwick), Guillaume Rabusseau (Université de Montréal / MILA), Muhammad Hamza Waseem (Oxford University), and Mirjam Weilenmann (IQOQI Vienna and Inria). Topics covered include quantum computing and information, quantum learning theory, tensor networks, quantum states of neural networks, and quantum cellular automata. The lectures will be complemented by additional research talks. Poster sessions for PhD students and post-doctoral researchers will be organized during the school." + image: "https://mpqcql2025.sciencesconf.org/data/pages/logos_4.png" + location: + latitude: 43.0008 + longitude: 6.20491 + +- title: "Cambridge Ellis Unit Summer School on Probabilistic Machine Learning" + year: 2025 + id: ellis-cambridge25 + full_name: "Cambridge Ellis Unit Summer School on Probabilistic Machine Learning 2025" + link: "https://www.ellis.eng.cam.ac.uk/summer-school/" + deadline: "2025-05-10 23:59:59" + timezone: "Europe/London" + place: "Cambridge, UK" + date: "July 14 - July 18, 2025" + start: 2025-07-14 + end: 2025-07-18 + sub: ['ML', 'GenAI', 'Theory', 'RL', 'CV'] + note: "Student participation fee: £500 (if traveling by air), £0 otherwise. Travel awards available for attendees from under-represented backgrounds." + twitter: "https://twitter.com/CambridgeEllis" + email: "ellis-admin@eng.cam.ac.uk" + description: "The Cambridge Ellis Unit Summer School on Probabilistic Machine Learning is a distinguished course offered to graduate students, researchers and professionals, featuring engaging experts and world-recognized professionals speaking about advanced machine learning concepts. Topics include Statistical Emulation, Uncertainty Quantification, Evaluation of Probabilistic Models, Reinforcement Learning, Diffusion Models, Normalising Flows, Deep Generative Models, Variational Inference and Stein Discrepancy, Probabilistic Models in Computer Vision and Graphics, and Machine Learning and the Physical World. Applicants must submit a 2-page CV and letter of reference. The event will be held at Pembroke College with lunch and refreshments provided." + location: + latitude: 52.20185888225664 + longitude: 0.11833142598481534 + image: "https://www.ellis.eng.cam.ac.uk/wp-content/uploads/2023/09/cropped-ellis-logo_horizontal_black_2023-cambridge.png" + series: "ELLIS Winter and Summer Schools" + +- title: "EDBT Summer School on AI & Data Management" + year: 2025 + id: edbt25 + full_name: "EDBT 2025 Summer School on AI & Data Management" + link: "https://dmai.cs.ucy.ac.cy/" + deadline: "2025-04-07 23:59:59" + timezone: "Europe/Nicosia" + place: "Nicosia, Cyprus" + date: "July 7 - July 11, 2025" + start: 2025-07-07 + end: 2025-07-11 + sub: ['ML', 'DM', 'GenAI'] + note: "Registration options: €600 (no accommodation), €850 (shared room), €1100 (single room). Microsoft Fellowships available for US students." + twitter: + email: "edbt2025summer@gmail.com" + description: "The EDBT association and the University of Cyprus are jointly sponsoring a Summer School on Artificial Intelligence (AI) and Data Management, hosted at the Resource Center 'Stelios Ioannou', University of Cyprus. It will cover a diverse range of topics around artificial intelligence and data management, with a special focus on Large Language Models, AI agents and Vector Databases. The program features 9 tutorials from internationally renowned researchers including Prof. Ioana Manolescu, Prof. Flora Salim, Prof. Sihem Amer-Yahia, Dr. Charalampos Tsourakakis, Prof. Volker Markl, Prof. Constantine Dovrolis, Prof. Mohamed F. Mokbel, Prof. Li Xiong, and Prof. Cyrus Shahabi. The school is primarily intended for graduate students and post-doctoral researchers, but also welcomes applications from advanced undergraduate students and academic and industrial researchers." + image: "https://dmai.cs.ucy.ac.cy/wp-content/uploads/2025/03/FINAL-EDBT-summer-school-logo-4.png" + location: + latitude: 35.14439766701156 + longitude: 33.41091247111121 + +- title: "Brown CNTR AI Policy Summer School" + year: 2025 + id: brown-cntr25 + full_name: "Brown University Center for Technological Responsibility, Reimagination and Redesign (CNTR) AI Policy Summer School 2025" + link: "https://cntr.brown.edu/summer-school" + deadline: "2025-04-05 23:59:59" + timezone: "America/New_York" + place: "Providence, RI and Washington, DC, USA" + date: "July 22 - July 31, 2025" + start: 2025-07-22 + end: 2025-07-31 + sub: ['RAI', 'ML'] + note: "Priority given to U.S. Citizens, Permanent Residents, and applicants from less represented states. Funding available for travel, lodging, and meals." + twitter: + email: "serenabooth@brown.edu" + description: "Brown University CNTR is launching an AI Policy Summer School with a dual location format in Providence, RI and Washington, DC. The program aims to enable graduate students to conduct high-quality policy-informed AI research, empower students to advocate for new AI policies or changes to existing policy, and build a pipeline of qualified technologists to fill emerging needs in government. The first week features seminars, reading groups, and discussions on AI Policy fundamentals, while the second week involves travel to Washington, D.C. to discuss relevant legislation with Congressional offices, executive agencies, and civil society organizations. Confirmed speakers include Alan Davidson (former NTIA administrator), Kiri Wagstaff (Former AI Policy Advisor to Senator Mark Kelly), and Helen Toner (Director of CSET). The event is open to graduate students and postdocs in computing and affiliated fields, with consideration for dedicated undergraduates as well. No prior policy experience required." + image: "https://logotyp.us/file/brown.svg" + location: + latitude: 41.82849084031934 + longitude: -71.40098154575963 + +- title: "BMVA Computer Vision Summer School" + year: 2025 + id: bmva-cvss25 + full_name: "28th BMVA Computer Vision Summer School (CVSS) 2025" + link: "https://cvss.bmva.org/" + deadline: "2025-06-15 23:59:59" + timezone: "Europe/London" + place: "Aberdeen, Scotland, UK" + date: "July 7 - July 11, 2025" + start: 2025-07-07 + end: 2025-07-11 + sub: ['CV', 'ML', 'GenAI'] + note: "Early bird registration until 15th Jun 2025" + twitter: "https://twitter.com/BmvaCvss" + email: "bmva-cvss2025@abdn.ac.uk" + description: "The 28th BMVA Computer Vision Summer School (CVSS) will consist of an intensive week of lectures and lab sessions covering a wide range of topics in Computer Vision. The program includes 16 lectures across several topics, such as hyperbolic deep learning, classical CV, egocentric vision, video understanding, generative models and others. Lecturers are researchers from some of the most active research groups in the UK and abroad. The summer school is organized by the University of Aberdeen and the British Machine Vision Association." + image: "https://cvss.bmva.org/assets/images/layout/cvss_logo_2025.png" + location: + latitude: 57.1648 + longitude: -2.1015 + series: "BMVA Computer Vision Summer School" + +- title: "Deep Learning for Medical Imaging School" + year: 2025 + id: dlmi25 + full_name: "6th Deep Learning for Medical Imaging (DLMI) School 2025" + link: "https://deepimaging2025.sciencesconf.org/" + deadline: "2025-04-11 23:59:59" + timezone: "Europe/Paris" + place: "Lyon, France" + date: "April 21 - April 25, 2025" + start: 2025-04-21 + end: 2025-04-25 + sub: ['ML', 'CV', 'Health'] + note: "Registration opens February 14th. In-person registration closes April 11th (limited to 70 full participants and 130 course-only participants). Virtual registration closes April 18th. Fees: Students €650-900, Academic €750-1120, Industrial €1000 (full), €300 (courses only), €200 (virtual). Accommodation booking available until March 31st." + twitter: + email: deepimaging2025@sciencesconf.org + description: "The 6th edition of the Deep Learning for Medical Imaging School is designed for both beginners and experts in medical imaging, including students, post-docs, research professionals, and professors. It offers an introduction to deep learning, covering fundamental concepts and their applications in medical imaging. The program includes 16 hours of oral presentations and four hands-on sessions (4 hours each). Participants will explore the basics of machine learning, progressing to the latest deep learning advancements in medical imaging. No expertise in machine learning or advanced programming skills is required to attend; a basic understanding of Python is sufficient for the hands-on sessions. Three attendance options are available: Full Registration (includes all courses, hands-on sessions, social events, meals, recorded sessions, and computing resources), Courses Only (on-site courses, recorded materials, coffee breaks, but no hands-on sessions, meals or social events), and Virtual Attendance (recorded sessions, computing resources, and live Q&A Zoom sessions on May 5-6). This school is organized by Labex PRIMES and INSA Lyon, and is a MICCAI endorsed event." + image: "https://deepimaging2025.sciencesconf.org/data/header/BandeauWeb_2.png" + location: + latitude: 45.783157129845144 + longitude: 4.87221626793872 + + +- title: "UK Robotics Summer School" + year: 2025 + id: ukrss25 + full_name: "UK Robotics Summer School 2025" + link: "https://ukrss.site.hw.ac.uk/" + deadline: "2025-04-30 23:59:59" + timezone: "Europe/London" + place: "Edinburgh, UK" + date: "June 2 - June 6, 2025" + start: 2025-06-02 + end: 2025-06-06 + sub: ['RO', 'ML', 'GenAI', 'HCI'] + note: "Registration deadline: April 30, 2025. Costs: £600 for industry/non-students, £300 for students (full week); £200/day for industry, £100/day for students. Fee includes lectures, tours, lunch, refreshments, and Summer School dinner. Registration via Eventbrite. Accommodation and travel to be arranged separately. Cancellations more than 30 days prior qualify for refund (excluding Eventbrite fees)." + twitter: + email: "janet_louise.forbes@hw.ac.uk" + description: "This 5-day Robotics Summer School is organised by the Edinburgh Centre for Robotics (Edinburgh and Heriot-Watt University) and the National Robotarium, supported by the CDT D2AIR, The Edinburgh Centre for Robotics and the UK-RAS network. The program offers a combination of lectures, tutorials, and industry presentations focusing on cutting-edge topics in robotics. Participants will gain insights into reasoning, control, collaboration, and learning, bioinspired robotics, generative AI for robotics, human robot interactions, as well as discussions on ethics, validation, and inclusivity in robotics and AI. The event includes hands-on experience with state-of-the-art robotics technology, a tour of the National Robotarium, and networking opportunities with fellow students, academics, and industry leaders. Refreshments, lunch, and a special Summer School dinner (sponsored by the UK-RAS network) are included." + image: "https://ukrss.site.hw.ac.uk/wp-content/uploads/sites/89/2024/12/download.png" + location: + latitude: 55.91228043531887 + longitude: -3.323275722224049 + +- title: "INVICTA School of VIsion, Computational intelligence, and patTern Analysis" + year: 2025 + id: invicta25 + full_name: "INvicta school of VIsion, Computational intelligence, and patTern Analysis (INVICTA) 2025" + link: "https://invicta.inesctec.pt/" + deadline: "2025-03-31 23:59:59" + timezone: "Europe/Lisbon" + place: "Porto, Portugal" + date: "April 7 - April 11, 2025" + start: 2025-04-07 + end: 2025-04-11 + sub: ['CV', 'ML', 'GenAI', 'Health'] + note: "Early-bird registration (€650) until Feb 9, 2025. Regular registration (€700) until March 31, 2025. 12% discount for APRP members." + twitter: "https://twitter.com/INVICTA_School" + email: "invicta@inesctec.pt" + image: "https://invicta.inesctec.pt/assets/img/logo/invicta_logo1.png" + description: "The INvicta school of VIsion, Computational intelligence, and patTern Analysis (INVICTA) is organized by the Visual Computing and Machine Intelligence (VCMI) group of INESC TEC. The program features lectures, hands-on workshops, case studies, and a round-table on Responsible AI, led by experts from academia and industry. Topics include explainable AI in healthcare, vision-language models, knowledge distillation, bioinspired algorithms for visual attention, diffusion models in medical imaging, and more. The registration fee includes all lectures, hands-on sessions, case studies, AI talks, coffee breaks, and a social program. The school will take place at Porto Innovation Hub in the city center." + location: + latitude: 41.1579 + longitude: -8.6291 + +- title: "Responsible ML Winter School" + year: 2025 + id: rmlws25 + full_name: "Winter School on Responsible Machine Learning 2025" + link: "https://mlwinterschoolumea.github.io/" + deadline: "2025-02-20 23:59:59" + timezone: "Europe/Stockholm" + place: "Umeå, Sweden" + date: "March 11 - March 13, 2025" + start: 2025-03-11 + end: 2025-03-13 + sub: ['ML', 'RAI'] + note: "Registration fee: Students 1500 SEK, Faculty 2500 SEK, Others 4000 SEK. Free for LEMUR, WASP, WASP-HS or Aequitas members. Poster submission deadline: February 28, 2025. As of December 16, 2024, the event has reached capacity." + twitter: + email: "monowar@cs.umu.se, nina.khairova@umu.se, virginia.dignum@umu.se" + description: "The Winter School on Responsible Machine Learning at Umeå University, Sweden offers lectures in the field of Responsible Machine Learning as well as hands-on multi-disciplinary and complementary training. The event includes a poster session and a social program, providing opportunities for networking and professional exchange. The school will take place in the Rotundan hall in the Universum building of Umeå University. The program is organized by the Responsible AI Group, led by Monowar Bhuyan and Virginia Dignum." + image: "https://mlwinterschoolumea.github.io/images/ai-policy-1.png" + location: + latitude: 63.819675624967985 + longitude: 20.305233918546286 + +- title: "Advanced Course on Artificial Intelligence & Neuroscience" + year: 2025 + id: acain25 + full_name: "5th Advanced Course and Symposium on Artificial Intelligence & Neuroscience (ACAIN) 2025" + link: "https://acain2025.icas.events/" + deadline: "2025-04-23 23:59:59" + timezone: "Europe/Rome" + place: "Castiglione della Pescaia, Italy" + date: "September 21 - September 24, 2025" + start: 2025-09-21 + end: 2025-09-24 + sub: ['ML', 'Neuro', 'CogSci', 'RO', 'RAI'] + note: "Regular registration deadline: April 23, 2025. Late registration: April 24 - August 10, 2025. Residential course - all participants must stay at the Riva del Sole Resort and Spa. Equivalent to 8 ECTS points." + twitter: + email: "acain@icas.cc" + image: "https://acain2025.icas.events/wp-content/uploads/sites/31/2024/09/ACAIN-2025-logo-banner-1.png" + description: "The 5th Advanced Course and Symposium on Artificial Intelligence & Neuroscience (ACAIN) is a full-immersion four-day event at the Riva del Sole Resort & SPA, Tuscany, featuring lectures by world-renowned experts. The event consists of a two-day course (September 21-22) followed by a two-day symposium (September 23-24). It aims to foster multidisciplinary interactions between AI and neuroscience communities. Topics include neuroscience-inspired AI, cognitive computing, deep learning, computational neuroscience, human-level AI, ethics for autonomous systems, explainable AI, and more. Confirmed lecturers include Panos Pardalos (University of Florida), Jose Principe (University of Florida), Maneesh Sahani (UCL), Jonathon Shlens (Google DeepMind), Dimitra Thomaidou (Hellenic Pasteur Institute), and Marina Vidaki (University of Crete). The event involves 36-40 hours of lectures and provides opportunities for participants to present their research through oral talks or posters." + location: + latitude: 42.77079126926875 + longitude: 10.852376626839042 + series: "Advanced Course and Symposium on Artificial Intelligence & Neuroscience (ACAIN)" + + +- title: "Data Visualization Summer School" + year: 2025 + id: dvss25 + full_name: "Data Visualization Summer School: Design, communicate, engage 2025" + link: "https://malga.unige.it/education/schools/dvss/" + deadline: "2025-05-18 23:59:59" + timezone: "Europe/Rome" + place: "Genoa, Italy" + date: "July 7 - July 11, 2025" + start: 2025-07-07 + end: 2025-07-11 + sub: ['ML', 'GenAI'] + note: "Application deadline: May 18, 2025. Acceptance notification: May 30, 2025. Registration fees: Free for UniGe and Northeastern PhD students; €100 for non-UniGe PhD students and postdocs; €200 for non-UniGe faculty; €400 for professionals." + twitter: "https://twitter.com/malga_center" + email: "malga@unige.it" + description: "The Summer School in Data Visualization aims to equip participants with both fundamental and cutting-edge skills in creating impactful data visualizations for science dissemination, combining traditional design principles with modern AI capabilities. The program includes morning lectures by experts spanning from data visualization practices to the role of generative AI, and afternoon lab sessions where participants work on group projects. Speakers include Prof. Enrico Bertini from Northeastern University (Boston, MA) and faculty members from the MaLGa Center and UniGe's dAD Department. The school is aimed at PhD students of all disciplines, master's thesis students, and professionals who want to master data visualization principles and leverage AI tools to create more impactful and innovative visual storytelling." + location: + latitude: 44.40498328188538 + longitude: 8.972239169310429 + series: "MaLGa Summer Schools" + +- title: "Eastern European Machine Learning Summer School" + year: 2025 + id: eeml25 + full_name: "Eastern European Machine Learning Summer School (EEML) 2025" + link: "https://www.eeml.eu/home" + deadline: "2025-04-07 23:59:59" + timezone: "AOE" + place: "Sarajevo, Bosnia and Herzegovina" + date: "July 21 - July 26, 2025" + start: 2025-07-21 + end: 2025-07-26 + sub: ['ML', 'GenAI'] + note: "Application deadline: April 7, 2025 (23:59 AoE). Notification of acceptance: Early May 2025. Registration opens: Early June 2025." + twitter: "https://twitter.com/EEMLcommunity" + email: "contact@eeml.eu" + image: "https://rit.rakuten.com/wp-content/uploads/2022/03/Annotation-2020-09-02-112910.png" + description: "The Eastern European Machine Learning Summer School (EEML) brings together world-class researchers and practitioners in machine learning and artificial intelligence. The 2025 edition features an impressive lineup of speakers including Aaron Courville (Mila), Diana Borsa (Google DeepMind), Ferenc Huszár (University of Cambridge), João Carreira (Google DeepMind), Samy Bengio (Apple, EPFL), and many others. The program also includes tutorials led by experts from Google DeepMind and the University of Oxford. The school is organized in partnership with the Association for the Advancement of Science and Technology, Romanian Association for Artificial Intelligence, and University of Sarajevo, with support from various sponsors and community partners." + location: + latitude: 43.8563 + longitude: 18.4131 + series: "Eastern European Machine Learning (EEML) Summer School" + +- title: "Oxford Machine Learning Summer School (OxML): MLx Fundamentals" + year: 2025 + id: oxmlf25 + full_name: "Oxford Machine Learning Summer School: MLx Fundamentals 2025" + link: "https://www.oxfordml.school/" + deadline: "2025-05-01 23:59:59" + timezone: "Europe/London" + place: "Online" + date: "May 1 - May 9, 2025" + start: 2025-05-01 + end: 2025-05-09 + sub: ['ML', 'Theory'] + note: "Online only. Registration fee: £150 + VAT. Comprehensive tickets available: £500 (online), £1,700 (hybrid) for all four OxML courses." + twitter: "https://twitter.com/GlobalGoalsAI" + email: "contact@oxfordml.school" + image: "https://static.wixstatic.com/media/9b9d14_6872b3c1af6140a9b7542da5d66cbdd0~mv2.png/v1/fill/w_230,h_236,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/AI4GG-%20Logo-dark.png" + description: "MLx Fundamentals covers foundational topics in Statistical ML and Deep Learning, from the mathematics of ML and optimization to fundamentals of deep learning, NLP, and computer vision. Each day combines theoretical and applied lectures with case studies (hands-on coding). Speakers include Yali Du (King's College London), Yuki Asano (University of Amsterdam), Karsten Kreis (NVIDIA), Ishan Misra (Meta), Chi Jin (Princeton University), Biwei Huang (UC San Diego), Meng Fang (University of Liverpool), and others. The program is organized by AI for Global Goals." + location: + latitude: 51.7548 + longitude: -1.2544 + series: "Oxford Machine Learning Summer School (OxML)" + +- title: "Oxford Machine Learning Summer School (OxML): MLx Generative AI" + year: 2025 + id: oxmlg25 + full_name: "Oxford Machine Learning Summer School: MLx Generative AI 2025" + link: "https://www.oxfordml.school/2025" + deadline: "2025-06-05 23:59:59" + timezone: "Europe/London" + place: "London, UK" + date: "June 5 - June 7, 2025" + start: 2025-06-05 + end: 2025-06-07 + sub: ['ML', 'GenAI'] + note: "Hybrid format (in-person at London School of Economics or online). Registration fees: £600 + VAT (in-person), £250 + VAT (online). Comprehensive tickets available for all four OxML courses." + twitter: "https://twitter.com/GlobalGoalsAI" + email: "contact@oxfordml.school" + image: "https://static.wixstatic.com/media/9b9d14_6872b3c1af6140a9b7542da5d66cbdd0~mv2.png/v1/fill/w_230,h_236,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/AI4GG-%20Logo-dark.png" + description: "MLx Generative AI focuses on building GenAI products, targeting scientists/engineers and product designers/managers. The program covers the latest developments in generative foundation models in language, vision, and more, with a deep dive into emerging research and design patterns in Agentic Workflow and Alignment/Trust. Speakers include Jeff Clune (University of British Columbia/CIFAR/Google DeepMind), Reza Khorshidi (University of Oxford/ELANDI), Danijela Horak (BBC), Peggy Tsai (BigID), Karo Moilanen (Moonsongs Labs), Edward Hughes (DeepMind), Sunil Mallya (FLlip AI), and Sahar Asadi (KING). The event will be held at the London School of Economics." + location: + latitude: 51.5144 + longitude: -0.1165 + series: "Oxford Machine Learning Summer School (OxML)" + +- title: "Oxford Machine Learning Summer School (OxML): MLx Health & Bio" + year: 2025 + id: oxmlh25 + full_name: "Oxford Machine Learning Summer School: MLx Health & Bio 2025" + link: "https://www.oxfordml.school/2025" + deadline: "2025-08-02 23:59:59" + timezone: "Europe/London" + place: "Oxford, UK" + date: "August 2 - August 5, 2025" + start: 2025-08-02 + end: 2025-08-05 + sub: ['ML', 'Health', 'Bio'] + note: "Hybrid format (in-person at University of Oxford's Maths Institute or online). Registration fees: £900 + VAT (in-person), £300 + VAT (online). Comprehensive tickets available for all four OxML courses." + twitter: "https://twitter.com/GlobalGoalsAI" + email: "contact@oxfordml.school" + image: "https://static.wixstatic.com/media/9b9d14_6872b3c1af6140a9b7542da5d66cbdd0~mv2.png/v1/fill/w_230,h_236,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/AI4GG-%20Logo-dark.png" + description: "MLx Health & Bio is a masterclass combining theoretical ML talks with applications in healthcare and biomedical sciences/research/technology. Topics range from imaging, proteomics, genomics, and EHR to computational biology, drug discovery, multi-omics, wearables, and more. Speakers include Michael Bronstein (University of Oxford/AITHYRA), Charlotte Deane (University of Oxford), Arthur Gretton (University College London/Google DeepMind), Mireia Crispin (University of Cambridge), Aiden Doherty (University of Oxford), Adam Lewandowski (UK Biobank), Jonathan Passerat-Palmbach (Imperial College London), Hoifung Poon (Microsoft Health), Brian Hie (Stanford University), and many other leading researchers from both academia and industry." + location: + latitude: 51.7603 + longitude: -1.2597 + series: "Oxford Machine Learning Summer School (OxML)" + +- title: "Oxford Machine Learning Summer School (OxML): MLx Representation Learning & GenAI" + year: 2025 + id: oxmlr25 + full_name: "Oxford Machine Learning Summer School: MLx Representation Learning & GenAI 2025" + link: "https://www.oxfordml.school/2025" + deadline: "2025-08-07 23:59:59" + timezone: "Europe/London" + place: "Oxford, UK" + date: "August 7 - August 10, 2025" + start: 2025-08-07 + end: 2025-08-10 + sub: ['ML', 'GenAI', 'CV', 'NLP'] + note: "Hybrid format (in-person at University of Oxford's Maths Institute or online). Registration fees: £900 + VAT (in-person), £300 + VAT (online). Comprehensive tickets available for all four OxML courses." + twitter: "https://twitter.com/GlobalGoalsAI" + email: "contact@oxfordml.school" + image: "https://static.wixstatic.com/media/9b9d14_6872b3c1af6140a9b7542da5d66cbdd0~mv2.png/v1/fill/w_230,h_236,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/AI4GG-%20Logo-dark.png" + description: "MLx Representation Learning & GenAI covers the latest developments in representation learning, including those behind the success of generative AI. The program features a deep dive into ML in domains such as NLP (including LLMs), computer vision (including foundational/frontier image, video and multi-modal models), Bayesian ML, Reinforcement Learning, Geometrical DL, and more. Speakers include Peyman Milanfar (Google), Aymeric Dieuleveut (École Polytechnique), Abdul Fatir Ansari (AWS AI Labs), Ashley Edwards (Runway), Fazl Barez (University of Oxford), Haitham Bou-Ammar (Huawei), Gerhard Neumann (KIT), Hannaneh Hajishirzi (University of Washington/Allen Institute for AI), David Salinas (University of Washington), Edward Johns (Imperial College London), Ilia Shumailov (Google DeepMind), and workshop leaders from Meta and Hugging Face." + location: + latitude: 51.7603 + longitude: -1.2597 + series: "Oxford Machine Learning Summer School (OxML)" + +- title: "BAI Summer School on AI Agents and Agentic Systems" + year: 2025 + id: bai25 + full_name: "Business Analytics Institute (BAI) Summer School on AI Agents and Agentic Systems 2025" + link: "https://www.baieurope.com/summer-school-2025" + deadline: "2025-04-15 23:59:59" + timezone: "Europe/Paris" + place: "Anglet, France" + date: "July 3 - July 12, 2025" + start: 2025-07-03 + end: 2025-07-12 + sub: ['ML', 'GenAI', 'EconAI'] + note: "Open to upper class/graduate students and working professionals. Registration: January 1 - April 15, 2025. Early bird discounts available until February 28, 2025. Fees: €1545 (session) + €275 (social activities). Housing options available at negotiated rates." + twitter: "https://twitter.com/dsign4analytics" + email: "info@baieurope.com" + image: "https://images.squarespace-cdn.com/content/v1/5cc60d5c20fffe0001f629be/1556484078439-IVAKT2IJOIEFTEU9Q1PP/BAI+logo+6+-+b+color.png?format=1500w" + description: "The Business Analytics Institute, together with the ZHAW School of Management and Law, offers a 10-day summer school focusing on the managerial implications of current innovations of AI Agents in Banking and Finance. The program includes case studies, workshops, seminars, and expert testimony from the Banking and Finance sectors, facilitated by industry-recognized experts including Profs. Cielen, Elliott, Hitz, Gellrich, Walter, and Schlenker. Practicums will be run using Python, Rust, and LangChain. The program features company visits with data science teams from traditional banks and Fintech operators, as well as cultural visits to Biarritz, Saint Jean de Luz, and San Sebastián, a Basque cooking class, surfing lessons, and a tour of the 18th frigate 'L'Hermione'." + location: + latitude: 43.4831 + longitude: -1.5148 + +- title: "Gaussian Process Summer School" + year: 2025 + id: gpss25 + full_name: "Gaussian Process Summer School 2025" + link: "https://gpss.cc/gpss25/" + deadline: "2025-06-27 23:59:00" + timezone: "Europe/London" + place: "Manchester, UK" + date: "September 08 - September 11, 2025" + start: 2025-09-08 + end: 2025-09-11 + sub: ['ML', 'Theory', 'Log'] +- title: "Cohere Labs - ML Summer School" + year: 2025 + id: clmlss25 + full_name: "Cohere Labs - ML Summer School 2025" + link: "https://cohere.com/events/Cohere-Labs-ML-Summer-School-2025" + deadline: "2025-06-30 23:59:00" + timezone: "Europe/London" + place: "Online" + date: "July 02 - July 14, 2025" + start: 2025-07-02 + end: 2025-07-14 + sub: ['ML', 'CV', 'NLP', 'KR', 'GenAI', 'Theory', 'Log', 'EML', 'RL'] diff --git a/site/_data/summerschools.yml b/site/_data/summerschools.yml index 659256a..541cbc7 100644 --- a/site/_data/summerschools.yml +++ b/site/_data/summerschools.yml @@ -7,13 +7,13 @@ timezone: Europe/Berlin place: "Leipzig, Germany" date: "June 22 - June 26, 2026" - start: 2024-06-22 - end: 2024-06-26 + start: 2026-06-22 + end: 2026-06-26 sub: ['ML', 'GenAI'] series: "International Summer School on AI and Big Data" description: "The theme is Neuro+Symbolic AI, focusing on an emerging paradigm that combines the strengths of neural learning and symbolic reasoning, augmented with foundations in each of these." location: - latitude: 51.34 + latitude: 51.34 longitude: 12.375 - title: Generative AI Summer School year: 2026 @@ -44,7 +44,7 @@ note: "Five-day residential summer school on artificial intelligence and generative AI with lectures by invited experts and research presentations by participants." email: "iaiss@icas.cc" description: "IAISS 2026 is a residential summer school covering modern AI topics including generative AI, reinforcement learning, and machine learning methods." - image: null + image: location: latitude: 42.7637 longitude: 10.8753 @@ -63,9 +63,9 @@ end: 2026-08-07 sub: ["ML", "Theory"] note: "Eighth edition of the Probabilistic AI School featuring lectures and tutorials on probabilistic machine learning." - email: null + email: description: "ProbAI School 2026 provides training in probabilistic modeling, variational inference, and generative modeling techniques." - image: null + image: location: latitude: 54.6872 longitude: 25.2797 @@ -84,9 +84,9 @@ end: 2026-07-29 sub: ["CV", "ML"] note: "Ten-day summer school hosted at the Google AI Community Center in Accra bringing together African students and international researchers in computer vision." - email: null + email: description: "ACVSS 2026 includes lectures, keynotes, practical sessions, and a hackathon focusing on computer vision, deep learning, and responsible AI." - image: null + image: location: latitude: 5.5593 longitude: -0.1974 @@ -107,7 +107,7 @@ note: "Five-day summer school dedicated to reliability, robustness, and safety of machine learning systems." email: "mlss@mlinpl.org" description: "MLSS R&S 2026 is an intensive academic program featuring invited lectures from leading researchers on AI safety, reliability, and trustworthy machine learning." - image: null + image: location: latitude: 50.0647 longitude: 19.9450 @@ -145,11 +145,11 @@ start: 2026-06-03 end: 2026-06-12 sub: ['RL', 'ML'] - note: null + note: twitter: "https://x.com/RLSummerSchool" email: "info@rlsummerschool.com" description: "RLSS is returning to Milan in 2026 from June 3rd to 12th! This edition of RLSS brings together researchers and students to explore the foundations and latest frontiers of RL in an intensive and in-person format." - image: null + image: location: latitude: 45.478065 longitude: 9.227077 @@ -195,7 +195,6 @@ latitude: 57.1648 longitude: -2.1015 series: "BMVA Computer Vision Summer School" - - title: "Oxford Machine Learning Summer School - MLx HEALTH & BIO" year: 2026 id: oxford_mlxbio26 @@ -208,10 +207,10 @@ start: 2026-07-10 end: 2026-07-13 sub: ["ML", "Health", "Bio"] - note: null - email: null + note: + email: description: "Oxford Machine Learning School (OxML) offers specialised tracks in advanced machine learning, including an MLx Health & Bio module focusing on applications in healthcare and biology." # from official program info :contentReference[oaicite:3]{index=3} - image: null + image: location: latitude: 51.7520 longitude: -1.2577 @@ -230,9 +229,9 @@ end: 2026-05-16 sub: ["ML", "RL", "GenAI"] note: "Six‑day online programme focused on practical machine learning applications including RL, diffusion models, and building AI systems." # from official announcement :contentReference[oaicite:5]{index=5} - email: null + email: description: "MLx Cases is a track of the OxML 2026 summer school emphasizing hands‑on ML engineering, reinforcement learning, diffusion models, and the construction of AI agents." # based on module description :contentReference[oaicite:6]{index=6} - image: null + image: location: latitude: 51.7520 longitude: -1.2577 @@ -251,9 +250,9 @@ end: 2026-07-18 sub: ["ML", "GenAI"] note: "Focuses on representation learning and advanced generative AI techniques with a special submodule on AI for mathematics." # module topics based on official announcements :contentReference[oaicite:9]{index=9} - email: null + email: description: "MLx Representation Learning & Generative AI is a track within OxML 2026 dedicated to cutting‑edge topics such as advanced representation learning and generative artificial intelligence." # based on official announcements :contentReference[oaicite:10]{index=10} - image: null + image: location: latitude: 51.7520 longitude: -1.2577 @@ -272,9 +271,9 @@ end: 2026-06-19 sub: ["ML"] note: "Introduction to the fundamental concepts and algorithms of Machine Learning with lab sessions at the Machine Learning Genoa Center (MaLGa)." # from official course page :contentReference[oaicite:0]{index=0} - email: null + email: description: "The Machine Learning Crash Course (MLCC) 2026 provides an introduction to the core methods in machine learning, suitable for undergraduate/graduate students and professionals." # official description :contentReference[oaicite:1]{index=1} - image: null + image: location: latitude: 44.4071 longitude: 8.9347 @@ -295,7 +294,7 @@ note: "The event includes keynote speeches, panel discussions, brainstorming sessions, and covers accommodation and meals from June 21 to June 26." # from official page :contentReference[oaicite:4]{index=4} email: "rpl-events@eecs.kth.se" # official contact from RPL page :contentReference[oaicite:5]{index=5} description: "The RPL Summer School 2026 is a six-day intensive programme focusing on robotics, perception, and learning, intended for doctoral and postdoctoral researchers." # from official description :contentReference[oaicite:6]{index=6} - image: null + image: location: latitude: 59.3293 # Stockholm coordinates longitude: 18.0686 @@ -314,9 +313,9 @@ end: 2026-06-26 sub: ["RO"] note: "A 5‑day summer school focusing on robotics and related AI topics held at the National Robotarium, Heriot‑Watt University." # official event description :contentReference[oaicite:2]{index=2} - email: null + email: description: "UK Robotics Summer School offers lectures, tutorials, and industry presentations on robotics, bioinspired systems, generative AI for robotics, and AI validation." # official description :contentReference[oaicite:3]{index=3} - image: null + image: location: latitude: 55.9533 longitude: -3.1883 @@ -337,7 +336,7 @@ note: "Application deadline is January 23, 2026 (23:59 CET)." # official deadline :contentReference[oaicite:7]{index=7} email: "gemss@sciencesconf.org" # official contact from affiliated page :contentReference[oaicite:8]{index=8} description: "GeMSS is a spring/summer school dedicated to deep generative models including latent variable models, diffusion models, and autoregressive models, attracting PhD students and researchers." # official description :contentReference[oaicite:9]{index=9} - image: null + image: location: latitude: 51.5072 longitude: -0.1276 @@ -380,23 +379,6 @@ latitude: 69.6492 longitude: 18.9553 -- title: "Advanced Summer School on Responsible AutoML" - year: 2025 - id: asraml25 - full_name: "Advanced Summer School on Responsible AutoML 2025" - link: "https://automlsummerschool.cin.ufpe.br/" - deadline: "2025-11-11 23:59:00" - timezone: "America/Sao_Paulo" - place: "Recife, Brazil" - date: "November 11 - November 12, 2025" - start: 2025-11-11 - end: 2025-11-12 - sub: ['Theory', 'ML', 'EML'] - location: - latitude: -8.055172279619814 - longitude: -34.95136218650733 - email: "ligia@cin.ufpe.br" - - title: "Annual Nepal AI School" year: 2025 id: anais25 @@ -410,7 +392,7 @@ end: 2026-01-08 sub: ['ML'] note: "Registration fees: $100-$240 USD (depends on applicant category). Application deadline: October 16, 2025." - twitter: null + twitter: email: "anais@naamii.org.np" description: "The 6th Annual Nepal AI School (ANAIS) is organized by NAAMII (Nepal Applied Mathematics and Informatics Institute for Research) in Kathmandu, Nepal. This intensive AI school provides participants with comprehensive training in artificial intelligence and machine learning concepts and applications. The program spans across the New Year period, offering an extended learning experience in the unique cultural setting of Nepal's capital city." image: "https://lh3.googleusercontent.com/sitesv/AICyYdaFTjoorHso7GpUtZqFbdL1Ao_um69TBktk_b9kTpuq8WJhZNj8HKyDvoqFw4rgyoPfEwRMJOZAbFMLcjj9Xuiie710vbA7jtDfDlDdGxb3V6HMHYUs-rp79f1YlMWAbX2jaHyopcAyDv3qzCxYdoQ0WHLS13Qr30Euk16xJ4L5gCbWeoKY5HEbWsY=w16383" @@ -419,46 +401,6 @@ longitude: 85.3240 series: "Annual Nepal AI School (ANAIS)" -- title: "Latin American School of Artificial Intelligence (LASAI)" - year: 2025 - id: lasai25 - full_name: "Latin American School of Artificial Intelligence (LASAI) 2025" - link: "https://simbig.org/lasai/2025/" - deadline: "2025-09-30 23:59:59" - timezone: "America/Lima" - place: "Lima, Peru" - date: "October 27 - October 31, 2025" - start: 2025-10-27 - end: 2025-10-31 - sub: ['ML'] - note: "Application deadline: September 30, 2025." - twitter: "https://twitter.com/SIMBigPeru" - email: "lasai2025@simbig.org" - description: "The Latin American LATAM School of Artificial Intelligence is hosted by Universidad Nacional Mayor de San Marcos (UNMSM) in Lima, Peru. This school aims to provide comprehensive training in artificial intelligence and machine learning for participants from Latin America and beyond. The program offers an intensive learning experience in one of South America's oldest and most prestigious universities, fostering AI education and research collaboration across the Latin American region." - location: - latitude: -12.0532 - longitude: -77.0853 - -- title: "Winter School on Causality and Explainable AI" - year: 2025 - id: causalxai25 - full_name: "Winter School on Causality and Explainable AI 2025" - link: "https://causality-xai-school.fr/" - deadline: "2025-10-01 23:59:59" - timezone: "Europe/Paris" - place: "Paris, France" - date: "October 20 - October 24, 2025" - start: 2025-10-20 - end: 2025-10-24 - sub: ['RAI', 'Theory'] - note: "Application deadline: October 1, 2025." - twitter: null - email: null - description: "The Winter School on Causality and Explainable AI is organized by a team from the Sorbonne Center for Artificial Intelligence, ELLIS - European Laboratory for Learning and Intelligent Systems, and other partner institutions. This specialized program focuses on the intersection of causal inference and explainable artificial intelligence, providing participants with theoretical foundations and practical applications in these critical areas of AI research. The school emphasizes understanding causal relationships in data and developing interpretable AI systems." - location: - latitude: 48.8566 - longitude: 2.3522 - - title: "MLSS Melbourne" year: 2026 id: mlssmelbourne26 @@ -480,1253 +422,6 @@ longitude: 144.9631 series: "Machine Learning Summer School (MLSS)" -- title: Summer School on Data Science, Learning and Optimization - year: 2025 - id: dataslo25 - full_name: Summer School on Data Science, Learning and Optimization (DataSLO) - link: https://www.unistrapg.it/it/studiare-in-un-ateneo-internazionale/dataslo - deadline: "2025-04-24 13:00:00" - timezone: "Europe/Rome" - place: "Norcia, Italy" - start: 2025-06-23 - end: 2025-06-27 - sub: ['ML', 'Theory'] - note: "Free registration, maximum 25 participants" - email: "progetto.fenice@unistrapg.it" - description: "The Summer School DataSLO will explore key topics related to the core methodologies that drive Data Science, Machine Learning and Computational Optimization – the three foundational pillars of modern Artificial Intelligence." - image: "https://www.unistrapg.it/sites/default/files/logo.png" - location: - latitude: 42.7889 - longitude: 13.0747 - -- title: "School on Automated Machine Learning (AutoML)" - year: 2025 - id: automl25 - full_name: "5th School on Automated Machine Learning (AutoML) 2025" - link: "https://www.automlschool.org/" - deadline: "2025-05-01 23:59:00" - timezone: "Europe/Rome" - place: "Tübingen, Germany" - date: "June 10 – 13, 2025" - start: 2025-06-10 - end: 2025-06-13 - sub: ['Theory', 'ML', 'EML'] - note: "Early bird deadline: May 1st" - email: "katharina.eggensperger@uni-tuebingen.de" - description: "AutoML has become a cornerstone in the toolkit of many developers and researchers. With the rise of foundation models, AutoML's potential has expanded even further, enabling smarter, more powerful, and scalable solutions. Although there is exponentially growing interest in the intersection of AutoML and foundation models, they are rarely taught at universities, leaving a significant gap between cutting-edge research and disseminated knowledge. This school consists of introductory, state-of-the-art, and application lectures for AutoML and Foundation Models. The AutoML School is a yearly research training event tailored for graduate and postgraduate students, research engineers, and industry practitioners who want to learn about AutoML. However, there are no formal prerequisites, and everyone is welcome." - image: "https://www.conftool.org/automl-school-2025/footer.png" - location: - latitude: 48.53899300170434 - longitude: 9.05771 - series: "AutoML School" - -- title: EuADS Summer School on Automated Data Science - year: 2025 - id: euads25 - full_name: EuADS Summer School on Automated Data Science 2025 - link: https://www.euads.org/fjkdlasjdiglsmdgkcxjhvckh/euads-summer-school-2025/ - deadline: 2025-05-20 - timezone: "Europe/Luxembourg" - place: "Luxembourg-Belair" - date: "July 8 - July 11, 2025" - start: 2025-07-08 - end: 2025-07-11 - sub: ['ML', 'DS', 'Theory'] - note: null - twitter: "https://x.com/euadsorg" - email: "contact@euads.org" - description: "The 2025 edition of the EuADS Summer School is dedicated to Automated Data Science (AutoDS) and will cover important branches of this research field in a tutorial style. With the increasing complexity of data science projects and the limited availability of human expertise, the idea of automating or partially automating the work of a data scientist has come to the fore in recent years. AutoDS aims to streamline the data science workflow, making processes such as data pre-processing, feature engineering, model selection, evaluation and deployment faster and more accessible." - image: - location: - latitude: 49.61235369861866 - longitude: 6.114854857934161 - -- title: "4th European Summer School on Quantum AI" - year: 2025 - id: eqai25 - full_name: "4th European Summer School on Quantum AI (EQAI) 2025" - link: "https://www.eqai.eu/" - deadline: "2025-08-19 23:59:00" - timezone: "Europe/Rome" - place: "Lignano Sabbiadoro, Italy" - date: "September 01 – 05, 2025" - start: 2025-09-01 - end: 2025-09-05 - sub: ['Quantum', 'ML'] - note: "Applications will be reviewed on a rolling basis." - email: "info.eqai@gmail.com" - description: "Following the success of the first three editions, this summer school aims to provide an objective and clear overview, as well as an in-depth analysis, of the state-of-the-art research in Quantum Machine Learning and Deep Learning. The courses will be delivered by world renowned experts in the field, from both academia and industry, and will cover both theoretical and practical aspects of real problems. The school aims to provide a stimulating opportunity for young researchers and Ph.D. students, but also quantum enthusiasts coming from the industry and outside of academia. The participants will benefit from direct interaction and discussions with experts in this field. Participants will also have the possibility to present the results of their research, and to interact with their scientific peers, in a friendly and constructive environment." - image: "https://eqai.eu/wp-content/uploads/2025/03/EQAI-2025-logo.png" - location: - latitude: 45.679604 - longitude: 13.122126 - series: "European Summer School on Quantum AI" - -- title: "African Computer Vision Summer School" - year: 2025 - id: acvs25 - full_name: "African Computer Vision Summer School (ACVSS) 2025" - link: "https://www.acvss.ai" - deadline: "2025-03-15 23:59:59" - timezone: "US/Hawaii" - place: "Kigali, Rwanda" - date: "July 13 - July 23, 2025" - start: 2025-07-13 - end: 2025-07-23 - sub: ['CV'] - note: null - twitter: "https://twitter.com/ACVSS_AI" - email: "acvss@googlegroups.com" - description: "The African Computer Vision Summer School (ACVSS) unites outstanding students and researchers with leading computer vision and AI experts. The curriculum emphasizes the importance of ethical considerations, geometry and math, deep learning and AI, and on seeding knowledge for multiple generations of students by coaching participants in educational leadership." - image: "https://lh5.googleusercontent.com/TnmzAOFrCRZbVKJYak2hkUB-hE-76rrigKEwGbS4__GnbqPXniEXADmX_7ZgxxfgPmH21Yme4MzyOesFhv0irv0=w16383" - location: - latitude: -1.961019644836035 - longitude: 30.113097157396247 - series: African Computer Vision Summer School (ACVSS) - -- title: "ELLIS Summer School: AI for Earth and Climate Sciences" - year: 2025 - id: jena25 - full_name: "ELLIS Summer School: AI for Earth and Climate Sciences 2025" - link: "https://www.ellis-jena.eu/summer-school-2025/" - deadline: "2025-03-31 23:59:59" - timezone: "Europe/Berlin" - place: "Jena, Germany" - date: "September 1 - September 5, 2025" - start: 2025-09-01 - end: 2025-09-05 - sub: ['ML', 'GenAI', 'ML4Science','Bio','CV'] - note: null - twitter: null - email: "conrad.philipp@uni-jena.de" - description: "The 2025 ELLIS Summer School on AI for Earth & Climate Sciences is the premier event for ELLIS PhD students, MSc students, and postdocs at the intersection of machine learning and geoscience to meet in person. During the week filled with keynotes, hands-on classes and project work the school will focus on cutting-edge research and discuss the latest advancements in the field. This interdisciplinary program will shape the future for the community of AI, Earth and Climate scientists by fostering collaboration among the next generation of interdisciplinary researchers." - image: "https://ellis.eu/uploads/ck_image/file/20/ellis_Summer_School_Jena.png" - location: - latitude: 50.927223 - longitude: 11.586111 - series: "ELLIS Winter and Summer Schools" - -- title: "Machine Learning and Advanced Statistics Summer School" - year: 2025 - id: mlas25 - full_name: "Madrid UPM Machine Learning and Advanced Statistics Summer School (MLAS) 2025" - link: "https://dia.fi.upm.es/MLAS" - deadline: "2025-05-27 23:59:59" - timezone: "Europe/Madrid" - place: "Madrid, Spain" - date: "June 16 - June 27, 2025" - start: 2025-06-16 - end: 2025-06-27 - sub: ['ML', 'GenAI', 'RL'] - note: null - twitter: null - email: "mlas@fi.upm.es" - description: "The MLAS summer school is an intensive set of courses providing an introduction to the theoretical foundations as well as the practical applications of some of the modern machine learning and statistical methods. During 2 weeks, the summer school offers 12 courses, of 15h lecture hours each. The students are free to choose the courses according to their interests." - image: "https://dia.fi.upm.es/wp-content/uploads/2024/01/logo-dia-conjunto@5x.png" - location: - latitude: 40.40535401476495 - longitude: -3.84004237805600 - series: "Machine Learning and Advanced Statistics Summer School (MLAS)" - -- title: "Advanced Course on Data Science & Machine Learning" - year: 2025 - id: acdl25 - full_name: "Advanced Course on Data Science & Machine Learning (ACDL) 2025" - link: "https://acdl2025.icas.events/" - deadline: "2025-04-23 23:59:59" - timezone: "Europe/Rome" - place: "Grosseto, Italy" - date: "June 09 - June 13, 2025" - start: 2025-06-09 - end: 2025-06-13 - sub: ['ML'] - note: null - twitter: "https://x.com/taosciences" - email: "acdl@icas.cc" - description: "The 8th Advanced Course on Data Science & Machine Learning – ACDL 2025 is a full-immersion five-day Course at the Riva del Sole Resort & SPA (Castiglione della Pescaia – Grosseto – Tuscany, Italy) on cutting-edge advances in Deep Learning, Data Science and Generative AI with lectures delivered by world-renowned experts. The Course provides a stimulating environment for PhD students, Post-Docs, junior academics (only up to assistant professors), early career researches, and industry leaders (and highly motivated, promising and brilliant Master students / BSc students). Participants will also have the chance to present their results with talks, and to interact with their colleagues, in a convivial, professional and productive environment." - image: "https://acdl2025.icas.events/wp-content/uploads/sites/30/2023/05/acdl2025-logo-web-small.png" - location: - latitude: 42.77079126926875 - longitude: 10.852376626839042 - series: Advanced Course on Data Science & Machine Learning (ACDL) - -- title: "Winter School on Emerging Technologies" - year: 2025 - id: ASUWinterSchool25 - full_name: "Twelfth Annual Winter School on Emerging Technologies Accelerating Impactful Scholarship" - link: "https://sfis.asu.edu/events/winter-school/" - deadline: "2024-10-07 23:59:00" - timezone: "MST" - place: "Mesa, AZ" - date: "Jan 03 - Jan 10, 2025" - start: 2025-01-03 - end: 2025-01-10 - sub: ['ML', 'RO'] - note: "Scholarship available" - description: "The Winter School program is run by the School for the Future of Innovation in Society at Arizona State University with support by The National Nanotechnology Coordinated Infrastructure Coordinating Office. The program gives junior scholars and scientists an introduction to and practical experience with methods and theory for better understanding the social dimensions of emerging technologies. The 2025 program will be focused on the broad notion of impact with an aim to explore ways for participants to increase and diversify the impact of their work." - image: "https://nnci.net/themes/cb_base/images/logo-black.png" - location: - latitude: 33.56174775625808 - longitude: -111.53586632923056 - -- title: "International Artificial Intelligence Summer School" - year: 2025 - id: IAISS25 - full_name: "International Artificial Intelligence Summer School (IAISS) 2025" - link: "https://2025.iaiss.cc/" - deadline: "2025-04-23 23:59:59" - timezone: "Europe/Rome" - place: "Grosseto, Italy" - date: "Sep 21 - Sep 25, 2025" - start: 2025-09-21 - end: 2025-09-25 - sub: ['ML'] - note: null - twitter: "https://x.com/taosciences" - email: "iaiss@icas.cc" - description: "The International Artificial Intelligence Summer School – IAISS 2025 is a full-immersion five-day Summer School at the Riva del Sole Resort & SPA (Castiglione della Pescaia – Grosseto – Tuscany, Italy) on cutting-edge advances in Artificial Intelligence and Generative AI with lectures delivered by world-renowned experts. The School provides a stimulating environment for PhD students, Post-Docs, Junior Academics, Early Career Researches and Junior Industry Leaders (and highly motivated, promising and brilliant Master Students). Participants will also have the chance to present their results with short talks and posters, and to interact with their colleagues, in a convivial, professional and productive environment." - image: "https://2025.iaiss.cc/wp-content/uploads/sites/29/2024/10/iaiss-logo-banner.png" - location: - latitude: 42.77079126926875 - longitude: 10.852376626839042 - -- title: "Winter School: Next Generation AI and Economic Applications" - year: 2025 - id: wsngaiea25 - full_name: "Winter School: Next Generation AI and Economic Applications" - link: "https://next-genai-xemines.com/" - deadline: "2025-01-30 12:00:00" - timezone: "Africa/Casablanca" - place: "UM6P Ben Guerir Campus, Morocco" - date: "Feb 24 - Feb 25, 2025" - start: 2025-02-24 - end: 2025-02-25 - sub: ['GenAI', 'EconAI'] - note: null - twitter: "https://x.com/UM6P_officiel" - email: "winterschooldatascience@gmail.com" - description: "Our Winter Data Science School focuses on Next Generation AI and its Economic Applications. We aim to provide deep insights into the latest techniques, foster networking, and offer practical skills. Over two days, participants will engage in expert-led sessions, including Charles-Albert Lehalle on AI in finance, and presentations by Michael Jordan and Yann LeCun, offering valuable insights into the transformation of AI products and its societal impact." - image: "https://next-genai-xemines.com/assets/visual/logo-cropped-bigger.png" - location: - latitude: 32.22509 - longitude: -7.93286 - -- title: "UM6P Winter School on Data Economics" - year: 2025 - id: wsde25 - full_name: "UM6P Winter School on Data Economics 2025" - link: "https://mcgt.um6p.ma/en/seminars-conferences/winter-days" - deadline: "2024-12-08 23:59:00" - timezone: "Africa/Casablanca" - place: "UM6P Rabat Campus, Morocco" - date: "Jan 20 - Jan 24, 2025" - start: 2025-01-20 - end: 2025-01-24 - sub: ['Theory', 'EconAI'] - note: - twitter: "https://x.com/UM6P_officiel" - email: "mcgt@um6p.ma" - description: "This one week winter school on data economics will introduce PhD students to central topic areas in the area. As data science transforms science and society, it is important to develop the economics of data. Collecting data is costly, possessing data gives market power, sharing data has risks and benefits, conclusions from data depend on data quantity and quality." - image: "https://mcgt.um6p.ma/assets/img/logo.png" - location: - latitude: 32.264254417665434 - longitude: -7.946706324442646 - -- title: "Bumblekite Machine Learning Summer School in Health, care and biosciences" - year: 2025 - id: bumblekite25 - full_name: "Bumblekite machine learning summer school in health, care and biosciences" - link: "https://www.bumblekite.co/bumblekite-25" - deadline: "2025-03-09 23:59:00" - timezone: "Europe/Berlin" - place: "Zürich, Switzerland" - date: "June 22 - June 28, 2025" - start: 2025-06-22 - end: 2025-06-28 - sub: ['ML', 'Health', 'Bio'] - note: null - twitter: null - email: "bumblekite-team@four-corp.com" - description: "Bumblekite summer school is FOUR’s annual machine learning summer school (MLSS) in health, care and biosciences. Our Bumblekite MLSS creates and nurtures a learning space for evolving your data science and engineering skills and domain-specific knowledge, as well as skills in writing, coaching, leadership and strategy development — equally important communication skills. We strongly believe the combination of all of the above is key to unlocking the positive, deeply impactful contributions you will lead in our field and beyond." - image: "https://images.squarespace-cdn.com/content/v1/5e176b36a659cc3920d4038c/1598711702923-U9G274MDT9BPOXBH2Q2L/Bumblekite_logomark_.png?format=500w" - location: - latitude: 47.376821212238646 - longitude: 8.547440346312348 - series: Bumblekite Machine Learning Summer School in Health - -- title: "Summer School in Responsible AI and Human Rights" - year: 2025 - id: ssraihr25 - full_name: "Summer School in Responsible AI and Human Rights 2025" - link: "https://mila.quebec/en/ai4humanity/learning/summer-school-in-responsible-ai-and-human-rights" - deadline: "2025-01-06 23:59:00" - timezone: "America/Toronto" - place: "Montreal, Canada" - date: "May 26 - May 30, 2025" - start: 2025-05-26 - end: 2025-05-30 - sub: ['RAI'] - note: null - twitter: "https://x.com/Mila_Quebec" - email: "info@mila.quebec" - description: "The summer school, a joint initiative by Mila and the Université de Montréal brings together participants from different backgrounds and horizons to explore the intersections between responsible artificial intelligence (AI) and human rights." - image: "https://mila.quebec/sites/default/files/styles/focal_crop_2500_757/public/blocks/imagefullwidth/1289/2024capsuleraihrsseng.jpg.webp?itok=oiuqQ0Rn" - location: - latitude: 45.53086 - longitude: -73.61325 - -- title: "European Summer School on Artificial Intelligence" - year: 2025 - id: essai25 - full_name: "3rd European Summer School on Artificial Intelligence" - link: "https://essai2025.eu/" - deadline: "2025-06-01 23:59:00" - timezone: "Europe/Bratislava" - place: "Bratislava, Slovakia" - date: "June 30 - July 4, 2025" - start: 2025-06-30 - end: 2025-07-04 - sub: ['ML', 'RO', 'AP', 'DM'] - note: null - email: "peter.drotar@tuke.sk" - description: "European Summer School on Artificial Intelligence (ESSAI) intends to serve as a central hub for PhD students and young researchers working in all aspects of AI. The ESSAI Summer School covers one week of courses in the summer, at different sites around Europe, for both beginning and advanced students, and junior and senior researchers. ESSAI provides introductory and advanced courses in all areas of AI, emphasizing topics that allow students to gain a broad view of AI and understand connections between subdisciplines. ESSAI also offers several social activities for students and researchers alike. One of the tracks of ESSAI consists of advanced tutorials on a specific subject and corresponds to the traditional ACAI school organized by EurAI since 1989." - image: "https://essai2025.eu/wp-content/uploads/ESSAI_2025_logo_corrected_v01.png" - location: - latitude: 48.148598 - longitude: 17.107748 - series: European Summer School on Artificial Intelligence (ESSAI) - -- title: "ELLIS Winter School on Foundation Models" - year: 2025 - id: fomo25 - full_name: "2nd ELLIS Winter School on Foundation Models (FoMo)" - link: "https://ivi.fnwi.uva.nl/ellis/events/2025-ellis-winter-school-on-foundation-models-fomo" - deadline: "2025-02-07 23:59:00" - timezone: "Europe/Amsterdam" - place: "Amsterdam, Netherlands" - date: "March 18 - March 21, 2025" - start: 2025-03-18 - end: 2025-03-21 - sub: ['ML'] - note: null - twitter: "https://x.com/ellis_amsterdam" - email: "ellisinfo-science@uva.nl" - description: "The FoMo presents a valuable opportunity to explore the intricacies of foundation models and to highlight how Europe is establishing its own path beyond the widely-known Big Tech narrative. Notable insights and innovative approaches are emerging from Europe in both academia and industry. Thus, one of the main objectives of this winter school is to highlight these perspectives and provide a thorough understanding of how Europe is shaping its research agenda with unique directions while fostering community collaboration. Participants can expect a diverse lineup of speakers, including Tim Rocktäschel (UCL and Google Deepmind), Amir Zamir (EPFL), and Fahad Khan (MBZUAI, Linköping University Sweden)– more to be announced soon, and the opportunity to engage with like-minded individuals." - image: "https://ivi.fnwi.uva.nl/ellis/wp-content/uploads/2024/12/Fomo-25-2-1536x864.png" - location: - latitude: 52.383207972959795 - longitude: 4.903048457672083 - series: ELLIS Winter School on Foundation Models (FoMo) - -- title: "Gatsby Bridging Programme" - year: 2025 - id: gatsbybp25 - full_name: "Gatsby Bridging Programme (Maths Summer School)" - link: "https://www.ucl.ac.uk/gatsby/study-and-work/gatsby-bridging-programme" - deadline: "2025-02-07 23:59:00" - timezone: "GMT" - place: "London, UK" - date: "June 23 - Aug 8, 2025" - start: 2025-06-23 - end: 2025-08-08 - sub: ['Theory', 'Neuro'] - note: null - twitter: "https://x.com/GatsbyUCL" - email: "admissions@gatsby.ucl.ac.uk" - description: "The Gatsby Bridging Programme is a mathematics summer school for penultimate- or final-year undergraduates and Master’s students (incl. recent graduates) who aspire to pursue a postgraduate research degree in Theoretical Neuroscience and/or Machine Learning but whose predoctoral degree(s) does not have a strong mathematical focus. During the programme, you will develop the mathematical intuitions and learn the mathematics skills necessary to enter these fields." - image: "https://www.ucl.ac.uk/gatsby/sites/gatsby/files/styles/small_image/public/gatsby_partners.png?itok=zIODn6fm" - location: - latitude: 51.521277368652434 - longitude: -0.13837474697884816 - series: Gatsby Bridging Programme - -- title: "Reasoning Web Summer School" - year: 2025 - id: rw25 - full_name: "21st Reasoning Web (RW) Summer School" - link: "https://2025.declarativeai.net/events/reasoning-web" - deadline: "2025-06-09 23:59:00" - timezone: "Asia/Istanbul" - place: "Istanbul, Türkiye" - date: "Sep 25 - Sep 28, 2025" - start: 2025-09-25 - end: 2025-09-28 - sub: ['KR', 'Log'] - note: null - email: "meghyn.bienvenu@labri.fr" - description: "The purpose of the Reasoning Web (RW) Summer School is to disseminate recent advances in reasoning techniques and other developments relevant to Semantic Web and Linked Data applications. The summer school is intended for individuals who are currently pursuing or have already completed postgraduate degrees (PhD or MSc). It is also open to researchers at all levels interested in deepening their knowledge in the respective area." - image: "https://lh4.googleusercontent.com/ahD7QVgIKnRDt5hOqxtj13xgGUcCBWATob3vm0YvK5BiyiRSG2XmRlyw4rUvc8LS14MzJBnJE7X9eeW_VLZyoU8xQoCt7quxCRuu0pwrK4VxEkhX" - location: - latitude: 41.0075881131308 - longitude: 28.9652750001439 - series: Reasoning Web (RW) Summer School - -- title: "Summer School on Multimodal Foundation Models and Generative AI" - year: 2025 - id: aiss25 - full_name: "Summer School on Multimodal Foundation Models and Generative AI" - link: "https://ai-summer-school.inpt.ac.ma/" - deadline: "2025-07-13" - timezone: "Africa/Casablanca" - place: "Rabat, Morocco" - date: "September 8 - September 12, 2025" - start: 2025-09-08 - end: 2025-09-12 - sub: ['ML', 'NLP', 'CV', 'GenAI'] - note: "Applications open June 23, 2025; acceptance notifications sent July 25, 2025." - email: "team@morocco.ai" - description: - "The AI Summer School is an immersive five-day program jointly organized by - MoroccoAI, Institut National Des Postes et Télécommunications (INPT), IMT Nord - Europe, and Soft Centre, supported by ACM SIGMM. - - The 2025 edition focuses on Multimodal Foundation Models and Generative AI, - providing participants with lectures from world-renowned experts, hands-on labs, - project mentorship, and networking opportunities. It is designed for Master’s and - PhD students, postdocs, researchers, and industry professionals with intermediate - knowledge of machine learning and Python programming. - - Key features: - - 20+ expert sessions and 15+ hands-on labs - - Networking with 50+ participants and AI leaders - - Coverage of cutting-edge topics: generative AI, LLMs, multimodal foundation models - - Visits to Morocco’s technology ecosystem (e.g., Casablanca Technopark) - - Full access to lectures, meals, and accommodations included in registration" - image: "https://morocco.ai/wp-content/uploads/2020/03/MoroccoAI_Logo.png" - location: - latitude: 34.020882 - longitude: -6.841650 - series: "MoroccoAI Summer School" - - -- title: "AI and Games Summer School" - year: 2025 - id: agss25 - full_name: "7th International Summer School on Artificial Intelligence and Games" - link: "https://school.gameaibook.org/" - deadline: "2025-06-09 23:59:00" - timezone: "Europe/Stockholm" - place: "Malmö, Sweden" - date: "June 23- June 27, 2025" - start: 2025-06-23 - end: 2025-06-27 - sub: ['ML', 'AI4Games'] - note: null - email: "school@gameaibook.org" - twitter: "https://x.com/GameAISchool" - description: "The summer school is dedicated to the uses of artificial intelligence (AI) techniques in and for games. After introductory lectures that explain the background and key techniques in AI and games, the school will introduce participants the uses of AI for playing games, for generating content for games, and for modeling players. This school is suitable for industrial game developers, designers, programmers and practitioners, but also for graduate students in games, artificial intelligence, design, human-computer interaction, and computational intelligence." - image: "https://school.gameaibook.org/wp-content/uploads/2024/09/logo-malmo-2.png" - location: - latitude: 55.607698037142704 - longitude: 12.98575008491183 - series: AI and Games Summer School - -- title: "MLSS Kraków: Drug and Materials Discovery" - year: 2025 - id: krakow2025 - full_name: "MLSS Kraków 2025: Drug and Materials Discovery" - link: "https://mlss2025.mlinpl.org/" - deadline: "2025-04-19 23:59:59" - timezone: "US/Alaska" - place: "Kraków, Poland" - date: "July 1-6, 2025" - start: 2025-07-01 - end: 2025-07-06 - sub: ['GenAI', 'Bio', 'ML4Science', 'Health'] - note: null - email: "mlss@mlinpl.org" - twitter: "https://x.com/mlinpl" - image: "https://mlss2025.mlinpl.org/images/institutions-logos/logo-mlinpl.svg" - description: "MLSS Kraków 2025 is a summer school providing a didactic introduction to a range of modern topics in Machine Learning and their applications for Drug and Materials Discovery, primarily intended for research-oriented graduate students. The school features a line-up of internationally recognized researchers who will talk with enthusiasm about their subjects. Our goal is to provide a unique opportunity to learn from and connect with the leading experts in the scenic setting of the historic city of Kraków, Poland. This school is the next edtion of MLSS^S 2023 and MLSS^N 2022." - location: - latitude: 50.0301961 - longitude: 19.906168 - series: MLSS Kraków - -- title: Nordic Probabilistic AI School - year: 2025 - id: npas2025 - full_name: Nordic Probabilistic AI School 2025 - link: https://nordic.probabilistic.ai/ - deadline: '2025-03-09 23:59:59' - timezone: Europe/Oslo - place: Trondheim, Norway - date: June 16 - June 20, 2025 - start: 2025-06-16 - end: 2025-06-20 - sub: ['Theory', 'GenAI', 'ML'] - note: null - twitter: https://twitter.com/probabilisticai/ - email: hello@probabilistic.ai - description: "The ProbAI is here to provide an inclusive education environment serving state-of-the-art expertise in machine learning and artificial intelligence with a probabilistic twist. With a carefully designed curriculum and a seamless blend of theory and hands-on sessions, our expert team of invited lecturers will guide you through five intensive days each dedicated to a different topic: introduction to probabilistic modeling, variational inference and optimization, conformal predictions, deep generative models, geometric probabilistic models, and probabilistic circuits." - location: - latitude: 63.42340 - longitude: 10.40071 - series: Probabilistic AI School (ProbAI) - -- title: "Machine Learning Summer School Senegal" - year: 2025 - id: mlss-senegal25 - full_name: "Machine Learning Summer School (MLSS) Senegal" - link: "https://mlss-senegal.github.io/" - deadline: "2025-02-28 23:59:00" - timezone: "Africa/Dakar" - place: "Mbour, Senegal" - date: "June 23 - July 4, 2025" - start: 2025-06-23 - end: 2025-07-04 - sub: ['ML'] - note: "Application fee of $450 due by April 23, 2025" - email: "mlss.senegal2025@gmail.com" - twitter: null - description: "Located along the scenic Atlantic coast of Senegal, AIMS Mbour hosts this summer school for PhD students, post-docs, and advanced learners in mathematical sciences. The venue is conveniently situated approximately 1.5 hours from Dakar city center and 30 kilometers from Blaise Diagne International Airport. Applicants must submit a one-page self-recommendation letter explaining how the summer school will benefit them, along with a one-page CV summarizing their contributions in machine learning. Applications are accepted from December 15 to February 28, with acceptance notifications sent by March 31." - image: "https://aims-senegal.org/wp-content/uploads/sites/2/2020/10/aims_senegal.jpg" - location: - latitude: 14.4225 - longitude: -16.9736 - series: Machine Learning Summer School (MLSS) - -- title: "Machine Learning Summer School Arequipa" - year: 2025 - id: mlss-arequipa25 - full_name: "Machine Learning Summer School (MLSS) Arequipa" - link: "https://eventosdiee.ucsp.edu.pe/mlss/" - deadline: "2025-03-20 23:59:00" - timezone: "America/Lima" - place: "Arequipa, Peru" - date: "August 2 - August 13, 2025" - start: 2025-08-02 - end: 2025-08-13 - sub: ['ML'] - note: "Applicants need one referee." - email: "electronica@ucsp.edu.pe" - twitter: null - description: "MLSS Arequipa 2025 is open to a select group of 100 highly motivated participants. Our primary target audience consists of MSc and PhD students with a solid technical foundation in research areas related to machine learning. However, a limited number of industry professionals, professors, researchers, and exceptional undergraduate students may also be considered, based on availability. Industrial applicants are encouraged to apply, thanks to sponsorship opportunities from their respective organizations. All participants should possess programming skills in Python, a strong interest in machine learning, and a solid understanding of linear algebra, basic calculus, probability, and statistics." - image: "https://eventosdiee.ucsp.edu.pe/mlss/wp-content/uploads/2024/02/logo-mlss.png" - location: - latitude: -16.389859050098813 - longitude: -71.53543171349251 - series: Machine Learning Summer School (MLSS) - -- title: "Princeton Machine Learning Theory Summer School" - year: 2025 - id: pmltss2025 - full_name: "Princeton Machine Learning Theory Summer School 2025" - link: "https://mlschool.princeton.edu/" - deadline: "2025-03-31 23:59:59" - timezone: "America/New_York" - place: "Princeton, USA" - date: "August 12 - August 21, 2025" - start: 2025-08-12 - end: 2025-08-21 - sub: ['ML', 'Theory'] - note: "Applications require a CV, letter of recommendation, and statement of purpose" - twitter: null - email: "pmlss@princeton.edu" - description: "The Princeton Machine Learning Theory Summer School is aimed at PhD students interested in machine learning theory. The school will run in person and focuses on showcasing exciting recent developments in the subject through four main courses. The primary focus this year is on theoretical advances in deep learning. The program aims to connect young researchers and foster community within theoretical machine learning." - image: "https://mlschool.princeton.edu/sites/g/files/toruqf5946/files/styles/freeform_750w/public/2023-06/pu_logo_3.png?itok=6OYKyOo7" - location: - latitude: 40.34590714001614 - longitude: -74.65576054459738 - series: "Princeton Machine Learning Theory Summer School" - -- title: "IAIFI Summer School" - year: 2025 - id: iaifi2025 - full_name: "Institute for Artificial Intelligence and Fundamental Interactions (IAIFI) Summer School 2025" - link: "https://iaifi.org/phd-summer-school" - deadline: "2025-02-07 23:59:59" - timezone: "America/New_York" - place: "Cambridge, USA" - date: "August 4 - August 8, 2025" - start: 2025-08-04 - end: 2025-08-08 - sub: ['Theory', 'ML4Science'] - note: "No registration fee. Dorm accommodation costs will be reimbursed for up to 5 nights. Attendees must cover travel costs." - twitter: https://twitter.com/iaifi_news - email: iaifi@mit.edu - description: "The IAIFI Summer School combines AI and Physics for early career researchers, particularly PhD students, advanced undergraduates, and postdocs. The program features lectures and tutorials on Reinforcement Learning, Robust/Interpretable AI, Scaling Laws, Physics-Motivated Optimization, Simulation Intelligence, and Representation/Manifold Learning. The event includes a full-day hackathon, networking events, and a career panel. Admission decisions will be announced by February 17, 2025." - image: "https://iaifi.org/images/iaifi-pressimage-horizontalcrop-smaller.jpg" - location: - latitude: 42.3770 - longitude: -71.1167 - -- title: "International Semantic Web Research Summer School" - year: 2025 - id: isws25 - full_name: "International Semantic Web Research Summer School (ISWS) 2025" - link: "https://2025.semanticwebschool.org/" - deadline: "2025-03-15 23:59:59" - timezone: "Europe/Rome" - place: "Bertinoro, Italy" - date: "June 8 - June 14, 2025" - start: 2025-06-08 - end: 2025-06-14 - sub: ['KR', 'ML'] - note: "Acceptance notification: April 1st, 2025" - email: "isws.application@gmail.com" - description: "ISWS is a full immersion, super intensive one-week experience focusing on knowledge graphs for reliable AI. The program includes lectures and keynotes from outstanding speakers, and a 'learning by doing' teamwork program on open research problems. Participants work under the guidance of leading scientists in the field to co-author a white paper of high potential impact." - location: - latitude: 44.1487 - longitude: 12.1323 - series: "International Semantic Web Research Summer School (ISWS)" - -- title: "Theoretical Foundations of Machine Learning Course" - year: 2025 - id: tfml2025 - full_name: "Theoretical Foundations of Machine Learning (TFML) Course 2025" - link: "https://malga.unige.it/education/schools/tfml/" - deadline: "2025-03-30 23:59:59" - timezone: "Europe/Rome" - place: "Genova, Italy" - date: "June 23 - June 27, 2025" - start: 2025-06-23 - end: 2025-06-27 - sub: ['ML', 'Theory'] - note: "Acceptance notification: April 11th, 2025" - twitter: "https://twitter.com/malga_center" - email: "malga@unige.it" - description: "The course covers key algorithmic principles in machine learning and their theoretical foundations. Topics include statistical learning theory, linear and nonlinear models (kernel methods and neural networks), empirical risk minimization, regularization, functional analysis with focus on reproducing kernel Hilbert spaces, convex analysis, optimization methods (gradient, stochastic gradient, splitting methods, back-propagation), and statistical analysis using concentration of measure, empirical process theory, spectral calculus and operator theory. The program includes two tutorials by invited speakers." - image: "https://lcsl.unige.it/img/malga.png" - location: - latitude: 44.40499 - longitude: 8.97224 - series: "MaLGa Summer Schools" - -- title: "A Journey through Deep Learning Summer School" - year: 2025 - id: jdl2025 - full_name: "A Journey through Deep Learning (JDL) Summer School 2025" - link: "https://malga.unige.it/education/schools/jdl/" - deadline: "2025-03-30 23:59:59" - timezone: "Europe/Rome" - place: "Genova, Italy" - date: "June 16 - June 20, 2025" - start: 2025-06-16 - end: 2025-06-20 - sub: ['ML'] - note: "Acceptance notification: March 30th, 2025. In-person only, no online streaming. No travel scholarships available." - twitter: "https://twitter.com/malga_center" - email: "malga@unige.it" - description: "A Journey through Deep Learning is an intensive 40-hour PhD-level school offering a comprehensive exploration of Deep Learning principles and applications. Organized by the MaLGa Center, this program combines methodological aspects with practical insights into modern frameworks and architectures. The school is open to students, postdocs, faculty members and professionals, upon selection. Attendees will receive an attendance certificate reporting their actual hours of attendance." - image: "https://lcsl.unige.it/img/malga.png" - location: - latitude: 44.40498328188538 - longitude: 8.972239169310429 - series: "MaLGa Summer Schools" - -- title: "School on Analytical Connectionism" - year: 2025 - id: ac25 - full_name: "2025 School on Analytical Connectionism" - link: "https://www.analytical-connectionism.net/school/2025/" - deadline: "2025-04-18 23:59:00" - timezone: "Etc/GMT-12" - place: "London, UK" - date: "August 25 - September 5, 2025" - start: 2025-08-25 - end: 2025-09-05 - sub: ['Theory', 'CogSci'] - note: "Acceptance notification: May 25th, 2025. In-person only; no streaming. Travel scholarships available for 25% of participants." - twitter: "https://x.com/GatsbyUCL" - email: "admissions@gatsby.ucl.ac.uk" - image: "https://www.analytical-connectionism.net/assets/images/sponsors/gatsby-unit.png" - description: "Analytical Connectionism is a 2-week summer course on analytical tools, including methods from statistical physics and probability theory, for probing neural networks and higher-level cognition. The course brings together neuroscience, psychology and machine-learning communities, and introduces attendees to analytical methods for neural-network analysis and connectionist theories of higher-level cognition and psychology." - location: - latitude: 51.52118724608978 - longitude: -0.13832110294736547 - -- title: "LOGML Summer School" - year: 2025 - id: logml25 - full_name: "London Geometry and Machine Learning Summer School 2025" - link: "https://www.logml.ai/" - deadline: "2025-04-06 23:59:59" - timezone: "Etc/GMT-12" - place: "London, United Kingdom" - date: "July 7 - July 11, 2025" - start: 2025-07-07 - end: 2025-07-11 - sub: ['ML', 'Theory'] - twitter: https://twitter.com/LogmlSchool - email: "logml.committee@gmail.com." - description: "LOGML (London Geometry and Machine Learning) aims to bring together mathematicians and computer scientists to collaborate on a variety of problems at the intersection of geometry and machine learning. There will be a selection of group projects, each overseen by an experienced mentor, talks by leading figures in the field, a variety of social events and a company networking night." - image: "https://www.logml.ai/img/logo.png" - location: - latitude: 51.499173065086225 - longitude: -0.17902143167248896 - series: "London Geometry and Machine Learning Summer School (LOGML)" - -- title: "Cooperative AI Summer School" - year: 2025 - id: cass25 - full_name: "Cooperative AI Summer School 2025" - link: "https://www.cooperativeai.com/summer-school/summer-school-2025" - deadline: "2025-03-07 23:59:59" - timezone: "Europe/London" - place: "Marlow, UK" - date: "July 9 - July 13, 2025" - start: 2025-07-09 - end: 2025-07-13 - sub: ['ML', 'GenAI', 'EconAI'] - note: "Cost: Free / £250 / £500; Notification: April 2, 2025" - twitter: "https://twitter.com/coop_ai" - email: null - image: "https://cdn.prod.website-files.com/61fe446e584616a902bcb4f0/61ffa82ead518da3b2f75765_CoopAI_Primary_Black_Web_Small.png" - description: "The Cooperative AI Summer School is designed to provide students and early-career professionals in AI, computer science and related disciplines, such as sociology and economics, with a firm grounding in the emerging field of cooperative AI." - location: - latitude: 51.5707 - longitude: -0.7747 - -- title: "Summer School on Automatic Speech Recognition" - year: 2025 - id: s4p25 - full_name: "Summer School on Speech Signal Processing (S4P) 2025: Automatic Speech Recognition" - link: https://sites.google.com/view/s4p2025/ - deadline: "2025-07-09 23:59:59" - timezone: "Asia/Kolkata" - place: "Gandhinagar, India" - date: "July 5 - July 9, 2025" - start: 2025-07-05 - end: 2025-07-09 - sub: ['SP', 'ML', 'NLP'] - note: "Early bird registration deadline: March 31, 2025. Student Travel Grants available, including DAU Student Grants for 50 students (first come, first served)." - twitter: null - email: "s4p.daiict@gmail.com" - image: "https://lh3.googleusercontent.com/l4bEPKJurzYNUVZzo9r2VdiGmq03BxfWmFoc5NNPHOEtu8b2DDWFzYWMRn5rthINcCcT4Nnnb_Z2yS8OqxDL1UM=w16383" - description: "Summer School on Speech Signal Processing (S4P) is being organized as a part of summer school activities at Speech Research Lab, DAU, Gandhinagar. It will provide opportunities for students, researchers, and professionals to enhance their fundamentals and get exposed to cutting edge research areas in the field of speech signal processing. The school focuses on Automatic Speech Recognition (ASR), which deals with recognizing the linguistic context from speech or converting speech into text with the help of machines. ASR is a key component of commercially successful Intelligent Personal Assistants (IPAs) and Voice Assistants." - location: - latitude: 23.1926 - longitude: 72.6350 - -- title: "Montreal Robotics Summer School" - year: 2025 - id: mrss25 - full_name: "Montreal Robotics Summer School (MRSS) 2025" - link: https://fracturedplane.notion.site/Montreal-Robotics-Summer-School-2025-195214857276801f9737eaf741c533a7 - deadline: "2025-02-28 23:59:59" - timezone: "America/Montreal" - place: "Montreal, Canada" - date: "August 10 - August 15, 2025" - start: 2025-08-10 - end: 2025-08-15 - sub: ['RO', 'ML'] - note: "Free. Food, travel and lodging is covered. Limited to 25 participants." - twitter: "https://x.com/Mila_Quebec" - email: robotics-school@mila.quebec - image: "https://mila.quebec/sites/default/files/media-library/image/4032/milalogowebcoulrgb.png" - description: "This summer school offers tutorials and lectures on state-of-the-art machine learning methods for training the next generation of learning robots. The summer school is an extension supported by the many robotics groups around Montreal. Attendees will have the opportunity to learn about current deep reinforcement learning methods, how to apply them to real hardware, sim2real transfer techniques, and experience with legged robotics. This year's version will feature humanoid robots. On the last day of the summer school, teams will use their new skills to compete in designing the best vision-based navigation controller on a quadruped robot to navigate an obstacle course." - location: - latitude: 45.5287 - longitude: -73.6110 - series: "Montreal Robotics Summer School (MRSS)" - -- title: "AI4Science Summer School" - year: 2025 - id: ai4s25 - full_name: "AI4Science Summer School 2025 in Caen" - link: "https://ai4science.sciencesconf.org/" - deadline: "2025-04-20 23:59:59" - timezone: "Europe/Paris" - place: "Caen, France" - date: "June 29 - July 4, 2025" - start: 2025-06-29 - end: 2025-07-04 - sub: ['ML', 'ML4Science'] - note: "Registration fee: 100€ (including social events). Free for participants from Normandy Universities. CV required." - twitter: null - email: "cai4science@sciencesconf.org" - image: "https://ai4science.sciencesconf.org/data/pages/AFFICHE_SumSchool_IA_2025_v5_.png" - description: "The 2nd Summer School on Advancing Scientific Discovery with AI is designed to explore the intersection of artificial intelligence and scientific research. The program covers machine learning for scientific data analysis, AI-driven experimental design, generative models in scientific applications, and the integration of AI with physical simulations. This technical and scientific programme focuses on deep learning and is primarily aimed at researchers familiar with mathematical modeling, numerical computation and Python programming. A significant part consists of hands-on sessions where participants will use Python libraries to manipulate data and implement models." - location: - latitude: 49.1950 - longitude: -0.3588 - -- title: "Brains, Minds & Machines Summer Course" - year: 2025 - id: bmm25 - full_name: "Brains, Minds & Machines Summer Course 2025" - link: https://cbmm.mit.edu/summer-school/2025 - deadline: "2025-03-24 23:59:59" - timezone: "America/New_York" - place: "Woods Hole, MA, USA" - date: "August 3 - August 24, 2025" - start: 2025-08-03 - end: 2025-08-24 - sub: ['ML', 'Neuro', 'CogSci'] - note: null - twitter: https://twitter.com/MIT_CBMM - email: null - image: "https://cbmm.mit.edu/sites/default/files/images/CBMM-logo-screen-RGB-colour-optimized.svg" - description: "An intensive three-week course giving advanced students a 'deep end' introduction to the problem of intelligence – how the brain produces intelligent behavior and how we may be able to replicate intelligence in machines. The course covers topics including neurons and models, computational vision, biological vision, machine learning, Bayesian inference, planning and motor control, memory, social cognition, inverse problems, audition and speech processing, and natural language processing. The program includes MathCamps and NeuroCamps, hands-on workshops, tutorials, and culminates with student projects. Appropriate for graduate students, postdocs, and faculty in computer science or neuroscience." - location: - latitude: 41.5257 - longitude: -70.6699 - series: "Brains, Minds & Machines Summer Course" - -- title: "Mediterranean Machine Learning (M2L) Summer School" - year: 2025 - id: m2l25 - full_name: "Mediterranean Machine Learning (M2L) Summer School 2025" - link: "https://www.m2lschool.org/" - deadline: "2025-03-28 23:59:59" - timezone: "Etc/UTC" - place: "Split, Croatia" - date: "September 8 - September 12, 2025" - start: 2025-09-08 - end: 2025-09-12 - sub: ['ML', 'NLP', 'CV', 'GenAI', 'RL'] - note: "Applications open February 25, 2025. Notification of acceptance in early May 2025." - twitter: "https://x.com/M2lSchool" - email: "organizers@m2lschool.org" - image: "https://lh6.googleusercontent.com/zSMSt8r_-NUb433Ig_19MTW1U9MIpcT-sHwLILOqtotJu0LYoE6TsanidmPn14yUoFgIolXuJMRTHprg4KBy9oE=w16383" - description: "The 5th edition of the Mediterranean Machine Learning (M2L) summer school will be structured around 5 days of keynotes, lectures and intensive hands-on sessions on the most recent and fast developing core areas of Machine Learning. The intended audience is primarily Doctoral candidates and exceptional Master's and Bachelor's students, academics, professionals, and practitioners worldwide. The school will focus on Natural Language Processing, Ethics and fairness, Computer Vision, Generative Models, Reinforcement Learning and real world applications of Deep Learning. The program includes optional poster sessions and social activities to foster networking." - location: - latitude: 43.5081 - longitude: 16.4402 - series: "Mediterranean Machine Learning (M2L) Summer School" - -- title: "MenaML Winter School" - year: 2025 - id: menaML25 - full_name: "2025 Middle East and North Africa Machine Learning (MenaML) Winter School" - link: "https://www.mena.ml/" - deadline: "2024-11-01 23:59:00" - timezone: "Asia/Qatar" - place: "Doha, Qatar" - date: "9-14 February, 2025" - start: 2025-02-09 - end: 2025-02-14 - sub: ['ML', 'NLP', 'CV', 'GenAI', 'Neuro', 'RL', 'ML4Science'] - note: "Applications open Oct 3, 2024, and close Nov 1, 2024. A limited number of scholarships is available." - email: "contact@mena.ml" - description: "The 2025 Middle East and North Africa Machine Learning (MenaML) Winter School is a premier event designed to equip the next generation of AI leaders. - This six-day intensive program, hosted in the vibrant city of Doha, Qatar, offers a unique blend of keynotes, lectures, and hands-on practical sessions. - Lectures and lab sessions will be taught by local and international AI experts from leading institutes such as Google DeepMind, Qatar Computing Research Institute (QCRI), HBKU, and others. - State-of-the-art content and code will be accessible to all school participants. - The 2025 MenaML Winter School is designed for Bachelor, Master, and Doctoral students. - It welcomes applications from all around the world, with a focus on the MENA region. - Ideal participants have a strong technical background and some experience in machine learning." - image: "https://lh6.googleusercontent.com/OrVqEQesnEbamERIZ15pfdcT7r7Y87zjha7DLmCK248dbBkxGRzFj-HpGcgm4Y4-pYM4Rce3AYZyQ8WBGqGa0PKtQDq-OWnEV8XambKlVWn4C2ZnpVToRvZdj1bV6u2pFwXxYPn48jVcc-IhgKRjgzAHmQSi2q1fpb8FwdcnOr7M_93PWXa09oXQolCDMbUWADHkYE3RewJxAbphqFN7=w1280" - location: - latitude: 25.31692 - longitude: 51.44722 - - -- title: "Summer School on Cryptography, Statistics and Machine Learning" - year: 2025 - id: ysumss25 - full_name: "Summer School on Cryptography, Statistics and Machine Learning 2025" - link: "http://mathschool.ysu.am/mss2025/" - deadline: "2025-06-01 23:59:59" - timezone: "Asia/Yerevan" - place: "Tsaghkadzor, Armenia" - date: "June 29 - July 06, 2025" - start: 2025-06-29 - end: 2025-07-06 - sub: ['ML', 'Theory'] - note: "Participation fee: 450 EUR (academia), 600 EUR (industry), 250 EUR (Armenian students). Scholarships available." - twitter: null - email: "mathschool@ysu.am" - image: "https://www.ysu.am/themes/custom/ysu_main/images/logo-english.svg" - description: "The Faculty of Mathematics and Mechanics of the Yerevan State University is organizing a Summer School on Cryptography, Statistics and Machine Learning. The target audience includes university undergraduate seniors, Master and PhD students and researchers, as well as industry professionals interested in Cryptography, Probability, Statistics, Machine Learning and applications. All lectures will be delivered in English. The participation fee covers registration, accommodation, and full board. Limited spots available; selection process applies for registered participants." - location: - latitude: 40.180284 - longitude: 44.52613 - -- title: "Mathematics and Physics of Quantum Computing and Quantum Learning" - year: 2025 - id: mpqcql25 - full_name: "Summer School on Mathematics and Physics of Quantum Computing and Quantum Learning (MPQCQL) 2025" - link: "https://mpqcql2025.sciencesconf.org" - deadline: "2025-04-30 23:59:59" - timezone: "Europe/Paris" - place: "Porquerolles, France" - date: "May 23 - May 28, 2025" - start: 2025-05-23 - end: 2025-05-28 - sub: ['Quantum', 'ML', 'Theory'] - note: "Participation fee: 450 EUR (students, postdocs), 600 EUR (faculty, industry). Limited places available." - twitter: null - email: "mpqcql2025@sciencesconf.org" - description: "This summer school aims at gathering mathematicians, computer scientists, and physicists interested in quantum learning and quantum computation. Several introductory lectures will be given by leading researchers in the field including Pablo Arrighi (Université Paris-Saclay and Inria), Matthias Caro (University of Warwick), Guillaume Rabusseau (Université de Montréal / MILA), Muhammad Hamza Waseem (Oxford University), and Mirjam Weilenmann (IQOQI Vienna and Inria). Topics covered include quantum computing and information, quantum learning theory, tensor networks, quantum states of neural networks, and quantum cellular automata. The lectures will be complemented by additional research talks. Poster sessions for PhD students and post-doctoral researchers will be organized during the school." - image: "https://mpqcql2025.sciencesconf.org/data/pages/logos_4.png" - location: - latitude: 43.0008 - longitude: 6.20491 - -- title: "Cambridge Ellis Unit Summer School on Probabilistic Machine Learning" - year: 2025 - id: ellis-cambridge25 - full_name: "Cambridge Ellis Unit Summer School on Probabilistic Machine Learning 2025" - link: "https://www.ellis.eng.cam.ac.uk/summer-school/" - deadline: "2025-05-10 23:59:59" - timezone: "Europe/London" - place: "Cambridge, UK" - date: "July 14 - July 18, 2025" - start: 2025-07-14 - end: 2025-07-18 - sub: ['ML', 'GenAI', 'Theory', 'RL', 'CV'] - note: "Student participation fee: £500 (if traveling by air), £0 otherwise. Travel awards available for attendees from under-represented backgrounds." - twitter: "https://twitter.com/CambridgeEllis" - email: "ellis-admin@eng.cam.ac.uk" - description: "The Cambridge Ellis Unit Summer School on Probabilistic Machine Learning is a distinguished course offered to graduate students, researchers and professionals, featuring engaging experts and world-recognized professionals speaking about advanced machine learning concepts. Topics include Statistical Emulation, Uncertainty Quantification, Evaluation of Probabilistic Models, Reinforcement Learning, Diffusion Models, Normalising Flows, Deep Generative Models, Variational Inference and Stein Discrepancy, Probabilistic Models in Computer Vision and Graphics, and Machine Learning and the Physical World. Applicants must submit a 2-page CV and letter of reference. The event will be held at Pembroke College with lunch and refreshments provided." - location: - latitude: 52.20185888225664 - longitude: 0.11833142598481534 - image: "https://www.ellis.eng.cam.ac.uk/wp-content/uploads/2023/09/cropped-ellis-logo_horizontal_black_2023-cambridge.png" - series: "ELLIS Winter and Summer Schools" - -- title: "EDBT Summer School on AI & Data Management" - year: 2025 - id: edbt25 - full_name: "EDBT 2025 Summer School on AI & Data Management" - link: "https://dmai.cs.ucy.ac.cy/" - deadline: "2025-04-07 23:59:59" - timezone: "Europe/Nicosia" - place: "Nicosia, Cyprus" - date: "July 7 - July 11, 2025" - start: 2025-07-07 - end: 2025-07-11 - sub: ['ML', 'DM', 'GenAI',] - note: "Registration options: €600 (no accommodation), €850 (shared room), €1100 (single room). Microsoft Fellowships available for US students." - twitter: null - email: "edbt2025summer@gmail.com" - description: "The EDBT association and the University of Cyprus are jointly sponsoring a Summer School on Artificial Intelligence (AI) and Data Management, hosted at the Resource Center 'Stelios Ioannou', University of Cyprus. It will cover a diverse range of topics around artificial intelligence and data management, with a special focus on Large Language Models, AI agents and Vector Databases. The program features 9 tutorials from internationally renowned researchers including Prof. Ioana Manolescu, Prof. Flora Salim, Prof. Sihem Amer-Yahia, Dr. Charalampos Tsourakakis, Prof. Volker Markl, Prof. Constantine Dovrolis, Prof. Mohamed F. Mokbel, Prof. Li Xiong, and Prof. Cyrus Shahabi. The school is primarily intended for graduate students and post-doctoral researchers, but also welcomes applications from advanced undergraduate students and academic and industrial researchers." - image: "https://dmai.cs.ucy.ac.cy/wp-content/uploads/2025/03/FINAL-EDBT-summer-school-logo-4.png" - location: - latitude: 35.14439766701156 - longitude: 33.41091247111121 - -- title: "Brown CNTR AI Policy Summer School" - year: 2025 - id: brown-cntr25 - full_name: "Brown University Center for Technological Responsibility, Reimagination and Redesign (CNTR) AI Policy Summer School 2025" - link: "https://cntr.brown.edu/summer-school" - deadline: "2025-04-05 23:59:59" - timezone: "America/New_York" - place: "Providence, RI and Washington, DC, USA" - date: "July 22 - July 31, 2025" - start: 2025-07-22 - end: 2025-07-31 - sub: ['RAI', 'ML'] - note: "Priority given to U.S. Citizens, Permanent Residents, and applicants from less represented states. Funding available for travel, lodging, and meals." - twitter: null - email: "serenabooth@brown.edu" - description: "Brown University CNTR is launching an AI Policy Summer School with a dual location format in Providence, RI and Washington, DC. The program aims to enable graduate students to conduct high-quality policy-informed AI research, empower students to advocate for new AI policies or changes to existing policy, and build a pipeline of qualified technologists to fill emerging needs in government. The first week features seminars, reading groups, and discussions on AI Policy fundamentals, while the second week involves travel to Washington, D.C. to discuss relevant legislation with Congressional offices, executive agencies, and civil society organizations. Confirmed speakers include Alan Davidson (former NTIA administrator), Kiri Wagstaff (Former AI Policy Advisor to Senator Mark Kelly), and Helen Toner (Director of CSET). The event is open to graduate students and postdocs in computing and affiliated fields, with consideration for dedicated undergraduates as well. No prior policy experience required." - image: "https://logotyp.us/file/brown.svg" - location: - latitude: 41.82849084031934 - longitude: -71.40098154575963 - -- title: "BMVA Computer Vision Summer School" - year: 2025 - id: bmva-cvss25 - full_name: "28th BMVA Computer Vision Summer School (CVSS) 2025" - link: "https://cvss.bmva.org/" - deadline: "2025-06-15 23:59:59" - timezone: "Europe/London" - place: "Aberdeen, Scotland, UK" - date: "July 7 - July 11, 2025" - start: 2025-07-07 - end: 2025-07-11 - sub: ['CV', 'ML', 'GenAI'] - note: "Early bird registration until 15th Jun 2025" - twitter: "https://twitter.com/BmvaCvss" - email: "bmva-cvss2025@abdn.ac.uk" - description: "The 28th BMVA Computer Vision Summer School (CVSS) will consist of an intensive week of lectures and lab sessions covering a wide range of topics in Computer Vision. The program includes 16 lectures across several topics, such as hyperbolic deep learning, classical CV, egocentric vision, video understanding, generative models and others. Lecturers are researchers from some of the most active research groups in the UK and abroad. The summer school is organized by the University of Aberdeen and the British Machine Vision Association." - image: "https://cvss.bmva.org/assets/images/layout/cvss_logo_2025.png" - location: - latitude: 57.1648 - longitude: -2.1015 - series: "BMVA Computer Vision Summer School" - -- title: "Deep Learning for Medical Imaging School" - year: 2025 - id: dlmi25 - full_name: "6th Deep Learning for Medical Imaging (DLMI) School 2025" - link: "https://deepimaging2025.sciencesconf.org/" - deadline: "2025-04-11 23:59:59" - timezone: "Europe/Paris" - place: "Lyon, France" - date: "April 21 - April 25, 2025" - start: 2025-04-21 - end: 2025-04-25 - sub: ['ML', 'CV', 'Health'] - note: "Registration opens February 14th. In-person registration closes April 11th (limited to 70 full participants and 130 course-only participants). Virtual registration closes April 18th. Fees: Students €650-900, Academic €750-1120, Industrial €1000 (full), €300 (courses only), €200 (virtual). Accommodation booking available until March 31st." - twitter: null - email: deepimaging2025@sciencesconf.org - description: "The 6th edition of the Deep Learning for Medical Imaging School is designed for both beginners and experts in medical imaging, including students, post-docs, research professionals, and professors. It offers an introduction to deep learning, covering fundamental concepts and their applications in medical imaging. The program includes 16 hours of oral presentations and four hands-on sessions (4 hours each). Participants will explore the basics of machine learning, progressing to the latest deep learning advancements in medical imaging. No expertise in machine learning or advanced programming skills is required to attend; a basic understanding of Python is sufficient for the hands-on sessions. Three attendance options are available: Full Registration (includes all courses, hands-on sessions, social events, meals, recorded sessions, and computing resources), Courses Only (on-site courses, recorded materials, coffee breaks, but no hands-on sessions, meals or social events), and Virtual Attendance (recorded sessions, computing resources, and live Q&A Zoom sessions on May 5-6). This school is organized by Labex PRIMES and INSA Lyon, and is a MICCAI endorsed event." - image: "https://deepimaging2025.sciencesconf.org/data/header/BandeauWeb_2.png" - location: - latitude: 45.783157129845144 - longitude: 4.87221626793872 - - -- title: "UK Robotics Summer School" - year: 2025 - id: ukrss25 - full_name: "UK Robotics Summer School 2025" - link: "https://ukrss.site.hw.ac.uk/" - deadline: "2025-04-30 23:59:59" - timezone: "Europe/London" - place: "Edinburgh, UK" - date: "June 2 - June 6, 2025" - start: 2025-06-02 - end: 2025-06-06 - sub: ['RO', 'ML', 'GenAI', 'HCI'] - note: "Registration deadline: April 30, 2025. Costs: £600 for industry/non-students, £300 for students (full week); £200/day for industry, £100/day for students. Fee includes lectures, tours, lunch, refreshments, and Summer School dinner. Registration via Eventbrite. Accommodation and travel to be arranged separately. Cancellations more than 30 days prior qualify for refund (excluding Eventbrite fees)." - twitter: null - email: "janet_louise.forbes@hw.ac.uk" - description: "This 5-day Robotics Summer School is organised by the Edinburgh Centre for Robotics (Edinburgh and Heriot-Watt University) and the National Robotarium, supported by the CDT D2AIR, The Edinburgh Centre for Robotics and the UK-RAS network. The program offers a combination of lectures, tutorials, and industry presentations focusing on cutting-edge topics in robotics. Participants will gain insights into reasoning, control, collaboration, and learning, bioinspired robotics, generative AI for robotics, human robot interactions, as well as discussions on ethics, validation, and inclusivity in robotics and AI. The event includes hands-on experience with state-of-the-art robotics technology, a tour of the National Robotarium, and networking opportunities with fellow students, academics, and industry leaders. Refreshments, lunch, and a special Summer School dinner (sponsored by the UK-RAS network) are included." - image: "https://ukrss.site.hw.ac.uk/wp-content/uploads/sites/89/2024/12/download.png" - location: - latitude: 55.91228043531887 - longitude: -3.323275722224049 - -- title: "INVICTA School of VIsion, Computational intelligence, and patTern Analysis" - year: 2025 - id: invicta25 - full_name: "INvicta school of VIsion, Computational intelligence, and patTern Analysis (INVICTA) 2025" - link: "https://invicta.inesctec.pt/" - deadline: "2025-03-31 23:59:59" - timezone: "Europe/Lisbon" - place: "Porto, Portugal" - date: "April 7 - April 11, 2025" - start: 2025-04-07 - end: 2025-04-11 - sub: ['CV', 'ML', 'GenAI', 'Health'] - note: "Early-bird registration (€650) until Feb 9, 2025. Regular registration (€700) until March 31, 2025. 12% discount for APRP members." - twitter: "https://twitter.com/INVICTA_School" - email: "invicta@inesctec.pt" - image: "https://invicta.inesctec.pt/assets/img/logo/invicta_logo1.png" - description: "The INvicta school of VIsion, Computational intelligence, and patTern Analysis (INVICTA) is organized by the Visual Computing and Machine Intelligence (VCMI) group of INESC TEC. The program features lectures, hands-on workshops, case studies, and a round-table on Responsible AI, led by experts from academia and industry. Topics include explainable AI in healthcare, vision-language models, knowledge distillation, bioinspired algorithms for visual attention, diffusion models in medical imaging, and more. The registration fee includes all lectures, hands-on sessions, case studies, AI talks, coffee breaks, and a social program. The school will take place at Porto Innovation Hub in the city center." - location: - latitude: 41.1579 - longitude: -8.6291 - -- title: "Responsible ML Winter School" - year: 2025 - id: rmlws25 - full_name: "Winter School on Responsible Machine Learning 2025" - link: "https://mlwinterschoolumea.github.io/" - deadline: "2025-02-20 23:59:59" - timezone: "Europe/Stockholm" - place: "Umeå, Sweden" - date: "March 11 - March 13, 2025" - start: 2025-03-11 - end: 2025-03-13 - sub: ['ML', 'RAI'] - note: "Registration fee: Students 1500 SEK, Faculty 2500 SEK, Others 4000 SEK. Free for LEMUR, WASP, WASP-HS or Aequitas members. Poster submission deadline: February 28, 2025. As of December 16, 2024, the event has reached capacity." - twitter: null - email: "monowar@cs.umu.se, nina.khairova@umu.se, virginia.dignum@umu.se" - description: "The Winter School on Responsible Machine Learning at Umeå University, Sweden offers lectures in the field of Responsible Machine Learning as well as hands-on multi-disciplinary and complementary training. The event includes a poster session and a social program, providing opportunities for networking and professional exchange. The school will take place in the Rotundan hall in the Universum building of Umeå University. The program is organized by the Responsible AI Group, led by Monowar Bhuyan and Virginia Dignum." - image: "https://mlwinterschoolumea.github.io/images/ai-policy-1.png" - location: - latitude: 63.819675624967985 - longitude: 20.305233918546286 - -- title: "Advanced Course on Artificial Intelligence & Neuroscience" - year: 2025 - id: acain25 - full_name: "5th Advanced Course and Symposium on Artificial Intelligence & Neuroscience (ACAIN) 2025" - link: "https://acain2025.icas.events/" - deadline: "2025-04-23 23:59:59" - timezone: "Europe/Rome" - place: "Castiglione della Pescaia, Italy" - date: "September 21 - September 24, 2025" - start: 2025-09-21 - end: 2025-09-24 - sub: ['ML', 'Neuro', 'CogSci', 'RO', 'RAI'] - note: "Regular registration deadline: April 23, 2025. Late registration: April 24 - August 10, 2025. Residential course - all participants must stay at the Riva del Sole Resort and Spa. Equivalent to 8 ECTS points." - twitter: null - email: "acain@icas.cc" - image: "https://acain2025.icas.events/wp-content/uploads/sites/31/2024/09/ACAIN-2025-logo-banner-1.png" - description: "The 5th Advanced Course and Symposium on Artificial Intelligence & Neuroscience (ACAIN) is a full-immersion four-day event at the Riva del Sole Resort & SPA, Tuscany, featuring lectures by world-renowned experts. The event consists of a two-day course (September 21-22) followed by a two-day symposium (September 23-24). It aims to foster multidisciplinary interactions between AI and neuroscience communities. Topics include neuroscience-inspired AI, cognitive computing, deep learning, computational neuroscience, human-level AI, ethics for autonomous systems, explainable AI, and more. Confirmed lecturers include Panos Pardalos (University of Florida), Jose Principe (University of Florida), Maneesh Sahani (UCL), Jonathon Shlens (Google DeepMind), Dimitra Thomaidou (Hellenic Pasteur Institute), and Marina Vidaki (University of Crete). The event involves 36-40 hours of lectures and provides opportunities for participants to present their research through oral talks or posters." - location: - latitude: 42.77079126926875 - longitude: 10.852376626839042 - series: "Advanced Course and Symposium on Artificial Intelligence & Neuroscience (ACAIN)" - - -- title: "Data Visualization Summer School" - year: 2025 - id: dvss25 - full_name: "Data Visualization Summer School: Design, communicate, engage 2025" - link: "https://malga.unige.it/education/schools/dvss/" - deadline: "2025-05-18 23:59:59" - timezone: "Europe/Rome" - place: "Genoa, Italy" - date: "July 7 - July 11, 2025" - start: 2025-07-07 - end: 2025-07-11 - sub: ['ML', 'GenAI'] - note: "Application deadline: May 18, 2025. Acceptance notification: May 30, 2025. Registration fees: Free for UniGe and Northeastern PhD students; €100 for non-UniGe PhD students and postdocs; €200 for non-UniGe faculty; €400 for professionals." - twitter: "https://twitter.com/malga_center" - email: "malga@unige.it" - description: "The Summer School in Data Visualization aims to equip participants with both fundamental and cutting-edge skills in creating impactful data visualizations for science dissemination, combining traditional design principles with modern AI capabilities. The program includes morning lectures by experts spanning from data visualization practices to the role of generative AI, and afternoon lab sessions where participants work on group projects. Speakers include Prof. Enrico Bertini from Northeastern University (Boston, MA) and faculty members from the MaLGa Center and UniGe's dAD Department. The school is aimed at PhD students of all disciplines, master's thesis students, and professionals who want to master data visualization principles and leverage AI tools to create more impactful and innovative visual storytelling." - location: - latitude: 44.40498328188538 - longitude: 8.972239169310429 - series: "MaLGa Summer Schools" - -- title: "Eastern European Machine Learning Summer School" - year: 2025 - id: eeml25 - full_name: "Eastern European Machine Learning Summer School (EEML) 2025" - link: "https://www.eeml.eu/home" - deadline: "2025-04-07 23:59:59" - timezone: "AOE" - place: "Sarajevo, Bosnia and Herzegovina" - date: "July 21 - July 26, 2025" - start: 2025-07-21 - end: 2025-07-26 - sub: ['ML', 'GenAI'] - note: "Application deadline: April 7, 2025 (23:59 AoE). Notification of acceptance: Early May 2025. Registration opens: Early June 2025." - twitter: "https://twitter.com/EEMLcommunity" - email: "contact@eeml.eu" - image: "https://rit.rakuten.com/wp-content/uploads/2022/03/Annotation-2020-09-02-112910.png" - description: "The Eastern European Machine Learning Summer School (EEML) brings together world-class researchers and practitioners in machine learning and artificial intelligence. The 2025 edition features an impressive lineup of speakers including Aaron Courville (Mila), Diana Borsa (Google DeepMind), Ferenc Huszár (University of Cambridge), João Carreira (Google DeepMind), Samy Bengio (Apple, EPFL), and many others. The program also includes tutorials led by experts from Google DeepMind and the University of Oxford. The school is organized in partnership with the Association for the Advancement of Science and Technology, Romanian Association for Artificial Intelligence, and University of Sarajevo, with support from various sponsors and community partners." - location: - latitude: 43.8563 - longitude: 18.4131 - series: "Eastern European Machine Learning (EEML) Summer School" - -- title: "Oxford Machine Learning Summer School (OxML): MLx Fundamentals" - year: 2025 - id: oxmlf25 - full_name: "Oxford Machine Learning Summer School: MLx Fundamentals 2025" - link: "https://www.oxfordml.school/" - deadline: "2025-05-01 23:59:59" - timezone: "Europe/London" - place: "Online" - date: "May 1 - May 9, 2025" - start: 2025-05-01 - end: 2025-05-09 - sub: ['ML', 'Theory'] - note: "Online only. Registration fee: £150 + VAT. Comprehensive tickets available: £500 (online), £1,700 (hybrid) for all four OxML courses." - twitter: "https://twitter.com/GlobalGoalsAI" - email: "contact@oxfordml.school" - image: "https://static.wixstatic.com/media/9b9d14_6872b3c1af6140a9b7542da5d66cbdd0~mv2.png/v1/fill/w_230,h_236,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/AI4GG-%20Logo-dark.png" - description: "MLx Fundamentals covers foundational topics in Statistical ML and Deep Learning, from the mathematics of ML and optimization to fundamentals of deep learning, NLP, and computer vision. Each day combines theoretical and applied lectures with case studies (hands-on coding). Speakers include Yali Du (King's College London), Yuki Asano (University of Amsterdam), Karsten Kreis (NVIDIA), Ishan Misra (Meta), Chi Jin (Princeton University), Biwei Huang (UC San Diego), Meng Fang (University of Liverpool), and others. The program is organized by AI for Global Goals." - location: - latitude: 51.7548 - longitude: -1.2544 - series: "Oxford Machine Learning Summer School (OxML)" - -- title: "Oxford Machine Learning Summer School (OxML): MLx Generative AI" - year: 2025 - id: oxmlg25 - full_name: "Oxford Machine Learning Summer School: MLx Generative AI 2025" - link: "https://www.oxfordml.school/2025" - deadline: "2025-06-05 23:59:59" - timezone: "Europe/London" - place: "London, UK" - date: "June 5 - June 7, 2025" - start: 2025-06-05 - end: 2025-06-07 - sub: ['ML', 'GenAI'] - note: "Hybrid format (in-person at London School of Economics or online). Registration fees: £600 + VAT (in-person), £250 + VAT (online). Comprehensive tickets available for all four OxML courses." - twitter: "https://twitter.com/GlobalGoalsAI" - email: "contact@oxfordml.school" - image: "https://static.wixstatic.com/media/9b9d14_6872b3c1af6140a9b7542da5d66cbdd0~mv2.png/v1/fill/w_230,h_236,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/AI4GG-%20Logo-dark.png" - description: "MLx Generative AI focuses on building GenAI products, targeting scientists/engineers and product designers/managers. The program covers the latest developments in generative foundation models in language, vision, and more, with a deep dive into emerging research and design patterns in Agentic Workflow and Alignment/Trust. Speakers include Jeff Clune (University of British Columbia/CIFAR/Google DeepMind), Reza Khorshidi (University of Oxford/ELANDI), Danijela Horak (BBC), Peggy Tsai (BigID), Karo Moilanen (Moonsongs Labs), Edward Hughes (DeepMind), Sunil Mallya (FLlip AI), and Sahar Asadi (KING). The event will be held at the London School of Economics." - location: - latitude: 51.5144 - longitude: -0.1165 - series: "Oxford Machine Learning Summer School (OxML)" - -- title: "Oxford Machine Learning Summer School (OxML): MLx Health & Bio" - year: 2025 - id: oxmlh25 - full_name: "Oxford Machine Learning Summer School: MLx Health & Bio 2025" - link: "https://www.oxfordml.school/2025" - deadline: "2025-08-02 23:59:59" - timezone: "Europe/London" - place: "Oxford, UK" - date: "August 2 - August 5, 2025" - start: 2025-08-02 - end: 2025-08-05 - sub: ['ML', 'Health', 'Bio'] - note: "Hybrid format (in-person at University of Oxford's Maths Institute or online). Registration fees: £900 + VAT (in-person), £300 + VAT (online). Comprehensive tickets available for all four OxML courses." - twitter: "https://twitter.com/GlobalGoalsAI" - email: "contact@oxfordml.school" - image: "https://static.wixstatic.com/media/9b9d14_6872b3c1af6140a9b7542da5d66cbdd0~mv2.png/v1/fill/w_230,h_236,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/AI4GG-%20Logo-dark.png" - description: "MLx Health & Bio is a masterclass combining theoretical ML talks with applications in healthcare and biomedical sciences/research/technology. Topics range from imaging, proteomics, genomics, and EHR to computational biology, drug discovery, multi-omics, wearables, and more. Speakers include Michael Bronstein (University of Oxford/AITHYRA), Charlotte Deane (University of Oxford), Arthur Gretton (University College London/Google DeepMind), Mireia Crispin (University of Cambridge), Aiden Doherty (University of Oxford), Adam Lewandowski (UK Biobank), Jonathan Passerat-Palmbach (Imperial College London), Hoifung Poon (Microsoft Health), Brian Hie (Stanford University), and many other leading researchers from both academia and industry." - location: - latitude: 51.7603 - longitude: -1.2597 - series: "Oxford Machine Learning Summer School (OxML)" - -- title: "Oxford Machine Learning Summer School (OxML): MLx Representation Learning & GenAI" - year: 2025 - id: oxmlr25 - full_name: "Oxford Machine Learning Summer School: MLx Representation Learning & GenAI 2025" - link: "https://www.oxfordml.school/2025" - deadline: "2025-08-07 23:59:59" - timezone: "Europe/London" - place: "Oxford, UK" - date: "August 7 - August 10, 2025" - start: 2025-08-07 - end: 2025-08-10 - sub: ['ML', 'GenAI', 'CV', 'NLP'] - note: "Hybrid format (in-person at University of Oxford's Maths Institute or online). Registration fees: £900 + VAT (in-person), £300 + VAT (online). Comprehensive tickets available for all four OxML courses." - twitter: "https://twitter.com/GlobalGoalsAI" - email: "contact@oxfordml.school" - image: "https://static.wixstatic.com/media/9b9d14_6872b3c1af6140a9b7542da5d66cbdd0~mv2.png/v1/fill/w_230,h_236,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/AI4GG-%20Logo-dark.png" - description: "MLx Representation Learning & GenAI covers the latest developments in representation learning, including those behind the success of generative AI. The program features a deep dive into ML in domains such as NLP (including LLMs), computer vision (including foundational/frontier image, video and multi-modal models), Bayesian ML, Reinforcement Learning, Geometrical DL, and more. Speakers include Peyman Milanfar (Google), Aymeric Dieuleveut (École Polytechnique), Abdul Fatir Ansari (AWS AI Labs), Ashley Edwards (Runway), Fazl Barez (University of Oxford), Haitham Bou-Ammar (Huawei), Gerhard Neumann (KIT), Hannaneh Hajishirzi (University of Washington/Allen Institute for AI), David Salinas (University of Washington), Edward Johns (Imperial College London), Ilia Shumailov (Google DeepMind), and workshop leaders from Meta and Hugging Face." - location: - latitude: 51.7603 - longitude: -1.2597 - series: "Oxford Machine Learning Summer School (OxML)" - -- title: "BAI Summer School on AI Agents and Agentic Systems" - year: 2025 - id: bai25 - full_name: "Business Analytics Institute (BAI) Summer School on AI Agents and Agentic Systems 2025" - link: "https://www.baieurope.com/summer-school-2025" - deadline: "2025-04-15 23:59:59" - timezone: "Europe/Paris" - place: "Anglet, France" - date: "July 3 - July 12, 2025" - start: 2025-07-03 - end: 2025-07-12 - sub: ['ML', 'GenAI', 'EconAI'] - note: "Open to upper class/graduate students and working professionals. Registration: January 1 - April 15, 2025. Early bird discounts available until February 28, 2025. Fees: €1545 (session) + €275 (social activities). Housing options available at negotiated rates." - twitter: "https://twitter.com/dsign4analytics" - email: "info@baieurope.com" - image: "https://images.squarespace-cdn.com/content/v1/5cc60d5c20fffe0001f629be/1556484078439-IVAKT2IJOIEFTEU9Q1PP/BAI+logo+6+-+b+color.png?format=1500w" - description: "The Business Analytics Institute, together with the ZHAW School of Management and Law, offers a 10-day summer school focusing on the managerial implications of current innovations of AI Agents in Banking and Finance. The program includes case studies, workshops, seminars, and expert testimony from the Banking and Finance sectors, facilitated by industry-recognized experts including Profs. Cielen, Elliott, Hitz, Gellrich, Walter, and Schlenker. Practicums will be run using Python, Rust, and LangChain. The program features company visits with data science teams from traditional banks and Fintech operators, as well as cultural visits to Biarritz, Saint Jean de Luz, and San Sebastián, a Basque cooking class, surfing lessons, and a tour of the 18th frigate 'L'Hermione'." - location: - latitude: 43.4831 - longitude: -1.5148 - -- title: "Gaussian Process Summer School" - year: 2025 - id: gpss25 - full_name: "Gaussian Process Summer School 2025" - link: "https://gpss.cc/gpss25/" - deadline: "2025-06-27 23:59:00" - timezone: "Europe/London" - place: "Manchester, UK" - date: "September 08 - September 11, 2025" - start: 2025-09-08 - end: 2025-09-11 - sub: ['ML', 'Theory', 'Log'] - -- title: "Cohere Labs - ML Summer School" - year: 2025 - id: clmlss25 - full_name: "Cohere Labs - ML Summer School 2025" - link: "https://cohere.com/events/Cohere-Labs-ML-Summer-School-2025" - deadline: "2025-06-30 23:59:00" - timezone: "Europe/London" - place: "Online" - date: "July 02 - July 14, 2025" - start: 2025-07-02 - end: 2025-07-14 - sub: ['ML', 'CV', 'NLP', 'KR', 'GenAI', 'Theory', 'Log', 'EML', 'RL'] - - title: "Statistics and Learning Theory Summer School" year: 2026 id: slt2026 diff --git a/site/archive.html b/site/archive.html index a950e88..2d77435 100644 --- a/site/archive.html +++ b/site/archive.html @@ -90,7 +90,8 @@

Archival Schools

To view schools from a particular year, click on the year below to expand the archive.

- {% for year in (2018..2024) reversed %} + {% assign archive_years = site.data.archive | map: 'year' | uniq | sort | reverse %} + {% for year in archive_years %}