[{"data":1,"prerenderedAt":4728},["ShallowReactive",2],{"navigation":3,"api-navigation":184,"\u002Flearn\u002Ftutorials\u002Fhyperparameters-and-interpolation":206,"docyard:crossref-index":4727},[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":35,"body":208,"description":4721,"extension":4722,"meta":4723,"navigation":4724,"path":36,"seo":4725,"stem":37,"__hash__":4726},"content\u002F2.learn\u002F1.tutorials\u002F04.hyperparameters-and-interpolation.md",{"type":209,"value":210,"toc":4693},"minimark",[211,215,252,255,266,273,366,373,434,439,445,641,646,649,676,682,689,701,717,902,905,911,916,1190,1193,1199,1206,1209,1453,1456,1461,1464,1472,1482,1489,1495,1741,1744,1766,1772,1875,1878,1886,1894,1916,1923,2049,2052,2061,2121,2129,2146,2174,2400,2403,2584,2587,2594,2824,2864,2868,2875,2952,2955,3068,3071,3249,3252,3269,3277,3295,3471,3474,4128,4131,4277,4280,4521,4524,4531,4556,4569,4573,4636,4653,4655,4689],[212,213,35],"h1",{"id":214},"hyperparameters-and-interpolation",[216,217,218,222,223,226,229,230,234,235,238,239,242,243,245,229,248,251],"p",{},[219,220,221],"strong",{},"Series:"," laco tutorial notebooks",[224,225],"br",{},[219,227,228],{},"Prerequisites:"," ",[231,232,233],"code",{},"01.why-laco.ipynb"," (installation), ",[231,236,237],{},"02.first-steps.ipynb"," (config basics), ",[231,240,241],{},"03.lazy-call-and-partial.ipynb"," (lazy call and partial)",[224,244],{},[219,246,247],{},"Dependencies:",[231,249,250],{},"torch.nn"," (for concrete examples)",[253,254],"hr",{},[216,256,257,258,261,262,265],{},"The previous notebook showed how ",[231,259,260],{},"L.call"," turns a constructor call into a config node. But configs with hard-coded numbers are still hard to sweep: every ",[231,263,264],{},"in_features=256"," is a copy you'd have to hunt down and change.",[216,267,268,269,272],{},"This notebook covers laco's ",[219,270,271],{},"interpolation system",": the mechanism that lets a single change propagate through an entire config tree.",[274,275,276,292],"table",{},[277,278,279],"thead",{},[280,281,282,286,289],"tr",{},[283,284,285],"th",{},"Construct",[283,287,288],{},"What it produces at runtime",[283,290,291],{},"What it types as (IDE)",[293,294,295,314,333,349],"tbody",{},[280,296,297,303,308],{},[298,299,300],"td",{},[231,301,302],{},"@L.params class hps",[298,304,305],{},[231,306,307],{},"ParamsWrapper(hps)",[298,309,310,313],{},[231,311,312],{},"type[hps]"," (dataclass-like)",[280,315,316,321,327],{},[298,317,318],{},[231,319,320],{},"hps.attr",[298,322,323,326],{},[231,324,325],{},"\"${hps.attr}\""," (interpolation string)",[298,328,329,330],{},"declared type of ",[231,331,332],{},"attr",[280,334,335,340,343],{},[298,336,337],{},[231,338,339],{},"L.ref(\"${...}\")",[298,341,342],{},"the string itself",[298,344,345,346],{},"caller-chosen type ",[231,347,348],{},"R",[280,350,351,356,361],{},[298,352,353],{},[231,354,355],{},"L.r.sum(a, b)",[298,357,358,326],{},[231,359,360],{},"\"${sum:a,b}\"",[298,362,363],{},[231,364,365],{},"float",[216,367,368,369,372],{},"By the end you will be able to write a config where every dimension flows from a single\n",[231,370,371],{},"hps"," class, and sweeping them all at once is a single URL query parameter.",[374,375,380],"pre",{"className":376,"code":377,"language":378,"meta":379,"style":379},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","import laco\nimport laco.language as L\nimport torch.nn as nn\n","python","",[231,381,382,395,416],{"__ignoreMap":379},[383,384,387,391],"span",{"class":385,"line":386},"line",1,[383,388,390],{"class":389},"sVHd0","import",[383,392,394],{"class":393},"su5hD"," laco\n",[383,396,398,400,403,407,410,413],{"class":385,"line":397},2,[383,399,390],{"class":389},[383,401,402],{"class":393}," laco",[383,404,406],{"class":405},"sP7_E",".",[383,408,198],{"class":409},"skxfh",[383,411,412],{"class":389}," as",[383,414,415],{"class":393}," L\n",[383,417,419,421,424,426,429,431],{"class":385,"line":418},3,[383,420,390],{"class":389},[383,422,423],{"class":393}," torch",[383,425,406],{"class":405},[383,427,428],{"class":409},"nn",[383,430,412],{"class":389},[383,432,433],{"class":393}," nn\n",[435,436,438],"h2",{"id":437},"section-1-the-hard-coded-number-problem","Section 1: The hard-coded number problem",[216,440,441,442,444],{},"Suppose you are building a two-layer MLP. With ",[231,443,260],{}," alone, your config looks like this:",[374,446,448],{"className":376,"code":447,"language":378,"meta":379,"style":379},"# Hard-coded dimensions — fragile!\nlayer1 = L.call(nn.Linear)(in_features=128, out_features=256)\nlayer2 = L.call(nn.Linear)(in_features=256, out_features=256)\nlayer3 = L.call(nn.Linear)(in_features=256, out_features=64)\n\n# To change the hidden size from 256 → 512, you must find every \"256\"\n# and decide whether it is a hidden dimension or something else.\n# Mistakes are silent — nothing checks that layer2.in == layer1.out.\nprint(laco.dump(layer2))\n",[231,449,450,456,511,550,591,598,604,610,616],{"__ignoreMap":379},[383,451,452],{"class":385,"line":386},[383,453,455],{"class":454},"sutJx","# Hard-coded dimensions — fragile!\n",[383,457,458,461,465,468,470,474,477,479,481,484,487,491,493,497,500,503,505,508],{"class":385,"line":397},[383,459,460],{"class":393},"layer1 ",[383,462,464],{"class":463},"smGrS","=",[383,466,467],{"class":393}," L",[383,469,406],{"class":405},[383,471,473],{"class":472},"slqww","call",[383,475,476],{"class":405},"(",[383,478,428],{"class":472},[383,480,406],{"class":405},[383,482,483],{"class":409},"Linear",[383,485,486],{"class":405},")(",[383,488,490],{"class":489},"s99_P","in_features",[383,492,464],{"class":463},[383,494,496],{"class":495},"srdBf","128",[383,498,499],{"class":405},",",[383,501,502],{"class":489}," out_features",[383,504,464],{"class":463},[383,506,507],{"class":495},"256",[383,509,510],{"class":405},")\n",[383,512,513,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548],{"class":385,"line":418},[383,514,515],{"class":393},"layer2 ",[383,517,464],{"class":463},[383,519,467],{"class":393},[383,521,406],{"class":405},[383,523,473],{"class":472},[383,525,476],{"class":405},[383,527,428],{"class":472},[383,529,406],{"class":405},[383,531,483],{"class":409},[383,533,486],{"class":405},[383,535,490],{"class":489},[383,537,464],{"class":463},[383,539,507],{"class":495},[383,541,499],{"class":405},[383,543,502],{"class":489},[383,545,464],{"class":463},[383,547,507],{"class":495},[383,549,510],{"class":405},[383,551,553,556,558,560,562,564,566,568,570,572,574,576,578,580,582,584,586,589],{"class":385,"line":552},4,[383,554,555],{"class":393},"layer3 ",[383,557,464],{"class":463},[383,559,467],{"class":393},[383,561,406],{"class":405},[383,563,473],{"class":472},[383,565,476],{"class":405},[383,567,428],{"class":472},[383,569,406],{"class":405},[383,571,483],{"class":409},[383,573,486],{"class":405},[383,575,490],{"class":489},[383,577,464],{"class":463},[383,579,507],{"class":495},[383,581,499],{"class":405},[383,583,502],{"class":489},[383,585,464],{"class":463},[383,587,588],{"class":495},"64",[383,590,510],{"class":405},[383,592,594],{"class":385,"line":593},5,[383,595,597],{"emptyLinePlaceholder":596},true,"\n",[383,599,601],{"class":385,"line":600},6,[383,602,603],{"class":454},"# To change the hidden size from 256 → 512, you must find every \"256\"\n",[383,605,607],{"class":385,"line":606},7,[383,608,609],{"class":454},"# and decide whether it is a hidden dimension or something else.\n",[383,611,613],{"class":385,"line":612},8,[383,614,615],{"class":454},"# Mistakes are silent — nothing checks that layer2.in == layer1.out.\n",[383,617,619,623,625,628,630,633,635,638],{"class":385,"line":618},9,[383,620,622],{"class":621},"sptTA","print",[383,624,476],{"class":405},[383,626,627],{"class":472},"laco",[383,629,406],{"class":405},[383,631,632],{"class":472},"dump",[383,634,476],{"class":405},[383,636,637],{"class":472},"layer2",[383,639,640],{"class":405},"))\n",[642,643],"docyard-notebook-output",{"data":644,"kind":645},"e19jb252ZXJ0XzogYWxsLCBfbGFjb186IDEsIF90YXJnZXRfOiB0b3JjaC5ubi5MaW5lYXIsIGluX2ZlYXR1cmVzOiAyNTYsIG91dF9mZWF0dXJlczogMjU2fQoK","stream",[216,647,648],{},"Three problems:",[650,651,652,661,670],"ol",{},[653,654,655,229,658,660],"li",{},[219,656,657],{},"Duplication.",[231,659,507],{}," appears three times. One missed update → shape mismatch at runtime.",[653,662,663,666,667,669],{},[219,664,665],{},"No provenance."," The number ",[231,668,507],{}," carries no label. Is it the hidden size? The batch size? A coincidence?",[653,671,672,675],{},[219,673,674],{},"No sweep support."," To run a hyperparameter search over hidden sizes, you'd need an outer loop that rebuilds the entire config from scratch.",[216,677,678,681],{},[231,679,680],{},"@L.params"," solves all three.",[435,683,685,686,688],{"id":684},"section-2-lparams-names-your-hyperparameters","Section 2: ",[231,687,680],{}," names your hyperparameters",[216,690,691,693,694,697,698,700],{},[231,692,680],{}," decorates a plain class whose annotated fields are the hyperparameters. Accessing an attribute returns an OmegaConf ",[219,695,696],{},"interpolation string",": a ",[231,699,325],{}," placeholder that OmegaConf resolves to the actual value when the config tree is instantiated.",[216,702,703,704,708,709,712,713,716],{},"The class body looks like a dataclass. To pyright and your IDE, it ",[705,706,707],"em",{},"is"," a dataclass (thanks to ",[231,710,711],{},"@dataclass_transform","). At runtime it's a ",[231,714,715],{},"ParamsWrapper"," that emits interpolation strings.",[374,718,720],{"className":376,"code":719,"language":378,"meta":379,"style":379},"@L.params\nclass hps:\n    dim_in:     int = 128\n    dim_out:    int = 64\n    dim_hidden: int = 256\n    num_layers: int = 3\n\n# Attribute access returns interpolation strings at runtime:\nprint(hps.dim_in)      # \"${hps.dim_in}\"\nprint(hps.dim_out)     # \"${hps.dim_out}\"\nprint(hps.dim_hidden)  # \"${hps.dim_hidden}\"\nprint(type(hps.dim_in))  # \u003Cclass 'str'>\n",[231,721,722,737,750,768,783,798,812,816,821,840,859,878],{"__ignoreMap":379},[383,723,724,728,732,734],{"class":385,"line":386},[383,725,727],{"class":726},"stp6e","@",[383,729,731],{"class":730},"sGLFI","L",[383,733,406],{"class":726},[383,735,736],{"class":730},"params\n",[383,738,739,743,747],{"class":385,"line":397},[383,740,742],{"class":741},"sbsja","class",[383,744,746],{"class":745},"sbgvK"," hps",[383,748,749],{"class":405},":\n",[383,751,752,755,758,762,765],{"class":385,"line":418},[383,753,754],{"class":393},"    dim_in",[383,756,757],{"class":405},":",[383,759,761],{"class":760},"sZMiF","     int",[383,763,764],{"class":463}," =",[383,766,767],{"class":495}," 128\n",[383,769,770,773,775,778,780],{"class":385,"line":552},[383,771,772],{"class":393},"    dim_out",[383,774,757],{"class":405},[383,776,777],{"class":760},"    int",[383,779,764],{"class":463},[383,781,782],{"class":495}," 64\n",[383,784,785,788,790,793,795],{"class":385,"line":593},[383,786,787],{"class":393},"    dim_hidden",[383,789,757],{"class":405},[383,791,792],{"class":760}," int",[383,794,764],{"class":463},[383,796,797],{"class":495}," 256\n",[383,799,800,803,805,807,809],{"class":385,"line":600},[383,801,802],{"class":393},"    num_layers",[383,804,757],{"class":405},[383,806,792],{"class":760},[383,808,764],{"class":463},[383,810,811],{"class":495}," 3\n",[383,813,814],{"class":385,"line":606},[383,815,597],{"emptyLinePlaceholder":596},[383,817,818],{"class":385,"line":612},[383,819,820],{"class":454},"# Attribute access returns interpolation strings at runtime:\n",[383,822,823,825,827,829,831,834,837],{"class":385,"line":618},[383,824,622],{"class":621},[383,826,476],{"class":405},[383,828,371],{"class":472},[383,830,406],{"class":405},[383,832,833],{"class":409},"dim_in",[383,835,836],{"class":405},")",[383,838,839],{"class":454},"      # \"${hps.dim_in}\"\n",[383,841,843,845,847,849,851,854,856],{"class":385,"line":842},10,[383,844,622],{"class":621},[383,846,476],{"class":405},[383,848,371],{"class":472},[383,850,406],{"class":405},[383,852,853],{"class":409},"dim_out",[383,855,836],{"class":405},[383,857,858],{"class":454},"     # \"${hps.dim_out}\"\n",[383,860,862,864,866,868,870,873,875],{"class":385,"line":861},11,[383,863,622],{"class":621},[383,865,476],{"class":405},[383,867,371],{"class":472},[383,869,406],{"class":405},[383,871,872],{"class":409},"dim_hidden",[383,874,836],{"class":405},[383,876,877],{"class":454},"  # \"${hps.dim_hidden}\"\n",[383,879,881,883,885,888,890,892,894,896,899],{"class":385,"line":880},12,[383,882,622],{"class":621},[383,884,476],{"class":405},[383,886,887],{"class":760},"type",[383,889,476],{"class":405},[383,891,371],{"class":472},[383,893,406],{"class":405},[383,895,833],{"class":409},[383,897,898],{"class":405},"))",[383,900,901],{"class":454},"  # \u003Cclass 'str'>\n",[642,903],{"data":904,"kind":645},"JHtocHMuZGltX2lufQoke2hwcy5kaW1fb3V0fQoke2hwcy5kaW1faGlkZGVufQo8Y2xhc3MgJ3N0cic+Cg==",[216,906,907,908,910],{},"Those strings become the values in the config node. OmegaConf resolves them later, when the full config tree (including the ",[231,909,371],{}," node with the actual integers) is present.",[216,912,913,914,757],{},"Now rewrite the MLP layers using ",[231,915,371],{},[374,917,919],{"className":376,"code":918,"language":378,"meta":379,"style":379},"layer1_cfg = L.call(nn.Linear)(in_features=hps.dim_in,     out_features=hps.dim_hidden)\nlayer2_cfg = L.call(nn.Linear)(in_features=hps.dim_hidden, out_features=hps.dim_hidden)\nlayer3_cfg = L.call(nn.Linear)(in_features=hps.dim_hidden, out_features=hps.dim_out)\n\n# Each layer node holds the interpolation strings, e.g. in_features: ${hps.dim_in}.\n# An interpolation can only resolve when the *full* config tree also contains the\n# hps node with the actual integers. On its own a fragment has no hps sibling, so\n# dumping it would raise InterpolationKeyError. We assemble that tree by hand here;\n# laco.load does exactly this for a config file (see Section 4). Calling hps() on\n# the @L.params block returns its plain {field: value} dict.\ntree = {\"hps\": hps(), \"layer1\": layer1_cfg, \"layer2\": layer2_cfg, \"layer3\": layer3_cfg}\n\nprint(laco.dump(tree))\n",[231,920,921,969,1016,1063,1067,1072,1077,1082,1087,1092,1097,1166,1170],{"__ignoreMap":379},[383,922,923,926,928,930,932,934,936,938,940,942,944,946,948,950,952,954,956,959,961,963,965,967],{"class":385,"line":386},[383,924,925],{"class":393},"layer1_cfg ",[383,927,464],{"class":463},[383,929,467],{"class":393},[383,931,406],{"class":405},[383,933,473],{"class":472},[383,935,476],{"class":405},[383,937,428],{"class":472},[383,939,406],{"class":405},[383,941,483],{"class":409},[383,943,486],{"class":405},[383,945,490],{"class":489},[383,947,464],{"class":463},[383,949,371],{"class":472},[383,951,406],{"class":405},[383,953,833],{"class":409},[383,955,499],{"class":405},[383,957,958],{"class":489},"     out_features",[383,960,464],{"class":463},[383,962,371],{"class":472},[383,964,406],{"class":405},[383,966,872],{"class":409},[383,968,510],{"class":405},[383,970,971,974,976,978,980,982,984,986,988,990,992,994,996,998,1000,1002,1004,1006,1008,1010,1012,1014],{"class":385,"line":397},[383,972,973],{"class":393},"layer2_cfg ",[383,975,464],{"class":463},[383,977,467],{"class":393},[383,979,406],{"class":405},[383,981,473],{"class":472},[383,983,476],{"class":405},[383,985,428],{"class":472},[383,987,406],{"class":405},[383,989,483],{"class":409},[383,991,486],{"class":405},[383,993,490],{"class":489},[383,995,464],{"class":463},[383,997,371],{"class":472},[383,999,406],{"class":405},[383,1001,872],{"class":409},[383,1003,499],{"class":405},[383,1005,502],{"class":489},[383,1007,464],{"class":463},[383,1009,371],{"class":472},[383,1011,406],{"class":405},[383,1013,872],{"class":409},[383,1015,510],{"class":405},[383,1017,1018,1021,1023,1025,1027,1029,1031,1033,1035,1037,1039,1041,1043,1045,1047,1049,1051,1053,1055,1057,1059,1061],{"class":385,"line":418},[383,1019,1020],{"class":393},"layer3_cfg ",[383,1022,464],{"class":463},[383,1024,467],{"class":393},[383,1026,406],{"class":405},[383,1028,473],{"class":472},[383,1030,476],{"class":405},[383,1032,428],{"class":472},[383,1034,406],{"class":405},[383,1036,483],{"class":409},[383,1038,486],{"class":405},[383,1040,490],{"class":489},[383,1042,464],{"class":463},[383,1044,371],{"class":472},[383,1046,406],{"class":405},[383,1048,872],{"class":409},[383,1050,499],{"class":405},[383,1052,502],{"class":489},[383,1054,464],{"class":463},[383,1056,371],{"class":472},[383,1058,406],{"class":405},[383,1060,853],{"class":409},[383,1062,510],{"class":405},[383,1064,1065],{"class":385,"line":552},[383,1066,597],{"emptyLinePlaceholder":596},[383,1068,1069],{"class":385,"line":593},[383,1070,1071],{"class":454},"# Each layer node holds the interpolation strings, e.g. in_features: ${hps.dim_in}.\n",[383,1073,1074],{"class":385,"line":600},[383,1075,1076],{"class":454},"# An interpolation can only resolve when the *full* config tree also contains the\n",[383,1078,1079],{"class":385,"line":606},[383,1080,1081],{"class":454},"# hps node with the actual integers. On its own a fragment has no hps sibling, so\n",[383,1083,1084],{"class":385,"line":612},[383,1085,1086],{"class":454},"# dumping it would raise InterpolationKeyError. We assemble that tree by hand here;\n",[383,1088,1089],{"class":385,"line":618},[383,1090,1091],{"class":454},"# laco.load does exactly this for a config file (see Section 4). Calling hps() on\n",[383,1093,1094],{"class":385,"line":842},[383,1095,1096],{"class":454},"# the @L.params block returns its plain {field: value} dict.\n",[383,1098,1099,1102,1104,1107,1111,1114,1116,1118,1120,1123,1126,1129,1131,1133,1136,1138,1140,1142,1144,1146,1149,1151,1153,1156,1158,1160,1163],{"class":385,"line":861},[383,1100,1101],{"class":393},"tree ",[383,1103,464],{"class":463},[383,1105,1106],{"class":405}," {",[383,1108,1110],{"class":1109},"sjJ54","\"",[383,1112,371],{"class":1113},"s_sjI",[383,1115,1110],{"class":1109},[383,1117,757],{"class":405},[383,1119,746],{"class":472},[383,1121,1122],{"class":405},"(),",[383,1124,1125],{"class":1109}," \"",[383,1127,1128],{"class":1113},"layer1",[383,1130,1110],{"class":1109},[383,1132,757],{"class":405},[383,1134,1135],{"class":393}," layer1_cfg",[383,1137,499],{"class":405},[383,1139,1125],{"class":1109},[383,1141,637],{"class":1113},[383,1143,1110],{"class":1109},[383,1145,757],{"class":405},[383,1147,1148],{"class":393}," layer2_cfg",[383,1150,499],{"class":405},[383,1152,1125],{"class":1109},[383,1154,1155],{"class":1113},"layer3",[383,1157,1110],{"class":1109},[383,1159,757],{"class":405},[383,1161,1162],{"class":393}," layer3_cfg",[383,1164,1165],{"class":405},"}\n",[383,1167,1168],{"class":385,"line":880},[383,1169,597],{"emptyLinePlaceholder":596},[383,1171,1173,1175,1177,1179,1181,1183,1185,1188],{"class":385,"line":1172},13,[383,1174,622],{"class":621},[383,1176,476],{"class":405},[383,1178,627],{"class":472},[383,1180,406],{"class":405},[383,1182,632],{"class":472},[383,1184,476],{"class":405},[383,1186,1187],{"class":472},"tree",[383,1189,640],{"class":405},[642,1191],{"data":1192,"kind":645},"X2xhY29fOiAxCmhwczoge2RpbV9oaWRkZW46IDI1NiwgZGltX2luOiAxMjgsIGRpbV9vdXQ6IDY0LCBudW1fbGF5ZXJzOiAzfQpsYXllcjE6IHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLkxpbmVhciwgaW5fZmVhdHVyZXM6ICcke2hwcy5kaW1faW59JywKICBvdXRfZmVhdHVyZXM6ICcke2hwcy5kaW1faGlkZGVufSd9CmxheWVyMjoge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uTGluZWFyLCBpbl9mZWF0dXJlczogJyR7aHBzLmRpbV9oaWRkZW59JywKICBvdXRfZmVhdHVyZXM6ICcke2hwcy5kaW1faGlkZGVufSd9CmxheWVyMzoge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uTGluZWFyLCBpbl9mZWF0dXJlczogJyR7aHBzLmRpbV9oaWRkZW59JywKICBvdXRfZmVhdHVyZXM6ICcke2hwcy5kaW1fb3V0fSd9Cgo=",[216,1194,1195,1196,1198],{},"The dimensions are now labeled references. Changing ",[231,1197,872],{}," in one place propagates everywhere automatically: no hunting, no mismatches.",[435,1200,1202,1203,1205],{"id":1201},"section-3-lparams-what-pyright-sees-vs-what-python-holds","Section 3: ",[231,1204,680],{},", what pyright sees vs. what Python holds",[216,1207,1208],{},"This is the core lie-typing construct for hyperparameters. The static view and the runtime view diverge deliberately, and that divergence is load-bearing.",[374,1210,1212],{"className":376,"code":1211,"language":378,"meta":379,"style":379},"@L.params\nclass dims:\n    width: int   = 512\n    depth: int   = 6\n    drop:  float = 0.1\n\n# What Python holds at runtime:\nprint(\"dims.width  (runtime) =\", repr(dims.width))   # '${dims.width}'\nprint(\"dims.depth  (runtime) =\", repr(dims.depth))   # '${dims.depth}'\nprint(\"dims.drop   (runtime) =\", repr(dims.drop))    # '${dims.drop}'\n\n# The IDE \u002F pyright reports:\n#   dims.width : int\n#   dims.depth : int\n#   dims.drop  : float\n# ... which is a lie, but a useful one.\nprint()\nprint(\"Runtime type of dims.width:\", type(dims.width))  # str\n",[231,1213,1214,1224,1233,1248,1262,1277,1281,1286,1319,1350,1381,1385,1390,1395,1401,1407,1413,1421],{"__ignoreMap":379},[383,1215,1216,1218,1220,1222],{"class":385,"line":386},[383,1217,727],{"class":726},[383,1219,731],{"class":730},[383,1221,406],{"class":726},[383,1223,736],{"class":730},[383,1225,1226,1228,1231],{"class":385,"line":397},[383,1227,742],{"class":741},[383,1229,1230],{"class":745}," dims",[383,1232,749],{"class":405},[383,1234,1235,1238,1240,1242,1245],{"class":385,"line":418},[383,1236,1237],{"class":393},"    width",[383,1239,757],{"class":405},[383,1241,792],{"class":760},[383,1243,1244],{"class":463},"   =",[383,1246,1247],{"class":495}," 512\n",[383,1249,1250,1253,1255,1257,1259],{"class":385,"line":552},[383,1251,1252],{"class":393},"    depth",[383,1254,757],{"class":405},[383,1256,792],{"class":760},[383,1258,1244],{"class":463},[383,1260,1261],{"class":495}," 6\n",[383,1263,1264,1267,1269,1272,1274],{"class":385,"line":593},[383,1265,1266],{"class":393},"    drop",[383,1268,757],{"class":405},[383,1270,1271],{"class":760},"  float",[383,1273,764],{"class":463},[383,1275,1276],{"class":495}," 0.1\n",[383,1278,1279],{"class":385,"line":600},[383,1280,597],{"emptyLinePlaceholder":596},[383,1282,1283],{"class":385,"line":606},[383,1284,1285],{"class":454},"# What Python holds at runtime:\n",[383,1287,1288,1290,1292,1294,1297,1299,1301,1304,1306,1309,1311,1314,1316],{"class":385,"line":612},[383,1289,622],{"class":621},[383,1291,476],{"class":405},[383,1293,1110],{"class":1109},[383,1295,1296],{"class":1113},"dims.width  (runtime) =",[383,1298,1110],{"class":1109},[383,1300,499],{"class":405},[383,1302,1303],{"class":621}," repr",[383,1305,476],{"class":405},[383,1307,1308],{"class":472},"dims",[383,1310,406],{"class":405},[383,1312,1313],{"class":409},"width",[383,1315,898],{"class":405},[383,1317,1318],{"class":454},"   # '${dims.width}'\n",[383,1320,1321,1323,1325,1327,1330,1332,1334,1336,1338,1340,1342,1345,1347],{"class":385,"line":618},[383,1322,622],{"class":621},[383,1324,476],{"class":405},[383,1326,1110],{"class":1109},[383,1328,1329],{"class":1113},"dims.depth  (runtime) =",[383,1331,1110],{"class":1109},[383,1333,499],{"class":405},[383,1335,1303],{"class":621},[383,1337,476],{"class":405},[383,1339,1308],{"class":472},[383,1341,406],{"class":405},[383,1343,1344],{"class":409},"depth",[383,1346,898],{"class":405},[383,1348,1349],{"class":454},"   # '${dims.depth}'\n",[383,1351,1352,1354,1356,1358,1361,1363,1365,1367,1369,1371,1373,1376,1378],{"class":385,"line":842},[383,1353,622],{"class":621},[383,1355,476],{"class":405},[383,1357,1110],{"class":1109},[383,1359,1360],{"class":1113},"dims.drop   (runtime) =",[383,1362,1110],{"class":1109},[383,1364,499],{"class":405},[383,1366,1303],{"class":621},[383,1368,476],{"class":405},[383,1370,1308],{"class":472},[383,1372,406],{"class":405},[383,1374,1375],{"class":409},"drop",[383,1377,898],{"class":405},[383,1379,1380],{"class":454},"    # '${dims.drop}'\n",[383,1382,1383],{"class":385,"line":861},[383,1384,597],{"emptyLinePlaceholder":596},[383,1386,1387],{"class":385,"line":880},[383,1388,1389],{"class":454},"# The IDE \u002F pyright reports:\n",[383,1391,1392],{"class":385,"line":1172},[383,1393,1394],{"class":454},"#   dims.width : int\n",[383,1396,1398],{"class":385,"line":1397},14,[383,1399,1400],{"class":454},"#   dims.depth : int\n",[383,1402,1404],{"class":385,"line":1403},15,[383,1405,1406],{"class":454},"#   dims.drop  : float\n",[383,1408,1410],{"class":385,"line":1409},16,[383,1411,1412],{"class":454},"# ... which is a lie, but a useful one.\n",[383,1414,1416,1418],{"class":385,"line":1415},17,[383,1417,622],{"class":621},[383,1419,1420],{"class":405},"()\n",[383,1422,1424,1426,1428,1430,1433,1435,1437,1440,1442,1444,1446,1448,1450],{"class":385,"line":1423},18,[383,1425,622],{"class":621},[383,1427,476],{"class":405},[383,1429,1110],{"class":1109},[383,1431,1432],{"class":1113},"Runtime type of dims.width:",[383,1434,1110],{"class":1109},[383,1436,499],{"class":405},[383,1438,1439],{"class":760}," type",[383,1441,476],{"class":405},[383,1443,1308],{"class":472},[383,1445,406],{"class":405},[383,1447,1313],{"class":409},[383,1449,898],{"class":405},[383,1451,1452],{"class":454},"  # str\n",[642,1454],{"data":1455,"kind":645},"ZGltcy53aWR0aCAgKHJ1bnRpbWUpID0gJyR7ZGltcy53aWR0aH0nCmRpbXMuZGVwdGggIChydW50aW1lKSA9ICcke2RpbXMuZGVwdGh9JwpkaW1zLmRyb3AgICAocnVudGltZSkgPSAnJHtkaW1zLmRyb3B9JwoKUnVudGltZSB0eXBlIG9mIGRpbXMud2lkdGg6IDxjbGFzcyAnc3RyJz4K",[1457,1458,1460],"h3",{"id":1459},"the-full-resolution-flow","The full resolution flow",[216,1462,1463],{},"Here is the complete journey from class definition to resolved integer:",[374,1465,1470],{"className":1466,"code":1468,"language":1469},[1467],"language-text","@L.params class hps\n    → at import time: ParamsWrapper(hps)\n\nhps.dim_hidden  (attribute access)\n    → \"${hps.dim_hidden}\"  (str)\n\nL.call(nn.Linear)(in_features=hps.dim_hidden, ...)\n    → DictConfig { _target_: \"...\", in_features: \"${hps.dim_hidden}\", ... }\n\nlaco.instantiate(full_cfg)  # full_cfg contains the hps node with actual values\n    → OmegaConf resolves \"${hps.dim_hidden}\" → 256\n    → nn.Linear(in_features=256, ...)\n","text",[231,1471,1468],{"__ignoreMap":379},[216,1473,1474,1475,1477,1478,1481],{},"The resolution only works when the full config tree contains the ",[231,1476,371],{}," node. ",[231,1479,1480],{},"laco.load"," assembles that tree from the config file's exported names.",[435,1483,1485,1486,1488],{"id":1484},"section-4-using-lparams-in-a-real-config","Section 4: Using ",[231,1487,680],{}," in a real config",[216,1490,1491,1492,757],{},"Let's build a complete, loadable config following the pattern from ",[231,1493,1494],{},"linear_regression.py",[374,1496,1498],{"className":376,"code":1497,"language":378,"meta":379,"style":379},"@L.params\nclass hps:\n    in_features:   int   = 8\n    out_features:  int   = 1\n    learning_rate: float = 1e-2\n\n# root=True marks this node as the root of a config tree (it is a typing\u002Fintent\n# marker; it does not bundle the hps node by itself). For the ${hps.*} references\n# to resolve, the hps node must live alongside the model in one tree -- which is\n# precisely what laco.load assembles from a file's exported names. We mirror that\n# here so the config is self-contained and dumpable.\nmodel_cfg = L.call(nn.Linear, root=True)(\n    in_features  = hps.in_features,\n    out_features = hps.out_features,\n)\n\nfull_cfg = {\"hps\": hps(), \"model\": model_cfg}\n\nprint(\"--- model config YAML ---\")\nprint(laco.dump(full_cfg))\n",[231,1499,1500,1510,1518,1533,1548,1563,1567,1572,1577,1582,1587,1592,1627,1643,1658,1662,1666,1701,1705,1721],{"__ignoreMap":379},[383,1501,1502,1504,1506,1508],{"class":385,"line":386},[383,1503,727],{"class":726},[383,1505,731],{"class":730},[383,1507,406],{"class":726},[383,1509,736],{"class":730},[383,1511,1512,1514,1516],{"class":385,"line":397},[383,1513,742],{"class":741},[383,1515,746],{"class":745},[383,1517,749],{"class":405},[383,1519,1520,1523,1525,1528,1530],{"class":385,"line":418},[383,1521,1522],{"class":393},"    in_features",[383,1524,757],{"class":405},[383,1526,1527],{"class":760},"   int",[383,1529,1244],{"class":463},[383,1531,1532],{"class":495}," 8\n",[383,1534,1535,1538,1540,1543,1545],{"class":385,"line":552},[383,1536,1537],{"class":393},"    out_features",[383,1539,757],{"class":405},[383,1541,1542],{"class":760},"  int",[383,1544,1244],{"class":463},[383,1546,1547],{"class":495}," 1\n",[383,1549,1550,1553,1555,1558,1560],{"class":385,"line":593},[383,1551,1552],{"class":393},"    learning_rate",[383,1554,757],{"class":405},[383,1556,1557],{"class":760}," float",[383,1559,764],{"class":463},[383,1561,1562],{"class":495}," 1e-2\n",[383,1564,1565],{"class":385,"line":600},[383,1566,597],{"emptyLinePlaceholder":596},[383,1568,1569],{"class":385,"line":606},[383,1570,1571],{"class":454},"# root=True marks this node as the root of a config tree (it is a typing\u002Fintent\n",[383,1573,1574],{"class":385,"line":612},[383,1575,1576],{"class":454},"# marker; it does not bundle the hps node by itself). For the ${hps.*} references\n",[383,1578,1579],{"class":385,"line":618},[383,1580,1581],{"class":454},"# to resolve, the hps node must live alongside the model in one tree -- which is\n",[383,1583,1584],{"class":385,"line":842},[383,1585,1586],{"class":454},"# precisely what laco.load assembles from a file's exported names. We mirror that\n",[383,1588,1589],{"class":385,"line":861},[383,1590,1591],{"class":454},"# here so the config is self-contained and dumpable.\n",[383,1593,1594,1597,1599,1601,1603,1605,1607,1609,1611,1613,1615,1618,1620,1624],{"class":385,"line":880},[383,1595,1596],{"class":393},"model_cfg ",[383,1598,464],{"class":463},[383,1600,467],{"class":393},[383,1602,406],{"class":405},[383,1604,473],{"class":472},[383,1606,476],{"class":405},[383,1608,428],{"class":472},[383,1610,406],{"class":405},[383,1612,483],{"class":409},[383,1614,499],{"class":405},[383,1616,1617],{"class":489}," root",[383,1619,464],{"class":463},[383,1621,1623],{"class":1622},"s39Yj","True",[383,1625,1626],{"class":405},")(\n",[383,1628,1629,1631,1634,1636,1638,1640],{"class":385,"line":1172},[383,1630,1522],{"class":489},[383,1632,1633],{"class":463},"  =",[383,1635,746],{"class":472},[383,1637,406],{"class":405},[383,1639,490],{"class":409},[383,1641,1642],{"class":405},",\n",[383,1644,1645,1647,1649,1651,1653,1656],{"class":385,"line":1397},[383,1646,1537],{"class":489},[383,1648,764],{"class":463},[383,1650,746],{"class":472},[383,1652,406],{"class":405},[383,1654,1655],{"class":409},"out_features",[383,1657,1642],{"class":405},[383,1659,1660],{"class":385,"line":1403},[383,1661,510],{"class":405},[383,1663,1664],{"class":385,"line":1409},[383,1665,597],{"emptyLinePlaceholder":596},[383,1667,1668,1671,1673,1675,1677,1679,1681,1683,1685,1687,1689,1692,1694,1696,1699],{"class":385,"line":1415},[383,1669,1670],{"class":393},"full_cfg ",[383,1672,464],{"class":463},[383,1674,1106],{"class":405},[383,1676,1110],{"class":1109},[383,1678,371],{"class":1113},[383,1680,1110],{"class":1109},[383,1682,757],{"class":405},[383,1684,746],{"class":472},[383,1686,1122],{"class":405},[383,1688,1125],{"class":1109},[383,1690,1691],{"class":1113},"model",[383,1693,1110],{"class":1109},[383,1695,757],{"class":405},[383,1697,1698],{"class":393}," model_cfg",[383,1700,1165],{"class":405},[383,1702,1703],{"class":385,"line":1423},[383,1704,597],{"emptyLinePlaceholder":596},[383,1706,1708,1710,1712,1714,1717,1719],{"class":385,"line":1707},19,[383,1709,622],{"class":621},[383,1711,476],{"class":405},[383,1713,1110],{"class":1109},[383,1715,1716],{"class":1113},"--- model config YAML ---",[383,1718,1110],{"class":1109},[383,1720,510],{"class":405},[383,1722,1724,1726,1728,1730,1732,1734,1736,1739],{"class":385,"line":1723},20,[383,1725,622],{"class":621},[383,1727,476],{"class":405},[383,1729,627],{"class":472},[383,1731,406],{"class":405},[383,1733,632],{"class":472},[383,1735,476],{"class":405},[383,1737,1738],{"class":472},"full_cfg",[383,1740,640],{"class":405},[642,1742],{"data":1743,"kind":645},"LS0tIG1vZGVsIGNvbmZpZyBZQU1MIC0tLQpfbGFjb186IDEKaHBzOiB7aW5fZmVhdHVyZXM6IDgsIGxlYXJuaW5nX3JhdGU6IDAuMDEsIG91dF9mZWF0dXJlczogMX0KbW9kZWw6IHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLkxpbmVhciwgaW5fZmVhdHVyZXM6ICcke2hwcy5pbl9mZWF0dXJlc30nLAogIG91dF9mZWF0dXJlczogJyR7aHBzLm91dF9mZWF0dXJlc30nfQoK",[216,1745,1746,1747,1750,1751,1753,1754,1757,1758,1761,1762,1765],{},"Notice that the YAML shows ",[231,1748,1749],{},"in_features: ${hps.in_features}",": the literal interpolation string. The ",[231,1752,371],{}," node with the default values (",[231,1755,1756],{},"in_features: 8",") is automatically included when you call ",[231,1759,1760],{},"laco.load(\"configs:\u002F\u002F...\")"," because laco exports all top-level names (including the result of ",[231,1763,1764],{},"hps()",").",[216,1767,1768,1769,1771],{},"To override ",[231,1770,490],{}," from 8 to 32:",[374,1773,1775],{"className":376,"code":1774,"language":378,"meta":379,"style":379},"# Load from the real file with an override:\ncfg = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Flinear_regression.py\",\n    \"hps.in_features=32\",\n    key=\"model\"\n)\nbuilt = laco.instantiate(cfg)\nprint(built)  # Linear(in_features=32, out_features=1, bias=True)\n",[231,1776,1777,1782,1799,1811,1822,1836,1840,1861],{"__ignoreMap":379},[383,1778,1779],{"class":385,"line":386},[383,1780,1781],{"class":454},"# Load from the real file with an override:\n",[383,1783,1784,1787,1789,1791,1793,1796],{"class":385,"line":397},[383,1785,1786],{"class":393},"cfg ",[383,1788,464],{"class":463},[383,1790,402],{"class":393},[383,1792,406],{"class":405},[383,1794,1795],{"class":472},"load",[383,1797,1798],{"class":405},"(\n",[383,1800,1801,1804,1807,1809],{"class":385,"line":418},[383,1802,1803],{"class":1109},"    \"",[383,1805,1806],{"class":1113},"configs:\u002F\u002Fexamples\u002Flinear_regression.py",[383,1808,1110],{"class":1109},[383,1810,1642],{"class":405},[383,1812,1813,1815,1818,1820],{"class":385,"line":552},[383,1814,1803],{"class":1109},[383,1816,1817],{"class":1113},"hps.in_features=32",[383,1819,1110],{"class":1109},[383,1821,1642],{"class":405},[383,1823,1824,1827,1829,1831,1833],{"class":385,"line":593},[383,1825,1826],{"class":489},"    key",[383,1828,464],{"class":463},[383,1830,1110],{"class":1109},[383,1832,1691],{"class":1113},[383,1834,1835],{"class":1109},"\"\n",[383,1837,1838],{"class":385,"line":600},[383,1839,510],{"class":405},[383,1841,1842,1845,1847,1849,1851,1854,1856,1859],{"class":385,"line":606},[383,1843,1844],{"class":393},"built ",[383,1846,464],{"class":463},[383,1848,402],{"class":393},[383,1850,406],{"class":405},[383,1852,1853],{"class":472},"instantiate",[383,1855,476],{"class":405},[383,1857,1858],{"class":472},"cfg",[383,1860,510],{"class":405},[383,1862,1863,1865,1867,1870,1872],{"class":385,"line":612},[383,1864,622],{"class":621},[383,1866,476],{"class":405},[383,1868,1869],{"class":472},"built",[383,1871,836],{"class":405},[383,1873,1874],{"class":454},"  # Linear(in_features=32, out_features=1, bias=True)\n",[642,1876],{"data":1877,"kind":645},"TGluZWFyKGluX2ZlYXR1cmVzPTMyLCBvdXRfZmVhdHVyZXM9MSwgYmlhcz1UcnVlKQo=",[435,1879,1881,1882,1885],{"id":1880},"section-5-lref-explicit-interpolation-references","Section 5: ",[231,1883,1884],{},"L.ref",", explicit interpolation references",[216,1887,1888,1890,1891,1893],{},[231,1889,320],{}," covers the common case where you own the ",[231,1892,680],{}," class and can access it directly. But sometimes you need an interpolation reference:",[1895,1896,1897,1904,1910],"ul",{},[653,1898,1899,1900,1903],{},"to a key in a ",[705,1901,1902],{},"different"," config file",[653,1905,1906,1907],{},"to a nested path like ",[231,1908,1909],{},"${model.encoder.depth}",[653,1911,1912,1913,1915],{},"as a one-off, without declaring a full ",[231,1914,680],{}," class",[216,1917,1918,1920,1921,406],{},[231,1919,339],{}," is the explicit escape hatch. It returns the string unchanged at runtime, typed as the caller-chosen generic ",[231,1922,348],{},[374,1924,1926],{"className":376,"code":1925,"language":378,"meta":379,"style":379},"# Explicitly typed interpolation reference\nhidden_ref: int = L.ref(\"${hps.dim_hidden}\")\nprint(hidden_ref)        # \"${hps.dim_hidden}\"\nprint(type(hidden_ref))  # \u003Cclass 'str'>  (typed as int by the IDE)\n\n# Cross-file reference (e.g., referencing an encoder's output dim\n# from a decoder config that lives in a different file)\nencoder_out_ref: int = L.ref(\"${encoder.out_dim}\")\nprint(encoder_out_ref)\n",[231,1927,1928,1933,1965,1978,1995,1999,2004,2009,2039],{"__ignoreMap":379},[383,1929,1930],{"class":385,"line":386},[383,1931,1932],{"class":454},"# Explicitly typed interpolation reference\n",[383,1934,1935,1938,1940,1942,1944,1946,1948,1951,1953,1955,1958,1961,1963],{"class":385,"line":397},[383,1936,1937],{"class":393},"hidden_ref",[383,1939,757],{"class":405},[383,1941,792],{"class":760},[383,1943,764],{"class":463},[383,1945,467],{"class":393},[383,1947,406],{"class":405},[383,1949,1950],{"class":472},"ref",[383,1952,476],{"class":405},[383,1954,1110],{"class":1109},[383,1956,1957],{"class":1113},"$",[383,1959,1960],{"class":495},"{hps.dim_hidden}",[383,1962,1110],{"class":1109},[383,1964,510],{"class":405},[383,1966,1967,1969,1971,1973,1975],{"class":385,"line":418},[383,1968,622],{"class":621},[383,1970,476],{"class":405},[383,1972,1937],{"class":472},[383,1974,836],{"class":405},[383,1976,1977],{"class":454},"        # \"${hps.dim_hidden}\"\n",[383,1979,1980,1982,1984,1986,1988,1990,1992],{"class":385,"line":552},[383,1981,622],{"class":621},[383,1983,476],{"class":405},[383,1985,887],{"class":760},[383,1987,476],{"class":405},[383,1989,1937],{"class":472},[383,1991,898],{"class":405},[383,1993,1994],{"class":454},"  # \u003Cclass 'str'>  (typed as int by the IDE)\n",[383,1996,1997],{"class":385,"line":593},[383,1998,597],{"emptyLinePlaceholder":596},[383,2000,2001],{"class":385,"line":600},[383,2002,2003],{"class":454},"# Cross-file reference (e.g., referencing an encoder's output dim\n",[383,2005,2006],{"class":385,"line":606},[383,2007,2008],{"class":454},"# from a decoder config that lives in a different file)\n",[383,2010,2011,2014,2016,2018,2020,2022,2024,2026,2028,2030,2032,2035,2037],{"class":385,"line":612},[383,2012,2013],{"class":393},"encoder_out_ref",[383,2015,757],{"class":405},[383,2017,792],{"class":760},[383,2019,764],{"class":463},[383,2021,467],{"class":393},[383,2023,406],{"class":405},[383,2025,1950],{"class":472},[383,2027,476],{"class":405},[383,2029,1110],{"class":1109},[383,2031,1957],{"class":1113},[383,2033,2034],{"class":495},"{encoder.out_dim}",[383,2036,1110],{"class":1109},[383,2038,510],{"class":405},[383,2040,2041,2043,2045,2047],{"class":385,"line":618},[383,2042,622],{"class":621},[383,2044,476],{"class":405},[383,2046,2013],{"class":472},[383,2048,510],{"class":405},[642,2050],{"data":2051,"kind":645},"JHtocHMuZGltX2hpZGRlbn0KPGNsYXNzICdzdHInPgoke2VuY29kZXIub3V0X2RpbX0K",[1457,2053,2055,2056,2058,2059],{"id":2054},"when-to-use-lref-vs-hpsattr","When to use ",[231,2057,1884],{}," vs ",[231,2060,320],{},[274,2062,2063,2073],{},[277,2064,2065],{},[280,2066,2067,2070],{},[283,2068,2069],{},"Situation",[283,2071,2072],{},"Preferred construct",[293,2074,2075,2087,2097,2108],{},[280,2076,2077,2082],{},[298,2078,2079,2081],{},[231,2080,680],{}," class is in scope",[298,2083,2084,2086],{},[231,2085,320],{},": shorter, type-checked against the class body",[280,2088,2089,2092],{},[298,2090,2091],{},"Cross-file or cross-module reference",[298,2093,2094,2096],{},[231,2095,339],{},": explicit, no import needed",[280,2098,2099,2104],{},[298,2100,2101,2102,1915],{},"One-off interpolation not worth a full ",[231,2103,680],{},[298,2105,2106],{},[231,2107,339],{},[280,2109,2110,2116],{},[298,2111,2112,2113,836],{},"Nested path (e.g. ",[231,2114,2115],{},"${a.b.c}",[298,2117,2118],{},[231,2119,2120],{},"L.ref(\"${a.b.c}\")",[435,2122,2124,2125,2128],{"id":2123},"section-6-lr-typed-resolver-builders","Section 6: ",[231,2126,2127],{},"L.r",", typed resolver builders",[216,2130,2131,2132,2135,2136,2135,2139,2142,2143,2145],{},"OmegaConf interpolation strings are plain strings: they can't do arithmetic on their own. laco registers a set of custom OmegaConf resolvers (",[231,2133,2134],{},"sum",", ",[231,2137,2138],{},"div",[231,2140,2141],{},"pow",", ...) and exposes typed builder methods on ",[231,2144,2127],{}," that produce the resolver strings.",[216,2147,2148,229,2151,2154,2155,2158,2159,2162,2163,2166,2167,2170,2171,406],{},[219,2149,2150],{},"The key point:",[231,2152,2153],{},"L.r.div(a, b)"," does ",[705,2156,2157],{},"not"," compute ",[231,2160,2161],{},"a \u002F b"," at config-build time. It emits the string ",[231,2164,2165],{},"\"${div:a,b}\"",", which OmegaConf resolves to the actual quotient at instantiation time, using the resolved (integer) values of any interpolations embedded in ",[231,2168,2169],{},"a"," or ",[231,2172,2173],{},"b",[374,2175,2177],{"className":376,"code":2176,"language":378,"meta":379,"style":379},"@L.params\nclass model_hps:\n    hidden: int = 512\n    num_heads: int = 8\n\n# These all produce interpolation strings, not computed values:\nprint(\"sum    :\", L.r.sum(model_hps.hidden, 64))\nprint(\"div    :\", L.r.div(model_hps.hidden, 2))\nprint(\"pow    :\", L.r.pow(2, model_hps.num_heads))\nprint(\"head_dim:\", L.r.div(model_hps.hidden, model_hps.num_heads))\n",[231,2178,2179,2189,2198,2211,2224,2228,2233,2276,2316,2357],{"__ignoreMap":379},[383,2180,2181,2183,2185,2187],{"class":385,"line":386},[383,2182,727],{"class":726},[383,2184,731],{"class":730},[383,2186,406],{"class":726},[383,2188,736],{"class":730},[383,2190,2191,2193,2196],{"class":385,"line":397},[383,2192,742],{"class":741},[383,2194,2195],{"class":745}," model_hps",[383,2197,749],{"class":405},[383,2199,2200,2203,2205,2207,2209],{"class":385,"line":418},[383,2201,2202],{"class":393},"    hidden",[383,2204,757],{"class":405},[383,2206,792],{"class":760},[383,2208,764],{"class":463},[383,2210,1247],{"class":495},[383,2212,2213,2216,2218,2220,2222],{"class":385,"line":552},[383,2214,2215],{"class":393},"    num_heads",[383,2217,757],{"class":405},[383,2219,792],{"class":760},[383,2221,764],{"class":463},[383,2223,1532],{"class":495},[383,2225,2226],{"class":385,"line":593},[383,2227,597],{"emptyLinePlaceholder":596},[383,2229,2230],{"class":385,"line":600},[383,2231,2232],{"class":454},"# These all produce interpolation strings, not computed values:\n",[383,2234,2235,2237,2239,2241,2244,2246,2248,2250,2252,2255,2257,2259,2261,2264,2266,2269,2271,2274],{"class":385,"line":606},[383,2236,622],{"class":621},[383,2238,476],{"class":405},[383,2240,1110],{"class":1109},[383,2242,2243],{"class":1113},"sum    :",[383,2245,1110],{"class":1109},[383,2247,499],{"class":405},[383,2249,467],{"class":472},[383,2251,406],{"class":405},[383,2253,2254],{"class":409},"r",[383,2256,406],{"class":405},[383,2258,2134],{"class":472},[383,2260,476],{"class":405},[383,2262,2263],{"class":472},"model_hps",[383,2265,406],{"class":405},[383,2267,2268],{"class":409},"hidden",[383,2270,499],{"class":405},[383,2272,2273],{"class":495}," 64",[383,2275,640],{"class":405},[383,2277,2278,2280,2282,2284,2287,2289,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311,2314],{"class":385,"line":612},[383,2279,622],{"class":621},[383,2281,476],{"class":405},[383,2283,1110],{"class":1109},[383,2285,2286],{"class":1113},"div    :",[383,2288,1110],{"class":1109},[383,2290,499],{"class":405},[383,2292,467],{"class":472},[383,2294,406],{"class":405},[383,2296,2254],{"class":409},[383,2298,406],{"class":405},[383,2300,2138],{"class":472},[383,2302,476],{"class":405},[383,2304,2263],{"class":472},[383,2306,406],{"class":405},[383,2308,2268],{"class":409},[383,2310,499],{"class":405},[383,2312,2313],{"class":495}," 2",[383,2315,640],{"class":405},[383,2317,2318,2320,2322,2324,2327,2329,2331,2333,2335,2337,2339,2341,2343,2346,2348,2350,2352,2355],{"class":385,"line":618},[383,2319,622],{"class":621},[383,2321,476],{"class":405},[383,2323,1110],{"class":1109},[383,2325,2326],{"class":1113},"pow    :",[383,2328,1110],{"class":1109},[383,2330,499],{"class":405},[383,2332,467],{"class":472},[383,2334,406],{"class":405},[383,2336,2254],{"class":409},[383,2338,406],{"class":405},[383,2340,2141],{"class":472},[383,2342,476],{"class":405},[383,2344,2345],{"class":495},"2",[383,2347,499],{"class":405},[383,2349,2195],{"class":472},[383,2351,406],{"class":405},[383,2353,2354],{"class":409},"num_heads",[383,2356,640],{"class":405},[383,2358,2359,2361,2363,2365,2368,2370,2372,2374,2376,2378,2380,2382,2384,2386,2388,2390,2392,2394,2396,2398],{"class":385,"line":842},[383,2360,622],{"class":621},[383,2362,476],{"class":405},[383,2364,1110],{"class":1109},[383,2366,2367],{"class":1113},"head_dim:",[383,2369,1110],{"class":1109},[383,2371,499],{"class":405},[383,2373,467],{"class":472},[383,2375,406],{"class":405},[383,2377,2254],{"class":409},[383,2379,406],{"class":405},[383,2381,2138],{"class":472},[383,2383,476],{"class":405},[383,2385,2263],{"class":472},[383,2387,406],{"class":405},[383,2389,2268],{"class":409},[383,2391,499],{"class":405},[383,2393,2195],{"class":472},[383,2395,406],{"class":405},[383,2397,2354],{"class":409},[383,2399,640],{"class":405},[642,2401],{"data":2402,"kind":645},"c3VtICAgIDogJHtzdW06JHttb2RlbF9ocHMuaGlkZGVufSw2NH0KZGl2ICAgIDogJHtkaXY6JHttb2RlbF9ocHMuaGlkZGVufSwyfQpwb3cgICAgOiAke3BvdzoyLCR7bW9kZWxfaHBzLm51bV9oZWFkc319CmhlYWRfZGltOiAke2Rpdjoke21vZGVsX2hwcy5oaWRkZW59LCR7bW9kZWxfaHBzLm51bV9oZWFkc319Cg==",[374,2404,2406],{"className":376,"code":2405,"language":378,"meta":379,"style":379},"# Practical use: derive head_dim from hidden and num_heads\n# so changing either one automatically updates the other.\nhead_dim_cfg = L.call(nn.Linear)(\n    in_features  = L.r.div(model_hps.hidden, model_hps.num_heads),\n    out_features = model_hps.hidden,\n)\n\n# As before, the resolver string ${div:${model_hps.hidden},${model_hps.num_heads}}\n# only resolves when the model_hps node is present in the same tree, so we bundle\n# it in (just like laco.load does for a config file).\nfull_cfg = {\"model_hps\": model_hps(), \"proj\": head_dim_cfg}\n\nprint(\"--- head projection config ---\")\nprint(laco.dump(full_cfg))\n",[231,2407,2408,2413,2418,2441,2476,2490,2494,2498,2503,2508,2513,2547,2551,2566],{"__ignoreMap":379},[383,2409,2410],{"class":385,"line":386},[383,2411,2412],{"class":454},"# Practical use: derive head_dim from hidden and num_heads\n",[383,2414,2415],{"class":385,"line":397},[383,2416,2417],{"class":454},"# so changing either one automatically updates the other.\n",[383,2419,2420,2423,2425,2427,2429,2431,2433,2435,2437,2439],{"class":385,"line":418},[383,2421,2422],{"class":393},"head_dim_cfg ",[383,2424,464],{"class":463},[383,2426,467],{"class":393},[383,2428,406],{"class":405},[383,2430,473],{"class":472},[383,2432,476],{"class":405},[383,2434,428],{"class":472},[383,2436,406],{"class":405},[383,2438,483],{"class":409},[383,2440,1626],{"class":405},[383,2442,2443,2445,2447,2449,2451,2453,2455,2457,2459,2461,2463,2465,2467,2469,2471,2473],{"class":385,"line":552},[383,2444,1522],{"class":489},[383,2446,1633],{"class":463},[383,2448,467],{"class":472},[383,2450,406],{"class":405},[383,2452,2254],{"class":409},[383,2454,406],{"class":405},[383,2456,2138],{"class":472},[383,2458,476],{"class":405},[383,2460,2263],{"class":472},[383,2462,406],{"class":405},[383,2464,2268],{"class":409},[383,2466,499],{"class":405},[383,2468,2195],{"class":472},[383,2470,406],{"class":405},[383,2472,2354],{"class":409},[383,2474,2475],{"class":405},"),\n",[383,2477,2478,2480,2482,2484,2486,2488],{"class":385,"line":593},[383,2479,1537],{"class":489},[383,2481,764],{"class":463},[383,2483,2195],{"class":472},[383,2485,406],{"class":405},[383,2487,2268],{"class":409},[383,2489,1642],{"class":405},[383,2491,2492],{"class":385,"line":600},[383,2493,510],{"class":405},[383,2495,2496],{"class":385,"line":606},[383,2497,597],{"emptyLinePlaceholder":596},[383,2499,2500],{"class":385,"line":612},[383,2501,2502],{"class":454},"# As before, the resolver string ${div:${model_hps.hidden},${model_hps.num_heads}}\n",[383,2504,2505],{"class":385,"line":618},[383,2506,2507],{"class":454},"# only resolves when the model_hps node is present in the same tree, so we bundle\n",[383,2509,2510],{"class":385,"line":842},[383,2511,2512],{"class":454},"# it in (just like laco.load does for a config file).\n",[383,2514,2515,2517,2519,2521,2523,2525,2527,2529,2531,2533,2535,2538,2540,2542,2545],{"class":385,"line":861},[383,2516,1670],{"class":393},[383,2518,464],{"class":463},[383,2520,1106],{"class":405},[383,2522,1110],{"class":1109},[383,2524,2263],{"class":1113},[383,2526,1110],{"class":1109},[383,2528,757],{"class":405},[383,2530,2195],{"class":472},[383,2532,1122],{"class":405},[383,2534,1125],{"class":1109},[383,2536,2537],{"class":1113},"proj",[383,2539,1110],{"class":1109},[383,2541,757],{"class":405},[383,2543,2544],{"class":393}," head_dim_cfg",[383,2546,1165],{"class":405},[383,2548,2549],{"class":385,"line":880},[383,2550,597],{"emptyLinePlaceholder":596},[383,2552,2553,2555,2557,2559,2562,2564],{"class":385,"line":1172},[383,2554,622],{"class":621},[383,2556,476],{"class":405},[383,2558,1110],{"class":1109},[383,2560,2561],{"class":1113},"--- head projection config ---",[383,2563,1110],{"class":1109},[383,2565,510],{"class":405},[383,2567,2568,2570,2572,2574,2576,2578,2580,2582],{"class":385,"line":1397},[383,2569,622],{"class":621},[383,2571,476],{"class":405},[383,2573,627],{"class":472},[383,2575,406],{"class":405},[383,2577,632],{"class":472},[383,2579,476],{"class":405},[383,2581,1738],{"class":472},[383,2583,640],{"class":405},[642,2585],{"data":2586,"kind":645},"LS0tIGhlYWQgcHJvamVjdGlvbiBjb25maWcgLS0tCl9sYWNvXzogMQptb2RlbF9ocHM6IHtoaWRkZW46IDUxMiwgbnVtX2hlYWRzOiA4fQpwcm9qOiB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5MaW5lYXIsIGluX2ZlYXR1cmVzOiAnJHtkaXY6JHttb2RlbF9ocHMuaGlkZGVufSwke21vZGVsX2hwcy5udW1faGVhZHN9fScsCiAgb3V0X2ZlYXR1cmVzOiAnJHttb2RlbF9ocHMuaGlkZGVufSd9Cgo=",[1457,2588,2590,2591,2593],{"id":2589},"bundled-lr-resolvers","Bundled ",[231,2592,2127],{}," resolvers",[274,2595,2596,2614],{},[277,2597,2598],{},[280,2599,2600,2603,2608,2611],{},[283,2601,2602],{},"Resolver",[283,2604,2605,2607],{},[231,2606,2127],{}," builder",[283,2609,2610],{},"Computes",[283,2612,2613],{},"Notes",[293,2615,2616,2635,2654,2673,2690,2708,2727,2746,2765,2784,2804],{},[280,2617,2618,2622,2627,2632],{},[298,2619,2620],{},[231,2621,2134],{},[298,2623,2624],{},[231,2625,2626],{},"L.r.sum(a, b, ...)",[298,2628,2629],{},[231,2630,2631],{},"a + b + ...",[298,2633,2634],{},"Any number of args",[280,2636,2637,2642,2647,2652],{},[298,2638,2639],{},[231,2640,2641],{},"min",[298,2643,2644],{},[231,2645,2646],{},"L.r.min(a, b, ...)",[298,2648,2649],{},[231,2650,2651],{},"min(a, b, ...)",[298,2653,2634],{},[280,2655,2656,2661,2666,2671],{},[298,2657,2658],{},[231,2659,2660],{},"max",[298,2662,2663],{},[231,2664,2665],{},"L.r.max(a, b, ...)",[298,2667,2668],{},[231,2669,2670],{},"max(a, b, ...)",[298,2672,2634],{},[280,2674,2675,2679,2683,2687],{},[298,2676,2677],{},[231,2678,2138],{},[298,2680,2681],{},[231,2682,2153],{},[298,2684,2685],{},[231,2686,2161],{},[298,2688,2689],{},"Float result",[280,2691,2692,2696,2701,2706],{},[298,2693,2694],{},[231,2695,2141],{},[298,2697,2698],{},[231,2699,2700],{},"L.r.pow(a, b)",[298,2702,2703],{},[231,2704,2705],{},"a ** b",[298,2707],{},[280,2709,2710,2715,2720,2725],{},[298,2711,2712],{},[231,2713,2714],{},"mod",[298,2716,2717],{},[231,2718,2719],{},"L.r.mod(a, b)",[298,2721,2722],{},[231,2723,2724],{},"a % b",[298,2726],{},[280,2728,2729,2734,2739,2744],{},[298,2730,2731],{},[231,2732,2733],{},"neg",[298,2735,2736],{},[231,2737,2738],{},"L.r.neg(a)",[298,2740,2741],{},[231,2742,2743],{},"-a",[298,2745],{},[280,2747,2748,2753,2758,2763],{},[298,2749,2750],{},[231,2751,2752],{},"reciprocal",[298,2754,2755],{},[231,2756,2757],{},"L.r.reciprocal(a)",[298,2759,2760],{},[231,2761,2762],{},"1 \u002F a",[298,2764],{},[280,2766,2767,2772,2777,2782],{},[298,2768,2769],{},[231,2770,2771],{},"abs",[298,2773,2774],{},[231,2775,2776],{},"L.r.abs(a)",[298,2778,2779],{},[231,2780,2781],{},"abs(a)",[298,2783],{},[280,2785,2786,2791,2796,2801],{},[298,2787,2788],{},[231,2789,2790],{},"round",[298,2792,2793],{},[231,2794,2795],{},"L.r.round(a, digits=0)",[298,2797,2798],{},[231,2799,2800],{},"round(a, d)",[298,2802,2803],{},"digits required at wire level",[280,2805,2806,2811,2816,2821],{},[298,2807,2808],{},[231,2809,2810],{},"math",[298,2812,2813],{},[231,2814,2815],{},"L.r.math('sqrt', a)",[298,2817,2818],{},[231,2819,2820],{},"math.sqrt(a)",[298,2822,2823],{},"Any math module function",[216,2825,2826,2832,2833,2135,2836,2135,2838,2841,2842,2845,2846,2849,2850,2135,2853,2135,2856,2859,2860,2863],{},[219,2827,2828,2829,2831],{},"Argument types for ",[231,2830,2127],{}," methods."," Each argument must be an ",[231,2834,2835],{},"int",[231,2837,365],{},[231,2839,2840],{},"str"," (including ",[231,2843,2844],{},"\"${...}\""," interpolation strings), or another ",[231,2847,2848],{},"L.r.*"," result. Container types (",[231,2851,2852],{},"list",[231,2854,2855],{},"dict",[231,2857,2858],{},"DictConfig",") are not supported; use ",[231,2861,2862],{},"L.ref(\"${key}\")"," to reference a config value instead.",[435,2865,2867],{"id":2866},"section-7-overrides-changing-values-without-editing-the-file","Section 7: Overrides, changing values without editing the file",[216,2869,2870,2871,2874],{},"Now that all dimensions are interpolation strings pointing at ",[231,2872,2873],{},"hps.*",", a single override changes every dependent value across the config tree. laco supports two override syntaxes.",[374,2876,2878],{"className":376,"code":2877,"language":378,"meta":379,"style":379},"# ---- Syntax 1: URL query string ----\n# Append ?key=value&key2=value2 and optionally #fragment to select a sub-key.\ncfg_url = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Flinear_regression.py?hps.in_features=32&hps.out_features=4#model\"\n)\nprint(\"URL override — model:\")\nprint(laco.dump(cfg_url))\n",[231,2879,2880,2885,2890,2905,2914,2918,2933],{"__ignoreMap":379},[383,2881,2882],{"class":385,"line":386},[383,2883,2884],{"class":454},"# ---- Syntax 1: URL query string ----\n",[383,2886,2887],{"class":385,"line":397},[383,2888,2889],{"class":454},"# Append ?key=value&key2=value2 and optionally #fragment to select a sub-key.\n",[383,2891,2892,2895,2897,2899,2901,2903],{"class":385,"line":418},[383,2893,2894],{"class":393},"cfg_url ",[383,2896,464],{"class":463},[383,2898,402],{"class":393},[383,2900,406],{"class":405},[383,2902,1795],{"class":472},[383,2904,1798],{"class":405},[383,2906,2907,2909,2912],{"class":385,"line":552},[383,2908,1803],{"class":1109},[383,2910,2911],{"class":1113},"configs:\u002F\u002Fexamples\u002Flinear_regression.py?hps.in_features=32&hps.out_features=4#model",[383,2913,1835],{"class":1109},[383,2915,2916],{"class":385,"line":593},[383,2917,510],{"class":405},[383,2919,2920,2922,2924,2926,2929,2931],{"class":385,"line":600},[383,2921,622],{"class":621},[383,2923,476],{"class":405},[383,2925,1110],{"class":1109},[383,2927,2928],{"class":1113},"URL override — model:",[383,2930,1110],{"class":1109},[383,2932,510],{"class":405},[383,2934,2935,2937,2939,2941,2943,2945,2947,2950],{"class":385,"line":606},[383,2936,622],{"class":621},[383,2938,476],{"class":405},[383,2940,627],{"class":472},[383,2942,406],{"class":405},[383,2944,632],{"class":472},[383,2946,476],{"class":405},[383,2948,2949],{"class":472},"cfg_url",[383,2951,640],{"class":405},[642,2953],{"data":2954,"kind":645},"VVJMIG92ZXJyaWRlIOKAlCBtb2RlbDoKe19jb252ZXJ0XzogYWxsLCBfbGFjb186IDEsIF90YXJnZXRfOiB0b3JjaC5ubi5MaW5lYXIsIGJpYXM6ICcke2hwcy5iaWFzfScsIGluX2ZlYXR1cmVzOiAnJHtocHMuaW5fZmVhdHVyZXN9JywKICBvdXRfZmVhdHVyZXM6ICcke2hwcy5vdXRfZmVhdHVyZXN9J30KCg==",[374,2956,2958],{"className":376,"code":2957,"language":378,"meta":379,"style":379},"# ---- Syntax 2: Positional override strings ----\n# Pass extra strings after the path; each is \"key=value\".\ncfg_pos = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Flinear_regression.py\",\n    \"hps.in_features=32\",\n    \"hps.out_features=4\",\n    key=\"model\",\n)\nprint(\"Positional override — model:\")\nprint(laco.dump(cfg_pos))\n",[231,2959,2960,2965,2970,2985,2995,3005,3016,3030,3034,3049],{"__ignoreMap":379},[383,2961,2962],{"class":385,"line":386},[383,2963,2964],{"class":454},"# ---- Syntax 2: Positional override strings ----\n",[383,2966,2967],{"class":385,"line":397},[383,2968,2969],{"class":454},"# Pass extra strings after the path; each is \"key=value\".\n",[383,2971,2972,2975,2977,2979,2981,2983],{"class":385,"line":418},[383,2973,2974],{"class":393},"cfg_pos ",[383,2976,464],{"class":463},[383,2978,402],{"class":393},[383,2980,406],{"class":405},[383,2982,1795],{"class":472},[383,2984,1798],{"class":405},[383,2986,2987,2989,2991,2993],{"class":385,"line":552},[383,2988,1803],{"class":1109},[383,2990,1806],{"class":1113},[383,2992,1110],{"class":1109},[383,2994,1642],{"class":405},[383,2996,2997,2999,3001,3003],{"class":385,"line":593},[383,2998,1803],{"class":1109},[383,3000,1817],{"class":1113},[383,3002,1110],{"class":1109},[383,3004,1642],{"class":405},[383,3006,3007,3009,3012,3014],{"class":385,"line":600},[383,3008,1803],{"class":1109},[383,3010,3011],{"class":1113},"hps.out_features=4",[383,3013,1110],{"class":1109},[383,3015,1642],{"class":405},[383,3017,3018,3020,3022,3024,3026,3028],{"class":385,"line":606},[383,3019,1826],{"class":489},[383,3021,464],{"class":463},[383,3023,1110],{"class":1109},[383,3025,1691],{"class":1113},[383,3027,1110],{"class":1109},[383,3029,1642],{"class":405},[383,3031,3032],{"class":385,"line":612},[383,3033,510],{"class":405},[383,3035,3036,3038,3040,3042,3045,3047],{"class":385,"line":618},[383,3037,622],{"class":621},[383,3039,476],{"class":405},[383,3041,1110],{"class":1109},[383,3043,3044],{"class":1113},"Positional override — model:",[383,3046,1110],{"class":1109},[383,3048,510],{"class":405},[383,3050,3051,3053,3055,3057,3059,3061,3063,3066],{"class":385,"line":842},[383,3052,622],{"class":621},[383,3054,476],{"class":405},[383,3056,627],{"class":472},[383,3058,406],{"class":405},[383,3060,632],{"class":472},[383,3062,476],{"class":405},[383,3064,3065],{"class":472},"cfg_pos",[383,3067,640],{"class":405},[642,3069],{"data":3070,"kind":645},"UG9zaXRpb25hbCBvdmVycmlkZSDigJQgbW9kZWw6CntfY29udmVydF86IGFsbCwgX2xhY29fOiAxLCBfdGFyZ2V0XzogdG9yY2gubm4uTGluZWFyLCBiaWFzOiAnJHtocHMuYmlhc30nLCBpbl9mZWF0dXJlczogJyR7aHBzLmluX2ZlYXR1cmVzfScsCiAgb3V0X2ZlYXR1cmVzOiAnJHtocHMub3V0X2ZlYXR1cmVzfSd9Cgo=",[374,3072,3074],{"className":376,"code":3073,"language":378,"meta":379,"style":379},"# Side-by-side: default vs. overridden\ncfg_default  = laco.load(\"configs:\u002F\u002Fexamples\u002Flinear_regression.py\")\ncfg_override = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Flinear_regression.py\",\n    \"hps.in_features=64\",\n    \"hps.learning_rate=5e-4\",\n)\n\nprint(\"=== default hps ===\")\nprint(laco.dump(cfg_default[\"hps\"]))\n\nprint(\"=== overridden hps ===\")\nprint(laco.dump(cfg_override[\"hps\"]))\n",[231,3075,3076,3081,3104,3119,3129,3140,3151,3155,3159,3174,3203,3207,3222],{"__ignoreMap":379},[383,3077,3078],{"class":385,"line":386},[383,3079,3080],{"class":454},"# Side-by-side: default vs. overridden\n",[383,3082,3083,3086,3088,3090,3092,3094,3096,3098,3100,3102],{"class":385,"line":397},[383,3084,3085],{"class":393},"cfg_default  ",[383,3087,464],{"class":463},[383,3089,402],{"class":393},[383,3091,406],{"class":405},[383,3093,1795],{"class":472},[383,3095,476],{"class":405},[383,3097,1110],{"class":1109},[383,3099,1806],{"class":1113},[383,3101,1110],{"class":1109},[383,3103,510],{"class":405},[383,3105,3106,3109,3111,3113,3115,3117],{"class":385,"line":418},[383,3107,3108],{"class":393},"cfg_override ",[383,3110,464],{"class":463},[383,3112,402],{"class":393},[383,3114,406],{"class":405},[383,3116,1795],{"class":472},[383,3118,1798],{"class":405},[383,3120,3121,3123,3125,3127],{"class":385,"line":552},[383,3122,1803],{"class":1109},[383,3124,1806],{"class":1113},[383,3126,1110],{"class":1109},[383,3128,1642],{"class":405},[383,3130,3131,3133,3136,3138],{"class":385,"line":593},[383,3132,1803],{"class":1109},[383,3134,3135],{"class":1113},"hps.in_features=64",[383,3137,1110],{"class":1109},[383,3139,1642],{"class":405},[383,3141,3142,3144,3147,3149],{"class":385,"line":600},[383,3143,1803],{"class":1109},[383,3145,3146],{"class":1113},"hps.learning_rate=5e-4",[383,3148,1110],{"class":1109},[383,3150,1642],{"class":405},[383,3152,3153],{"class":385,"line":606},[383,3154,510],{"class":405},[383,3156,3157],{"class":385,"line":612},[383,3158,597],{"emptyLinePlaceholder":596},[383,3160,3161,3163,3165,3167,3170,3172],{"class":385,"line":618},[383,3162,622],{"class":621},[383,3164,476],{"class":405},[383,3166,1110],{"class":1109},[383,3168,3169],{"class":1113},"=== default hps ===",[383,3171,1110],{"class":1109},[383,3173,510],{"class":405},[383,3175,3176,3178,3180,3182,3184,3186,3188,3191,3194,3196,3198,3200],{"class":385,"line":842},[383,3177,622],{"class":621},[383,3179,476],{"class":405},[383,3181,627],{"class":472},[383,3183,406],{"class":405},[383,3185,632],{"class":472},[383,3187,476],{"class":405},[383,3189,3190],{"class":472},"cfg_default",[383,3192,3193],{"class":405},"[",[383,3195,1110],{"class":1109},[383,3197,371],{"class":1113},[383,3199,1110],{"class":1109},[383,3201,3202],{"class":405},"]))\n",[383,3204,3205],{"class":385,"line":861},[383,3206,597],{"emptyLinePlaceholder":596},[383,3208,3209,3211,3213,3215,3218,3220],{"class":385,"line":880},[383,3210,622],{"class":621},[383,3212,476],{"class":405},[383,3214,1110],{"class":1109},[383,3216,3217],{"class":1113},"=== overridden hps ===",[383,3219,1110],{"class":1109},[383,3221,510],{"class":405},[383,3223,3224,3226,3228,3230,3232,3234,3236,3239,3241,3243,3245,3247],{"class":385,"line":1172},[383,3225,622],{"class":621},[383,3227,476],{"class":405},[383,3229,627],{"class":472},[383,3231,406],{"class":405},[383,3233,632],{"class":472},[383,3235,476],{"class":405},[383,3237,3238],{"class":472},"cfg_override",[383,3240,3193],{"class":405},[383,3242,1110],{"class":1109},[383,3244,371],{"class":1113},[383,3246,1110],{"class":1109},[383,3248,3202],{"class":405},[642,3250],{"data":3251,"kind":645},"PT09IGRlZmF1bHQgaHBzID09PQp7X2xhY29fOiAxLCBiaWFzOiB0cnVlLCBpbl9mZWF0dXJlczogOCwgbGVhcm5pbmdfcmF0ZTogMC4wMSwgbW9tZW50dW06IDAuOSwgb3V0X2ZlYXR1cmVzOiAxfQoKPT09IG92ZXJyaWRkZW4gaHBzID09PQp7X2xhY29fOiAxLCBiaWFzOiB0cnVlLCBpbl9mZWF0dXJlczogNjQsIGxlYXJuaW5nX3JhdGU6IDAuMDAwNSwgbW9tZW50dW06IDAuOSwgb3V0X2ZlYXR1cmVzOiAxfQoK",[216,3253,3254,3255,3257,3258,3261,3262,3265,3266,3268],{},"The overrides write into the ",[231,3256,371],{}," node. Because ",[231,3259,3260],{},"model.in_features"," is ",[231,3263,3264],{},"\"${hps.in_features}\"",", it automatically picks up the new value at instantiation time, with no other changes required. This is the payoff for using ",[231,3267,680],{}," everywhere.",[435,3270,3272,3273,3276],{"id":3271},"section-8-mlppy-full-walkthrough","Section 8: ",[231,3274,3275],{},"mlp.py"," full walkthrough",[216,3278,3279,3280,3282,3283,2135,3285,2135,3287,3290,3291,3294],{},"Let's read through ",[231,3281,3275],{}," section by section with annotations. This is the smallest non-trivial laco config: it uses ",[231,3284,680],{},[231,3286,260],{},[231,3288,3289],{},"L.repeat",", and ",[231,3292,3293],{},"L.OrderedDict"," together.",[374,3296,3298],{"className":376,"code":3297,"language":378,"meta":379,"style":379},"# === Part 1: Hyperparameters ===\n# Note: activation is typed as type[nn.Module] — laco can store a class object\n# as a config value. The YAML representation is a !!python\u002Fname: tag.\n@L.params\nclass mlp_hps:\n    dim_in:     int           = 128\n    dim_out:    int           = 128\n    dim_hidden: int           = 256\n    num_layers: int           = 3\n    activation: type[nn.Module] = nn.ReLU\n\nprint(\"hps.dim_in  :\", mlp_hps.dim_in)     # \"${mlp_hps.dim_in}\"\nprint(\"hps.activation:\", mlp_hps.activation)  # \"${mlp_hps.activation}\"\n",[231,3299,3300,3305,3310,3315,3325,3334,3347,3359,3371,3383,3414,3418,3444],{"__ignoreMap":379},[383,3301,3302],{"class":385,"line":386},[383,3303,3304],{"class":454},"# === Part 1: Hyperparameters ===\n",[383,3306,3307],{"class":385,"line":397},[383,3308,3309],{"class":454},"# Note: activation is typed as type[nn.Module] — laco can store a class object\n",[383,3311,3312],{"class":385,"line":418},[383,3313,3314],{"class":454},"# as a config value. The YAML representation is a !!python\u002Fname: tag.\n",[383,3316,3317,3319,3321,3323],{"class":385,"line":552},[383,3318,727],{"class":726},[383,3320,731],{"class":730},[383,3322,406],{"class":726},[383,3324,736],{"class":730},[383,3326,3327,3329,3332],{"class":385,"line":593},[383,3328,742],{"class":741},[383,3330,3331],{"class":745}," mlp_hps",[383,3333,749],{"class":405},[383,3335,3336,3338,3340,3342,3345],{"class":385,"line":600},[383,3337,754],{"class":393},[383,3339,757],{"class":405},[383,3341,761],{"class":760},[383,3343,3344],{"class":463},"           =",[383,3346,767],{"class":495},[383,3348,3349,3351,3353,3355,3357],{"class":385,"line":606},[383,3350,772],{"class":393},[383,3352,757],{"class":405},[383,3354,777],{"class":760},[383,3356,3344],{"class":463},[383,3358,767],{"class":495},[383,3360,3361,3363,3365,3367,3369],{"class":385,"line":612},[383,3362,787],{"class":393},[383,3364,757],{"class":405},[383,3366,792],{"class":760},[383,3368,3344],{"class":463},[383,3370,797],{"class":495},[383,3372,3373,3375,3377,3379,3381],{"class":385,"line":618},[383,3374,802],{"class":393},[383,3376,757],{"class":405},[383,3378,792],{"class":760},[383,3380,3344],{"class":463},[383,3382,811],{"class":495},[383,3384,3385,3388,3390,3392,3394,3396,3398,3401,3404,3406,3409,3411],{"class":385,"line":842},[383,3386,3387],{"class":393},"    activation",[383,3389,757],{"class":405},[383,3391,1439],{"class":393},[383,3393,3193],{"class":405},[383,3395,428],{"class":393},[383,3397,406],{"class":405},[383,3399,3400],{"class":409},"Module",[383,3402,3403],{"class":405},"]",[383,3405,764],{"class":463},[383,3407,3408],{"class":393}," nn",[383,3410,406],{"class":405},[383,3412,3413],{"class":409},"ReLU\n",[383,3415,3416],{"class":385,"line":861},[383,3417,597],{"emptyLinePlaceholder":596},[383,3419,3420,3422,3424,3426,3429,3431,3433,3435,3437,3439,3441],{"class":385,"line":880},[383,3421,622],{"class":621},[383,3423,476],{"class":405},[383,3425,1110],{"class":1109},[383,3427,3428],{"class":1113},"hps.dim_in  :",[383,3430,1110],{"class":1109},[383,3432,499],{"class":405},[383,3434,3331],{"class":472},[383,3436,406],{"class":405},[383,3438,833],{"class":409},[383,3440,836],{"class":405},[383,3442,3443],{"class":454},"     # \"${mlp_hps.dim_in}\"\n",[383,3445,3446,3448,3450,3452,3455,3457,3459,3461,3463,3466,3468],{"class":385,"line":1172},[383,3447,622],{"class":621},[383,3449,476],{"class":405},[383,3451,1110],{"class":1109},[383,3453,3454],{"class":1113},"hps.activation:",[383,3456,1110],{"class":1109},[383,3458,499],{"class":405},[383,3460,3331],{"class":472},[383,3462,406],{"class":405},[383,3464,3465],{"class":409},"activation",[383,3467,836],{"class":405},[383,3469,3470],{"class":454},"  # \"${mlp_hps.activation}\"\n",[642,3472],{"data":3473,"kind":645},"aHBzLmRpbV9pbiAgOiAke21scF9ocHMuZGltX2lufQpocHMuYWN0aXZhdGlvbjogJHttbHBfaHBzLmFjdGl2YXRpb259Cg==",[374,3475,3477],{"className":376,"code":3476,"language":378,"meta":379,"style":379},"# === Part 2: make_mlp factory function ===\n# The function takes the resolved values as arguments — not hps attributes.\n# This makes it usable both from the config system (where hps.* are\n# interpolation strings) and from plain Python code (where you pass integers).\n\ndef make_mlp(*, dim_in, dim_out, dim_hidden, num_layers, activation):\n    return L.call(nn.Sequential, root=True)(\n        # L.OrderedDict groups named layers into a DictConfig.\n        # Each entry is a (\"name\", config_node) tuple.\n        L.OrderedDict(\n            (\n                \"input\",\n                # The input block: Linear → activation\n                L.call(nn.Sequential)(\n                    L.call(nn.Linear)(in_features=dim_in, out_features=dim_hidden),\n                    L.call(activation)(),  # activation is a class reference\n                ),\n            ),\n            (\n                \"hidden\",\n                # L.repeat(n, src) produces n deep-copies of src in a list.\n                # expand_args=True unpacks the list as positional args to Sequential.\n                L.call(nn.Sequential, expand_args=True)(\n                    L.repeat(\n                        num_layers,\n                        L.call(nn.Sequential)(\n                            L.call(nn.Linear)(\n                                in_features=dim_hidden,\n                                out_features=dim_hidden,\n                            ),\n                            L.call(activation)(),\n                        ),\n                    ),\n                ),\n            ),\n            (\n                \"output\",\n                L.call(nn.Sequential)(\n                    L.call(nn.Linear)(in_features=dim_hidden, out_features=dim_out),\n                ),\n            ),\n        )\n    )\n\n# === Part 3: module-level model symbol ===\n# Called with hps.* — all values are interpolation strings here.\n# laco.load exports this symbol and assembles the full tree with the hps node,\n# so OmegaConf can resolve the interpolations at instantiate time.\nmodel = make_mlp(\n    dim_in     = mlp_hps.dim_in,\n    dim_out    = mlp_hps.dim_out,\n    dim_hidden = mlp_hps.dim_hidden,\n    num_layers = mlp_hps.num_layers,\n    activation = mlp_hps.activation,\n)\n\nprint(\"model config type:\", type(model))\n",[231,3478,3479,3484,3489,3494,3499,3503,3544,3574,3579,3584,3596,3601,3613,3618,3637,3672,3690,3695,3700,3704,3714,3720,3726,3754,3766,3774,3794,3814,3826,3838,3844,3860,3866,3872,3877,3882,3887,3899,3918,3953,3958,3963,3969,3975,3980,3986,3992,3998,4004,4016,4032,4048,4063,4079,4094,4099,4104],{"__ignoreMap":379},[383,3480,3481],{"class":385,"line":386},[383,3482,3483],{"class":454},"# === Part 2: make_mlp factory function ===\n",[383,3485,3486],{"class":385,"line":397},[383,3487,3488],{"class":454},"# The function takes the resolved values as arguments — not hps attributes.\n",[383,3490,3491],{"class":385,"line":418},[383,3492,3493],{"class":454},"# This makes it usable both from the config system (where hps.* are\n",[383,3495,3496],{"class":385,"line":552},[383,3497,3498],{"class":454},"# interpolation strings) and from plain Python code (where you pass integers).\n",[383,3500,3501],{"class":385,"line":593},[383,3502,597],{"emptyLinePlaceholder":596},[383,3504,3505,3508,3511,3513,3516,3518,3521,3523,3526,3528,3531,3533,3536,3538,3541],{"class":385,"line":600},[383,3506,3507],{"class":741},"def",[383,3509,3510],{"class":730}," make_mlp",[383,3512,476],{"class":405},[383,3514,3515],{"class":463},"*",[383,3517,2135],{"class":393},[383,3519,833],{"class":3520},"sFwrP",[383,3522,499],{"class":405},[383,3524,3525],{"class":3520}," dim_out",[383,3527,499],{"class":405},[383,3529,3530],{"class":3520}," dim_hidden",[383,3532,499],{"class":405},[383,3534,3535],{"class":3520}," num_layers",[383,3537,499],{"class":405},[383,3539,3540],{"class":3520}," activation",[383,3542,3543],{"class":405},"):\n",[383,3545,3546,3549,3551,3553,3555,3557,3559,3561,3564,3566,3568,3570,3572],{"class":385,"line":606},[383,3547,3548],{"class":389},"    return",[383,3550,467],{"class":393},[383,3552,406],{"class":405},[383,3554,473],{"class":472},[383,3556,476],{"class":405},[383,3558,428],{"class":472},[383,3560,406],{"class":405},[383,3562,3563],{"class":409},"Sequential",[383,3565,499],{"class":405},[383,3567,1617],{"class":489},[383,3569,464],{"class":463},[383,3571,1623],{"class":1622},[383,3573,1626],{"class":405},[383,3575,3576],{"class":385,"line":612},[383,3577,3578],{"class":454},"        # L.OrderedDict groups named layers into a DictConfig.\n",[383,3580,3581],{"class":385,"line":618},[383,3582,3583],{"class":454},"        # Each entry is a (\"name\", config_node) tuple.\n",[383,3585,3586,3589,3591,3594],{"class":385,"line":842},[383,3587,3588],{"class":472},"        L",[383,3590,406],{"class":405},[383,3592,3593],{"class":472},"OrderedDict",[383,3595,1798],{"class":405},[383,3597,3598],{"class":385,"line":861},[383,3599,3600],{"class":405},"            (\n",[383,3602,3603,3606,3609,3611],{"class":385,"line":880},[383,3604,3605],{"class":1109},"                \"",[383,3607,3608],{"class":1113},"input",[383,3610,1110],{"class":1109},[383,3612,1642],{"class":405},[383,3614,3615],{"class":385,"line":1172},[383,3616,3617],{"class":454},"                # The input block: Linear → activation\n",[383,3619,3620,3623,3625,3627,3629,3631,3633,3635],{"class":385,"line":1397},[383,3621,3622],{"class":472},"                L",[383,3624,406],{"class":405},[383,3626,473],{"class":472},[383,3628,476],{"class":405},[383,3630,428],{"class":472},[383,3632,406],{"class":405},[383,3634,3563],{"class":409},[383,3636,1626],{"class":405},[383,3638,3639,3642,3644,3646,3648,3650,3652,3654,3656,3658,3660,3662,3664,3666,3668,3670],{"class":385,"line":1403},[383,3640,3641],{"class":472},"                    L",[383,3643,406],{"class":405},[383,3645,473],{"class":472},[383,3647,476],{"class":405},[383,3649,428],{"class":472},[383,3651,406],{"class":405},[383,3653,483],{"class":409},[383,3655,486],{"class":405},[383,3657,490],{"class":489},[383,3659,464],{"class":463},[383,3661,833],{"class":472},[383,3663,499],{"class":405},[383,3665,502],{"class":489},[383,3667,464],{"class":463},[383,3669,872],{"class":472},[383,3671,2475],{"class":405},[383,3673,3674,3676,3678,3680,3682,3684,3687],{"class":385,"line":1409},[383,3675,3641],{"class":472},[383,3677,406],{"class":405},[383,3679,473],{"class":472},[383,3681,476],{"class":405},[383,3683,3465],{"class":472},[383,3685,3686],{"class":405},")(),",[383,3688,3689],{"class":454},"  # activation is a class reference\n",[383,3691,3692],{"class":385,"line":1415},[383,3693,3694],{"class":405},"                ),\n",[383,3696,3697],{"class":385,"line":1423},[383,3698,3699],{"class":405},"            ),\n",[383,3701,3702],{"class":385,"line":1707},[383,3703,3600],{"class":405},[383,3705,3706,3708,3710,3712],{"class":385,"line":1723},[383,3707,3605],{"class":1109},[383,3709,2268],{"class":1113},[383,3711,1110],{"class":1109},[383,3713,1642],{"class":405},[383,3715,3717],{"class":385,"line":3716},21,[383,3718,3719],{"class":454},"                # L.repeat(n, src) produces n deep-copies of src in a list.\n",[383,3721,3723],{"class":385,"line":3722},22,[383,3724,3725],{"class":454},"                # expand_args=True unpacks the list as positional args to Sequential.\n",[383,3727,3729,3731,3733,3735,3737,3739,3741,3743,3745,3748,3750,3752],{"class":385,"line":3728},23,[383,3730,3622],{"class":472},[383,3732,406],{"class":405},[383,3734,473],{"class":472},[383,3736,476],{"class":405},[383,3738,428],{"class":472},[383,3740,406],{"class":405},[383,3742,3563],{"class":409},[383,3744,499],{"class":405},[383,3746,3747],{"class":489}," expand_args",[383,3749,464],{"class":463},[383,3751,1623],{"class":1622},[383,3753,1626],{"class":405},[383,3755,3757,3759,3761,3764],{"class":385,"line":3756},24,[383,3758,3641],{"class":472},[383,3760,406],{"class":405},[383,3762,3763],{"class":472},"repeat",[383,3765,1798],{"class":405},[383,3767,3769,3772],{"class":385,"line":3768},25,[383,3770,3771],{"class":472},"                        num_layers",[383,3773,1642],{"class":405},[383,3775,3777,3780,3782,3784,3786,3788,3790,3792],{"class":385,"line":3776},26,[383,3778,3779],{"class":472},"                        L",[383,3781,406],{"class":405},[383,3783,473],{"class":472},[383,3785,476],{"class":405},[383,3787,428],{"class":472},[383,3789,406],{"class":405},[383,3791,3563],{"class":409},[383,3793,1626],{"class":405},[383,3795,3797,3800,3802,3804,3806,3808,3810,3812],{"class":385,"line":3796},27,[383,3798,3799],{"class":472},"                            L",[383,3801,406],{"class":405},[383,3803,473],{"class":472},[383,3805,476],{"class":405},[383,3807,428],{"class":472},[383,3809,406],{"class":405},[383,3811,483],{"class":409},[383,3813,1626],{"class":405},[383,3815,3817,3820,3822,3824],{"class":385,"line":3816},28,[383,3818,3819],{"class":489},"                                in_features",[383,3821,464],{"class":463},[383,3823,872],{"class":472},[383,3825,1642],{"class":405},[383,3827,3829,3832,3834,3836],{"class":385,"line":3828},29,[383,3830,3831],{"class":489},"                                out_features",[383,3833,464],{"class":463},[383,3835,872],{"class":472},[383,3837,1642],{"class":405},[383,3839,3841],{"class":385,"line":3840},30,[383,3842,3843],{"class":405},"                            ),\n",[383,3845,3847,3849,3851,3853,3855,3857],{"class":385,"line":3846},31,[383,3848,3799],{"class":472},[383,3850,406],{"class":405},[383,3852,473],{"class":472},[383,3854,476],{"class":405},[383,3856,3465],{"class":472},[383,3858,3859],{"class":405},")(),\n",[383,3861,3863],{"class":385,"line":3862},32,[383,3864,3865],{"class":405},"                        ),\n",[383,3867,3869],{"class":385,"line":3868},33,[383,3870,3871],{"class":405},"                    ),\n",[383,3873,3875],{"class":385,"line":3874},34,[383,3876,3694],{"class":405},[383,3878,3880],{"class":385,"line":3879},35,[383,3881,3699],{"class":405},[383,3883,3885],{"class":385,"line":3884},36,[383,3886,3600],{"class":405},[383,3888,3890,3892,3895,3897],{"class":385,"line":3889},37,[383,3891,3605],{"class":1109},[383,3893,3894],{"class":1113},"output",[383,3896,1110],{"class":1109},[383,3898,1642],{"class":405},[383,3900,3902,3904,3906,3908,3910,3912,3914,3916],{"class":385,"line":3901},38,[383,3903,3622],{"class":472},[383,3905,406],{"class":405},[383,3907,473],{"class":472},[383,3909,476],{"class":405},[383,3911,428],{"class":472},[383,3913,406],{"class":405},[383,3915,3563],{"class":409},[383,3917,1626],{"class":405},[383,3919,3921,3923,3925,3927,3929,3931,3933,3935,3937,3939,3941,3943,3945,3947,3949,3951],{"class":385,"line":3920},39,[383,3922,3641],{"class":472},[383,3924,406],{"class":405},[383,3926,473],{"class":472},[383,3928,476],{"class":405},[383,3930,428],{"class":472},[383,3932,406],{"class":405},[383,3934,483],{"class":409},[383,3936,486],{"class":405},[383,3938,490],{"class":489},[383,3940,464],{"class":463},[383,3942,872],{"class":472},[383,3944,499],{"class":405},[383,3946,502],{"class":489},[383,3948,464],{"class":463},[383,3950,853],{"class":472},[383,3952,2475],{"class":405},[383,3954,3956],{"class":385,"line":3955},40,[383,3957,3694],{"class":405},[383,3959,3961],{"class":385,"line":3960},41,[383,3962,3699],{"class":405},[383,3964,3966],{"class":385,"line":3965},42,[383,3967,3968],{"class":405},"        )\n",[383,3970,3972],{"class":385,"line":3971},43,[383,3973,3974],{"class":405},"    )\n",[383,3976,3978],{"class":385,"line":3977},44,[383,3979,597],{"emptyLinePlaceholder":596},[383,3981,3983],{"class":385,"line":3982},45,[383,3984,3985],{"class":454},"# === Part 3: module-level model symbol ===\n",[383,3987,3989],{"class":385,"line":3988},46,[383,3990,3991],{"class":454},"# Called with hps.* — all values are interpolation strings here.\n",[383,3993,3995],{"class":385,"line":3994},47,[383,3996,3997],{"class":454},"# laco.load exports this symbol and assembles the full tree with the hps node,\n",[383,3999,4001],{"class":385,"line":4000},48,[383,4002,4003],{"class":454},"# so OmegaConf can resolve the interpolations at instantiate time.\n",[383,4005,4007,4010,4012,4014],{"class":385,"line":4006},49,[383,4008,4009],{"class":393},"model ",[383,4011,464],{"class":463},[383,4013,3510],{"class":472},[383,4015,1798],{"class":405},[383,4017,4019,4021,4024,4026,4028,4030],{"class":385,"line":4018},50,[383,4020,754],{"class":489},[383,4022,4023],{"class":463},"     =",[383,4025,3331],{"class":472},[383,4027,406],{"class":405},[383,4029,833],{"class":409},[383,4031,1642],{"class":405},[383,4033,4035,4037,4040,4042,4044,4046],{"class":385,"line":4034},51,[383,4036,772],{"class":489},[383,4038,4039],{"class":463},"    =",[383,4041,3331],{"class":472},[383,4043,406],{"class":405},[383,4045,853],{"class":409},[383,4047,1642],{"class":405},[383,4049,4051,4053,4055,4057,4059,4061],{"class":385,"line":4050},52,[383,4052,787],{"class":489},[383,4054,764],{"class":463},[383,4056,3331],{"class":472},[383,4058,406],{"class":405},[383,4060,872],{"class":409},[383,4062,1642],{"class":405},[383,4064,4066,4068,4070,4072,4074,4077],{"class":385,"line":4065},53,[383,4067,802],{"class":489},[383,4069,764],{"class":463},[383,4071,3331],{"class":472},[383,4073,406],{"class":405},[383,4075,4076],{"class":409},"num_layers",[383,4078,1642],{"class":405},[383,4080,4082,4084,4086,4088,4090,4092],{"class":385,"line":4081},54,[383,4083,3387],{"class":489},[383,4085,764],{"class":463},[383,4087,3331],{"class":472},[383,4089,406],{"class":405},[383,4091,3465],{"class":409},[383,4093,1642],{"class":405},[383,4095,4097],{"class":385,"line":4096},55,[383,4098,510],{"class":405},[383,4100,4102],{"class":385,"line":4101},56,[383,4103,597],{"emptyLinePlaceholder":596},[383,4105,4107,4109,4111,4113,4116,4118,4120,4122,4124,4126],{"class":385,"line":4106},57,[383,4108,622],{"class":621},[383,4110,476],{"class":405},[383,4112,1110],{"class":1109},[383,4114,4115],{"class":1113},"model config type:",[383,4117,1110],{"class":1109},[383,4119,499],{"class":405},[383,4121,1439],{"class":760},[383,4123,476],{"class":405},[383,4125,1691],{"class":472},[383,4127,640],{"class":405},[642,4129],{"data":4130,"kind":645},"bW9kZWwgY29uZmlnIHR5cGU6IDxjbGFzcyAnb21lZ2Fjb25mLmRpY3Rjb25maWcuRGljdENvbmZpZyc+Cg==",[374,4132,4134],{"className":376,"code":4133,"language":378,"meta":379,"style":379},"# Load the real mlp.py config and instantiate it:\nmlp_cfg = laco.load(\"configs:\u002F\u002Fexamples\u002Fmlp.py#model\")\nmlp_model = laco.instantiate(mlp_cfg)\nprint(mlp_model)\nprint()\n# Count parameters:\ntotal_params = sum(p.numel() for p in mlp_model.parameters())\nprint(f\"Total parameters: {total_params:,}\")\n",[231,4135,4136,4141,4165,4185,4196,4202,4207,4249],{"__ignoreMap":379},[383,4137,4138],{"class":385,"line":386},[383,4139,4140],{"class":454},"# Load the real mlp.py config and instantiate it:\n",[383,4142,4143,4146,4148,4150,4152,4154,4156,4158,4161,4163],{"class":385,"line":397},[383,4144,4145],{"class":393},"mlp_cfg ",[383,4147,464],{"class":463},[383,4149,402],{"class":393},[383,4151,406],{"class":405},[383,4153,1795],{"class":472},[383,4155,476],{"class":405},[383,4157,1110],{"class":1109},[383,4159,4160],{"class":1113},"configs:\u002F\u002Fexamples\u002Fmlp.py#model",[383,4162,1110],{"class":1109},[383,4164,510],{"class":405},[383,4166,4167,4170,4172,4174,4176,4178,4180,4183],{"class":385,"line":418},[383,4168,4169],{"class":393},"mlp_model ",[383,4171,464],{"class":463},[383,4173,402],{"class":393},[383,4175,406],{"class":405},[383,4177,1853],{"class":472},[383,4179,476],{"class":405},[383,4181,4182],{"class":472},"mlp_cfg",[383,4184,510],{"class":405},[383,4186,4187,4189,4191,4194],{"class":385,"line":552},[383,4188,622],{"class":621},[383,4190,476],{"class":405},[383,4192,4193],{"class":472},"mlp_model",[383,4195,510],{"class":405},[383,4197,4198,4200],{"class":385,"line":593},[383,4199,622],{"class":621},[383,4201,1420],{"class":405},[383,4203,4204],{"class":385,"line":600},[383,4205,4206],{"class":454},"# Count parameters:\n",[383,4208,4209,4212,4214,4217,4219,4221,4223,4226,4229,4232,4235,4238,4241,4243,4246],{"class":385,"line":606},[383,4210,4211],{"class":393},"total_params ",[383,4213,464],{"class":463},[383,4215,4216],{"class":621}," sum",[383,4218,476],{"class":405},[383,4220,216],{"class":472},[383,4222,406],{"class":405},[383,4224,4225],{"class":472},"numel",[383,4227,4228],{"class":405},"()",[383,4230,4231],{"class":389}," for",[383,4233,4234],{"class":472}," p ",[383,4236,4237],{"class":389},"in",[383,4239,4240],{"class":472}," mlp_model",[383,4242,406],{"class":405},[383,4244,4245],{"class":472},"parameters",[383,4247,4248],{"class":405},"())\n",[383,4250,4251,4253,4255,4258,4261,4264,4267,4270,4273,4275],{"class":385,"line":612},[383,4252,622],{"class":621},[383,4254,476],{"class":405},[383,4256,4257],{"class":741},"f",[383,4259,4260],{"class":1113},"\"Total parameters: ",[383,4262,4263],{"class":495},"{",[383,4265,4266],{"class":472},"total_params",[383,4268,4269],{"class":741},":,",[383,4271,4272],{"class":495},"}",[383,4274,1110],{"class":1113},[383,4276,510],{"class":405},[642,4278],{"data":4279,"kind":645},"U2VxdWVudGlhbCgKICAoaW5wdXQpOiBTZXF1ZW50aWFsKAogICAgKDApOiBMaW5lYXIoaW5fZmVhdHVyZXM9MTI4LCBvdXRfZmVhdHVyZXM9MjU2LCBiaWFzPVRydWUpCiAgICAoMSk6IFJlTFUoKQogICkKICAoaGlkZGVuKTogU2VxdWVudGlhbCgKICAgICgwKTogU2VxdWVudGlhbCgKICAgICAgKDApOiBMaW5lYXIoaW5fZmVhdHVyZXM9MjU2LCBvdXRfZmVhdHVyZXM9MjU2LCBiaWFzPVRydWUpCiAgICAgICgxKTogUmVMVSgpCiAgICApCiAgICAoMSk6IFNlcXVlbnRpYWwoCiAgICAgICgwKTogTGluZWFyKGluX2ZlYXR1cmVzPTI1Niwgb3V0X2ZlYXR1cmVzPTI1NiwgYmlhcz1UcnVlKQogICAgICAoMSk6IFJlTFUoKQogICAgKQogICAgKDIpOiBTZXF1ZW50aWFsKAogICAgICAoMCk6IExpbmVhcihpbl9mZWF0dXJlcz0yNTYsIG91dF9mZWF0dXJlcz0yNTYsIGJpYXM9VHJ1ZSkKICAgICAgKDEpOiBSZUxVKCkKICAgICkKICApCiAgKG91dHB1dCk6IFNlcXVlbnRpYWwoCiAgICAoMCk6IExpbmVhcihpbl9mZWF0dXJlcz0yNTYsIG91dF9mZWF0dXJlcz0xMjgsIGJpYXM9VHJ1ZSkKICApCikKClRvdGFsIHBhcmFtZXRlcnM6IDI2MywyOTYK",[374,4281,4283],{"className":376,"code":4282,"language":378,"meta":379,"style":379},"# Sweep dim_hidden and num_layers without touching the file:\nfor dim_hidden, num_layers in [(128, 2), (256, 3), (512, 4)]:\n    cfg = laco.load(\n        \"configs:\u002F\u002Fexamples\u002Fmlp.py\",\n        f\"hps.dim_hidden={dim_hidden}\",\n        f\"hps.num_layers={num_layers}\",\n        key=\"model\"\n    )\n    built = laco.instantiate(cfg)\n    params = sum(p.numel() for p in built.parameters())\n    print(f\"  dim_hidden={dim_hidden:3d}, num_layers={num_layers} → {params:>7,} params\")\n",[231,4284,4285,4290,4341,4356,4368,4386,4403,4416,4420,4439,4473],{"__ignoreMap":379},[383,4286,4287],{"class":385,"line":386},[383,4288,4289],{"class":454},"# Sweep dim_hidden and num_layers without touching the file:\n",[383,4291,4292,4295,4297,4299,4302,4304,4307,4309,4311,4313,4316,4319,4321,4323,4326,4328,4330,4333,4335,4338],{"class":385,"line":397},[383,4293,4294],{"class":389},"for",[383,4296,3530],{"class":393},[383,4298,499],{"class":405},[383,4300,4301],{"class":393}," num_layers ",[383,4303,4237],{"class":389},[383,4305,4306],{"class":405}," [(",[383,4308,496],{"class":495},[383,4310,499],{"class":405},[383,4312,2313],{"class":495},[383,4314,4315],{"class":405},"),",[383,4317,4318],{"class":405}," (",[383,4320,507],{"class":495},[383,4322,499],{"class":405},[383,4324,4325],{"class":495}," 3",[383,4327,4315],{"class":405},[383,4329,4318],{"class":405},[383,4331,4332],{"class":495},"512",[383,4334,499],{"class":405},[383,4336,4337],{"class":495}," 4",[383,4339,4340],{"class":405},")]:\n",[383,4342,4343,4346,4348,4350,4352,4354],{"class":385,"line":418},[383,4344,4345],{"class":393},"    cfg ",[383,4347,464],{"class":463},[383,4349,402],{"class":393},[383,4351,406],{"class":405},[383,4353,1795],{"class":472},[383,4355,1798],{"class":405},[383,4357,4358,4361,4364,4366],{"class":385,"line":552},[383,4359,4360],{"class":1109},"        \"",[383,4362,4363],{"class":1113},"configs:\u002F\u002Fexamples\u002Fmlp.py",[383,4365,1110],{"class":1109},[383,4367,1642],{"class":405},[383,4369,4370,4373,4376,4378,4380,4382,4384],{"class":385,"line":593},[383,4371,4372],{"class":741},"        f",[383,4374,4375],{"class":1113},"\"hps.dim_hidden=",[383,4377,4263],{"class":495},[383,4379,872],{"class":472},[383,4381,4272],{"class":495},[383,4383,1110],{"class":1113},[383,4385,1642],{"class":405},[383,4387,4388,4390,4393,4395,4397,4399,4401],{"class":385,"line":600},[383,4389,4372],{"class":741},[383,4391,4392],{"class":1113},"\"hps.num_layers=",[383,4394,4263],{"class":495},[383,4396,4076],{"class":472},[383,4398,4272],{"class":495},[383,4400,1110],{"class":1113},[383,4402,1642],{"class":405},[383,4404,4405,4408,4410,4412,4414],{"class":385,"line":606},[383,4406,4407],{"class":489},"        key",[383,4409,464],{"class":463},[383,4411,1110],{"class":1109},[383,4413,1691],{"class":1113},[383,4415,1835],{"class":1109},[383,4417,4418],{"class":385,"line":612},[383,4419,3974],{"class":405},[383,4421,4422,4425,4427,4429,4431,4433,4435,4437],{"class":385,"line":618},[383,4423,4424],{"class":393},"    built ",[383,4426,464],{"class":463},[383,4428,402],{"class":393},[383,4430,406],{"class":405},[383,4432,1853],{"class":472},[383,4434,476],{"class":405},[383,4436,1858],{"class":472},[383,4438,510],{"class":405},[383,4440,4441,4444,4446,4448,4450,4452,4454,4456,4458,4460,4462,4464,4467,4469,4471],{"class":385,"line":842},[383,4442,4443],{"class":393},"    params ",[383,4445,464],{"class":463},[383,4447,4216],{"class":621},[383,4449,476],{"class":405},[383,4451,216],{"class":472},[383,4453,406],{"class":405},[383,4455,4225],{"class":472},[383,4457,4228],{"class":405},[383,4459,4231],{"class":389},[383,4461,4234],{"class":472},[383,4463,4237],{"class":389},[383,4465,4466],{"class":472}," built",[383,4468,406],{"class":405},[383,4470,4245],{"class":472},[383,4472,4248],{"class":405},[383,4474,4475,4478,4480,4482,4485,4487,4489,4492,4494,4497,4499,4501,4503,4506,4508,4511,4514,4516,4519],{"class":385,"line":861},[383,4476,4477],{"class":621},"    print",[383,4479,476],{"class":405},[383,4481,4257],{"class":741},[383,4483,4484],{"class":1113},"\"  dim_hidden=",[383,4486,4263],{"class":495},[383,4488,872],{"class":472},[383,4490,4491],{"class":741},":3d",[383,4493,4272],{"class":495},[383,4495,4496],{"class":1113},", num_layers=",[383,4498,4263],{"class":495},[383,4500,4076],{"class":472},[383,4502,4272],{"class":495},[383,4504,4505],{"class":1113}," → ",[383,4507,4263],{"class":495},[383,4509,4510],{"class":472},"params",[383,4512,4513],{"class":741},":>7,",[383,4515,4272],{"class":495},[383,4517,4518],{"class":1113}," params\"",[383,4520,510],{"class":405},[642,4522],{"data":4523,"kind":645},"ICBkaW1faGlkZGVuPTEyOCwgbnVtX2xheWVycz0yIOKGkiAgNjYsMDQ4IHBhcmFtcwogIGRpbV9oaWRkZW49MjU2LCBudW1fbGF5ZXJzPTMg4oaSIDI2MywyOTYgcGFyYW1zCiAgZGltX2hpZGRlbj01MTIsIG51bV9sYXllcnM9NCDihpIgMSwxODIsMzM2IHBhcmFtcwo=",[1457,4525,4527,4528,4530],{"id":4526},"what-lrepeat-does","What ",[231,4529,3289],{}," does",[216,4532,4533,4536,4537,4539,4540,4543,4544,4547,4548,4551,4552,4555],{},[231,4534,4535],{},"L.repeat(n, src)"," is a config-level deep-copy primitive. It stores a ",[231,4538,2858],{}," node with ",[231,4541,4542],{},"_target_: laco.ops.repeat"," and ",[231,4545,4546],{},"num: n, src: \u003Csrc node>",". At instantiation time it produces a list of ",[231,4549,4550],{},"n"," independent deep-copies of whatever ",[231,4553,4554],{},"src"," instantiates to.",[216,4557,4558,4559,4561,4562,4564,4565,4568],{},"This is how the ",[231,4560,2268],{}," block gets ",[231,4563,4076],{}," identical ",[231,4566,4567],{},"Linear → activation"," sub-modules without you writing the list by hand, and the copies do not share weights (each copy is independent after instantiation).",[435,4570,4572],{"id":4571},"recap","Recap",[274,4574,4575,4584],{},[277,4576,4577],{},[280,4578,4579,4581],{},[283,4580,285],{},[283,4582,4583],{},"Use it when…",[293,4585,4586,4595,4607,4616,4628],{},[280,4587,4588,4592],{},[298,4589,4590],{},[231,4591,302],{},[298,4593,4594],{},"You have a group of related hyperparameters that should be overridable together",[280,4596,4597,4601],{},[298,4598,4599],{},[231,4600,320],{},[298,4602,4603,4604,4606],{},"Referencing a parameter from its own ",[231,4605,680],{}," class (in-scope)",[280,4608,4609,4613],{},[298,4610,4611],{},[231,4612,339],{},[298,4614,4615],{},"Cross-file references, nested paths, one-off interpolations",[280,4617,4618,4622],{},[298,4619,4620],{},[231,4621,2153],{},[298,4623,4624,4625,836],{},"Deriving one dimension from others arithmetically (",[231,4626,4627],{},"head_dim = hidden \u002F\u002F num_heads",[280,4629,4630,4633],{},[298,4631,4632],{},"Override strings",[298,4634,4635],{},"Sweeping values without modifying the config file",[216,4637,4638,4641,4643,4645,4646,4648,4649,4652],{},[219,4639,4640],{},"The interpolation contract in one sentence:",[224,4642],{},[231,4644,320],{}," at config-build time is a string ",[231,4647,325],{}," that becomes an integer (or float, bool, ...) at ",[231,4650,4651],{},"laco.instantiate"," time: the type system lies so your editor stays green throughout.",[253,4654],{},[216,4656,4657,229,4660,4663,4664,4666,4667,182,4670,4673,4674,4677,4678,4681,4682,4681,4685,4688],{},[219,4658,4659],{},"Next in the series:",[231,4661,4662],{},"05.loading-saving-cli.ipynb"," covers the URL grammar for ",[231,4665,1480],{},", saving configs with ",[231,4668,4669],{},"laco.dump",[231,4671,4672],{},"laco.save",", the ",[231,4675,4676],{},"configs:\u002F\u002F"," protocol, and the ",[231,4679,4680],{},"laco compose"," \u002F ",[231,4683,4684],{},"laco show",[231,4686,4687],{},"laco run"," CLI commands.",[4690,4691,4692],"style",{},"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 .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 .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 .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}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 pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--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 .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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}",{"title":379,"searchDepth":418,"depth":418,"links":4694},[4695,4696,4698,4702,4704,4709,4714,4715,4720],{"id":437,"depth":397,"text":438},{"id":684,"depth":397,"text":4697},"Section 2: @L.params names your hyperparameters",{"id":1201,"depth":397,"text":4699,"children":4700},"Section 3: @L.params, what pyright sees vs. what Python holds",[4701],{"id":1459,"depth":418,"text":1460},{"id":1484,"depth":397,"text":4703},"Section 4: Using @L.params in a real config",{"id":1880,"depth":397,"text":4705,"children":4706},"Section 5: L.ref, explicit interpolation references",[4707],{"id":2054,"depth":418,"text":4708},"When to use L.ref vs hps.attr",{"id":2123,"depth":397,"text":4710,"children":4711},"Section 6: L.r, typed resolver builders",[4712],{"id":2589,"depth":418,"text":4713},"Bundled L.r resolvers",{"id":2866,"depth":397,"text":2867},{"id":3271,"depth":397,"text":4716,"children":4717},"Section 8: mlp.py full walkthrough",[4718],{"id":4526,"depth":418,"text":4719},"What L.repeat does",{"id":4571,"depth":397,"text":4572},"Series: laco tutorial notebooksPrerequisites: 01.why-laco.ipynb (installation), 02.first-steps.ipynb (config basics), 03.lazy-call-and-partial.ipynb (lazy call and partial)Dependencies: torch.nn (for concrete examples)","md",{"notebook":596},{"icon":25},{"title":35,"description":4721},"2ue_QqN69Iv1ji48Z6nlJhJQb9qgUU2OrLguAsd4-IM",{},1785687301850]