");--input-focus-border-color:Highlight;--input-focus-outline:1px solid Canvas;--input-unfocused-border-color:transparent;--input-disabled-border-color:transparent;--input-hover-border-color:black;--link-outline:none}@media screen and (forced-colors:active){:root{--input-focus-border-color:CanvasText;--input-unfocused-border-color:ActiveText;--input-disabled-border-color:GrayText;--input-hover-border-color:Highlight;--link-outline:1.5px solid LinkText}}:root{--react-pdf-text-layer:1;--highlight-bg-color:rgba(180, 0, 170, 1);--highlight-selected-bg-color:rgba(0, 100, 0, 1)}@media screen and (forced-colors:active){:root{--highlight-bg-color:Highlight;--highlight-selected-bg-color:ButtonText}}._wrapper_4ijce_1{background-color:#3f51b5;border:1px solid #3f51b5;clear:both}._menubar_4ijce_7{position:sticky;top:-1px;z-index:10;padding-block-start:.2em;padding-block-end:.2em;background-color:#3f51b5;color:#f0f0f0;user-select:none}._menubar_4ijce_7 ._central_4ijce_17{display:flex;gap:.2em;justify-content:center;align-items:baseline;font-variant-numeric:lining-nums tabular-nums}._menubar_4ijce_7 ._left_4ijce_24{position:absolute;left:0;top:.25em;padding-left:.2em}._menubar_4ijce_7 ._right_4ijce_30{position:absolute;right:0;top:.25em;padding-right:.4em}._menubar_4ijce_7 ._page-viewer-container_4ijce_36{display:inline-flex;align-items:stretch;gap:.2em}._menubar_4ijce_7 ._page-viewer_4ijce_36{border:1px solid #f0f0f0;display:inline-block;padding-inline:.2em;padding-block-end:.1em;min-width:1ch;text-align:center;user-select:all}._menubar_4ijce_7 ._page-viewer_4ijce_36:focus{border-color:#ffba67;color:#ffba67;caret-color:#fff}@media (hover:hover){._menubar_4ijce_7 a:hover{color:#ffba67}}._menubar_4ijce_7 button{border:0 solid transparent;background-color:transparent;color:gray;font-size:1rem}._menubar_4ijce_7 button:not([disabled]){color:#f0f0f0;cursor:pointer}@media (hover:hover){._menubar_4ijce_7 button:not([disabled]):hover{color:#ffba67}}._loader_4ijce_76{text-align:center;background-color:#fff;color:gray}._loader_4ijce_76>span{display:inline-block;position:sticky;top:1.5rem;padding-top:2rem}._bibtex_vg9s2_1{display:none;float:right;margin-left:1rem;background-color:#f0f0f0;font-size:.8rem;max-width:min(25em,40vw);position:relative}@media screen and (min-width:38em){._bibtex_vg9s2_1{display:block}}._bibtex_vg9s2_1 ._commands_vg9s2_15{position:absolute;right:0;top:0}._bibtex_vg9s2_1 ._commands_vg9s2_15 ._copy_vg9s2_20{display:inline-block;padding-block-start:.2em;padding-block-end:.3em;padding-inline:.3em;background-color:#fff;border:1px solid #606060;cursor:pointer}._bibtex_vg9s2_1 .highlight{margin:0!important}._bibtex_vg9s2_1 .highlight pre{border:0 none transparent!important;white-space:pre!important;padding-block-start:.2rem;padding-block-end:.4rem;overflow-x:scroll}._bibtex_vg9s2_1 .highlight pre .line-number{display:none!important}body{counter-reset:katexEqnNo mmlEqnNo}:root{--color-prettylights-syntax-comment:#57606a;--color-prettylights-syntax-constant:#0550ae;--color-prettylights-syntax-entity:#6639ba;--color-prettylights-syntax-storage-modifier-import:#24292f;--color-prettylights-syntax-entity-tag:#116329;--color-prettylights-syntax-keyword:#cf222e;--color-prettylights-syntax-string:#0a3069;--color-prettylights-syntax-variable:#953800;--color-prettylights-syntax-brackethighlighter-unmatched:#82071e;--color-prettylights-syntax-invalid-illegal-text:#f6f8fa;--color-prettylights-syntax-invalid-illegal-bg:#82071e;--color-prettylights-syntax-carriage-return-text:#f6f8fa;--color-prettylights-syntax-carriage-return-bg:#cf222e;--color-prettylights-syntax-string-regexp:#116329;--color-prettylights-syntax-markup-list:#3b2300;--color-prettylights-syntax-markup-heading:#0550ae;--color-prettylights-syntax-markup-italic:#24292f;--color-prettylights-syntax-markup-bold:#24292f;--color-prettylights-syntax-markup-deleted-text:#82071e;--color-prettylights-syntax-markup-deleted-bg:#ffebe9;--color-prettylights-syntax-markup-inserted-text:#116329;--color-prettylights-syntax-markup-inserted-bg:#dafbe1;--color-prettylights-syntax-markup-changed-text:#953800;--color-prettylights-syntax-markup-changed-bg:#ffd8b5;--color-prettylights-syntax-markup-ignored-text:#eaeef2;--color-prettylights-syntax-markup-ignored-bg:#0550ae;--color-prettylights-syntax-meta-diff-range:#8250df;--color-prettylights-syntax-brackethighlighter-angle:#57606a;--color-prettylights-syntax-sublimelinter-gutter-mark:#8c959f;--color-prettylights-syntax-constant-other-reference-link:#0a3069}.pl-en{color:var(--color-prettylights-syntax-entity)}.pl-k{color:var(--color-prettylights-syntax-keyword)}.pl-pds,.pl-s{color:var(--color-prettylights-syntax-string)}._header_opib5_1{font-family:Cinzel Variable,serif;font-size:1.25rem;position:relative;color:#fff;background-color:#3f51b5;padding-inline:2.4rem;padding-block-start:.3rem}@media screen and (min-width:38em){._header_opib5_1{padding-inline:3rem;font-size:1.1rem}}._header_opib5_1 ._toggle_opib5_16{font-size:1.5rem;position:absolute;left:.3em;top:.3em;cursor:pointer}@media (hover:hover){._header_opib5_1 ._toggle_opib5_16 :hover{color:#ffba67}}@media screen and (min-width:38em){._header_opib5_1 ._toggle_opib5_16{display:none}}._header_opib5_1>ul{list-style:none;display:flex;flex-direction:column;align-items:center;gap:.2rem}@media screen and (min-width:38em){._header_opib5_1>ul{flex-direction:row;align-items:stretch;gap:1em}}._header_opib5_1>ul>li a{display:flex;align-items:center;height:100%;color:#fff;border-bottom:.2rem solid transparent}@media (hover:hover){._header_opib5_1>ul>li a:hover{color:#ffba67;border-bottom-color:#ffba67}}._header_opib5_1>ul>li:not(:first-child) a{padding-bottom:.2em}@media screen and (min-width:38em){._header_opib5_1>ul>li:not(:first-child) a{padding:0}}._header_opib5_1 ._site-name_opib5_68{position:relative;font-size:1.5rem;font-weight:700;line-height:1.5em}@media not screen and (min-width:38em){._header_opib5_1:not(._open_opib5_75)>ul>li:not(:first-child){display:none}}body,html{position:absolute;inset:0;overflow:hidden}body,h1,html,p,ul{padding:0;margin:0}html{font-size:16px}@media screen and (min-width:58em){html{font-size:24px}}a{color:inherit;text-decoration:inherit}*{box-sizing:border-box}body{position:absolute;inset:0;display:grid;grid-template-rows:auto 1fr;overflow:hidden}._container_1th49_55{font-family:"Exo 2 Variable",sans-serif;display:flex;flex-direction:column;font-size:1rem;overflow:auto;position:relative}._footer_1th49_64{flex:0 0 auto;color:#fff;background-color:#3f51b5;text-align:center;padding:.2rem .2rem .3rem;position:relative;user-select:none}._footer_1th49_64 ._icons_1th49_74{display:none}@media screen and (min-width:38em){._footer_1th49_64 ._icons_1th49_74{display:flex;gap:.3em;position:absolute;left:3rem;bottom:.25rem;text-align:left}}@media screen and (min-width:58em){._footer_1th49_64{font-size:.8rem}}._footer_1th49_64 a{color:#fff;text-decoration:none}@media (hover:hover){._footer_1th49_64 a:hover{color:#ffba67}}._main_1th49_102{flex:1 0 auto;color:#303030;max-width:100em;margin:1rem}@media screen and (min-width:38em){._main_1th49_102{margin:2rem 3rem}}._main_1th49_102>h1:first-child{margin-top:-2rem;padding-top:2rem}._main_1th49_102 h1{font-size:2.25rem;padding-top:1.5rem;padding-bottom:.75rem;font-weight:400}._main_1th49_102 h1{text-align:center}@media screen and (min-width:38em){._main_1th49_102 h1{text-align:left}}._main_1th49_102 p{text-align:justify;hyphens:auto;margin-bottom:.5em}._main_1th49_102 .highlight{margin-block-end:.75em}._main_1th49_102 .highlight .highlight-header{display:none}._main_1th49_102 .highlight pre{border:1px solid #606060;margin:0;white-space:pre-wrap;user-select:contain}._main_1th49_102 .highlight pre>code{font-family:Roboto Mono Variable,monospace;line-height:1.3em;tab-size:2}._main_1th49_102 .highlight pre:not(.one-line)>code{display:table}._main_1th49_102 .highlight pre:not(.one-line)>code .line{display:table-row}._main_1th49_102 .highlight pre:not(.one-line)>code .line .line-number{border-inline-start:2px solid #F0F0F0;display:table-cell;user-select:none;height:100%;padding-inline-start:1em;padding-inline-end:.5em;color:var(--color-prettylights-syntax-sublimelinter-gutter-mark);background-color:#f0f0f0}._main_1th49_102 .highlight pre:not(.one-line)>code .line .text{display:table-cell;width:100%;padding-inline:.5em;overflow-wrap:anywhere}._main_1th49_102 .highlight pre:not(.one-line)>code .line .text .indent{white-space:pre}@media (hover:hover){._main_1th49_102 .highlight pre:not(.one-line)>code .line:hover{background-color:#f0f0f0}._main_1th49_102 .highlight pre:not(.one-line)>code .line:hover .line-number{color:#000;border-inline-start:2px solid #606060;background-color:#e0e0e0}}@font-face{font-family:Cinzel Variable;font-style:normal;font-display:swap;font-weight:400 900;src:url(/_astro/cinzel-latin-ext-wght-normal.9_1vLTtc.woff2) format("woff2-variations");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Cinzel Variable;font-style:normal;font-display:swap;font-weight:400 900;src:url(/_astro/cinzel-latin-wght-normal.DS2jhxdi.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:"Exo 2 Variable";font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/exo-2-cyrillic-ext-wght-normal.B5xQCqZ8.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:"Exo 2 Variable";font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/exo-2-cyrillic-wght-normal.Cho_hbqG.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:"Exo 2 Variable";font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/exo-2-vietnamese-wght-normal.BNOz-EOU.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:"Exo 2 Variable";font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/exo-2-latin-ext-wght-normal.OsFGN4qS.woff2) format("woff2-variations");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"Exo 2 Variable";font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/exo-2-latin-wght-normal.DllOx71z.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:"Exo 2 Variable";font-style:italic;font-display:swap;font-weight:100 900;src:url(/_astro/exo-2-cyrillic-ext-wght-italic.DWfNeZM3.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:"Exo 2 Variable";font-style:italic;font-display:swap;font-weight:100 900;src:url(/_astro/exo-2-cyrillic-wght-italic.U6Mqfn83.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:"Exo 2 Variable";font-style:italic;font-display:swap;font-weight:100 900;src:url(/_astro/exo-2-vietnamese-wght-italic.CCZ786PG.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:"Exo 2 Variable";font-style:italic;font-display:swap;font-weight:100 900;src:url(/_astro/exo-2-latin-ext-wght-italic.0wO9IMfB.woff2) format("woff2-variations");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"Exo 2 Variable";font-style:italic;font-display:swap;font-weight:100 900;src:url(/_astro/exo-2-latin-wght-italic.CbsmNhw9.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Academicons;font-style:normal;font-weight:400;font-display:block;src:url(data:font/woff2;base64,d09GMgABAAAAAARgAAwAAAAABtAAAAQTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAATAgEEQgKhyiGAAsMAAE2AiQDFAQgBYFmByAbSwXILgpsY9rgDQcEHWs2s/qWB5G3hYd4gF/337mDv7Mmq5SQYCUyOQJM66q076e8zze7nvzvwaoEF/QtaZ1pHVTmbeFjAerk9PqlZZh6gEkUWZRoWqvUNJIDJxxJYLkEGFEEx5tt8lLQ2F/Afvqjv0iCudCPSXlcs5NqRS3Wvjo2lmsFqU9QKah3rN0RQXy3dpCE2yEhJQwKU4C+jv+tvBVFJI3BccV837Ap45LgBnN5EzZ3S5NwDboBYdqp5k+JYpRKachhot03CshEou9zWcTz729yOeqFZWKLWA/W5SxYPPQiYdXuEUhBAZQg9AFhDoCFiIjli1ekbaSiDktG7ZnX2Io2jppe5Ho9OJfSeaFotyQkneoEj6qvy6TjPJ1oRMMqmz8XLTF4aGdj02bepapSmfEamTss1Bxh6tyO2oaNdCWjgpvhFAsVVIclpZZPIoWb88RB+UADk7Wr1lcuqVhXtXQeKgC7yhhY7XgAltQ/KO0ahLGnkNL5UH9SVO+QdWEqxjpv6k6A/Ts0jFXDQEiR0NSdsDNQsGQPXkJoOLoRlpy+cAar+0h1E1IO88MTMp5rWL3WRDi0YK2KXbfpe/ZQtncv1XlwGSl9FJaqTiFl26FxzNjBg9Jz+dBBWFJP0/ZgjCTx3nDsetPc0K9qsl55GCmnLmEMBdfv5+EPGHbec1SL1mD9yqRIKC0Qoc8LB15H86cse1Tz3qRu2jhsWEWzuGDpVjUmNBQXjR58ZUb8o7WppRuX5Cw+fmxQVOveeeOSIpbMT17RIXy3x+6VS8oSxpbWPxkVj2rrO3Uog8LPRabMYTu50W7dXG4pUnb9ErK1CWljKyrKA8tEec3DLWvoFa+detZkYuoZnfCkRW3aF7UMdlT9Ux6Vqt28ebuMDl0y2oW0bJc+e9zLXNnwjyj0tl7rYOyomf5LPduO9kw8RtfyXIp9nCshsLCU/XjTrzO2pt1LNpiPi5WZ3becWLdvHH6vKLv+PL/9RlEMivOtdqClZzx/aW5Vl+m/qp9meUXPHvJx2L4s+GeFNS3Iu36Hvn1au4LjI4jz7FEXmUpcu4+4oHc0YNXcVq3npfyYV6b9xnZ048nn3/uRiodVHhb5tCb6ZJcdl52XP1z5Xcpu/MOfdlPr0wPe6QaonbsdGl2EgPBlyp3v3SfW3ulrVtAD4J17bwR8Hh35/3/uVhToCpCZigPh2kdFY2gGgHuzwRpSVxUPt9SOyIIMpfIbCEiTZOUAEYKAbroD8pnAU0j8AdRKUMZ8JVLENCU2SMh8Mq+kKkHzxi6bL1mBQuly5WipuSbaa6KVavr0aVEeFUiVDEmLcdDMWh1U012ieEmSZUuXaKVVCEbNNdYmhi00e5aWRkiWqliWeAW7TE9OK/dOeQ==) format("woff2")}.ai{font-family:Academicons;font-weight:400;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.ai-doi:before{content:""}.ai-google-scholar:before{content:""}.ai-orcid:before{content:""}:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(data:font/woff2;base64,d09GMgABAAAAAANoAAoAAAAABkQAAAMeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAPAqFGIQPCwgAATYCJAMMBCAFgzQHIBsEBciOw3R7I9skyZdJ181/Hk//3JdkcCamg9x1IL/kth+wy8O38/2rIsi7y7M4n/EApz6wYKCbuKa+VgBVLwBHOtGmKp7A9GkBVkCjPP+nra0LhzNvtUsiNtEneiTJWfRrBfDxlKZAANrUCkCajfzGxgiAERIMN7EH5FdRDg5+nPVxDp3VbAPoRRaA2B6LNgKQAAADcABzHAIlzxOgVSSMLmk0IN2M2xi3BqkQR6YF0KV5AOAXGjwZiM7UBVt0HVorQTGUhhRfTTbXS5X6N/K2e6+2BTje6ruORMvcdjvPsduXcapERQt81kRs89rhMzdyhcdKz7IZeuNIrT/ewn2GhdJKbakyj5gBpb6aVHpVV4uJtOya/FDJMsuhBO9xrkvdl9sOtVTt76G2UNqs0h9vNcdqe/Tu0qFWaiuV7Wy7FW7LLIbSCv3xbpO92mKW9UxzpYUSc61Xkmu5Kh2GYAhmeNxQHCm7nnQ483Rp+c2M5ZAei4sh+dXTHlpaAJDWFDJFkq/ct54qkNo3Gmai/5g+ff4QPePDae3bazFkPfs9DW50HtBBztkZ6J+7t/Hhg/BHR/knZ+ueY1kwx2vxjBfYEyZPZFxiU25K5Jkg5+SD2pFCAfwXtUXx9yDbxsSA17eyYmQSGtaTDRyww6S0BTh6ZJGtheW2iF2bOEYp5tXZeyxEcazpwAmmwE2Z9JJO7Pj2ffNYUXTb06GDufF3Qa0+9Ju5ORgKBiZZNg8uoFhKtRw8KQXTy0VnZzG4mcpWMJlEJBeZqUuwjMnEfaKZs/QOFxkAAARcESA/s4Q649hvOvoMAPA46MTIskTzRbONTaGzAHQwIvCdCXZvgA8BtfxXIoZAC6Af4LicB49OBKDjRdoqcSjrAggN9yGQaG8Fxsh9gZNqZjW/FwTNQm+lJRSQqrNOepDrrUV3nXXUIlySbhp00jyTfgqZ1nrq4NhNqRbddNcWdyFJhAgh/AUKEiVMiCDBwkg8vetJuVHSyyEanZlw/sLaDebFNIaTHvMlVfvBuqyU3yyFzrroq5u2WmvDD89TEy+SpjjVn+awAQA=) format("woff2")}.fab{font-weight:400}.fa-github:before{content:""}.fa-twitter:before{content:""}:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(data:font/woff2;base64,d09GMgABAAAAAAIwAAoAAAAABHAAAAHkAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAANAqBXIFhCwYAATYCJAMIBCAFgygHIBu+A8guChxjeQqOf8lQWNbs+FB2huakKB7+fy29byDwJ0QFQgWIjmyFTKoYHKHwXVkg1dqcCsV6/f+f2935S+HFGabNT9fqc+vQiMRA81BpIBNuMScQOP35j4+bxQDbUzf1Sef5g0aa0Bo0li1L6C9aYMsk8NLASjdhus2vHYH4FWSIGKlH0ApFfItrSmJbnAIb6Vv/G+FMpswB6AAAq7d3u/svv8S7esQ7m0BArIw3GA/IkKMHE+jBGw8KheCXusa1L8NBAFLAcwAcA30k5F2jpx9PVbrTl8fd/ir2h7jVs69K1fNZr0dFnOk7EHdSiifTXwxkcX/GyykHnggRIqjixEk3UYoMSSWDp2s8O9xG2/Ala+s73bfzNPOgszN90nPFr+dKJqSePBhEEcCpmeV4dRQKanLUfTMgyMvSrv8xbdu+7H9TlYGfCx6XsbC+srPxDk0yEPzZzYYc8IDAe2YxRNQQyBr/agWBEACg0RFMFM1YnJGLhqX+NNPmO82tcWsWPi2dUD9/g/lgA58nMZJTxXwuVddcRKWqWFDpUo69yIYqEjP5PKSnp6WqrmGgo6WhqYMItV2EPskKrCFgV1VnapMYSbvoKSFqVuJVs46qP5vwBUoRk86QIIIjEcFnWKy+EQAAAAA=) format("woff2")}.far{font-weight:400}:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(data:font/woff2;base64,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) format("woff2")}.fa{font-family:var(--fa-style-family, "Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fab,.far{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.far{font-family:"Font Awesome 6 Free"}.fab{font-family:"Font Awesome 6 Brands"}.fa-4x{font-size:4em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-spin{animation-name:fa-spin;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration, 2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}@media (prefers-reduced-motion:reduce){.fa-spin{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.fa-copy:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-bars:before{content:""}.fa-circle-notch:before{content:""}.fa-download:before{content:""}.fa-file-pdf:before{content:""}.fa-list:before{content:""}._header_opib5_1{font-family:Cinzel Variable,serif;font-size:1.25rem;position:relative;color:#fff;background-color:#3f51b5;padding-inline:2.4rem;padding-block-start:.3rem}@media screen and (min-width:38em){._header_opib5_1{padding-inline:3rem;font-size:1.1rem}}._header_opib5_1 ._toggle_opib5_16{font-size:1.5rem;position:absolute;left:.3em;top:.3em;cursor:pointer}@media (hover:hover){._header_opib5_1 ._toggle_opib5_16 :hover{color:#ffba67}}@media screen and (min-width:38em){._header_opib5_1 ._toggle_opib5_16{display:none}}._header_opib5_1>ul{list-style:none;display:flex;flex-direction:column;align-items:center;gap:.2rem}@media screen and (min-width:38em){._header_opib5_1>ul{flex-direction:row;align-items:stretch;gap:1em}}._header_opib5_1>ul>li a{display:flex;align-items:center;height:100%;color:#fff;border-bottom:.2rem solid transparent}@media (hover:hover){._header_opib5_1>ul>li a:hover{color:#ffba67;border-bottom-color:#ffba67}}._header_opib5_1>ul>li:not(:first-child) a{padding-bottom:.2em}@media screen and (min-width:38em){._header_opib5_1>ul>li:not(:first-child) a{padding:0}}._header_opib5_1 ._site-name_opib5_68{position:relative;font-size:1.5rem;font-weight:700;line-height:1.5em}@media not screen and (min-width:38em){._header_opib5_1:not(._open_opib5_75)>ul>li:not(:first-child){display:none}}._bibtex_vg9s2_1{display:none;float:right;margin-left:1rem;background-color:#f0f0f0;font-size:.8rem;max-width:min(25em,40vw);position:relative}@media screen and (min-width:38em){._bibtex_vg9s2_1{display:block}}._bibtex_vg9s2_1 ._commands_vg9s2_15{position:absolute;right:0;top:0}._bibtex_vg9s2_1 ._commands_vg9s2_15 ._copy_vg9s2_20{display:inline-block;padding-block-start:.2em;padding-block-end:.3em;padding-inline:.3em;background-color:#fff;border:1px solid #606060;cursor:pointer}._bibtex_vg9s2_1 .highlight{margin:0!important}._bibtex_vg9s2_1 .highlight pre{border:0 none transparent!important;white-space:pre!important;padding-block-start:.2rem;padding-block-end:.4rem;overflow-x:scroll}._bibtex_vg9s2_1 .highlight pre .line-number{display:none!important}._links_11h5g_1{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:baseline;align-content:flex-start;font-size:1rem;column-gap:.3rem;row-gap:.2rem;padding-bottom:.75rem}._links_11h5g_1>a{border:1px solid #606060;padding-inline:.4em;padding-block:.2em}@media screen and (min-width:38em){._links_11h5g_1>a{padding-inline:.2em;padding-block:0}}._links_11h5g_1>a:hover{background-color:#f0f0f0}:root{--react-pdf-annotation-layer:1;--annotation-unfocused-field-background:url("data:image/svg+xml;charset=UTF-8,");--input-focus-border-color:Highlight;--input-focus-outline:1px solid Canvas;--input-unfocused-border-color:transparent;--input-disabled-border-color:transparent;--input-hover-border-color:black;--link-outline:none}@media screen and (forced-colors:active){:root{--input-focus-border-color:CanvasText;--input-unfocused-border-color:ActiveText;--input-disabled-border-color:GrayText;--input-hover-border-color:Highlight;--link-outline:1.5px solid LinkText}}:root{--react-pdf-text-layer:1;--highlight-bg-color:rgba(180, 0, 170, 1);--highlight-selected-bg-color:rgba(0, 100, 0, 1)}@media screen and (forced-colors:active){:root{--highlight-bg-color:Highlight;--highlight-selected-bg-color:ButtonText}}._wrapper_4ijce_1{background-color:#3f51b5;border:1px solid #3f51b5;clear:both}._menubar_4ijce_7{position:sticky;top:-1px;z-index:10;padding-block-start:.2em;padding-block-end:.2em;background-color:#3f51b5;color:#f0f0f0;user-select:none}._menubar_4ijce_7 ._central_4ijce_17{display:flex;gap:.2em;justify-content:center;align-items:baseline;font-variant-numeric:lining-nums tabular-nums}._menubar_4ijce_7 ._left_4ijce_24{position:absolute;left:0;top:.25em;padding-left:.2em}._menubar_4ijce_7 ._right_4ijce_30{position:absolute;right:0;top:.25em;padding-right:.4em}._menubar_4ijce_7 ._page-viewer-container_4ijce_36{display:inline-flex;align-items:stretch;gap:.2em}._menubar_4ijce_7 ._page-viewer_4ijce_36{border:1px solid #f0f0f0;display:inline-block;padding-inline:.2em;padding-block-end:.1em;min-width:1ch;text-align:center;user-select:all}._menubar_4ijce_7 ._page-viewer_4ijce_36:focus{border-color:#ffba67;color:#ffba67;caret-color:#fff}@media (hover:hover){._menubar_4ijce_7 a:hover{color:#ffba67}}._menubar_4ijce_7 button{border:0 solid transparent;background-color:transparent;color:gray;font-size:1rem}._menubar_4ijce_7 button:not([disabled]){color:#f0f0f0;cursor:pointer}@media (hover:hover){._menubar_4ijce_7 button:not([disabled]):hover{color:#ffba67}}._loader_4ijce_76{text-align:center;background-color:#fff;color:gray}._loader_4ijce_76>span{display:inline-block;position:sticky;top:1.5rem;padding-top:2rem}astro-island{display:contents}
@article{stoffersAutomatedMemoizationField2018,
author = {Stoffers, Mirko and Schemmel, Daniel and Soria Dustmann, Oscar and Wehrle, Klaus},
title = {On {{Automated}} {{Memoization}} in the {{Field}} of {{Simulation}} {{Parameter}} {{Studies}}},
journal = {{{ACM}} {{Transactions}} on {{Modeling}} and {{Computer}} {{Simulation}} {{(TOMACS)}}},
volume = {28},
pages = {26:1--26:25},
year = {2018},
month = {sep},
doi = {10.1145/3186316},
}
Processes in computer simulations tend to be highly repetitive. In particular, parameter studies further exasperate the situation as the same model is repeatedly executed with only partially varying parameters. Consequently, computer simulations perform identical computations, with identical code, identical input, and hence identical output. These redundant computations waste significant amounts of time and energy. Memoization, dating back to 1968, enables the caching of such identical intermediate results, thereby significantly speeding up those computations. However, until now, automated approaches were limited to pure functions. At ACM SIGSIM-PADS 2016 we published, to the best of our knowledge, the first practical approach for automated memoization for impure code. In this work, we extend this approach and evaluate the performance characteristics of a number of extensions that deal with questions posed at PADS: (1) To reduce and bound the memory footprint, we investigate several cache eviction strategies. (2) We allow the original and the memoized code to coexist via a runtime-switch and analyze the crossover point, thereby mitigating memoization overhead. (3) By optionally persisting the Memoization Cache to disk, we expand the scope to exploratory parameter studies where cached results can now be reused across multiple simulation runs. Altogether, automated memoization for impure code is a valuable technique, the versatility of which we explore further in this article. It sped up a case study of an OFDM network simulation by a factor of more than 80 with an only marginal increase of memory consumption.