[{"data":1,"prerenderedAt":1804},["ShallowReactive",2],{"navigation":3,"api-navigation":184,"\u002Flearn\u002Fhow-to\u002Flaco-app":206,"docyard:crossref-index":1803},[4,8,155,174,180],{"title":5,"path":6,"stem":7},"Getting Started","\u002Fgetting-started","1.getting-started",{"title":9,"path":10,"stem":11,"children":12},"Learn","\u002Flearn","2.learn",[13,15,66,99,133],{"title":9,"path":10,"stem":14},"2.learn\u002Findex",{"title":16,"path":17,"stem":18,"children":19},"Tutorials","\u002Flearn\u002Ftutorials","2.learn\u002F1.tutorials\u002Findex",[20,21,26,30,34,38,42,46,50,54,58,62],{"title":16,"path":17,"stem":18},{"title":22,"path":23,"stem":24,"icon":25},"Why Laco?","\u002Flearn\u002Ftutorials\u002Fwhy-laco","2.learn\u002F1.tutorials\u002F01.why-laco","i-lucide-notebook",{"title":27,"path":28,"stem":29,"icon":25},"First Steps with Laco","\u002Flearn\u002Ftutorials\u002Ffirst-steps","2.learn\u002F1.tutorials\u002F02.first-steps",{"title":31,"path":32,"stem":33,"icon":25},"Lazy Call and Partial","\u002Flearn\u002Ftutorials\u002Flazy-call-and-partial","2.learn\u002F1.tutorials\u002F03.lazy-call-and-partial",{"title":35,"path":36,"stem":37,"icon":25},"Hyperparameters and Interpolation","\u002Flearn\u002Ftutorials\u002Fhyperparameters-and-interpolation","2.learn\u002F1.tutorials\u002F04.hyperparameters-and-interpolation",{"title":39,"path":40,"stem":41,"icon":25},"Loading, Saving, and the CLI","\u002Flearn\u002Ftutorials\u002Floading-saving-cli","2.learn\u002F1.tutorials\u002F05.loading-saving-cli",{"title":43,"path":44,"stem":45,"icon":25},"Nested Configs and Containers","\u002Flearn\u002Ftutorials\u002Fnested-configs-and-containers","2.learn\u002F1.tutorials\u002F06.nested-configs-and-containers",{"title":47,"path":48,"stem":49,"icon":25},"Typed Groups and Schemas","\u002Flearn\u002Ftutorials\u002Ftyped-groups-and-schemas","2.learn\u002F1.tutorials\u002F07.typed-groups-and-schemas",{"title":51,"path":52,"stem":53,"icon":25},"Pipeline Configs","\u002Flearn\u002Ftutorials\u002Fpipeline-configs","2.learn\u002F1.tutorials\u002F08.pipeline-configs",{"title":55,"path":56,"stem":57,"icon":25},"Tasks and the App Loop","\u002Flearn\u002Ftutorials\u002Ftasks-and-app-loop","2.learn\u002F1.tutorials\u002F09.tasks-and-app-loop",{"title":59,"path":60,"stem":61,"icon":25},"Tracing","\u002Flearn\u002Ftutorials\u002Ftracing","2.learn\u002F1.tutorials\u002F10.tracing",{"title":63,"path":64,"stem":65,"icon":25},"Production Patterns","\u002Flearn\u002Ftutorials\u002Fproduction-patterns","2.learn\u002F1.tutorials\u002F11.production-patterns",{"title":67,"path":68,"stem":69,"children":70},"Concepts","\u002Flearn\u002Fconcepts","2.learn\u002F2.concepts\u002Findex",[71,72,76,80,84,88,92,95],{"title":67,"path":68,"stem":69},{"title":73,"path":74,"stem":75},"Config as Python","\u002Flearn\u002Fconcepts\u002Fconfig-as-python","2.learn\u002F2.concepts\u002F1.config-as-python",{"title":77,"path":78,"stem":79},"Lazy Construction","\u002Flearn\u002Fconcepts\u002Flazy-construction","2.learn\u002F2.concepts\u002F2.lazy-construction",{"title":81,"path":82,"stem":83},"Lie-Typing","\u002Flearn\u002Fconcepts\u002Flie-typing","2.learn\u002F2.concepts\u002F3.lie-typing",{"title":85,"path":86,"stem":87},"Interpolation","\u002Flearn\u002Fconcepts\u002Finterpolation","2.learn\u002F2.concepts\u002F4.interpolation",{"title":89,"path":90,"stem":91},"Typed Groups","\u002Flearn\u002Fconcepts\u002Ftyped-groups","2.learn\u002F2.concepts\u002F5.typed-groups",{"title":59,"path":93,"stem":94},"\u002Flearn\u002Fconcepts\u002Ftracing","2.learn\u002F2.concepts\u002F6.tracing",{"title":96,"path":97,"stem":98},"App Loop","\u002Flearn\u002Fconcepts\u002Fapp-loop","2.learn\u002F2.concepts\u002F7.app-loop",{"title":100,"path":101,"stem":102,"children":103},"How-To Guides","\u002Flearn\u002Fhow-to","2.learn\u002F3.how-to\u002Findex",[104,105,109,113,117,121,125,129],{"title":100,"path":101,"stem":102},{"title":106,"path":107,"stem":108},"Override Configs","\u002Flearn\u002Fhow-to\u002Foverride-configs","2.learn\u002F3.how-to\u002F1.override-configs",{"title":110,"path":111,"stem":112},"Safe Loading","\u002Flearn\u002Fhow-to\u002Fsafe-loading","2.learn\u002F3.how-to\u002F2.safe-loading",{"title":114,"path":115,"stem":116},"Custom Resolvers","\u002Flearn\u002Fhow-to\u002Fcustom-resolvers","2.learn\u002F3.how-to\u002F3.custom-resolvers",{"title":118,"path":119,"stem":120},"Lint and Strict Mode","\u002Flearn\u002Fhow-to\u002Flint-and-strict","2.learn\u002F3.how-to\u002F4.lint-and-strict",{"title":122,"path":123,"stem":124},"Publishing a reproducible app with laco app","\u002Flearn\u002Fhow-to\u002Flaco-app","2.learn\u002F3.how-to\u002F5.laco-app",{"title":126,"path":127,"stem":128},"Reproduce an Experiment","\u002Flearn\u002Fhow-to\u002Freproduce-experiment","2.learn\u002F3.how-to\u002F6.reproduce-experiment",{"title":130,"path":131,"stem":132},"Migrate from argparse","\u002Flearn\u002Fhow-to\u002Fmigrate-from-argparse","2.learn\u002F3.how-to\u002F7.migrate-from-argparse",{"title":134,"path":135,"stem":136,"children":137},"Examples Curriculum","\u002Flearn\u002Fexamples","2.learn\u002F4.examples\u002Findex",[138,139,143,147,151],{"title":134,"path":135,"stem":136},{"title":140,"path":141,"stem":142},"Foundation Examples","\u002Flearn\u002Fexamples\u002Ffoundations","2.learn\u002F4.examples\u002F1.foundations",{"title":144,"path":145,"stem":146},"Building Blocks","\u002Flearn\u002Fexamples\u002Fbuilding-blocks","2.learn\u002F4.examples\u002F2.building-blocks",{"title":148,"path":149,"stem":150},"Typed-Group Variants","\u002Flearn\u002Fexamples\u002Ftyped-variants","2.learn\u002F4.examples\u002F3.typed-variants",{"title":152,"path":153,"stem":154},"End-to-End Pipelines","\u002Flearn\u002Fexamples\u002Fpipelines","2.learn\u002F4.examples\u002F4.pipelines",{"title":156,"path":157,"stem":158,"children":159},"Resources","\u002Fresources","3.resources",[160,162,166,170],{"title":156,"path":157,"stem":161},"3.resources\u002Findex",{"title":163,"path":164,"stem":165},"Integrations","\u002Fresources\u002Fintegrations","3.resources\u002F1.integrations",{"title":167,"path":168,"stem":169},"Migration guide: Laco 0.x → 1.0","\u002Fresources\u002Fmigration-0.x-to-1.0","3.resources\u002F2.migration-0.x-to-1.0",{"title":171,"path":172,"stem":173},"Laco vs hydra-zen","\u002Fresources\u002Flaco-vs-hydra-zen","3.resources\u002F3.laco-vs-hydra-zen",{"title":175,"path":176,"stem":177,"children":178},"API Reference","\u002Fapi","4.api\u002Findex",[179],{"title":175,"path":176,"stem":177},{"title":181,"path":182,"stem":183},"Lazy Configuration for Python","\u002F","index",[185,188,191,194,197,200,203],{"title":186,"path":187},"cli","\u002Fapi\u002Fcli",{"title":189,"path":190},"compat","\u002Fapi\u002Fcompat",{"title":192,"path":193},"handler","\u002Fapi\u002Fhandler",{"title":195,"path":196},"keys","\u002Fapi\u002Fkeys",{"title":198,"path":199},"language","\u002Fapi\u002Flanguage",{"title":201,"path":202},"ops","\u002Fapi\u002Fops",{"title":204,"path":205},"utils","\u002Fapi\u002Futils",{"id":207,"title":122,"body":208,"description":1798,"extension":1799,"meta":1800,"navigation":333,"path":123,"seo":1801,"stem":124,"__hash__":1802},"content\u002F2.learn\u002F3.how-to\u002F5.laco-app.md",{"type":209,"value":210,"toc":1777},"minimark",[211,220,231,236,276,280,287,560,564,757,763,809,816,855,859,863,881,889,893,1007,1011,1017,1048,1052,1062,1137,1140,1144,1157,1227,1230,1289,1301,1353,1359,1368,1509,1523,1527,1652,1704,1708,1718,1755,1773],[212,213,215,216],"h1",{"id":214},"publishing-a-reproducible-app-with-laco-app","Publishing a reproducible app with ",[217,218,219],"code",{},"laco app",[221,222,223,225,226,230],"p",{},[217,224,219],{}," lets project authors expose a ",[227,228,229],"strong",{},"simple argparse-style CLI"," for\ntheir configs so that collaborators and external users can reproduce or\nextend experiments without needing to understand Hydra.",[232,233,235],"h2",{"id":234},"how-it-works","How it works",[237,238,239,258,269],"ol",{},[240,241,242,243,246,247,250,251,250,254,257],"li",{},"The author annotates their config class with ",[217,244,245],{},"@L.params"," and marks\nindividual hyperparameters with ",[217,248,249],{},"L.param()"," \u002F ",[217,252,253],{},"L.Param[T]",[217,255,256],{},"L.Hidden[T]",".",[240,259,260,261,264,265,268],{},"The project's ",[217,262,263],{},"pyproject.toml"," registers a ",[217,266,267],{},"laco.apps"," entry point pointing\nto the entry function.",[240,270,271,272,275],{},"Users run ",[217,273,274],{},"laco app \u003Cdist> \u003Centry> --flag value",": laco translates the\nflags into Hydra overrides and runs the task.",[232,277,279],{"id":278},"author-setup","Author setup",[281,282,284,285],"h3",{"id":283},"_1-declare-hyperparameters-with-lparams","1. Declare hyperparameters with ",[217,286,245],{},[288,289,294],"pre",{"className":290,"code":291,"language":292,"meta":293,"style":293},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","# configs\u002Ftrain.py\nimport laco.language as L\n\n@L.params          # default: prefix=\"\", so flags are flat (--lr, --epochs)\nclass hps:\n    \"\"\"Hyperparameters.\n\n    Parameters\n    ----------\n    lr : float\n        Learning rate.\n    epochs : int\n        Number of training epochs.\n    \"\"\"\n    lr: float = 0.001\n    epochs: int = 100\n\n    # Hidden from the CLI but still in the config:\n    _internal_state: L.Hidden[str] = \"init\"\n\nseed = L.param(42, help=\"Global random seed\")\n","python","",[217,295,296,305,328,335,354,368,379,384,390,396,402,408,414,420,426,447,463,468,474,512,517],{"__ignoreMap":293},[297,298,301],"span",{"class":299,"line":300},"line",1,[297,302,304],{"class":303},"sutJx","# configs\u002Ftrain.py\n",[297,306,308,312,316,319,322,325],{"class":299,"line":307},2,[297,309,311],{"class":310},"sVHd0","import",[297,313,315],{"class":314},"su5hD"," laco",[297,317,257],{"class":318},"sP7_E",[297,320,198],{"class":321},"skxfh",[297,323,324],{"class":310}," as",[297,326,327],{"class":314}," L\n",[297,329,331],{"class":299,"line":330},3,[297,332,334],{"emptyLinePlaceholder":333},true,"\n",[297,336,338,342,346,348,351],{"class":299,"line":337},4,[297,339,341],{"class":340},"stp6e","@",[297,343,345],{"class":344},"sGLFI","L",[297,347,257],{"class":340},[297,349,350],{"class":344},"params",[297,352,353],{"class":303},"          # default: prefix=\"\", so flags are flat (--lr, --epochs)\n",[297,355,357,361,365],{"class":299,"line":356},5,[297,358,360],{"class":359},"sbsja","class",[297,362,364],{"class":363},"sbgvK"," hps",[297,366,367],{"class":318},":\n",[297,369,371,375],{"class":299,"line":370},6,[297,372,374],{"class":373},"s2W-s","    \"\"\"",[297,376,378],{"class":377},"sithA","Hyperparameters.\n",[297,380,382],{"class":299,"line":381},7,[297,383,334],{"emptyLinePlaceholder":333},[297,385,387],{"class":299,"line":386},8,[297,388,389],{"class":377},"    Parameters\n",[297,391,393],{"class":299,"line":392},9,[297,394,395],{"class":377},"    ----------\n",[297,397,399],{"class":299,"line":398},10,[297,400,401],{"class":377},"    lr : float\n",[297,403,405],{"class":299,"line":404},11,[297,406,407],{"class":377},"        Learning rate.\n",[297,409,411],{"class":299,"line":410},12,[297,412,413],{"class":377},"    epochs : int\n",[297,415,417],{"class":299,"line":416},13,[297,418,419],{"class":377},"        Number of training epochs.\n",[297,421,423],{"class":299,"line":422},14,[297,424,425],{"class":373},"    \"\"\"\n",[297,427,429,432,435,439,443],{"class":299,"line":428},15,[297,430,431],{"class":314},"    lr",[297,433,434],{"class":318},":",[297,436,438],{"class":437},"sZMiF"," float",[297,440,442],{"class":441},"smGrS"," =",[297,444,446],{"class":445},"srdBf"," 0.001\n",[297,448,450,453,455,458,460],{"class":299,"line":449},16,[297,451,452],{"class":314},"    epochs",[297,454,434],{"class":318},[297,456,457],{"class":437}," int",[297,459,442],{"class":441},[297,461,462],{"class":445}," 100\n",[297,464,466],{"class":299,"line":465},17,[297,467,334],{"emptyLinePlaceholder":333},[297,469,471],{"class":299,"line":470},18,[297,472,473],{"class":303},"    # Hidden from the CLI but still in the config:\n",[297,475,477,480,482,485,487,490,493,496,499,501,505,509],{"class":299,"line":476},19,[297,478,479],{"class":314},"    _internal_state",[297,481,434],{"class":318},[297,483,484],{"class":314}," L",[297,486,257],{"class":318},[297,488,489],{"class":321},"Hidden",[297,491,492],{"class":318},"[",[297,494,495],{"class":437},"str",[297,497,498],{"class":318},"]",[297,500,442],{"class":441},[297,502,504],{"class":503},"sjJ54"," \"",[297,506,508],{"class":507},"s_sjI","init",[297,510,511],{"class":503},"\"\n",[297,513,515],{"class":299,"line":514},20,[297,516,334],{"emptyLinePlaceholder":333},[297,518,520,523,526,528,530,534,537,540,543,547,549,552,555,557],{"class":299,"line":519},21,[297,521,522],{"class":314},"seed ",[297,524,525],{"class":441},"=",[297,527,484],{"class":314},[297,529,257],{"class":318},[297,531,533],{"class":532},"slqww","param",[297,535,536],{"class":318},"(",[297,538,539],{"class":445},"42",[297,541,542],{"class":318},",",[297,544,546],{"class":545},"s99_P"," help",[297,548,525],{"class":441},[297,550,551],{"class":503},"\"",[297,553,554],{"class":507},"Global random seed",[297,556,551],{"class":503},[297,558,559],{"class":318},")\n",[281,561,563],{"id":562},"_2-write-the-entry-point","2. Write the entry point",[288,565,567],{"className":290,"code":566,"language":292,"meta":293,"style":293},"# my_project\u002Ftrain.py\nimport laco\nimport laco.language as L\n\n@laco.main(config_name=\"train\", config_path=\"configs\")\n@L.task\ndef run(hps, seed: int):\n    print(f\"Training with lr={hps.lr}, seed={seed}\")\n    ...\n\nif __name__ == \"__main__\":\n    run()\n",[217,568,569,574,581,595,599,641,652,678,719,725,729,749],{"__ignoreMap":293},[297,570,571],{"class":299,"line":300},[297,572,573],{"class":303},"# my_project\u002Ftrain.py\n",[297,575,576,578],{"class":299,"line":307},[297,577,311],{"class":310},[297,579,580],{"class":314}," laco\n",[297,582,583,585,587,589,591,593],{"class":299,"line":330},[297,584,311],{"class":310},[297,586,315],{"class":314},[297,588,257],{"class":318},[297,590,198],{"class":321},[297,592,324],{"class":310},[297,594,327],{"class":314},[297,596,597],{"class":299,"line":337},[297,598,334],{"emptyLinePlaceholder":333},[297,600,601,603,606,608,611,613,616,618,620,623,625,627,630,632,634,637,639],{"class":299,"line":356},[297,602,341],{"class":340},[297,604,605],{"class":344},"laco",[297,607,257],{"class":340},[297,609,610],{"class":344},"main",[297,612,536],{"class":318},[297,614,615],{"class":545},"config_name",[297,617,525],{"class":441},[297,619,551],{"class":503},[297,621,622],{"class":507},"train",[297,624,551],{"class":503},[297,626,542],{"class":318},[297,628,629],{"class":545}," config_path",[297,631,525],{"class":441},[297,633,551],{"class":503},[297,635,636],{"class":507},"configs",[297,638,551],{"class":503},[297,640,559],{"class":318},[297,642,643,645,647,649],{"class":299,"line":370},[297,644,341],{"class":340},[297,646,345],{"class":344},[297,648,257],{"class":340},[297,650,651],{"class":344},"task\n",[297,653,654,657,660,662,666,668,671,673,675],{"class":299,"line":381},[297,655,656],{"class":359},"def",[297,658,659],{"class":344}," run",[297,661,536],{"class":318},[297,663,665],{"class":664},"sFwrP","hps",[297,667,542],{"class":318},[297,669,670],{"class":664}," seed",[297,672,434],{"class":318},[297,674,457],{"class":437},[297,676,677],{"class":318},"):\n",[297,679,680,684,686,689,692,695,697,699,702,705,708,710,713,715,717],{"class":299,"line":386},[297,681,683],{"class":682},"sptTA","    print",[297,685,536],{"class":318},[297,687,688],{"class":359},"f",[297,690,691],{"class":507},"\"Training with lr=",[297,693,694],{"class":445},"{",[297,696,665],{"class":532},[297,698,257],{"class":318},[297,700,701],{"class":321},"lr",[297,703,704],{"class":445},"}",[297,706,707],{"class":507},", seed=",[297,709,694],{"class":445},[297,711,712],{"class":532},"seed",[297,714,704],{"class":445},[297,716,551],{"class":507},[297,718,559],{"class":318},[297,720,721],{"class":299,"line":392},[297,722,724],{"class":723},"s_hVV","    ...\n",[297,726,727],{"class":299,"line":398},[297,728,334],{"emptyLinePlaceholder":333},[297,730,731,734,737,740,742,745,747],{"class":299,"line":404},[297,732,733],{"class":310},"if",[297,735,736],{"class":723}," __name__",[297,738,739],{"class":441}," ==",[297,741,504],{"class":503},[297,743,744],{"class":507},"__main__",[297,746,551],{"class":503},[297,748,367],{"class":318},[297,750,751,754],{"class":299,"line":410},[297,752,753],{"class":532},"    run",[297,755,756],{"class":318},"()\n",[281,758,760,761],{"id":759},"_3-register-the-entry-point-in-pyprojecttoml","3. Register the entry point in ",[217,762,263],{},[288,764,768],{"className":765,"code":766,"language":767,"meta":293,"style":293},"language-toml shiki shiki-themes material-theme-lighter github-light github-dark","[project.entry-points.\"laco.apps\"]\ntrain = \"my_project.train:run\"\n","toml",[217,769,770,795],{"__ignoreMap":293},[297,771,772,774,777,779,782,784,787,789,792],{"class":299,"line":300},[297,773,492],{"class":318},[297,775,776],{"class":363},"project",[297,778,257],{"class":314},[297,780,781],{"class":363},"entry-points",[297,783,257],{"class":314},[297,785,786],{"class":363},"\"laco",[297,788,257],{"class":314},[297,790,791],{"class":363},"apps\"",[297,793,794],{"class":318},"]\n",[297,796,797,800,802,804,807],{"class":299,"line":307},[297,798,799],{"class":314},"train ",[297,801,525],{"class":318},[297,803,504],{"class":503},[297,805,806],{"class":507},"my_project.train:run",[297,808,511],{"class":503},[221,810,811,812,815],{},"After ",[217,813,814],{},"pip install -e ."," (or any install that registers the entry points),\nusers can invoke:",[288,817,821],{"className":818,"code":819,"language":820,"meta":293,"style":293},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","laco app my-project train --lr 0.01 --epochs 200 --seed 7\n","bash",[217,822,823],{"__ignoreMap":293},[297,824,825,827,830,833,836,840,843,846,849,852],{"class":299,"line":300},[297,826,605],{"class":363},[297,828,829],{"class":507}," app",[297,831,832],{"class":507}," my-project",[297,834,835],{"class":507}," train",[297,837,839],{"class":838},"stzsN"," --lr",[297,841,842],{"class":445}," 0.01",[297,844,845],{"class":838}," --epochs",[297,847,848],{"class":445}," 200",[297,850,851],{"class":838}," --seed",[297,853,854],{"class":445}," 7\n",[232,856,858],{"id":857},"user-experience","User experience",[281,860,862],{"id":861},"help","Help",[288,864,866],{"className":818,"code":865,"language":820,"meta":293,"style":293},"laco app my-project train --help\n",[217,867,868],{"__ignoreMap":293},[297,869,870,872,874,876,878],{"class":299,"line":300},[297,871,605],{"class":363},[297,873,829],{"class":507},[297,875,832],{"class":507},[297,877,835],{"class":507},[297,879,880],{"class":838}," --help\n",[288,882,887],{"className":883,"code":885,"language":886},[884],"language-text","usage: laco app my-project train [--lr LR] [--epochs EPOCHS] [--seed SEED]\n                                  [--dry-run] [--save-dir DIR]\n\nRun my-project:train with a simple flag-based interface.\n\noptions:\n  --lr LR          Learning rate. (default: 0.001)\n  --epochs EPOCHS  Number of training epochs. (default: 100)\n  --seed SEED      Global random seed (default: 42)\n  --dry-run        Print the resolved config as YAML and exit without running.\n  --save-dir DIR   Save resolved config.yaml into DIR before running.\n","text",[217,888,885],{"__ignoreMap":293},[281,890,892],{"id":891},"running-with-overrides","Running with overrides",[288,894,896],{"className":818,"code":895,"language":820,"meta":293,"style":293},"# Override a single value\nlaco app my-project train --lr 1e-4\n\n# Override several values\nlaco app my-project train --lr 1e-4 --epochs 500 --seed 0\n\n# Inspect the resolved config without running\nlaco app my-project train --lr 1e-4 --dry-run\n\n# Save the resolved config to disk\nlaco app my-project train --lr 1e-4 --save-dir .\u002Foutputs\u002Frun-001\n",[217,897,898,903,918,922,927,952,956,961,978,982,987],{"__ignoreMap":293},[297,899,900],{"class":299,"line":300},[297,901,902],{"class":303},"# Override a single value\n",[297,904,905,907,909,911,913,915],{"class":299,"line":307},[297,906,605],{"class":363},[297,908,829],{"class":507},[297,910,832],{"class":507},[297,912,835],{"class":507},[297,914,839],{"class":838},[297,916,917],{"class":507}," 1e-4\n",[297,919,920],{"class":299,"line":330},[297,921,334],{"emptyLinePlaceholder":333},[297,923,924],{"class":299,"line":337},[297,925,926],{"class":303},"# Override several values\n",[297,928,929,931,933,935,937,939,942,944,947,949],{"class":299,"line":356},[297,930,605],{"class":363},[297,932,829],{"class":507},[297,934,832],{"class":507},[297,936,835],{"class":507},[297,938,839],{"class":838},[297,940,941],{"class":507}," 1e-4",[297,943,845],{"class":838},[297,945,946],{"class":445}," 500",[297,948,851],{"class":838},[297,950,951],{"class":445}," 0\n",[297,953,954],{"class":299,"line":370},[297,955,334],{"emptyLinePlaceholder":333},[297,957,958],{"class":299,"line":381},[297,959,960],{"class":303},"# Inspect the resolved config without running\n",[297,962,963,965,967,969,971,973,975],{"class":299,"line":386},[297,964,605],{"class":363},[297,966,829],{"class":507},[297,968,832],{"class":507},[297,970,835],{"class":507},[297,972,839],{"class":838},[297,974,941],{"class":507},[297,976,977],{"class":838}," --dry-run\n",[297,979,980],{"class":299,"line":392},[297,981,334],{"emptyLinePlaceholder":333},[297,983,984],{"class":299,"line":398},[297,985,986],{"class":303},"# Save the resolved config to disk\n",[297,988,989,991,993,995,997,999,1001,1004],{"class":299,"line":404},[297,990,605],{"class":363},[297,992,829],{"class":507},[297,994,832],{"class":507},[297,996,835],{"class":507},[297,998,839],{"class":838},[297,1000,941],{"class":507},[297,1002,1003],{"class":838}," --save-dir",[297,1005,1006],{"class":507}," .\u002Foutputs\u002Frun-001\n",[281,1008,1010],{"id":1009},"fuzzy-suggestions-on-typos","Fuzzy suggestions on typos",[221,1012,1013,1014,1016],{},"If you mistype a flag, ",[217,1015,219],{}," shows the closest match:",[288,1018,1020],{"className":818,"code":1019,"language":820,"meta":293,"style":293},"laco app my-project train --learing-rate 0.01\n# error: argument --learing-rate: unrecognized arguments\n# Unknown flag '--learing-rate'. Did you mean: --lr?\n",[217,1021,1022,1038,1043],{"__ignoreMap":293},[297,1023,1024,1026,1028,1030,1032,1035],{"class":299,"line":300},[297,1025,605],{"class":363},[297,1027,829],{"class":507},[297,1029,832],{"class":507},[297,1031,835],{"class":507},[297,1033,1034],{"class":838}," --learing-rate",[297,1036,1037],{"class":445}," 0.01\n",[297,1039,1040],{"class":299,"line":307},[297,1041,1042],{"class":303},"# error: argument --learing-rate: unrecognized arguments\n",[297,1044,1045],{"class":299,"line":330},[297,1046,1047],{"class":303},"# Unknown flag '--learing-rate'. Did you mean: --lr?\n",[232,1049,1051],{"id":1050},"flag-prefix-rules","Flag prefix rules",[221,1053,1054,1055,1058,1059,1061],{},"The ",[217,1056,1057],{},"prefix"," argument to ",[217,1060,245],{}," controls how flags are named:",[1063,1064,1065,1083],"table",{},[1066,1067,1068],"thead",{},[1069,1070,1071,1077,1080],"tr",{},[1072,1073,1074],"th",{},[217,1075,1076],{},"prefix=",[1072,1078,1079],{},"Config key",[1072,1081,1082],{},"CLI flag",[1084,1085,1086,1105,1121],"tbody",{},[1069,1087,1088,1095,1100],{},[1089,1090,1091,1094],"td",{},[217,1092,1093],{},"\"\""," (default)",[1089,1096,1097],{},[217,1098,1099],{},"hps.lr",[1089,1101,1102],{},[217,1103,1104],{},"--lr",[1069,1106,1107,1112,1116],{},[1089,1108,1109],{},[217,1110,1111],{},"None",[1089,1113,1114],{},[217,1115,1099],{},[1089,1117,1118],{},[217,1119,1120],{},"--hps-lr",[1069,1122,1123,1128,1132],{},[1089,1124,1125],{},[217,1126,1127],{},"\"model\"",[1089,1129,1130],{},[217,1131,1099],{},[1089,1133,1134],{},[217,1135,1136],{},"--model-lr",[221,1138,1139],{},"Underscores in field names and prefixes are converted to hyphens in flags.",[232,1141,1143],{"id":1142},"hiding-parameters","Hiding parameters",[221,1145,1146,1147,1149,1150,1153,1154,1156],{},"Use ",[217,1148,256],{}," as the annotation, or pass ",[217,1151,1152],{},"hidden=[...]"," to ",[217,1155,245],{},",\nto keep fields in the config without exposing them as CLI flags:",[288,1158,1160],{"className":290,"code":1159,"language":292,"meta":293,"style":293},"@L.params(hidden=[\"weight_decay\"])\nclass hps:\n    lr: float = 0.001\n    weight_decay: float = 1e-4   # not exposed as --weight-decay\n",[217,1161,1162,1191,1199,1211],{"__ignoreMap":293},[297,1163,1164,1166,1168,1170,1172,1174,1177,1179,1181,1183,1186,1188],{"class":299,"line":300},[297,1165,341],{"class":340},[297,1167,345],{"class":344},[297,1169,257],{"class":340},[297,1171,350],{"class":344},[297,1173,536],{"class":318},[297,1175,1176],{"class":545},"hidden",[297,1178,525],{"class":441},[297,1180,492],{"class":318},[297,1182,551],{"class":503},[297,1184,1185],{"class":507},"weight_decay",[297,1187,551],{"class":503},[297,1189,1190],{"class":318},"])\n",[297,1192,1193,1195,1197],{"class":299,"line":307},[297,1194,360],{"class":359},[297,1196,364],{"class":363},[297,1198,367],{"class":318},[297,1200,1201,1203,1205,1207,1209],{"class":299,"line":330},[297,1202,431],{"class":314},[297,1204,434],{"class":318},[297,1206,438],{"class":437},[297,1208,442],{"class":441},[297,1210,446],{"class":445},[297,1212,1213,1216,1218,1220,1222,1224],{"class":299,"line":337},[297,1214,1215],{"class":314},"    weight_decay",[297,1217,434],{"class":318},[297,1219,438],{"class":437},[297,1221,442],{"class":441},[297,1223,941],{"class":445},[297,1225,1226],{"class":303},"   # not exposed as --weight-decay\n",[221,1228,1229],{},"Or use the type annotation directly:",[288,1231,1233],{"className":290,"code":1232,"language":292,"meta":293,"style":293},"@L.params\nclass hps:\n    lr: float = 0.001\n    weight_decay: L.Hidden[float] = 1e-4\n",[217,1234,1235,1246,1254,1266],{"__ignoreMap":293},[297,1236,1237,1239,1241,1243],{"class":299,"line":300},[297,1238,341],{"class":340},[297,1240,345],{"class":344},[297,1242,257],{"class":340},[297,1244,1245],{"class":344},"params\n",[297,1247,1248,1250,1252],{"class":299,"line":307},[297,1249,360],{"class":359},[297,1251,364],{"class":363},[297,1253,367],{"class":318},[297,1255,1256,1258,1260,1262,1264],{"class":299,"line":330},[297,1257,431],{"class":314},[297,1259,434],{"class":318},[297,1261,438],{"class":437},[297,1263,442],{"class":441},[297,1265,446],{"class":445},[297,1267,1268,1270,1272,1274,1276,1278,1280,1283,1285,1287],{"class":299,"line":337},[297,1269,1215],{"class":314},[297,1271,434],{"class":318},[297,1273,484],{"class":314},[297,1275,257],{"class":318},[297,1277,489],{"class":321},[297,1279,492],{"class":318},[297,1281,1282],{"class":437},"float",[297,1284,498],{"class":318},[297,1286,442],{"class":441},[297,1288,917],{"class":445},[221,1290,1291,1292,1294,1295,1297,1298,434],{},"To hide an entire ",[217,1293,245],{}," block from ",[217,1296,219],{}," (for example, a block\nused only internally), pass ",[217,1299,1300],{},"exclude=True",[288,1302,1304],{"className":290,"code":1303,"language":292,"meta":293,"style":293},"@L.params(exclude=True)\nclass internal:\n    debug: bool = False\n",[217,1305,1306,1329,1338],{"__ignoreMap":293},[297,1307,1308,1310,1312,1314,1316,1318,1321,1323,1327],{"class":299,"line":300},[297,1309,341],{"class":340},[297,1311,345],{"class":344},[297,1313,257],{"class":340},[297,1315,350],{"class":344},[297,1317,536],{"class":318},[297,1319,1320],{"class":545},"exclude",[297,1322,525],{"class":441},[297,1324,1326],{"class":1325},"s39Yj","True",[297,1328,559],{"class":318},[297,1330,1331,1333,1336],{"class":299,"line":307},[297,1332,360],{"class":359},[297,1334,1335],{"class":363}," internal",[297,1337,367],{"class":318},[297,1339,1340,1343,1345,1348,1350],{"class":299,"line":330},[297,1341,1342],{"class":314},"    debug",[297,1344,434],{"class":318},[297,1346,1347],{"class":437}," bool",[297,1349,442],{"class":441},[297,1351,1352],{"class":1325}," False\n",[232,1354,1356,1357],{"id":1355},"one-off-parameters-with-lparam","One-off parameters with ",[217,1358,249],{},[221,1360,1361,1362,1364,1365,1367],{},"For values that don't belong in a ",[217,1363,245],{}," class, use ",[217,1366,249],{}," at\nmodule level:",[288,1369,1371],{"className":290,"code":1370,"language":292,"meta":293,"style":293},"seed = L.param(42, help=\"Random seed\", validator=L.Range(0, 2**31))\nopt  = L.param(\"adam\", choices=[\"adam\", \"sgd\", \"adamw\"],\n               help=\"Optimizer name\")\n",[217,1372,1373,1435,1493],{"__ignoreMap":293},[297,1374,1375,1377,1379,1381,1383,1385,1387,1389,1391,1393,1395,1397,1400,1402,1404,1407,1409,1411,1413,1416,1418,1421,1423,1426,1429,1432],{"class":299,"line":300},[297,1376,522],{"class":314},[297,1378,525],{"class":441},[297,1380,484],{"class":314},[297,1382,257],{"class":318},[297,1384,533],{"class":532},[297,1386,536],{"class":318},[297,1388,539],{"class":445},[297,1390,542],{"class":318},[297,1392,546],{"class":545},[297,1394,525],{"class":441},[297,1396,551],{"class":503},[297,1398,1399],{"class":507},"Random seed",[297,1401,551],{"class":503},[297,1403,542],{"class":318},[297,1405,1406],{"class":545}," validator",[297,1408,525],{"class":441},[297,1410,345],{"class":532},[297,1412,257],{"class":318},[297,1414,1415],{"class":532},"Range",[297,1417,536],{"class":318},[297,1419,1420],{"class":445},"0",[297,1422,542],{"class":318},[297,1424,1425],{"class":445}," 2",[297,1427,1428],{"class":441},"**",[297,1430,1431],{"class":445},"31",[297,1433,1434],{"class":318},"))\n",[297,1436,1437,1440,1442,1444,1446,1448,1450,1452,1455,1457,1459,1462,1464,1466,1468,1470,1472,1474,1476,1479,1481,1483,1485,1488,1490],{"class":299,"line":307},[297,1438,1439],{"class":314},"opt  ",[297,1441,525],{"class":441},[297,1443,484],{"class":314},[297,1445,257],{"class":318},[297,1447,533],{"class":532},[297,1449,536],{"class":318},[297,1451,551],{"class":503},[297,1453,1454],{"class":507},"adam",[297,1456,551],{"class":503},[297,1458,542],{"class":318},[297,1460,1461],{"class":545}," choices",[297,1463,525],{"class":441},[297,1465,492],{"class":318},[297,1467,551],{"class":503},[297,1469,1454],{"class":507},[297,1471,551],{"class":503},[297,1473,542],{"class":318},[297,1475,504],{"class":503},[297,1477,1478],{"class":507},"sgd",[297,1480,551],{"class":503},[297,1482,542],{"class":318},[297,1484,504],{"class":503},[297,1486,1487],{"class":507},"adamw",[297,1489,551],{"class":503},[297,1491,1492],{"class":318},"],\n",[297,1494,1495,1498,1500,1502,1505,1507],{"class":299,"line":330},[297,1496,1497],{"class":545},"               help",[297,1499,525],{"class":441},[297,1501,551],{"class":503},[297,1503,1504],{"class":507},"Optimizer name",[297,1506,551],{"class":503},[297,1508,559],{"class":318},[221,1510,1511,1512,1515,1516,1519,1520,1522],{},"These appear as ",[217,1513,1514],{},"--seed"," and ",[217,1517,1518],{},"--opt"," in the CLI alongside the ",[217,1521,245],{},"\nflags.",[232,1524,1526],{"id":1525},"validators","Validators",[288,1528,1530],{"className":290,"code":1529,"language":292,"meta":293,"style":293},"import laco.language as L\n\nlr = L.param(1e-3, validator=L.Range(1e-7, 1.0))\nopt = L.param(\"adam\", validator=L.Choices(\"adam\", \"sgd\", \"adamw\"))\n",[217,1531,1532,1546,1550,1592],{"__ignoreMap":293},[297,1533,1534,1536,1538,1540,1542,1544],{"class":299,"line":300},[297,1535,311],{"class":310},[297,1537,315],{"class":314},[297,1539,257],{"class":318},[297,1541,198],{"class":321},[297,1543,324],{"class":310},[297,1545,327],{"class":314},[297,1547,1548],{"class":299,"line":307},[297,1549,334],{"emptyLinePlaceholder":333},[297,1551,1552,1555,1557,1559,1561,1563,1565,1568,1570,1572,1574,1576,1578,1580,1582,1585,1587,1590],{"class":299,"line":330},[297,1553,1554],{"class":314},"lr ",[297,1556,525],{"class":441},[297,1558,484],{"class":314},[297,1560,257],{"class":318},[297,1562,533],{"class":532},[297,1564,536],{"class":318},[297,1566,1567],{"class":445},"1e-3",[297,1569,542],{"class":318},[297,1571,1406],{"class":545},[297,1573,525],{"class":441},[297,1575,345],{"class":532},[297,1577,257],{"class":318},[297,1579,1415],{"class":532},[297,1581,536],{"class":318},[297,1583,1584],{"class":445},"1e-7",[297,1586,542],{"class":318},[297,1588,1589],{"class":445}," 1.0",[297,1591,1434],{"class":318},[297,1593,1594,1597,1599,1601,1603,1605,1607,1609,1611,1613,1615,1617,1619,1621,1623,1626,1628,1630,1632,1634,1636,1638,1640,1642,1644,1646,1648,1650],{"class":299,"line":337},[297,1595,1596],{"class":314},"opt ",[297,1598,525],{"class":441},[297,1600,484],{"class":314},[297,1602,257],{"class":318},[297,1604,533],{"class":532},[297,1606,536],{"class":318},[297,1608,551],{"class":503},[297,1610,1454],{"class":507},[297,1612,551],{"class":503},[297,1614,542],{"class":318},[297,1616,1406],{"class":545},[297,1618,525],{"class":441},[297,1620,345],{"class":532},[297,1622,257],{"class":318},[297,1624,1625],{"class":532},"Choices",[297,1627,536],{"class":318},[297,1629,551],{"class":503},[297,1631,1454],{"class":507},[297,1633,551],{"class":503},[297,1635,542],{"class":318},[297,1637,504],{"class":503},[297,1639,1478],{"class":507},[297,1641,551],{"class":503},[297,1643,542],{"class":318},[297,1645,504],{"class":503},[297,1647,1487],{"class":507},[297,1649,551],{"class":503},[297,1651,1434],{"class":318},[1063,1653,1654,1664],{},[1066,1655,1656],{},[1069,1657,1658,1661],{},[1072,1659,1660],{},"Validator",[1072,1662,1663],{},"Effect",[1084,1665,1666,1679,1692],{},[1069,1667,1668,1673],{},[1089,1669,1670],{},[217,1671,1672],{},"L.Range(min, max)",[1089,1674,1675,1676],{},"Value must be in ",[217,1677,1678],{},"[min, max]",[1069,1680,1681,1686],{},[1089,1682,1683],{},[217,1684,1685],{},"L.Choices(*opts)",[1089,1687,1688,1689],{},"Value must be one of ",[217,1690,1691],{},"opts",[1069,1693,1694,1697],{},[1089,1695,1696],{},"Any callable",[1089,1698,1699,1700,1703],{},"Called with the value; raise ",[217,1701,1702],{},"ValueError"," to reject",[232,1705,1707],{"id":1706},"boolean-flags","Boolean flags",[221,1709,1710,1711,250,1714,1717],{},"Boolean parameters get ",[217,1712,1713],{},"--flag",[217,1715,1716],{},"--no-flag"," pairs automatically:",[288,1719,1721],{"className":290,"code":1720,"language":292,"meta":293,"style":293},"@L.params\nclass hps:\n    use_amp: bool = True\n",[217,1722,1723,1733,1741],{"__ignoreMap":293},[297,1724,1725,1727,1729,1731],{"class":299,"line":300},[297,1726,341],{"class":340},[297,1728,345],{"class":344},[297,1730,257],{"class":340},[297,1732,1245],{"class":344},[297,1734,1735,1737,1739],{"class":299,"line":307},[297,1736,360],{"class":359},[297,1738,364],{"class":363},[297,1740,367],{"class":318},[297,1742,1743,1746,1748,1750,1752],{"class":299,"line":330},[297,1744,1745],{"class":314},"    use_amp",[297,1747,434],{"class":318},[297,1749,1347],{"class":437},[297,1751,442],{"class":441},[297,1753,1754],{"class":1325}," True\n",[288,1756,1758],{"className":818,"code":1757,"language":820,"meta":293,"style":293},"laco app my-project train --no-use-amp\n",[217,1759,1760],{"__ignoreMap":293},[297,1761,1762,1764,1766,1768,1770],{"class":299,"line":300},[297,1763,605],{"class":363},[297,1765,829],{"class":507},[297,1767,832],{"class":507},[297,1769,835],{"class":507},[297,1771,1772],{"class":838}," --no-use-amp\n",[1774,1775,1776],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .stp6e, html code.shiki .stp6e{--shiki-light:#39ADB5;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s2W-s, html code.shiki .s2W-s{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#032F62;--shiki-default-font-style:inherit;--shiki-dark:#9ECBFF;--shiki-dark-font-style:inherit}html pre.shiki code .sithA, html code.shiki .sithA{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#032F62;--shiki-default-font-style:inherit;--shiki-dark:#9ECBFF;--shiki-dark-font-style:inherit}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .slqww, html code.shiki .slqww{--shiki-light:#6182B8;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sFwrP, html code.shiki .sFwrP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#24292E;--shiki-default-font-style:inherit;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":293,"searchDepth":330,"depth":330,"links":1778},[1779,1780,1787,1792,1793,1794,1796,1797],{"id":234,"depth":307,"text":235},{"id":278,"depth":307,"text":279,"children":1781},[1782,1784,1785],{"id":283,"depth":330,"text":1783},"1. Declare hyperparameters with @L.params",{"id":562,"depth":330,"text":563},{"id":759,"depth":330,"text":1786},"3. Register the entry point in pyproject.toml",{"id":857,"depth":307,"text":858,"children":1788},[1789,1790,1791],{"id":861,"depth":330,"text":862},{"id":891,"depth":330,"text":892},{"id":1009,"depth":330,"text":1010},{"id":1050,"depth":307,"text":1051},{"id":1142,"depth":307,"text":1143},{"id":1355,"depth":307,"text":1795},"One-off parameters with L.param()",{"id":1525,"depth":307,"text":1526},{"id":1706,"depth":307,"text":1707},"laco app lets project authors expose a simple argparse-style CLI for\ntheir configs so that collaborators and external users can reproduce or\nextend experiments without needing to understand Hydra.","md",{},{"title":122,"description":1798},"vZ5YTo1kiBmaNgnunCJaJEsrWs89bpLkwlnXrYEyTJ8",{},1785687302989]