diff --git a/artifact-bib.yml b/artifact-bib.yml index 394a32b09d35888c8abc8c371fa9e64169f2f7ab..d48238dc7a3926eae5025777053743f01d8cdabf 100644 --- a/artifact-bib.yml +++ b/artifact-bib.yml @@ -1,4 +1,14 @@ -lightpredenergy: +tpdspaper: + type: Article + title: Scheduling with lightweight predictions in power-constrained HPC platforms + author: ["Carastan-Santos, Danilo", "Da Costa, Georges", "Fontana de Nardin, Igor", "Poquet, Millian", "Rzadca, Krzysztof", "Stolf, Patricia", "Trystram, Denis"] + date: 2024-10-21 + #url: "TODO" + parent: + type: Periodical + title: IEEE Transactions on Parallel and Distributed Systems + +europarpaper: type: Article title: Light-weight prediction for improving energy consumption in HPC platforms author: ["Carastan-Santos, Danilo", "Da Costa, Georges", "Poquet, Millian", "Stolf, Patricia", "Trystram, Denis"] diff --git a/artifact-overview.typ b/artifact-overview.typ index ffd167d3358ac1d3794b5997c8538bca51fb582f..236be3d343c06c491ac982509b4869d02a14b47f 100644 --- a/artifact-overview.typ +++ b/artifact-overview.typ @@ -1,11 +1,10 @@ #import "@preview/big-todo:0.2.0": * #import "@preview/showybox:2.0.1": showybox -#let artifact-code-git-repo = "https://framagit.org/batsim/artifact-europar24-lightweight-power-pred-sched" -#let artifact-code-git-repo-clone-url = "https://framagit.org/batsim/artifact-europar24-lightweight-power-pred-sched.git" -#let artifact-code-git-repo-irit = "https://gitlab.irit.fr/sepia-pub/open-science/artifact-europar24-lightweight-power-pred-sched" -#let artifact-code-sh-permalink = "https://archive.softwareheritage.org/swh:1:rev:5a15139dadde8d923703ece93745fa250b1a0c53;origin=https://framagit.org/batsim/artifact-europar24-lightweight-power-pred-sched.git;visit=swh:1:snp:968650e57128ea88b02a858279a7054f62f0a0b0" -#let artifact-code-git-commit = "5a15139dadde8d923703ece93745fa250b1a0c53" +#let artifact-code-git-repo = "https://gitlab.irit.fr/sepia-pub/open-science/artifact-tpds24-sched-lightweight-pred-power-constrained-platf" +#let artifact-code-git-repo-clone-url = "https://gitlab.irit.fr/sepia-pub/open-science/artifact-tpds24-sched-lightweight-pred-power-constrained-platf.git" +#let artifact-code-sh-permalink = "https://archive.softwareheritage.org/swh:1:rev:f8b56aa2c655f038ff2006bcb59d0417ba775658;origin=https://gitlab.irit.fr/sepia-pub/open-science/artifact-tpds24-sched-lightweight-pred-power-constrained-platf;visit=swh:1:snp:668971e14e6215bd9c6850cd0ccca39b00fd2151" +#let artifact-code-git-commit = "f8b56aa2c655f038ff2006bcb59d0417ba775658" #let zenodo-doi = "10.5281/zenodo.13961003" #let zenodo-url = "https://doi.org/" + zenodo-doi @@ -70,14 +69,14 @@ #show par: set block(spacing: 4mm) #set text(size: 12pt) #set align(left) - *Conference.* Euro-Par 2024\ - *Article.* Light-weight prediction for improving energy consumption in HPC platforms\ + *Journal.* TPDS\ + *Article.* Scheduling with lightweight predictions in power-constrained HPC platforms\ *Quick links*. #set list(marker: none, body-indent: 3.5mm) // - Preprint PDF on HAL. #url("https://hal.science/hal-04566184") - Artifact data on Zenodo. #url(zenodo-url) - Artifact Nix binary cache. #url("https://lightweight-pred-sched-europar24.cachix.org") - - Artifact code Git repository. #link(artifact-code-git-repo-irit)[IRIT], #link(artifact-code-git-repo)[Framagit] + - Artifact code Git repository. #link(artifact-code-git-repo)[IRIT] - Artifact code permalink. #link(artifact-code-sh-permalink)[Software Heritage] #line(length:100%, stroke: .5mm) ] @@ -85,7 +84,7 @@ //#outline(indent: 5mm) = Introduction -This document shows how to reproduce the experimental sections (6.2 to 6.5) of article @lightpredenergy. +This document shows how to reproduce the experimental sections (6.2 to 6.5) of article @tpdspaper, which is an extension of article @europarpaper. We hope that this document is enough to reproduce the whole experiments from scratch. However, as reproducing the exact analyses and experiments conducted by the authors requires to download and store lots of input trace data (#box([$tilde.eq$ 300 Go)]) and to do some heavy computations, various intermediate and final results have been cached and made available on #link(zenodo-url)[Zenodo] to enable the reproduction of only subparts of the experimental pipeline. In particular, the final analyses of the article are done in standalone notebooks whose input data is available and small. @@ -109,7 +108,7 @@ The MD5 hashes have been computed by #link("https://www.gnu.org/software/coreuti ] = Getting Started Guide -All the software environments required to reproduce the analyses and experiments of article @lightpredenergy are open source and have been packaged with #link("https://nixos.org/", [Nix]). +All the software environments required to reproduce the analyses and experiments of article @tpdspaper are open source and have been packaged with #link("https://nixos.org/", [Nix]). Nix can build the *full* software stack needed for this experiment as long as source code remains available. As we also put most of the source code needed by this artifact on #link("https://www.softwareheritage.org/")[Software Heritage] we hope that this artifact will have long-term longevity. For the sake of this artifact reviewers' quality of life, we have set up a binary cache with precompiled versions of the software used in the experiments. No special hardware is required to reproduce our work. Our Nix environments are likely to work on future Nix versions, but for the sake of traceability we stress that we have used Nix 2.18.0 installed either by #link("https://archive.softwareheritage.org/swh:1:rev:b5b47f1ea628ecaad5f2d95580ed393832b36dc8;origin=https://github.com/DavHau/nix-portable;visit=swh:1:snp:318694dfdf0449f0a95b20aab7e8370cff809a66")[nix-portable 0.10.0] or directly available via NixOS using channel `23-11`. @@ -227,7 +226,7 @@ defines how to build and use the software environments used to reproduce all our These environments are named _shells_ in Nix terminology. Nix builds software in isolated (filesystem, network...) sandboxes to remove most sources of non-determinism, and forces inputs (source code, dependencies) to have well-defined versions (well defined content hash and version control commit). -Our artifact Git repository *directly* defines how the scripts used to reproduce Article @lightpredenergy should be built, +Our artifact Git repository *directly* defines how the scripts used to reproduce Article @tpdspaper should be built, as the source code of these scripts is inside our artifact Git repository. Software that we manage but whose source code is stored in another repository (_e.g._, the scheduler implementation used in our scheduling experiment, the Batsim simulator...) define how they should be built in their own Git repository. Software that we do not manage but that we use is either imported from the repository of the software itself if they use flakes (_e.g._, Typst), imported from #link("https://github.com/NixOS/nixpkgs")[nixpkgs] if possible (_e.g._, gzip), or otherwise defined in our artifact Git repository (_e.g._, Python's fastparquet library). @@ -244,7 +243,7 @@ For the sake of traceability, here are the software versions that we think are t - SimGrid release 3.34 (commit `036c801d55e3ab07b470c79640109080fed049a1`) - intervalset commit `13d8f2d7000d4dc4e3202422658b0b5d83f83679` - batprotocol commit `25bc5bbf039c18a8024c4ab326047ba56800376a` -- easy-powercap release europar24 (commit `659660c35650e9f46ec47e8c0743d75649e68d7b`) +- easy-powercap release tpds24 (commit `1d7b8b0346fe21fdfa866cb76adcb839b3d51a7a`) - Batsim commit `ee797ccebbb95410479663ee0547e752112fc83e` - Python 3.11.6 - Pandas 2.1.1 @@ -254,8 +253,8 @@ For the sake of traceability, here are the software versions that we think are t - Typst commit `21c78abd6eecd0f6b3208405c7513be3bbd8991c` (after 0.11.0) = Step-by-Step Instructions -All the scripts strongly related to the experiments of Article @lightpredenergy are available on -#link(artifact-code-git-repo)[the Framagit GitLab instance], and on +All the scripts strongly related to the experiments of Article @tpdspaper are available on +#link(artifact-code-git-repo)[the IRIT GitLab instance], and on #link(artifact-code-sh-permalink)[Software Heritage] for long-term longevity. The repository can be cloned with the following commands. @@ -279,7 +278,7 @@ git checkout ARTIFACT-COMMIT" *All commands* below should be executed from the *root of the cloned Git repository*. The step-by-step instructions of this document can be used in several ways *depending on your goal*. -+ You can *check* the final analyses (code + plots) done in Article @lightpredenergy by reading the provided pre-rendered notebooks available on #link(zenodo-url)[Zenodo]. ++ You can *check* the final analyses (code + plots) done in Article @tpdspaper by reading the provided pre-rendered notebooks available on #link(zenodo-url)[Zenodo]. + You can *reproduce* the *final analyses* by first downloading the provided aggregated results of the experiments from #link(zenodo-url)[Zenodo], and then by running the notebooks yourself. This enables you to *edit* our notebooks before running them, so that you can to modify the analyses done or add your own. - Refer to @sec-analyze-prediction-results for instructions to analyze the results of the machine learning experiment. @@ -492,7 +491,7 @@ The following command populates the `./user-power-predictions/data` by extractin ``` ] -The analysis of the predictions, which also generates Figures 2 and 3 of Article @lightpredenergy, can be reproduced with the following command. +The analysis of the predictions, which also generates Figures 2 and 3 of Article @tpdspaper, can be reproduced with the following command. #fullbox(footer:[Time (laptop): 00:00:20.])[ ```sh @@ -517,7 +516,7 @@ The analysis of the predictions, which also generates Figures 2 and 3 of Article ] == Job scheduling with power prediction <sec-sched> -This section shows how to reproduce Sections 6.4 and 6.5 of article @lightpredenergy. +This section shows how to reproduce Sections 6.4 and 6.5 of article @tpdspaper. === Prepare all the files required to run the simulation ==== Generate a SimGrid platform <sec-gen-sg-platform> @@ -656,7 +655,7 @@ In particular to populate the `/tmp/wlds` directory you can *download file* `wor ] === Analyze the simulation campaign results <sec-analyze-simu-campaign-results> -The following command runs a notebook that analyze the aggregated results of the simulation campaign, and outputs Figure 4 and Figure 5 of Article @lightpredenergy. +The following command runs a notebook that analyze the aggregated results of the simulation campaign, and outputs Figure 4 and Figure 5 of Article @tpdspaper. Required input files. - `expe-sched/simu-campaign-agg-result.csv`, the simulation campaign main output of @sec-run-simu-campaign. @@ -683,4 +682,4 @@ Required input files. Their content should be completely reproducible though. ] -#bibliography("artifact-bib.yml") +#bibliography("artifact-bib.yml", style: "./ieee-no-et-al.csl") diff --git a/ieee-no-et-al.csl b/ieee-no-et-al.csl new file mode 100644 index 0000000000000000000000000000000000000000..d5383db3aedcd21f50f2d44776a651608776a0dd --- /dev/null +++ b/ieee-no-et-al.csl @@ -0,0 +1,512 @@ +<?xml version="1.0" encoding="utf-8"?> +<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0" demote-non-dropping-particle="sort-only"> + <info> + <title>IEEE</title> + <id>http://www.zotero.org/styles/ieee</id> + <link href="http://www.zotero.org/styles/ieee" rel="self"/> + <!-- <link href="https://ieeeauthorcenter.ieee.org/wp-content/uploads/IEEE-Reference-Guide.pdf" rel="documentation"/> - 2018 guidelines --> + <link href="http://journals.ieeeauthorcenter.ieee.org/wp-content/uploads/sites/7/IEEE_Reference_Guide.pdf" rel="documentation"/> + <link href="https://journals.ieeeauthorcenter.ieee.org/your-role-in-article-production/ieee-editorial-style-manual/" rel="documentation"/> + <author> + <name>Michael Berkowitz</name> + <email>mberkowi@gmu.edu</email> + </author> + <contributor> + <name>Julian Onions</name> + <email>julian.onions@gmail.com</email> + </contributor> + <contributor> + <name>Rintze Zelle</name> + <uri>http://twitter.com/rintzezelle</uri> + </contributor> + <contributor> + <name>Stephen Frank</name> + <uri>http://www.zotero.org/sfrank</uri> + </contributor> + <contributor> + <name>Sebastian Karcher</name> + </contributor> + <contributor> + <name>Giuseppe Silano</name> + <email>g.silano89@gmail.com</email> + <uri>http://giuseppesilano.net</uri> + </contributor> + <contributor> + <name>Patrick O'Brien</name> + </contributor> + <contributor> + <name>Brenton M. Wiernik</name> + </contributor> + <contributor> + <name>Oliver Couch</name> + <email>oliver.couch@gmail.com</email> + </contributor> + <category citation-format="numeric"/> + <category field="engineering"/> + <category field="generic-base"/> + <summary>IEEE style as per the 2023 guidelines, V 11.29.2023.</summary> + <updated>2024-03-27T11:41:27+00:00</updated> + <rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights> + </info> + <locale xml:lang="en"> + <date form="text"> + <date-part name="month" form="short" suffix=" "/> + <date-part name="day" form="numeric-leading-zeros" suffix=", "/> + <date-part name="year"/> + </date> + <terms> + <term name="chapter" form="short">ch.</term> + <term name="chapter-number" form="short">ch.</term> + <term name="presented at">presented at the</term> + <term name="available at">available</term> + </terms> + </locale> + <!-- Macros --> + <macro name="status"> + <choose> + <if variable="page issue volume" match="none"> + <text variable="status" text-case="capitalize-first" suffix="" font-weight="bold"/> + </if> + </choose> + </macro> + <macro name="edition"> + <choose> + <if type="bill book chapter graphic legal_case legislation motion_picture paper-conference report song" match="any"> + <choose> + <if is-numeric="edition"> + <group delimiter=" "> + <number variable="edition" form="ordinal"/> + <text term="edition" form="short"/> + </group> + </if> + <else> + <text variable="edition" text-case="capitalize-first" suffix="."/> + </else> + </choose> + </if> + </choose> + </macro> + <macro name="issued"> + <choose> + <if type="article-journal report" match="any"> + <date variable="issued"> + <date-part name="month" form="short" suffix=" "/> + <date-part name="year" form="long"/> + </date> + </if> + <else-if type="bill book chapter graphic legal_case legislation song thesis" match="any"> + <date variable="issued"> + <date-part name="year" form="long"/> + </date> + </else-if> + <else-if type="paper-conference" match="any"> + <date variable="issued"> + <date-part name="month" form="short"/> + <date-part name="year" prefix=" "/> + </date> + </else-if> + <else-if type="motion_picture" match="any"> + <date variable="issued" form="text" prefix="(" suffix=")"/> + </else-if> + <else> + <date variable="issued" form="text"/> + </else> + </choose> + </macro> + <macro name="author"> + <names variable="author"> + <name and="text" et-al-min="10" et-al-use-first="1" initialize-with=". "/> + <label form="short" prefix=", " text-case="capitalize-first"/> + <et-al font-style="italic"/> + <substitute> + <names variable="editor"/> + <names variable="translator"/> + <text macro="director"/> + </substitute> + </names> + </macro> + <macro name="editor"> + <names variable="editor"> + <name initialize-with=". " delimiter=", " and="text"/> + <label form="short" prefix=", " text-case="capitalize-first"/> + </names> + </macro> + <macro name="director"> + <names variable="director"> + <name and="text" et-al-min="7" et-al-use-first="1" initialize-with=". "/> + <et-al font-style="italic"/> + </names> + </macro> + <macro name="locators"> + <group delimiter=", "> + <text macro="edition"/> + <group delimiter=" "> + <text term="volume" form="short"/> + <number variable="volume" form="numeric"/> + </group> + <group delimiter=" "> + <number variable="number-of-volumes" form="numeric"/> + <text term="volume" form="short" plural="true"/> + </group> + <group delimiter=" "> + <text term="issue" form="short"/> + <number variable="issue" form="numeric"/> + </group> + </group> + </macro> + <macro name="title"> + <choose> + <if type="bill book graphic legal_case legislation motion_picture song standard software" match="any"> + <text variable="title" font-style="italic"/> + </if> + <else> + <text variable="title" quotes="true"/> + </else> + </choose> + </macro> + <macro name="publisher"> + <choose> + <if type="bill book chapter graphic legal_case legislation motion_picture paper-conference song" match="any"> + <group delimiter=": "> + <text variable="publisher-place"/> + <text variable="publisher"/> + </group> + </if> + <else> + <group delimiter=", "> + <text variable="publisher"/> + <text variable="publisher-place"/> + </group> + </else> + </choose> + </macro> + <macro name="event"> + <choose> + <!-- Published Conference Paper --> + <if type="paper-conference speech" match="any"> + <choose> + <if variable="container-title" match="any"> + <group delimiter=" "> + <text term="in"/> + <text variable="container-title" font-style="italic"/> + </group> + </if> + <!-- Unpublished Conference Paper --> + <else> + <group delimiter=" "> + <text term="presented at"/> + <text variable="event"/> + </group> + </else> + </choose> + </if> + </choose> + </macro> + <macro name="access"> + <choose> + <if type="webpage post post-weblog" match="any"> + <!-- https://url.com/ (accessed Mon. DD, YYYY). --> + <choose> + <if variable="URL"> + <group delimiter=". " prefix=" "> + <group delimiter=": "> + <text term="accessed" text-case="capitalize-first"/> + <date variable="accessed" form="text"/> + </group> + <text term="online" prefix="[" suffix="]" text-case="capitalize-first"/> + <group delimiter=": "> + <text term="available at" text-case="capitalize-first"/> + <text variable="URL"/> + </group> + </group> + </if> + </choose> + </if> + <else-if match="any" variable="DOI"> + <!-- doi: 10.1000/xyz123. --> + <text variable="DOI" prefix=" doi: " suffix="."/> + </else-if> + <else-if variable="URL"> + <!-- Accessed: Mon. DD, YYYY. [Medium]. Available: https://URL.com/ --> + <group delimiter=". " prefix=" " suffix=". "> + <!-- Accessed: Mon. DD, YYYY. --> + <group delimiter=": "> + <text term="accessed" text-case="capitalize-first"/> + <date variable="accessed" form="text"/> + </group> + <!-- [Online Video]. --> + <group prefix="[" suffix="]" delimiter=" "> + <choose> + <if variable="medium" match="any"> + <text variable="medium" text-case="capitalize-first"/> + </if> + <else> + <text term="online" text-case="capitalize-first"/> + <choose> + <if type="motion_picture"> + <text term="video" text-case="capitalize-first"/> + </if> + </choose> + </else> + </choose> + </group> + </group> + <!-- Available: https://URL.com/ --> + <group delimiter=": " prefix=" "> + <text term="available at" text-case="capitalize-first"/> + <text variable="URL"/> + </group> + </else-if> + </choose> + </macro> + <macro name="page"> + <choose> + <if type="article-journal" variable="number" match="all"> + <group delimiter=" "> + <text value="Art."/> + <text term="issue" form="short"/> + <text variable="number"/> + </group> + </if> + <else> + <group delimiter=" "> + <label variable="page" form="short"/> + <text variable="page"/> + </group> + </else> + </choose> + </macro> + <macro name="citation-locator"> + <group delimiter=" "> + <choose> + <if locator="page"> + <label variable="locator" form="short"/> + </if> + <else> + <label variable="locator" form="short" text-case="capitalize-first"/> + </else> + </choose> + <text variable="locator"/> + </group> + </macro> + <macro name="geographic-location"> + <group delimiter=", " suffix="."> + <choose> + <if variable="publisher-place"> + <text variable="publisher-place" text-case="title"/> + </if> + <else-if variable="event-place"> + <text variable="event-place" text-case="title"/> + </else-if> + </choose> + </group> + </macro> + <!-- Series --> + <macro name="collection"> + <choose> + <if variable="collection-title" match="any"> + <text term="in" suffix=" "/> + <group delimiter=", " suffix=". "> + <text variable="collection-title"/> + <text variable="collection-number" prefix="no. "/> + <text variable="volume" prefix="vol. "/> + </group> + </if> + </choose> + </macro> + <!-- Citation --> + <citation> + <sort> + <key variable="citation-number"/> + </sort> + <layout delimiter=", "> + <group prefix="[" suffix="]" delimiter=", "> + <text variable="citation-number"/> + <text macro="citation-locator"/> + </group> + </layout> + </citation> + <!-- Bibliography --> + <bibliography entry-spacing="0" second-field-align="flush"> + <layout> + <!-- Citation Number --> + <text variable="citation-number" prefix="[" suffix="]"/> + <!-- Author(s) --> + <text macro="author" suffix=", "/> + <!-- Rest of Citation --> + <choose> + <!-- Specific Formats --> + <if type="article-journal"> + <group delimiter=", "> + <text macro="title"/> + <text variable="container-title" font-style="italic" form="short"/> + <text macro="locators"/> + <text macro="page"/> + <text macro="issued"/> + <text macro="status"/> + </group> + <choose> + <if variable="URL DOI" match="none"> + <text value="."/> + </if> + <else> + <text value=","/> + </else> + </choose> + <text macro="access"/> + </if> + <else-if type="paper-conference speech" match="any"> + <group delimiter=", " suffix=", "> + <text macro="title"/> + <text macro="event"/> + <text macro="editor"/> + </group> + <text macro="collection"/> + <group delimiter=", " suffix="."> + <text macro="publisher"/> + <text macro="issued"/> + <text macro="page"/> + <text macro="status"/> + </group> + <text macro="access"/> + </else-if> + <else-if type="chapter"> + <group delimiter=", " suffix="."> + <text macro="title"/> + <group delimiter=" "> + <text term="in" suffix=" "/> + <text variable="container-title" font-style="italic"/> + </group> + <text macro="locators"/> + <text macro="editor"/> + <text macro="collection"/> + <text macro="publisher"/> + <text macro="issued"/> + <group delimiter=" "> + <label variable="chapter-number" form="short"/> + <text variable="chapter-number"/> + </group> + <text macro="page"/> + </group> + <text macro="access"/> + </else-if> + <else-if type="report"> + <group delimiter=", " suffix="."> + <text macro="title"/> + <text macro="publisher"/> + <group delimiter=" "> + <text variable="genre"/> + <text variable="number"/> + </group> + <text macro="issued"/> + </group> + <text macro="access"/> + </else-if> + <else-if type="thesis"> + <group delimiter=", " suffix="."> + <text macro="title"/> + <text variable="genre"/> + <text macro="publisher"/> + <text macro="issued"/> + </group> + <text macro="access"/> + </else-if> + <else-if type="software"> + <group delimiter=". " suffix="."> + <text macro="title"/> + <text macro="issued" prefix="(" suffix=")"/> + <text variable="genre"/> + <text macro="publisher"/> + </group> + <text macro="access"/> + </else-if> + <else-if type="article"> + <group delimiter=", " suffix="."> + <text macro="title"/> + <text macro="issued"/> + <group delimiter=": "> + <text macro="publisher" font-style="italic"/> + <text variable="number"/> + </group> + </group> + <text macro="access"/> + </else-if> + <else-if type="webpage post-weblog post" match="any"> + <group delimiter=", " suffix="."> + <text macro="title"/> + <text variable="container-title"/> + </group> + <text macro="access"/> + </else-if> + <else-if type="patent"> + <group delimiter=", "> + <text macro="title"/> + <text variable="number"/> + <text macro="issued"/> + </group> + <text macro="access"/> + </else-if> + <!-- Online Video --> + <else-if type="motion_picture"> + <text macro="geographic-location" suffix=". "/> + <group delimiter=", " suffix="."> + <text macro="title"/> + <text macro="issued"/> + </group> + <text macro="access"/> + </else-if> + <else-if type="standard"> + <group delimiter=", " suffix="."> + <text macro="title"/> + <group delimiter=" "> + <text variable="genre"/> + <text variable="number"/> + </group> + <text macro="geographic-location"/> + <text macro="issued"/> + </group> + <text macro="access"/> + </else-if> + <!-- Generic/Fallback Formats --> + <else-if type="bill book graphic legal_case legislation report song" match="any"> + <group delimiter=", " suffix=". "> + <text macro="title"/> + <text macro="locators"/> + </group> + <text macro="collection"/> + <group delimiter=", " suffix="."> + <text macro="publisher"/> + <text macro="issued"/> + <text macro="page"/> + </group> + <text macro="access"/> + </else-if> + <else-if type="article-magazine article-newspaper broadcast interview manuscript map patent personal_communication song speech thesis webpage" match="any"> + <group delimiter=", " suffix="."> + <text macro="title"/> + <text variable="container-title" font-style="italic"/> + <text macro="locators"/> + <text macro="publisher"/> + <text macro="page"/> + <text macro="issued"/> + </group> + <text macro="access"/> + </else-if> + <else> + <group delimiter=", " suffix=". "> + <text macro="title"/> + <text variable="container-title" font-style="italic"/> + <text macro="locators"/> + </group> + <text macro="collection"/> + <group delimiter=", " suffix="."> + <text macro="publisher"/> + <text macro="page"/> + <text macro="issued"/> + </group> + <text macro="access"/> + </else> + </choose> + </layout> + </bibliography> +</style>