Skip to content

Commit

Permalink
Derive slug field for demos in metadata.json (#1228)
Browse files Browse the repository at this point in the history
**Summary:**
This PR adds a `slug` field to each item in `metadata.json`. The slug is
derived from the filename of the demo and will eventually replace the
`canonicalURL` field. In a subsequent PR, the canonical URL field will
be removed.

**Relevant references:**
None.

**Possible Drawbacks:**
None.

**Related GitHub Issues:**
None.

**Other Notes:**
* [x] This PR includes a new GHA workflow "Build Website - Text (Test)"
for testing purposes. The workflow should be deleted prior to merging
this PR.

**Verification:**
The generated `metadata.json` file has the correct `slug` field for each
demo in the Glass Onion bucket.

<details><summary><tt>metadata.json</tt> Snippet</summary>
<p>

```json
[
  {
    "authors": [
      {
        "username": "whatsis"
      }
    ],
    "basedOnPapers": [],
    "canonicalURL": "/qml/demos/tutorial_how_to_use_noise_models",
    "categories": [
      "Quantum Computing",
      "How-to"
    ],
    "dateOfLastModification": "2024-10-01T00:00:00+00:00",
    "dateOfPublication": "2024-10-01T00:00:00+00:00",
    "doi": "",
    "previewImages": [
      {
        "type": "thumbnail",
        "uri": "/_static/demo_thumbnails/regular_demo_thumbnails/thumbnail_how_to_use_noise_models.png"
      },
      {
        "type": "large_thumbnail",
        "uri": "/_static/demo_thumbnails/large_demo_thumbnails/thumbnail_large_how_to_use_noise_models.png"
      }
    ],
    "referencedByPapers": [],
    "references": [],
    "relatedContent": [
      {
        "id": "tutorial_noisy_circuits",
        "type": "demonstration",
        "weight": 1
      }
    ],
    "seoDescription": "Learn how noise models can be built and inserted into a quantum circuit in PennyLane.",
    "slug": "tutorial_how_to_use_noise_models",
    "tags": [],
    "title": "How to use noise models in PennyLane"
  },
  {
    "authors": [
      {
        "username": "alvaro"
      }
    ],
    "basedOnPapers": [],
    "canonicalURL": "/qml/demos/tutorial_photonics",
    "categories": [
      "Quantum Hardware",
      "Quantum Computing"
    ],
    "dateOfLastModification": "2024-08-06T00:00:00+00:00",
    "dateOfPublication": "2022-05-31T00:00:00+00:00",
    "doi": "",
    "previewImages": [
      {
        "type": "thumbnail",
        "uri": "/_static/demo_thumbnails/regular_demo_thumbnails/thumbnail_photonic_QC.png"
      }
    ],
    "referencedByPapers": [],
    "references": [
      {
        "authors": "D. DiVincenzo",
        "id": "DiVincenzo2000",
        "journal": "Fortschritte der Physik",
        "title": "The Physical Implementation of Quantum Computation",
        "type": "article",
        "url": "https://onlinelibrary.wiley.com/doi/10.1002/1521-3978(200009)48:9/11%3C771::AID-PROP771%3E3.0.CO;2-E",
        "year": "2000"
      },
      {
        "authors": "C. Weedbrook, et al.",
        "id": "Weedbrook2012",
        "journal": "Rev. Mod. Phys.",
        "title": "Gaussian Quantum Information",
        "type": "article",
        "url": "https://journals.aps.org/rmp/abstract/10.1103/RevModPhys.84.621",
        "year": "2012"
      },
      {
        "authors": "S. Sabouri, et al.",
        "id": "Sabouri2021",
        "journal": "IEEE Photonics Journal",
        "number": "2",
        "title": "Thermo Optical Phase Shifter With Low Thermal Crosstalk for SOI Strip Waveguide",
        "type": "article",
        "url": "https://ieeexplore.ieee.org/document/9345963",
        "volume": "13",
        "year": "2021"
      },
      {
        "authors": "M. Paris",
        "id": "Paris1996",
        "journal": "Physics Letters A",
        "title": "Displacement operator by beam splitter",
        "type": "article",
        "url": "https://www.sciencedirect.com/science/article/abs/pii/0375960196003398?via%3Dihub",
        "year": "1996"
      },
      {
        "authors": "S. Braunstein, P. van Loock",
        "id": "Braunstein2005",
        "journal": "Rev. Mod. Phys.",
        "title": "Quantum information with continuous variables",
        "type": "article",
        "url": "https://journals.aps.org/rmp/abstract/10.1103/RevModPhys.77.513",
        "year": "2005"
      },
      {
        "authors": "C. Hamilton, et al.",
        "id": "Hamilton2017",
        "journal": "Phys. Rev. Lett.",
        "title": "Gaussian Boson Sampling",
        "type": "article",
        "url": "https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.119.170501",
        "year": "2017"
      },
      {
        "authors": "H.S. Zhong, et al.",
        "id": "Zhong2020",
        "journal": "Science",
        "title": "Quantum computational advantage using photons",
        "type": "article",
        "url": "https://www.science.org/doi/10.1126/science.abe8770",
        "year": "2020"
      },
      {
        "authors": "L. Madsen, et al.",
        "id": "Madsen2020",
        "journal": "Nature",
        "title": "Quantum computational advantage with a programmable photonic processor",
        "type": "article",
        "url": "https://www.nature.com/articles/s41586-022-04725-x",
        "year": "2022"
      },
      {
        "authors": "I. Tzitrin, et al.",
        "id": "Tzitrin2020",
        "journal": "Phys. Rev. A",
        "title": "Progress towards practical qubit computation using approximate Gottesman-Kitaev-Preskill codes",
        "type": "article",
        "url": "https://journals.aps.org/pra/abstract/10.1103/PhysRevA.64.012310",
        "year": "2020"
      },
      {
        "authors": "E. Bourassa, et al.",
        "id": "Bourassa2021",
        "journal": "Quantum",
        "title": "Blueprint for a Scalable Photonic Fault-Tolerant Quantum Computer",
        "type": "article",
        "url": "https://quantum-journal.org/papers/q-2021-02-04-392/",
        "year": "2021"
      }
    ],
    "relatedContent": [
      {
        "id": "tutorial_pasqal",
        "type": "demonstration",
        "weight": 1
      },
      {
        "id": "tutorial_trapped_ions",
        "type": "demonstration",
        "weight": 1
      },
      {
        "id": "tutorial_sc_qubits",
        "type": "demonstration",
        "weight": 1
      },
      {
        "id": "gbs",
        "type": "demonstration",
        "weight": 1
      }
    ],
    "seoDescription": "Learn how photonic quantum computers work through code",
    "slug": "tutorial_photonics",
    "tags": [],
    "title": "Photonic quantum computers"
  },
  {
    "authors": [
      {
        "id": "diksha_dhawan"
      }
    ],
    "basedOnPapers": [],
    "canonicalURL": "/qml/demos/tutorial_mapping",
    "categories": [
      "Algorithms",
      "Quantum Computing",
      "Quantum Chemistry"
    ],
    "dateOfLastModification": "2024-08-05T00:00:00+00:00",
    "dateOfPublication": "2024-05-06T00:00:00+00:00",
    "doi": "",
    "previewImages": [
      {
        "type": "thumbnail",
        "uri": "/_static/demonstration_assets/mapping/thumbnail_mapping_2024-06-20.png"
      },
      {
        "type": "large_thumbnail",
        "uri": "/_static/demo_thumbnails/large_demo_thumbnails/thumbnail_large_mapping_2024-06-20.png"
      }
    ],
    "referencedByPapers": [],
    "references": [
      {
        "authors": "A. Tranter, S. Sofia et al.",
        "id": "Tranter",
        "publisher": "International Journal of Quantum Chemistry",
        "title": "The Bravyi–Kitaev Transformation: Properties and Applications",
        "type": "article",
        "url": "https://onlinelibrary.wiley.com/doi/10.1002/qua.24969",
        "year": "2015"
      },
      {
        "authors": "Y. S. Yordanov et al.",
        "id": "Yordanov",
        "publisher": "Physical Review A",
        "title": "Efficient quantum circuits for quantum computational chemistry",
        "type": "article",
        "url": "https://journals.aps.org/pra/abstract/10.1103/PhysRevA.102.062612",
        "year": "2020"
      }
    ],
    "relatedContent": [],
    "seoDescription": "Learn how to map fermionic operators to qubit operators",
    "slug": "tutorial_mapping",
    "tags": [],
    "title": "Mapping fermionic Hamiltonians to qubit Hamiltonians"
  },
  # ...
]
```

</p>
</details>
  • Loading branch information
Mandrenkov authored Oct 4, 2024
1 parent ba99d49 commit d73cdab
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 6 deletions.
20 changes: 15 additions & 5 deletions .github/workflows/upload-text.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,21 @@ jobs:
path: qml_text

- name: Copy Concatenated Metadata into Build
run: >
jq -s .
$(find demonstrations -name "*.metadata.json" -type f
! -name "demonstrations_categories.metadata.json")
> ${{ steps.qml_text.outputs.download-path }}/demos/metadata.json
run: |
tmp_metadata_json=$(mktemp)
out_metadata_json=${{ steps.qml_text.outputs.download-path }}/demos/metadata.json
filepaths=$(
find demonstrations -name "*.metadata.json" -type f \
! -name "demonstrations_categories.metadata.json" \
)
for filepath in $filepaths; do
slug=$(basename $filepath .metadata.json)
jq ". += {\"slug\": \"$slug\"}" < $filepath >> $tmp_metadata_json
done
jq --slurp --sort-keys . < $tmp_metadata_json > $out_metadata_json
- name: Upload
uses: XanaduAI/cloud-actions/push-to-s3-and-invalidate-cloudfront@main
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/validate-demo-metadata.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ jobs:
METADATA_FILE_LIST: ${{ needs.generate-metadata-file-list.outputs.metadata_files }}
run: |
cd metadata_schemas
${{ steps.poetry.outputs.bin }} run check-jsonschema -v --traceback-mode full --schemafile demo.metadata.schema.0.1.2.json $METADATA_FILE_LIST
${{ steps.poetry.outputs.bin }} run check-jsonschema -v --traceback-mode full --schemafile demo.metadata.schema.0.1.3.json $METADATA_FILE_LIST
validate-metadata-preview-images:
runs-on: ubuntu-latest
Expand Down
140 changes: 140 additions & 0 deletions metadata_schemas/demo.metadata.schema.0.1.3.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "demo.metadata.schema.0.1.2.json",
"title": "Demo Metadata",
"description": "A QML demo's metadata",
"type": "object",
"properties": {
"title": {
"description": "The title of the demo.",
"type": "string",
"minLength": 2
},
"slug": {
"description": "The slug of the demo. This should match the base name of the metadata file.",
"type": "string",
"minLength": 1
},
"authors": {
"description": "The author(s) of the demo. This array must contain at least one item.",
"type": "array",
"items": {
"oneOf": [
{
"$ref": "file:./objects/author.schema.0.1.0.json"
},
{
"$ref": "file:./objects/author.schema.0.2.0.json"
}
]
},
"minItems": 1
},
"dateOfPublication": {
"description": "The date on which the demo was first published, in the form YYYY-MM-DDTHH:MM:SS+00:00.",
"type": "string",
"format": "date-time",
"minLength": 25,
"maxLength": 25
},
"dateOfLastModification": {
"description": "The date on which the demo was last modified, in the form YYYY-MM-DDTHH:MM:SS+00:00.",
"type": "string",
"format": "date-time",
"minLength": 25,
"maxLength": 25
},
"categories": {
"description": "An array of the categories that this demo is in.",
"type": "array",
"items": {
"enum": [
"Algorithms",
"Getting Started",
"Optimization",
"Quantum Machine Learning",
"Quantum Chemistry",
"Devices and Performance",
"Quantum Computing",
"Quantum Hardware",
"How-to"
]
},
"minItems": 0
},
"tags": {
"description": "An array of the tags that the demo has. An empty array is allowed.",
"type": "array",
"items": {
"type": "string"
}
},
"previewImages": {
"description": "An array of the different images that can be used as previews for this demo - e.g., thumbnails, social media cards (perhaps of different aspect ratios).",
"type": "array",
"items": {
"$ref": "file:./objects/preview.image.schema.0.1.0.json"
},
"minItems": 1
},
"seoDescription": {
"description": "A description of the demo suitable for SEO purposes. Ideally this should be less than 150 characters, but this is not a strict limit. It should be a full, grammatically-correct sentence ending in a full stop.",
"type": "string",
"minLength": 2
},
"doi": {
"description": "The DOI for the demo.",
"type": "string",
"pattern": "^$|^10[.]"
},
"canonicalURL": {
"description": "The canonical URL for the demo. Sometimes there might be more than one URL that points to a given page on a website. The canonical URL defines which of these should be thought of as the primary or main one.",
"type": "string",
"pattern": "(^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6})?\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)"
},
"references": {
"description": "An array of the references used for the demo.",
"type": "array",
"items": {
"$ref": "file:./objects/reference.schema.0.1.0.json"
}
},
"basedOnPapers": {
"description": "An array of the DOIs for the papers the demo is based on. An empty array is allowed.",
"type": "array",
"items": {
"type": "string"
}
},
"referencedByPapers": {
"description": "An array of the DOIs of any papers that reference the demo. An empty array is allowed.",
"type": "array",
"items": {
"type": "string"
}
},
"relatedContent": {
"description": "An array of objects describing the content related to the demo. An empty array is allowed.",
"type": "array",
"items": {
"$ref": "file:./objects/related.content.schema.0.1.0.json"
}
},
"hardware": {
"description": "An array of objects representing third-party vendors who can run the demo on their hardware. An empty array is allowed.",
"type": "array",
"items": {
"$ref": "file:./objects/hardware.schema.0.1.0.json"
}
},
"discussionForumUrl": {
"description": "Link to dedicated discussion forum thread on https://discuss.pennylane.ai/ for this demo",
"type": "string",
"format": "uri",
"pattern": "(^https?:\/\/(www.)?discuss.pennylane.ai(?:\/.*)?$)"
}
},
"required": [
"title", "authors", "dateOfPublication", "dateOfLastModification", "categories", "tags", "previewImages", "seoDescription", "doi", "canonicalURL", "references", "basedOnPapers", "referencedByPapers", "relatedContent"
]
}

0 comments on commit d73cdab

Please sign in to comment.