From e5648867371737a91d6cbdd3962bed3e1d91f21b Mon Sep 17 00:00:00 2001 From: "Fred J. Hickernell" Date: Wed, 29 Jul 2026 16:55:47 -0500 Subject: [PATCH 1/2] Prototype QMCSoftware organization website --- AGENTS.md | 14 +-- PLAN.md | 82 ++++++++++----- README.md | 16 +-- STATUS.md | 49 ++++++--- _quarto.yml | 19 ++-- about.qmd | 19 ++-- blog/index.qmd | 24 +++-- .../figures/iid_uniform_pts.png | Bin 0 -> 23188 bytes blog/why-add-q-to-mc/figures/lattice_pts.png | Bin 0 -> 29434 bytes blog/why-add-q-to-mc/index.qmd | 85 ++++++++++++++++ community/index.qmd | 12 ++- data/publications.yml | 23 +++++ index.qmd | 96 +++++++++++++----- news/fred-hickernell-siam-fellow/index.qmd | 25 +++++ news/index.qmd | 16 ++- publications/README.md | 58 +++++++++++ publications/catalog.ejs.md | 40 ++++++++ publications/index.qmd | 67 ++++++++++++ software/index.qmd | 48 +++++++++ software/lddata.qmd | 27 +++++ software/qmcpy.qmd | 33 ++++++ software/qmctoolscl.qmd | 24 +++++ software/quasimc-jl.qmd | 32 ++++++ styles/custom.scss | 91 ++++++++++++++++- 24 files changed, 789 insertions(+), 111 deletions(-) create mode 100644 blog/why-add-q-to-mc/figures/iid_uniform_pts.png create mode 100644 blog/why-add-q-to-mc/figures/lattice_pts.png create mode 100644 blog/why-add-q-to-mc/index.qmd create mode 100644 data/publications.yml create mode 100644 news/fred-hickernell-siam-fellow/index.qmd create mode 100644 publications/README.md create mode 100644 publications/catalog.ejs.md create mode 100644 publications/index.qmd create mode 100644 software/index.qmd create mode 100644 software/lddata.qmd create mode 100644 software/qmcpy.qmd create mode 100644 software/qmctoolscl.qmd create mode 100644 software/quasimc-jl.qmd diff --git a/AGENTS.md b/AGENTS.md index 9e41d64..acdbe8d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,17 +2,17 @@ ## Repository purpose -This repository contains the public-facing QMCPy website. It is a Quarto -website intended for project introductions, community information, news and -events, and blog content. +This repository contains the public-facing QMCSoftware organization website. +It is a Quarto website intended for software introductions, publications, +community information, news and events, and blog content. -QMCPy's technical documentation remains in the `QMCSoftware` repository and -continues to be built with MkDocs. Link to that documentation; do not migrate, -duplicate, or replace it from this repository. +Each project's technical documentation remains with its software repository. +Link to that documentation; do not migrate, duplicate, or replace it from this +repository. ## Repository boundaries -- Write only within `qmcpy-website` unless the user explicitly changes the +- Write only within `qmcsoftware-website` unless the user explicitly changes the scope. - `QMCSoftware` may be inspected for authoritative project information, existing documentation, and later blog-migration planning, but must not be diff --git a/PLAN.md b/PLAN.md index 6c6768b..b9e7f46 100644 --- a/PLAN.md +++ b/PLAN.md @@ -1,21 +1,22 @@ -# QMCPy Website Prototype Plan +# QMCSoftware Website Prototype Plan ## Purpose and architecture -This repository will provide the public-facing QMCPy website. Quarto source -lives on `main`, renders to `_site/`, and is published by GitHub Actions to the -`gh-pages` branch. The custom domain is `qmcpy.org`. +This repository will provide the single public-facing website for the +QMCSoftware organization. Quarto source lives on `main`, renders to `_site/`, +and is published by GitHub Actions to the `gh-pages` branch. The existing +custom domain, `qmcpy.org`, remains in place temporarily. -The existing technical documentation remains in `QMCSoftware`, continues to -use MkDocs, and is linked prominently from this site. The website adds a public -entry point; it does not replace the package documentation. +Technical documentation remains with each software repository and is linked +from this site. The website adds a shared public entry point; it does not +replace project documentation. ## Guiding principles - Keep the prototype small, navigable, and easy to maintain. - Reuse proven structural and deployment ideas without importing course or slide architecture. -- Treat maintained QMCPy sources as authoritative and avoid speculative copy. +- Treat maintained project sources as authoritative and avoid speculative copy. - Separate source from generated output and validate each phase before adding complexity. - Make later content migration explicit and reviewable. @@ -26,7 +27,7 @@ entry point; it does not replace the package documentation. - [x] Confirm the repository roles, source branch, output directory, publish branch, custom domain, and scope exclusions. -- [x] Inspect the starting `qmcpy-website` files. +- [x] Inspect the starting QMCPy-only prototype files. - [x] Inspect relevant Quarto and deployment patterns in `MATH565Fall2026`. - [x] Confirm the maintained documentation and GitHub destinations from `QMCSoftware`. @@ -41,7 +42,7 @@ entry point; it does not replace the package documentation. - [x] Avoid unnecessary runtime dependencies; no `requirements.txt` is needed for the current non-executable content. -### Phase 2A — Establish the site skeleton +### Phase 2A — Establish the original site skeleton - [x] Configure a Quarto website that renders to `_site/`. - [x] Add Home, Blog, News & Events, Community, Documentation, and GitHub @@ -58,10 +59,21 @@ entry point; it does not replace the package documentation. responsive button treatment. - [x] Keep the styling local and independent of classroom-specific styles. - [ ] Review the prototype with collaborators and align it with any approved - QMCPy visual identity or assets. + QMCSoftware visual identity or assets. - [ ] Complete browser-based responsive and accessibility review. -### Phase 3 — Develop the homepage +### Phase 3 — Convert to the QMCSoftware umbrella + +- [x] Replace the QMCPy-specific homepage with an organization-wide homepage. +- [x] Add a Software section for QMCPy, QMCToolsCL, QuasiMC.jl, and LDData. +- [x] Add a Publications prototype without inventing a complete bibliography. +- [x] Update shared navigation, metadata, footer, and organization-wide copy. +- [x] Keep each project's detailed documentation in its maintained repository. +- [x] Retain `qmcpy.org` and the existing `CNAME` during the transition. +- [ ] Decide the long-term domain, custom-domain settings, and redirects. +- [ ] Approve an organization-level visual identity and navbar mark, if any. + +### Phase 4 — Refine the homepage - [x] Add a concise prototype introduction and primary documentation/GitHub actions. @@ -70,8 +82,14 @@ entry point; it does not replace the package documentation. - [ ] Add approved imagery, examples, or impact highlights if they provide clear value. -### Phase 4 — Migrate the blog +### Phase 5 — Migrate the blog +- [x] Migrate “Why Add Q to MC?” as the first self-contained Quarto post, + preserving its authorship, mathematical explanation, equations, figures, and + captions. +- [x] Revise “Why Add Q to MC?” as a living article with one last-revised date, + qualified convergence claims, and practical guidance. +- [x] Establish listing metadata and a discoverable Blog index. - [ ] Inventory the existing 18 posts and their assets without modifying the source repository. - [ ] Define Quarto post metadata, URL preservation, authorship, categories, @@ -80,14 +98,16 @@ entry point; it does not replace the package documentation. - [ ] Verify dates, authors, links, code, mathematics, images, and legacy URLs. - [ ] Publish the complete archive only after collaborator review. -### Phase 5 — Build news and events +### Phase 6 — Build news and events - [x] Add the section entry page without invented announcements. +- [x] Add a sourced prototype news item and a discoverable News & Events + listing. - [ ] Define lightweight metadata and archive conventions. - [ ] Add only confirmed news, talks, workshops, releases, and events. - [ ] Decide how past and upcoming events should be presented. -### Phase 6 — Develop community content +### Phase 7 — Develop community content - [x] Link to maintained community and contribution resources. - [ ] Agree on the intended audience and approved community narrative. @@ -96,17 +116,29 @@ entry point; it does not replace the package documentation. - [ ] Review names, roles, affiliations, and acknowledgements with collaborators before publication. -### Phase 7 — Integrate documentation pathways +### Phase 8 — Integrate documentation pathways -- [x] Add prominent links to the existing MkDocs documentation. -- [x] State clearly that technical documentation remains a separate maintained - site. -- [ ] Review cross-links from both sites and identify any minimal reciprocal - navigation changes for a separately authorized `QMCSoftware` task. +- [x] Add links to maintained project documentation and repositories. +- [x] State clearly that technical documentation remains with each project. +- [ ] Review reciprocal links from the software repositories and documentation. - [ ] Verify that users can distinguish public, learning, API-reference, and contribution destinations. -### Phase 8 — Test the site +### Phase 8A — Develop publications + +- [x] Add a selected local YAML publication catalog. +- [x] Render ordinary publication records directly from YAML on the + Publications page, without per-publication folders or QMD files. +- [x] Sort the curated website catalog by year descending and title ascending, + grouping ordinary publications under year headings. +- [x] Add a reviewed prototype publication with publisher, DOI, and arXiv + links as a hand-written featured introduction. +- [x] Document the one-record YAML contribution convention. +- [ ] Correct and enrich the corresponding AcademicLib record in a separately + authorized AcademicLib task. +- [ ] Agree on bibliography scope, review ownership, and migration priorities. + +### Phase 9 — Test the site - [x] Validate the Quarto configuration and a complete local render. - [x] Inspect generated page structure, internal destinations, external @@ -116,7 +148,7 @@ entry point; it does not replace the package documentation. content. - [ ] Test from a fresh clone with the documented Quarto setup. -### Phase 9 — Validate deployment +### Phase 10 — Validate deployment - [x] Add GitHub Actions rendering from `main` to `_site/` and publishing to `gh-pages`. @@ -125,10 +157,10 @@ entry point; it does not replace the package documentation. - [ ] Trigger the workflow on GitHub and verify the `gh-pages` branch contents. - [ ] Verify HTTPS and `qmcpy.org` after deployment. -### Phase 10 — Collaborator review and prototype decision +### Phase 11 — Collaborator review and prototype decision - [ ] Review information architecture, visual direction, and provisional copy - with QMCPy collaborators. + with QMCSoftware collaborators. - [ ] Record requested changes and resolve launch-blocking issues. - [ ] Agree on ownership and cadence for blog, news, and community updates. - [ ] Approve the prototype before beginning the 18-post blog migration. diff --git a/README.md b/README.md index 527f88e..c7b48cf 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,16 @@ -# QMCPy website +# QMCSoftware website This repository contains the public-facing website for -[QMCPy](https://qmcpy.org), built with [Quarto](https://quarto.org/). +[QMCSoftware](https://github.com/QMCSoftware), built with +[Quarto](https://quarto.org/). It is an umbrella site for the organization's +software, publications, blog, news and events, and community information. -Technical package documentation remains in the -[QMCSoftware repository](https://github.com/QMCSoftware/QMCSoftware) and is -published separately with MkDocs at -[qmcsoftware.github.io/QMCSoftware](https://qmcsoftware.github.io/QMCSoftware/). +Technical documentation remains with each software repository. The website +links to maintained project documentation instead of duplicating it. + +The existing `https://qmcpy.org` site URL and `CNAME` remain in place +temporarily while the organization decides its long-term domain and redirect +strategy. ## Local preview diff --git a/STATUS.md b/STATUS.md index e74eba4..a4bb8b9 100644 --- a/STATUS.md +++ b/STATUS.md @@ -1,19 +1,33 @@ -# QMCPy Website Status +# QMCSoftware Website Status ## Complete - [x] Confirmed Quarto-on-`main`, `_site/`, `gh-pages`, and `qmcpy.org` architecture. - [x] Replaced the standalone HTML landing page with one Quarto source site. -- [x] Added Home, About, Blog, News & Events, and Community source pages. -- [x] Added the requested navigation and authoritative external links. +- [x] Converted the QMCPy-only prototype into an umbrella QMCSoftware site. +- [x] Added Software pages for QMCPy, QMCToolsCL, QuasiMC.jl, and LDData. +- [x] Added a Publications prototype and organization-wide navigation. +- [x] Migrated and revised “Why Add Q to MC?” as a living article, preserving + its mathematical explanation, figures, captions, and authorship while adding + qualified convergence and practical-use guidance. +- [x] Added a sourced 2026 SIAM Fellow news item. +- [x] Added a hand-written featured publication and a one-record YAML catalog + convention for ordinary publications. +- [x] Documented the separation between the broad AcademicLib registry, + website-curated publication records, and blog-local citations; catalog + display order no longer depends on YAML record order. +- [x] Added working Blog, News & Events, and Publications listings. +- [x] Preserved Home, About, Blog, News & Events, and Community pages. +- [x] Added authoritative project documentation and repository links. - [x] Added a restrained responsive visual foundation. -- [x] Integrated the existing QMCPy logo in the navbar and homepage hero with - responsive sizing and accessible alternative text. +- [x] Retained the QMCPy logo asset for possible project-specific use while + removing it from organization-level branding. - [x] Added GitHub Actions rendering and `gh-pages` publication with explicit `CNAME` preservation. - [x] Added repository guidance, roadmap, ignore rules, and local instructions. -- [x] Rendered locally and inspected the generated site structure and links. +- [x] Rendered the complete 13-page site and verified local link targets and + rendered `CNAME` preservation. ## Underway @@ -24,16 +38,21 @@ ## Next recommended task -- [ ] Review the rendered prototype with QMCPy collaborators and approve the - visual direction and public copy before adding content or migrating posts. +- [ ] Review the rendered umbrella prototype with QMCSoftware collaborators and + approve the visual direction and public copy before adding content or + migrating posts. ## Decisions and scope boundaries -- Technical documentation stays in `QMCSoftware` and continues to use MkDocs. -- The primary GitHub link targets `QMCSoftware/QMCSoftware`; community links - may also point to maintained pages within that project. -- The existing 18 blog posts are not imported in this prototype. -- No Reveal.js project, repository rename, speculative infrastructure, or - Python dependency file is included. +- Technical documentation stays with each software project. +- The primary GitHub link targets the QMCSoftware organization; project pages + link to their respective repositories and documentation. +- The site continues to use `qmcpy.org` temporarily; DNS, Pages settings, and + redirects have not been changed. +- One earlier blog post is migrated as a pattern; the remainder of the archive + is outside the current prototype. +- No Reveal.js project, speculative infrastructure, or Python dependency file + is included. - Generated `_site/` output remains outside the `main` branch. -- No commit or push is part of the current work. +- The completed prototype is maintained on a review branch until it is approved + for merge into `main`. diff --git a/_quarto.yml b/_quarto.yml index 9cfb5a2..cbcdc13 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -6,34 +6,37 @@ project: - "blog/**/*.qmd" - "news/**/*.qmd" - "community/**/*.qmd" + - "software/**/*.qmd" + - "publications/**/*.qmd" resources: - CNAME - assets/** + - data/** website: - title: "QMCPy" + title: "QMCSoftware" site-url: https://qmcpy.org - description: "Public website for QMCPy, quasi-Monte Carlo community software in Python." + description: "Open-source software and shared resources for quasi-Monte Carlo methods." navbar: background: "#073b4c" - logo: assets/logos/qmcpy_logo.png - logo-alt: "QMCPy logo" left: - href: index.qmd text: Home + - href: software/index.qmd + text: Software - href: blog/index.qmd text: Blog + - href: publications/index.qmd + text: Publications - href: news/index.qmd text: News & Events - href: community/index.qmd text: Community right: - - href: https://qmcsoftware.github.io/QMCSoftware/ - text: Documentation - - href: https://github.com/QMCSoftware/QMCSoftware + - href: https://github.com/QMCSoftware text: GitHub page-footer: - left: "QMCPy — quasi-Monte Carlo community software in Python" + left: "QMCSoftware — open-source quasi-Monte Carlo software" right: - href: about.qmd text: About this site diff --git a/about.qmd b/about.qmd index fc2fc1c..aeffed4 100644 --- a/about.qmd +++ b/about.qmd @@ -1,13 +1,16 @@ --- title: "About this site" -description: "How the QMCPy public website relates to the technical documentation." +description: "How the QMCSoftware public website relates to its software projects." --- -This site is the public-facing home for QMCPy. It is intended to make project -news, community information, and learning pathways easier to find. +This site is the public-facing home for the QMCSoftware organization. It +provides a shared entry point for the organization's open-source quasi-Monte +Carlo software, publications, news, events, and community information. -The detailed package documentation is maintained separately in the -[QMCSoftware repository](https://github.com/QMCSoftware/QMCSoftware) and -published with MkDocs at the -[QMCPy documentation site](https://qmcsoftware.github.io/QMCSoftware/). This -website links to that documentation rather than duplicating it. +Detailed technical documentation remains with each +[software project](software/index.qmd). This website links to those maintained +sources rather than duplicating them. + +The umbrella prototype is temporarily served at `qmcpy.org` so that the +existing deployment continues to work while the organization decides its +long-term domain and redirect strategy. diff --git a/blog/index.qmd b/blog/index.qmd index b950619..3447428 100644 --- a/blog/index.qmd +++ b/blog/index.qmd @@ -1,11 +1,23 @@ --- title: "Blog" -description: "QMCPy articles and project updates." +description: "Articles and project updates from QMCSoftware." +listing: + contents: + - "*/index.qmd" + type: default + sort: "date desc" + fields: + - image + - date + - title + - author + - description + - categories --- -The QMCPy blog archive will be added in a later migration phase. Existing posts -have not been copied or converted for this prototype. +The QMCSoftware blog shares accessible introductions, project updates, and +technical perspectives from across the community. -In the meantime, visit the -[technical documentation](https://qmcsoftware.github.io/QMCSoftware/) for -guides and examples. +This first migrated article establishes the pattern for bringing the earlier +QMCPy blog archive into the umbrella site. Additional posts will be reviewed +and migrated incrementally. diff --git a/blog/why-add-q-to-mc/figures/iid_uniform_pts.png b/blog/why-add-q-to-mc/figures/iid_uniform_pts.png new file mode 100644 index 0000000000000000000000000000000000000000..c82f0100d9566d6d2187667b3055aa2dec856d61 GIT binary patch literal 23188 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 SQs+Z^zoe>lKKF04!2bo$&2l3E literal 0 HcmV?d00001 diff --git a/blog/why-add-q-to-mc/figures/lattice_pts.png b/blog/why-add-q-to-mc/figures/lattice_pts.png new file mode 100644 index 0000000000000000000000000000000000000000..0bb525e344193a5dd49a4e6701b9801a5ae53527 GIT binary patch literal 29434 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 + 64 IID standard uniform points in 2 dimensions +
Figure 1: 64 IID standard uniform points in 2 dimensions.
+ + +Figure 2 gives an example of $\boldsymbol{X}_1, \ldots, \boldsymbol{X}_{64}$ used in QMC methods. These points are called integration lattice points. Note that they more evenly fill the square than the IID points in Figure 1. + +
+ 64 shifted lattice points in 2 dimensions +
Figure 2: 64 shifted lattice points in 2 dimensions.
+
+ +Because these QMC points are more even, they can sometimes reduce integration error much faster than IID sampling. In favorable cases, one may observe an error rate near $\mathcal{O}(n^{-1})$, while the typical statistical error for simple MC decreases like $\mathcal{O}(n^{-1/2})$. The rate $\mathcal{O}(n^{-1})$ is an illustration, not a guarantee: actual convergence depends on both the integrand and the QMC construction. That potential improvement is the reason to add Q to MC. + +QMCPy [1] is our open source Python library that implements QMC methods, including point generators, cubatures, and stopping criteria. A tutorial on QMC is given in [2]. This blog introduces you to QMC and QMCPy. + +## When does QMC help? + +More evenly distributed points can substantially improve integration accuracy, +but the size of the improvement depends on the problem. QMC tends to work best +when the integrand is sufficiently smooth or regular and when most of its +variation is driven by a relatively small number of important variables or +low-order interactions—what is often called low *effective dimension*. + +How a problem is formulated also matters. Transformations, the ordering of +variables, and other modeling choices can make important structure easier or +harder for a QMC rule to exploit. The low-discrepancy point set should suit the +problem, and randomization is useful when repeated estimates are needed to +assess error. Thus, neither even spacing nor a nominal dimension alone +determines the convergence rate. + +## How QMCPy makes QMC practical + +QMCPy brings the pieces of a QMC computation into one framework. It provides: + +- low-discrepancy sequences and lattices, +- randomized constructions, +- transformations for probability distributions, +- integrands and applications, and +- stopping criteria and error assessment. + +A future revision or companion post will include a short, runnable QMCPy +comparison of IID Monte Carlo and randomized QMC. + +## References + +1. S.-C. T. Choi, F. J. Hickernell, R. Jagadeeswaran, A. Jain, and A. Sorokin, QMCPy: a quasi-Monte Carlo Python library (version 2.3), DOI: 10.5281/zenodo.20297697 + +2. F. J. Hickernell, N. Kirk, and A. G. Sorokin, Quasi-Monte Carlo methods: what, why, and how? +In C. Lemieux and B. Feng, editors, Monte Carlo and quasi-Monte Carlo methods: MCQMC, Waterloo, Canada, August 2024, Springer, Cham, 2026 diff --git a/community/index.qmd b/community/index.qmd index e6d8080..73a4db2 100644 --- a/community/index.qmd +++ b/community/index.qmd @@ -1,14 +1,16 @@ --- title: "Community" -description: "Ways to learn about and contribute to QMCPy." +description: "Ways to learn about and contribute to QMCSoftware projects." --- -QMCPy is developed in the open. For the current contributor information, -project governance, and acknowledgements, use these maintained resources: +QMCSoftware projects are developed in the open. Each project maintains its own +technical and contributor information: +- [QMCSoftware organization on GitHub](https://github.com/QMCSoftware) - [QMCPy community documentation](https://qmcsoftware.github.io/QMCSoftware/community/) -- [Contributing guidelines](https://qmcsoftware.github.io/QMCSoftware/CONTRIBUTING/) -- [QMCSoftware repository](https://github.com/QMCSoftware/QMCSoftware) +- [QMCPy contributing guidelines](https://qmcsoftware.github.io/QMCSoftware/CONTRIBUTING/) +- [QMCToolsCL contributing guidelines](https://github.com/QMCSoftware/QMCToolsCL/blob/main/CONTRIBUTING.md) +- [QuasiMC.jl contributing guidelines](https://github.com/QMCSoftware/QuasiMC.jl/blob/develop/CONTRIBUTING.md) Additional public community content will be developed after collaborator review. diff --git a/data/publications.yml b/data/publications.yml new file mode 100644 index 0000000..92ae213 --- /dev/null +++ b/data/publications.yml @@ -0,0 +1,23 @@ +- key: hickirsor_2026_qmc_tutorial + cite: HKS26 + short: "Hickernell, Kirk, Sorokin (2026)" + title: "Quasi-Monte Carlo Methods: What, Why, and How?" + authors: + - Fred J. Hickernell + - Nathan Kirk + - Aleksei G. Sorokin + year: 2026 + type: inproceedings + venue: "Monte Carlo and Quasi-Monte Carlo 2024" + series: "Springer Proceedings in Mathematics & Statistics" + volume: 522 + pages: "3–40" + doi: "10.1007/978-3-032-10590-5_1" + doi_url: "https://doi.org/10.1007/978-3-032-10590-5_1" + arxiv: "arXiv:2502.03644" + arxiv_url: "https://arxiv.org/abs/2502.03644" + publisher_url: "https://link.springer.com/chapter/10.1007/978-3-032-10590-5_1" + tags: [qmc, tutorial] + related_projects: [QMCPy, QuasiMC.jl] + featured: true + description: "A tutorial on what quasi-Monte Carlo is, why it can improve upon ordinary Monte Carlo, and how problems can be formulated to benefit from QMC." diff --git a/index.qmd b/index.qmd index 041760d..aaa1dc2 100644 --- a/index.qmd +++ b/index.qmd @@ -5,52 +5,96 @@ toc: false --- ::: {.hero} -:::: {.grid .align-items-center} -::: {.g-col-12 .g-col-lg-8 .hero-copy} -## Quasi-Monte Carlo methods in Python (QMCPy) +::: {.hero-copy} +## Open software for quasi-Monte Carlo -An open-source Python library for quasi-Monte Carlo sampling and integration +QMCSoftware brings together open-source projects for quasi-Monte Carlo methods: +libraries for Python and Julia, sequence generators in OpenCL and C, and shared +low-discrepancy construction data. :::{.hero-actions} -[Read the documentation](https://qmcsoftware.github.io/QMCSoftware/){.btn .btn-primary} -[View QMCPy on GitHub](https://github.com/QMCSoftware/QMCSoftware){.btn .btn-outline-primary} +[Explore the software](software/index.qmd){.btn .btn-primary} +[Visit QMCSoftware on GitHub](https://github.com/QMCSoftware){.btn .btn-outline-primary} ::: ::: +::: + +## The QMCSoftware family + +:::: {.software-grid} +::: {.software-card} +### QMCPy -::: {.g-col-12 .g-col-lg-4 .hero-mark} - +Quasi-Monte Carlo community software in Python, with modular point generators, +measure transforms, integrands, and adaptive stopping criteria. + +[Explore QMCPy →](software/qmcpy.qmd) ::: -:::: + +::: {.software-card} +### QMCToolsCL + +Quasi-Monte Carlo sequence generators implemented in OpenCL and C. + +[Explore QMCToolsCL →](software/qmctoolscl.qmd) ::: -## Explore QMCPy +::: {.software-card} +### QuasiMC.jl + +A Julia port of QMCPy for quasi-Monte Carlo point generation, measure +transforms, and adaptive high-dimensional integration. -:::: {.grid} -::: {.g-col-12 .g-col-md-4} -### Learn +[Explore QuasiMC.jl →](software/quasimc-jl.qmd) +::: + +::: {.software-card} +### LDData -Use the existing technical documentation for installation, examples, demos, -and the package reference. +Low-discrepancy generating vectors and matrices, together with proposed simple +text formats for sharing them. -[Open the documentation →](https://qmcsoftware.github.io/QMCSoftware/) +[Explore LDData →](software/lddata.qmd) ::: +:::: -::: {.g-col-12 .g-col-md-4} -### Follow +## Explore the community -The [blog](blog/index.qmd) and [news and events](news/index.qmd) sections will -collect project updates as the site develops. +:::: {.pathway-grid} +::: {.pathway-card} +### Blog + +Articles and updates from across the QMCSoftware projects. + +[Read the blog →](blog/index.qmd) +::: + +::: {.pathway-card} +### Publications + +A developing guide to publications and software citation resources. + +[Browse publications →](publications/index.qmd) ::: -::: {.g-col-12 .g-col-md-4} -### Participate +::: {.pathway-card} +### News & Events + +Confirmed announcements, releases, talks, workshops, and events. + +[See news and events →](news/index.qmd) +::: + +::: {.pathway-card} +### Community + +Find maintained contribution resources and ways to connect with the projects. -Visit the [community page](community/index.qmd) for established ways to learn -about and contribute to the project. +[Visit the community page →](community/index.qmd) ::: :::: ::: {.callout-note appearance="simple"} -This public website is an early prototype. QMCPy's maintained technical -documentation continues to live at the documentation link above. +This umbrella website is an early prototype. Technical documentation remains +with each software project and is linked from its page. ::: diff --git a/news/fred-hickernell-siam-fellow/index.qmd b/news/fred-hickernell-siam-fellow/index.qmd new file mode 100644 index 0000000..b53c3a0 --- /dev/null +++ b/news/fred-hickernell-siam-fellow/index.qmd @@ -0,0 +1,25 @@ +--- +title: "Fred Hickernell Named a 2026 SIAM Fellow" +date: 2026-04-27 +description: "Illinois Tech professor recognized for innovations in high-dimensional integration and approximation and for scientific leadership." +categories: + - Recognition + - Community +--- + +Illinois Tech Professor Fred Hickernell was named to the 2026 class of Fellows +of the Society for Industrial and Applied Mathematics (SIAM). The distinction +recognizes his mathematical and statistical innovations in high-dimensional +integration and approximation, as well as his scientific leadership. + +The Illinois Tech article also highlights the open-source software developed by +Hickernell's research group and collaborators, including +[QMCPy](../../software/qmcpy.qmd), which makes quasi-Monte Carlo methods +available in Python. + +::: {.callout-note appearance="simple"} +**Source:** Illinois Institute of Technology, April 27, 2026. + +[Read the original Illinois Tech +article](https://www.iit.edu/news/applied-mathematics-professor-honored-siam-fellow){.btn .btn-primary} +::: diff --git a/news/index.qmd b/news/index.qmd index c3d77b9..2a65ef3 100644 --- a/news/index.qmd +++ b/news/index.qmd @@ -1,7 +1,17 @@ --- title: "News & Events" -description: "News and events from the QMCPy project." +description: "News and events from the QMCSoftware projects." +listing: + contents: + - "*/index.qmd" + type: default + sort: "date desc" + fields: + - date + - title + - description + - categories --- -This section is ready for confirmed QMCPy announcements and event information. -No placeholder stories or dates have been added. +Confirmed announcements, releases, talks, workshops, and events from the +QMCSoftware community. diff --git a/publications/README.md b/publications/README.md new file mode 100644 index 0000000..fc77c29 --- /dev/null +++ b/publications/README.md @@ -0,0 +1,58 @@ +# Publication data convention + +The website uses three deliberately separate citation conventions: + +1. Blog citations remain ordinary, hard-coded Markdown within each blog post. + Do not create or use a shared BibTeX file for blogs at this stage. +2. `HickernellAcademicLib/classlib/quarto/metadata/hickernell-papers.yml` + remains the broad shared scholarly reference registry. +3. This repository's `data/publications.yml` is the website-owned, curated + catalog. It contains only publications selected for the QMCSoftware + website. + +Relevant AcademicLib records may be copied manually into the website catalog. +Before adding them, verify and correct the bibliographic metadata and add +website-specific fields such as an original summary, related projects, tags, +and featured status. The website does not read from AcademicLib at build time, +and no synchronization machinery is part of this prototype. + +Quarto reads `data/publications.yml` directly and formats the general catalog +on `publications/index.qmd` with `publications/catalog.ejs.md`. Display order is +independent of the records' physical YAML order: publications are sorted by +year descending and then title ascending within each year. The template groups +ordinary publications under year headings. + +## Record convention + +Each record should have a stable key, preferably matching its AcademicLib key +when one exists. It should include: + +- verified bibliographic fields, an `authors` list, and authoritative URLs; +- tags and related QMCSoftware projects; +- an optional `featured` status; +- an original `description` used as the website's short summary. + +An ordinary publication needs only one YAML record. Do not add a slug, rendered +path, publication folder, or separate QMD page. The custom catalog template +prints the title, authors, year, venue, volume and pages when present, links, +tags, and related projects directly on the Publications page. + +The introductory tutorial is written by hand as the featured item on +`publications/index.qmd`. Its YAML record remains for catalog consistency and +has `featured: true`, so it is omitted from the general catalog and is not +displayed twice. + +## Contribution workflow + +1. Add one verified record to `data/publications.yml`. +2. Render the complete site with `quarto render`. +3. Confirm the publication appears correctly on the Publications page. + +That single YAML edit is the complete source change required for an ordinary +publication. + +The AcademicLib record `hickirsor_2026_qmc_tutorial` should later be enriched +with the website's structured fields and corrected to replace its current +arXiv DOI with the final Springer DOI, +`10.1007/978-3-032-10590-5_1`. AcademicLib is not modified as part of this +website task. diff --git a/publications/catalog.ejs.md b/publications/catalog.ejs.md new file mode 100644 index 0000000..717e76f --- /dev/null +++ b/publications/catalog.ejs.md @@ -0,0 +1,40 @@ +::: {.publication-catalog} + +<% let currentYear = null; %> +<% for (const item of items) { %> + +<% if (item.year !== currentYear) { currentYear = item.year; %> +### <%= item.year %> +<% } %> + +::: {.publication-item} + +#### <%= item.title %> + +**<%= item.authors.join(", ") %>** + +*<%= item.venue %>*<% if (item.series) { %>, <%= item.series %><% } %><% if (item.volume) { %>, volume <%= item.volume %><% } %><% if (item.pages) { %>, pages <%= item.pages %><% } %>, <%= item.year %>. + +<% if (item.doi_url || item.publisher_url || item.arxiv_url) { %> +:::{.project-links} +<% if (item.doi_url) { %>[DOI](<%= item.doi_url %>){.btn .btn-primary}<% } %> +<% if (item.publisher_url) { %>[Publisher](<%= item.publisher_url %>){.btn .btn-outline-primary}<% } %> +<% if (item.arxiv_url) { %>[arXiv](<%= item.arxiv_url %>){.btn .btn-outline-primary}<% } %> +::: +<% } %> + +<%= item.description %> + +<% if (item.tags && item.tags.length) { %> +**Tags:** <%= item.tags.join(", ") %> +<% } %> + +<% if (item.related_projects && item.related_projects.length) { %> +**Related projects:** <%= item.related_projects.join(", ") %> +<% } %> + +::: + +<% } %> + +::: diff --git a/publications/index.qmd b/publications/index.qmd new file mode 100644 index 0000000..3a3c199 --- /dev/null +++ b/publications/index.qmd @@ -0,0 +1,67 @@ +--- +title: "Publications" +description: "Publication and citation resources for QMCSoftware projects." +listing: + id: publication-catalog + contents: + - "../data/publications.yml" + template: catalog.ejs.md + sort: + - "year desc" + - "title asc" + exclude: + featured: true + sort-ui: false + filter-ui: false +--- + +This section collects reviewed publications connected with QMCSoftware and +quasi-Monte Carlo methods. It will grow incrementally rather than attempting +to infer a complete bibliography. + +Each item has a short, original description and links to authoritative +publication records or accessible preprints. Structured citation metadata is +kept locally in [`data/publications.yml`](../data/publications.yml), which +drives the general catalog below. + +## Featured introduction + +::: {.featured-publication} +### Quasi-Monte Carlo Methods: What, Why, and How? + +**Fred J. Hickernell, Nathan Kirk, and Aleksei G. Sorokin** + +*Monte Carlo and Quasi-Monte Carlo 2024*, Springer Proceedings in Mathematics +& Statistics, volume 522, pages 3–40, 2026. + +:::{.project-links} +[DOI](https://doi.org/10.1007/978-3-032-10590-5_1){.btn .btn-primary} +[Springer](https://link.springer.com/chapter/10.1007/978-3-032-10590-5_1){.btn .btn-outline-primary} +[arXiv](https://arxiv.org/abs/2502.03644){.btn .btn-outline-primary} +::: + +This paper is a tutorial on what quasi-Monte Carlo is, why it can improve upon +ordinary Monte Carlo, and how problems can be formulated to benefit from QMC. +::: + +## Publication catalog + +Additional publications will appear here as verified records are added to the +YAML catalog. + +::: {#publication-catalog} +::: + +## Scope + +The collection may include publications that describe QMCSoftware projects, +develop methods implemented in them, or demonstrate relevant applications. +All metadata should be checked against the publisher or another authoritative +record before publication. + +## Software citation resources + +- [QMCPy citation file](https://github.com/QMCSoftware/QMCSoftware/blob/main/cite_qmcpy.bib) +- [QuasiMC.jl citation file](https://github.com/QMCSoftware/QuasiMC.jl/blob/develop/cite_quasimcjl.bib) +- [QMCToolsCL repository](https://github.com/QMCSoftware/QMCToolsCL) +- [LDData repository](https://github.com/QMCSoftware/LDData) diff --git a/software/index.qmd b/software/index.qmd new file mode 100644 index 0000000..428617f --- /dev/null +++ b/software/index.qmd @@ -0,0 +1,48 @@ +--- +title: "Software" +description: "Open-source quasi-Monte Carlo software and data from QMCSoftware." +--- + +QMCSoftware brings together projects that support quasi-Monte Carlo work +across programming languages, sequence generation, numerical integration, and +shared low-discrepancy construction data. + +:::: {.software-grid} +::: {.software-card} +### QMCPy + +Quasi-Monte Carlo community software in Python, with modular point generators, +measure transforms, integrands, and adaptive stopping criteria. + +[Explore QMCPy →](qmcpy.qmd) +::: + +::: {.software-card} +### QMCToolsCL + +Quasi-Monte Carlo sequence generators implemented in OpenCL and C. + +[Explore QMCToolsCL →](qmctoolscl.qmd) +::: + +::: {.software-card} +### QuasiMC.jl + +A Julia port of QMCPy for quasi-Monte Carlo point generation, measure +transforms, and adaptive high-dimensional integration. + +[Explore QuasiMC.jl →](quasimc-jl.qmd) +::: + +::: {.software-card} +### LDData + +Low-discrepancy generating vectors and matrices, together with proposed simple +text formats for sharing them. + +[Explore LDData →](lddata.qmd) +::: +:::: + +Technical details, installation instructions, and contribution guidance remain +with each project and are linked from its page. diff --git a/software/lddata.qmd b/software/lddata.qmd new file mode 100644 index 0000000..486ac11 --- /dev/null +++ b/software/lddata.qmd @@ -0,0 +1,27 @@ +--- +title: "LDData" +description: "Low-discrepancy generating vectors, matrices, and file formats." +--- + +::: {.project-summary} +LDData collects low-discrepancy generating vectors and matrices and proposes +standard text formats for describing lattice rules, polynomial lattice rules, +digital nets, and Sobol' points. +::: + +:::{.project-links} +[GitHub repository](https://github.com/QMCSoftware/LDData){.btn .btn-primary} +::: + +## What the project provides + +The project aims to make construction data straightforward to share and read +across programming languages. Its README describes simple, relatively compact +text formats with human-readable headers and no more than one data line per +dimension. + +The repository is the maintained source for the proposed formats, examples, +and data files. + +- [Format descriptions and data](https://github.com/QMCSoftware/LDData) +- [Repository contents](https://github.com/QMCSoftware/LDData) diff --git a/software/qmcpy.qmd b/software/qmcpy.qmd new file mode 100644 index 0000000..f4abb32 --- /dev/null +++ b/software/qmcpy.qmd @@ -0,0 +1,33 @@ +--- +title: "QMCPy" +description: "Quasi-Monte Carlo community software in Python." +--- + +::: {.project-summary} +QMCPy is a Python framework for quasi-Monte Carlo sampling and integration. Its +plug-and-play components cover discrete distributions, measure transforms, +integrands, and stopping criteria. +::: + +:::{.project-links} +[Documentation](https://qmcsoftware.github.io/QMCSoftware/){.btn .btn-primary} +[GitHub repository](https://github.com/QMCSoftware/QMCSoftware){.btn .btn-outline-primary} +::: + +## What the project provides + +QMCPy is designed around the interacting components of a quasi-Monte Carlo +integration problem. The shared interfaces allow developers to add sampling +schemes, integrands, and stopping criteria, while practitioners can combine +implemented components for applications. + +The maintained documentation includes installation instructions, a package +reference with doctests, mathematical descriptions, and rendered example +notebooks. + +## Start with the maintained resources + +- [QMCPy documentation](https://qmcsoftware.github.io/QMCSoftware/) +- [Installation and quick-start resources](https://qmcsoftware.github.io/QMCSoftware/) +- [Contributing guidelines](https://qmcsoftware.github.io/QMCSoftware/CONTRIBUTING/) +- [Citation information](https://github.com/QMCSoftware/QMCSoftware/blob/main/cite_qmcpy.bib) diff --git a/software/qmctoolscl.qmd b/software/qmctoolscl.qmd new file mode 100644 index 0000000..1ec8f50 --- /dev/null +++ b/software/qmctoolscl.qmd @@ -0,0 +1,24 @@ +--- +title: "QMCToolsCL" +description: "Quasi-Monte Carlo sequence generators in OpenCL and C." +--- + +::: {.project-summary} +QMCToolsCL provides quasi-Monte Carlo sequence generators implemented in +OpenCL and C. +::: + +:::{.project-links} +[Documentation](https://qmcsoftware.github.io/QMCToolsCL/){.btn .btn-primary} +[GitHub repository](https://github.com/QMCSoftware/QMCToolsCL){.btn .btn-outline-primary} +::: + +## Maintained resources + +The project's technical documentation and source repository are the +authoritative places for supported generators, interfaces, installation, and +development information. + +- [QMCToolsCL documentation](https://qmcsoftware.github.io/QMCToolsCL/) +- [Source code](https://github.com/QMCSoftware/QMCToolsCL) +- [Contributing guidelines](https://github.com/QMCSoftware/QMCToolsCL/blob/main/CONTRIBUTING.md) diff --git a/software/quasimc-jl.qmd b/software/quasimc-jl.qmd new file mode 100644 index 0000000..71e0833 --- /dev/null +++ b/software/quasimc-jl.qmd @@ -0,0 +1,32 @@ +--- +title: "QuasiMC.jl" +description: "Quasi-Monte Carlo community software in Julia." +--- + +::: {.project-summary} +QuasiMC.jl is a Julia port of QMCPy. It provides quasi-Monte Carlo point +generators, measure transforms, integrands, and adaptive stopping criteria for +high-dimensional numerical integration. +::: + +:::{.project-links} +[Documentation](https://qmcsoftware.github.io/QuasiMC.jl/){.btn .btn-primary} +[GitHub repository](https://github.com/QMCSoftware/QuasiMC.jl){.btn .btn-outline-primary} +::: + +## What the project provides + +QuasiMC.jl follows the same component model as QMCPy: a discrete distribution, +a true measure, an integrand, and a stopping criterion. The repository +describes these as plug-and-play implementations whose components compose +naturally within the Julia library. + +The maintained documentation includes API references, doctests, and rendered +demo notebooks. + +## Start with the maintained resources + +- [QuasiMC.jl documentation](https://qmcsoftware.github.io/QuasiMC.jl/) +- [Source and installation instructions](https://github.com/QMCSoftware/QuasiMC.jl) +- [Contributing guidelines](https://github.com/QMCSoftware/QuasiMC.jl/blob/develop/CONTRIBUTING.md) +- [Citation information](https://github.com/QMCSoftware/QuasiMC.jl/blob/develop/cite_quasimcjl.bib) diff --git a/styles/custom.scss b/styles/custom.scss index 23959fd..12830e3 100644 --- a/styles/custom.scss +++ b/styles/custom.scss @@ -53,7 +53,7 @@ main.content { } .hero h2 { - max-width: 16ch; + max-width: 18ch; margin-top: 0; font-size: clamp(2.2rem, 6vw, 4.25rem); line-height: 1.05; @@ -61,7 +61,7 @@ main.content { } .hero-copy > p { - max-width: 48rem; + max-width: 54rem; font-size: 1.375rem; } @@ -108,6 +108,82 @@ main.content { margin-top: 0; } +.software-grid, +.pathway-grid { + display: grid; + gap: 1.25rem; + margin: 1.5rem 0 2.75rem; +} + +.software-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.pathway-grid { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.software-card, +.pathway-card { + display: flex; + flex-direction: column; + padding: 1.5rem; + border: 1px solid rgba(7, 59, 76, 0.16); + border-radius: 0.75rem; + background: #ffffff; + box-shadow: 0 0.4rem 1.2rem rgba(7, 59, 76, 0.06); +} + +.software-card { + border-top: 0.3rem solid #0b6e69; +} + +.software-card h3, +.pathway-card h3 { + margin-top: 0; +} + +.software-card p:last-child, +.pathway-card p:last-child { + margin-top: auto; + margin-bottom: 0; + padding-top: 0.5rem; + font-weight: 650; +} + +.project-links { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; + margin: 1.5rem 0 2rem; +} + +.project-summary { + padding: 1.25rem 1.5rem; + border-left: 0.3rem solid #0b6e69; + background: rgba(11, 110, 105, 0.06); +} + +.featured-publication, +.publication-item { + margin: 1.25rem 0 2rem; + padding: 1.5rem; + border: 1px solid rgba(7, 59, 76, 0.16); + border-radius: 0.75rem; + background: #ffffff; + box-shadow: 0 0.4rem 1.2rem rgba(7, 59, 76, 0.06); +} + +.featured-publication { + border-top: 0.3rem solid #0b6e69; +} + +.featured-publication h3, +.publication-item h3, +.publication-item h4 { + margin-top: 0; +} + @media (max-width: 575.98px) { .hero { padding: 2rem 1.35rem; @@ -125,4 +201,15 @@ main.content { .hero-actions .btn { width: 100%; } + + .software-grid, + .pathway-grid { + grid-template-columns: 1fr; + } +} + +@media (min-width: 576px) and (max-width: 991.98px) { + .pathway-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } } From 75673a6977177ace825b2acb383f963790685add Mon Sep 17 00:00:00 2001 From: "Fred J. Hickernell" Date: Wed, 29 Jul 2026 17:12:39 -0500 Subject: [PATCH 2/2] Add pull request site preview artifact --- .github/workflows/quarto-pr-preview.yml | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/quarto-pr-preview.yml diff --git a/.github/workflows/quarto-pr-preview.yml b/.github/workflows/quarto-pr-preview.yml new file mode 100644 index 0000000..50ce515 --- /dev/null +++ b/.github/workflows/quarto-pr-preview.yml @@ -0,0 +1,28 @@ +name: Build Quarto PR preview + +on: + pull_request: + branches: [main] + +permissions: + contents: read + +jobs: + render: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: quarto-dev/quarto-actions/setup@v2 + + - name: Render website + run: quarto render + + - name: Upload rendered website + uses: actions/upload-artifact@v4 + with: + name: qmcsoftware-site-pr-${{ github.event.pull_request.number }} + path: _site + if-no-files-found: error + retention-days: 14