[{"data":1,"prerenderedAt":5526},["ShallowReactive",2],{"navigation":3,"api-navigation":184,"\u002Flearn\u002Ftutorials\u002Fnested-configs-and-containers":206,"docyard:crossref-index":5525},[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":43,"body":208,"description":5519,"extension":5520,"meta":5521,"navigation":5522,"path":44,"seo":5523,"stem":45,"__hash__":5524},"content\u002F2.learn\u002F1.tutorials\u002F06.nested-configs-and-containers.md",{"type":209,"value":210,"toc":5493},"minimark",[211,215,232,237,307,321,442,447,450,458,485,488,642,645,783,786,869,872,894,904,906,913,933,945,1163,1166,1301,1304,1312,1353,1355,1361,1377,1390,1410,1423,1568,1571,1786,1789,1791,1798,1815,1822,2080,2083,2225,2228,2400,2403,2405,2409,2422,2514,2643,2646,2784,2787,2920,2923,3096,3099,3303,3306,3508,3511,3513,3520,3525,3530,3583,3586,3590,3672,3697,3699,3776,3789,3791,3941,3958,3960,4000,4009,4115,4118,4268,4271,4404,4407,4409,4416,4422,4619,4636,4657,4696,4699,4867,4870,4970,4973,5200,5203,5208,5246,5257,5259,5263,5266,5274,5278,5281,5287,5289,5293,5297,5420,5424,5465,5469,5489],[212,213,43],"h1",{"id":214},"nested-configs-and-containers",[216,217,218,222,223,227,228,231],"p",{},[219,220,221],"strong",{},"Prerequisites:"," ",[224,225,226],"code",{},"01.why-laco.ipynb"," through ",[224,229,230],{},"04.hyperparameters-and-interpolation.ipynb",".",[216,233,234],{},[219,235,236],{},"What you will learn:",[238,239,240,252,261,270,276,294,304],"ul",{},[241,242,243,244,247,248,251],"li",{},"How ",[224,245,246],{},"L.call"," nodes nest to produce deep ",[224,249,250],{},"DictConfig"," trees",[241,253,254,257,258],{},[224,255,256],{},"L.OrderedDict",": named sub-modules for ",[224,259,260],{},"nn.Sequential",[241,262,263,266,267],{},[224,264,265],{},"expand_args=True",": unpacking a list as ",[224,268,269],{},"*args",[241,271,272,275],{},[224,273,274],{},"L.repeat",": generating replicated config structures without Python loops",[241,277,278,279,282,283,282,286,282,289,282,292],{},"The five container macros: ",[224,280,281],{},"L.List",", ",[224,284,285],{},"L.Dict",[224,287,288],{},"L.Tuple",[224,290,291],{},"L.Set",[224,293,256],{},[241,295,296,297,300,301],{},"Full annotated walkthrough of ",[224,298,299],{},"mlp.py"," and ",[224,302,303],{},"cnn_classifier.py",[241,305,306],{},"Tree visualizations of nested config structure",[216,308,309,222,312,282,315,282,318,231],{},[219,310,311],{},"Dependencies:",[224,313,314],{},"torch",[224,316,317],{},"torch.nn",[224,319,320],{},"laco",[322,323,328],"pre",{"className":324,"code":325,"language":326,"meta":327,"style":327},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","import laco\nimport laco.language as L\nfrom omegaconf import OmegaConf\nfrom torch import nn\n\nprint(\"torch version:\", __import__('torch').__version__)\n","python","",[224,329,330,343,363,377,390,397],{"__ignoreMap":327},[331,332,335,339],"span",{"class":333,"line":334},"line",1,[331,336,338],{"class":337},"sVHd0","import",[331,340,342],{"class":341},"su5hD"," laco\n",[331,344,346,348,351,354,357,360],{"class":333,"line":345},2,[331,347,338],{"class":337},[331,349,350],{"class":341}," laco",[331,352,231],{"class":353},"sP7_E",[331,355,198],{"class":356},"skxfh",[331,358,359],{"class":337}," as",[331,361,362],{"class":341}," L\n",[331,364,366,369,372,374],{"class":333,"line":365},3,[331,367,368],{"class":337},"from",[331,370,371],{"class":341}," omegaconf ",[331,373,338],{"class":337},[331,375,376],{"class":341}," OmegaConf\n",[331,378,380,382,385,387],{"class":333,"line":379},4,[331,381,368],{"class":337},[331,383,384],{"class":341}," torch ",[331,386,338],{"class":337},[331,388,389],{"class":341}," nn\n",[331,391,393],{"class":333,"line":392},5,[331,394,396],{"emptyLinePlaceholder":395},true,"\n",[331,398,400,404,407,411,415,417,420,423,425,428,430,432,435,439],{"class":333,"line":399},6,[331,401,403],{"class":402},"sptTA","print",[331,405,406],{"class":353},"(",[331,408,410],{"class":409},"sjJ54","\"",[331,412,414],{"class":413},"s_sjI","torch version:",[331,416,410],{"class":409},[331,418,419],{"class":353},",",[331,421,422],{"class":402}," __import__",[331,424,406],{"class":353},[331,426,427],{"class":409},"'",[331,429,314],{"class":413},[331,431,427],{"class":409},[331,433,434],{"class":353},").",[331,436,438],{"class":437},"s_hVV","__version__",[331,440,441],{"class":353},")\n",[443,444],"docyard-notebook-output",{"data":445,"kind":446},"dG9yY2ggdmVyc2lvbjogMi4xMi4wK2N1MTMwCg==","stream",[448,449],"hr",{},[451,452,454,455,457],"h2",{"id":453},"section-1-nesting-lcall-nodes","Section 1: Nesting ",[224,456,246],{}," Nodes",[216,459,460,461,464,465,467,468,471,472,475,476,478,479,222,482,484],{},"Every ",[224,462,463],{},"L.call(T)(**kwargs)"," produces a ",[224,466,250],{}," node with a ",[224,469,470],{},"_target_"," key pointing to ",[224,473,474],{},"T",". When you pass another ",[224,477,246],{}," result as a keyword argument, you get a ",[219,480,481],{},"nested",[224,483,250],{}," tree: the entire model architecture expressed as data, not live objects.",[216,486,487],{},"This section builds up from a single layer to a two-layer sequential to illustrate how the nesting works.",[322,489,491],{"className":324,"code":490,"language":326,"meta":327,"style":327},"# Flat: a single nn.Linear layer config.\n# L.call(nn.Linear) returns a callable that, when called with kwargs,\n# produces a DictConfig — NOT an nn.Linear object.\nlinear_cfg = L.call(nn.Linear)(in_features=128, out_features=64)\n\nprint(\"Type at runtime:\", type(linear_cfg).__name__)\nprint()\nprint(\"YAML representation:\")\nprint(laco.dump(linear_cfg))\n",[224,492,493,499,504,509,562,566,597,605,621],{"__ignoreMap":327},[331,494,495],{"class":333,"line":334},[331,496,498],{"class":497},"sutJx","# Flat: a single nn.Linear layer config.\n",[331,500,501],{"class":333,"line":345},[331,502,503],{"class":497},"# L.call(nn.Linear) returns a callable that, when called with kwargs,\n",[331,505,506],{"class":333,"line":365},[331,507,508],{"class":497},"# produces a DictConfig — NOT an nn.Linear object.\n",[331,510,511,514,518,521,523,527,529,532,534,537,540,544,546,550,552,555,557,560],{"class":333,"line":379},[331,512,513],{"class":341},"linear_cfg ",[331,515,517],{"class":516},"smGrS","=",[331,519,520],{"class":341}," L",[331,522,231],{"class":353},[331,524,526],{"class":525},"slqww","call",[331,528,406],{"class":353},[331,530,531],{"class":525},"nn",[331,533,231],{"class":353},[331,535,536],{"class":356},"Linear",[331,538,539],{"class":353},")(",[331,541,543],{"class":542},"s99_P","in_features",[331,545,517],{"class":516},[331,547,549],{"class":548},"srdBf","128",[331,551,419],{"class":353},[331,553,554],{"class":542}," out_features",[331,556,517],{"class":516},[331,558,559],{"class":548},"64",[331,561,441],{"class":353},[331,563,564],{"class":333,"line":392},[331,565,396],{"emptyLinePlaceholder":395},[331,567,568,570,572,574,577,579,581,585,587,590,592,595],{"class":333,"line":399},[331,569,403],{"class":402},[331,571,406],{"class":353},[331,573,410],{"class":409},[331,575,576],{"class":413},"Type at runtime:",[331,578,410],{"class":409},[331,580,419],{"class":353},[331,582,584],{"class":583},"sZMiF"," type",[331,586,406],{"class":353},[331,588,589],{"class":525},"linear_cfg",[331,591,434],{"class":353},[331,593,594],{"class":437},"__name__",[331,596,441],{"class":353},[331,598,600,602],{"class":333,"line":599},7,[331,601,403],{"class":402},[331,603,604],{"class":353},"()\n",[331,606,608,610,612,614,617,619],{"class":333,"line":607},8,[331,609,403],{"class":402},[331,611,406],{"class":353},[331,613,410],{"class":409},[331,615,616],{"class":413},"YAML representation:",[331,618,410],{"class":409},[331,620,441],{"class":353},[331,622,624,626,628,630,632,635,637,639],{"class":333,"line":623},9,[331,625,403],{"class":402},[331,627,406],{"class":353},[331,629,320],{"class":525},[331,631,231],{"class":353},[331,633,634],{"class":525},"dump",[331,636,406],{"class":353},[331,638,589],{"class":525},[331,640,641],{"class":353},"))\n",[443,643],{"data":644,"kind":446},"VHlwZSBhdCBydW50aW1lOiBEaWN0Q29uZmlnCgpZQU1MIHJlcHJlc2VudGF0aW9uOgp7X2NvbnZlcnRfOiBhbGwsIF9sYWNvXzogMSwgX3RhcmdldF86IHRvcmNoLm5uLkxpbmVhciwgaW5fZmVhdHVyZXM6IDEyOCwgb3V0X2ZlYXR1cmVzOiA2NH0KCg==",[322,646,648],{"className":324,"code":647,"language":326,"meta":327,"style":327},"# Nested: nn.Sequential containing two sub-nodes.\n# Positional arguments to L.call become the _args_ list in the DictConfig.\nseq_cfg = L.call(nn.Sequential)(\n    L.call(nn.Linear)(in_features=128, out_features=64),\n    L.call(nn.ReLU)(),\n)\n\nprint(\"Nested YAML (note the _args_ list containing two sub-nodes):\")\nprint(laco.dump(seq_cfg))\n",[224,649,650,655,660,685,721,741,745,749,764],{"__ignoreMap":327},[331,651,652],{"class":333,"line":334},[331,653,654],{"class":497},"# Nested: nn.Sequential containing two sub-nodes.\n",[331,656,657],{"class":333,"line":345},[331,658,659],{"class":497},"# Positional arguments to L.call become the _args_ list in the DictConfig.\n",[331,661,662,665,667,669,671,673,675,677,679,682],{"class":333,"line":365},[331,663,664],{"class":341},"seq_cfg ",[331,666,517],{"class":516},[331,668,520],{"class":341},[331,670,231],{"class":353},[331,672,526],{"class":525},[331,674,406],{"class":353},[331,676,531],{"class":525},[331,678,231],{"class":353},[331,680,681],{"class":356},"Sequential",[331,683,684],{"class":353},")(\n",[331,686,687,690,692,694,696,698,700,702,704,706,708,710,712,714,716,718],{"class":333,"line":379},[331,688,689],{"class":525},"    L",[331,691,231],{"class":353},[331,693,526],{"class":525},[331,695,406],{"class":353},[331,697,531],{"class":525},[331,699,231],{"class":353},[331,701,536],{"class":356},[331,703,539],{"class":353},[331,705,543],{"class":542},[331,707,517],{"class":516},[331,709,549],{"class":548},[331,711,419],{"class":353},[331,713,554],{"class":542},[331,715,517],{"class":516},[331,717,559],{"class":548},[331,719,720],{"class":353},"),\n",[331,722,723,725,727,729,731,733,735,738],{"class":333,"line":392},[331,724,689],{"class":525},[331,726,231],{"class":353},[331,728,526],{"class":525},[331,730,406],{"class":353},[331,732,531],{"class":525},[331,734,231],{"class":353},[331,736,737],{"class":356},"ReLU",[331,739,740],{"class":353},")(),\n",[331,742,743],{"class":333,"line":399},[331,744,441],{"class":353},[331,746,747],{"class":333,"line":599},[331,748,396],{"emptyLinePlaceholder":395},[331,750,751,753,755,757,760,762],{"class":333,"line":607},[331,752,403],{"class":402},[331,754,406],{"class":353},[331,756,410],{"class":409},[331,758,759],{"class":413},"Nested YAML (note the _args_ list containing two sub-nodes):",[331,761,410],{"class":409},[331,763,441],{"class":353},[331,765,766,768,770,772,774,776,778,781],{"class":333,"line":623},[331,767,403],{"class":402},[331,769,406],{"class":353},[331,771,320],{"class":525},[331,773,231],{"class":353},[331,775,634],{"class":525},[331,777,406],{"class":353},[331,779,780],{"class":525},"seq_cfg",[331,782,641],{"class":353},[443,784],{"data":785,"kind":446},"TmVzdGVkIFlBTUwgKG5vdGUgdGhlIF9hcmdzXyBsaXN0IGNvbnRhaW5pbmcgdHdvIHN1Yi1ub2Rlcyk6Cl9hcmdzXzoKLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5MaW5lYXIsIGluX2ZlYXR1cmVzOiAxMjgsIG91dF9mZWF0dXJlczogNjR9Ci0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uUmVMVX0KX2NvbnZlcnRfOiBhbGwKX2xhY29fOiAxCl90YXJnZXRfOiB0b3JjaC5ubi5TZXF1ZW50aWFsCgo=",[322,787,789],{"className":324,"code":788,"language":326,"meta":327,"style":327},"# Instantiate: laco.instantiate walks the DictConfig tree recursively,\n# calling each _target_ with its stored kwargs and args.\nmodel = laco.instantiate(seq_cfg)\nprint(\"Instantiated model:\", model)\nprint(\"Type:\", type(model).__name__)\n",[224,790,791,796,801,821,841],{"__ignoreMap":327},[331,792,793],{"class":333,"line":334},[331,794,795],{"class":497},"# Instantiate: laco.instantiate walks the DictConfig tree recursively,\n",[331,797,798],{"class":333,"line":345},[331,799,800],{"class":497},"# calling each _target_ with its stored kwargs and args.\n",[331,802,803,806,808,810,812,815,817,819],{"class":333,"line":365},[331,804,805],{"class":341},"model ",[331,807,517],{"class":516},[331,809,350],{"class":341},[331,811,231],{"class":353},[331,813,814],{"class":525},"instantiate",[331,816,406],{"class":353},[331,818,780],{"class":525},[331,820,441],{"class":353},[331,822,823,825,827,829,832,834,836,839],{"class":333,"line":379},[331,824,403],{"class":402},[331,826,406],{"class":353},[331,828,410],{"class":409},[331,830,831],{"class":413},"Instantiated model:",[331,833,410],{"class":409},[331,835,419],{"class":353},[331,837,838],{"class":525}," model",[331,840,441],{"class":353},[331,842,843,845,847,849,852,854,856,858,860,863,865,867],{"class":333,"line":392},[331,844,403],{"class":402},[331,846,406],{"class":353},[331,848,410],{"class":409},[331,850,851],{"class":413},"Type:",[331,853,410],{"class":409},[331,855,419],{"class":353},[331,857,584],{"class":583},[331,859,406],{"class":353},[331,861,862],{"class":525},"model",[331,864,434],{"class":353},[331,866,594],{"class":437},[331,868,441],{"class":353},[443,870],{"data":871,"kind":446},"SW5zdGFudGlhdGVkIG1vZGVsOiBTZXF1ZW50aWFsKAogICgwKTogTGluZWFyKGluX2ZlYXR1cmVzPTEyOCwgb3V0X2ZlYXR1cmVzPTY0LCBiaWFzPVRydWUpCiAgKDEpOiBSZUxVKCkKKQpUeXBlOiBTZXF1ZW50aWFsCg==",[216,873,874,877,878,880,881,885,886,889,890,893],{},[219,875,876],{},"Key insight:"," the ",[224,879,250],{}," tree is the ",[882,883,884],"em",{},"blueprint",". ",[224,887,888],{},"laco.instantiate"," is the ",[882,891,892],{},"builder"," that walks it. You can store the blueprint, serialize it, override it, merge it, and only build when you actually need the object.",[216,895,896,897,900,901,903],{},"The ",[224,898,899],{},"_args_"," list in the YAML is how positional constructor arguments are represented in the config. For ",[224,902,260],{},", those positional args are the layer objects.",[448,905],{},[451,907,909,910,912],{"id":908},"section-2-lordereddict-named-sub-modules","Section 2: ",[224,911,256],{},", Named Sub-modules",[216,914,915,917,918,921,922,925,926,282,929,932],{},[224,916,260],{}," has a second constructor form: it accepts an ",[224,919,920],{},"OrderedDict"," to give each sub-module a name. Named sub-modules are very useful for ",[219,923,924],{},"feature extraction"," (you can ask PyTorch for ",[224,927,928],{},"model.linear",[224,930,931],{},"model.relu",", etc.) and for readable debugging.",[216,934,935,938,939,942,943,231],{},[224,936,937],{},"L.OrderedDict((name, config), ...)"," is the laco primitive for this pattern. It takes positional ",[224,940,941],{},"(key, value)"," pairs, not keyword arguments, because Python dicts do not guarantee insertion order in all contexts, and the ordered semantics matter for ",[224,944,260],{},[322,946,948],{"className":324,"code":947,"language":326,"meta":327,"style":327},"# Build a three-layer sequential with named sub-modules.\nmodel_cfg = L.call(nn.Sequential)(\n    L.OrderedDict(\n        (\"linear\", L.call(nn.Linear)(in_features=128, out_features=64)),\n        (\"relu\",   L.call(nn.ReLU)()),\n        (\"head\",   L.call(nn.Linear)(in_features=64,  out_features=10)),\n    )\n)\n\nprint(\"Config YAML:\")\nprint(laco.dump(model_cfg))\n",[224,949,950,955,978,989,1036,1067,1114,1119,1123,1127,1143],{"__ignoreMap":327},[331,951,952],{"class":333,"line":334},[331,953,954],{"class":497},"# Build a three-layer sequential with named sub-modules.\n",[331,956,957,960,962,964,966,968,970,972,974,976],{"class":333,"line":345},[331,958,959],{"class":341},"model_cfg ",[331,961,517],{"class":516},[331,963,520],{"class":341},[331,965,231],{"class":353},[331,967,526],{"class":525},[331,969,406],{"class":353},[331,971,531],{"class":525},[331,973,231],{"class":353},[331,975,681],{"class":356},[331,977,684],{"class":353},[331,979,980,982,984,986],{"class":333,"line":365},[331,981,689],{"class":525},[331,983,231],{"class":353},[331,985,920],{"class":525},[331,987,988],{"class":353},"(\n",[331,990,991,994,996,999,1001,1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025,1027,1029,1031,1033],{"class":333,"line":379},[331,992,993],{"class":353},"        (",[331,995,410],{"class":409},[331,997,998],{"class":413},"linear",[331,1000,410],{"class":409},[331,1002,419],{"class":353},[331,1004,520],{"class":525},[331,1006,231],{"class":353},[331,1008,526],{"class":525},[331,1010,406],{"class":353},[331,1012,531],{"class":525},[331,1014,231],{"class":353},[331,1016,536],{"class":356},[331,1018,539],{"class":353},[331,1020,543],{"class":542},[331,1022,517],{"class":516},[331,1024,549],{"class":548},[331,1026,419],{"class":353},[331,1028,554],{"class":542},[331,1030,517],{"class":516},[331,1032,559],{"class":548},[331,1034,1035],{"class":353},")),\n",[331,1037,1038,1040,1042,1045,1047,1049,1052,1054,1056,1058,1060,1062,1064],{"class":333,"line":392},[331,1039,993],{"class":353},[331,1041,410],{"class":409},[331,1043,1044],{"class":413},"relu",[331,1046,410],{"class":409},[331,1048,419],{"class":353},[331,1050,1051],{"class":525},"   L",[331,1053,231],{"class":353},[331,1055,526],{"class":525},[331,1057,406],{"class":353},[331,1059,531],{"class":525},[331,1061,231],{"class":353},[331,1063,737],{"class":356},[331,1065,1066],{"class":353},")()),\n",[331,1068,1069,1071,1073,1076,1078,1080,1082,1084,1086,1088,1090,1092,1094,1096,1098,1100,1102,1104,1107,1109,1112],{"class":333,"line":399},[331,1070,993],{"class":353},[331,1072,410],{"class":409},[331,1074,1075],{"class":413},"head",[331,1077,410],{"class":409},[331,1079,419],{"class":353},[331,1081,1051],{"class":525},[331,1083,231],{"class":353},[331,1085,526],{"class":525},[331,1087,406],{"class":353},[331,1089,531],{"class":525},[331,1091,231],{"class":353},[331,1093,536],{"class":356},[331,1095,539],{"class":353},[331,1097,543],{"class":542},[331,1099,517],{"class":516},[331,1101,559],{"class":548},[331,1103,419],{"class":353},[331,1105,1106],{"class":542},"  out_features",[331,1108,517],{"class":516},[331,1110,1111],{"class":548},"10",[331,1113,1035],{"class":353},[331,1115,1116],{"class":333,"line":599},[331,1117,1118],{"class":353},"    )\n",[331,1120,1121],{"class":333,"line":607},[331,1122,441],{"class":353},[331,1124,1125],{"class":333,"line":623},[331,1126,396],{"emptyLinePlaceholder":395},[331,1128,1130,1132,1134,1136,1139,1141],{"class":333,"line":1129},10,[331,1131,403],{"class":402},[331,1133,406],{"class":353},[331,1135,410],{"class":409},[331,1137,1138],{"class":413},"Config YAML:",[331,1140,410],{"class":409},[331,1142,441],{"class":353},[331,1144,1146,1148,1150,1152,1154,1156,1158,1161],{"class":333,"line":1145},11,[331,1147,403],{"class":402},[331,1149,406],{"class":353},[331,1151,320],{"class":525},[331,1153,231],{"class":353},[331,1155,634],{"class":525},[331,1157,406],{"class":353},[331,1159,1160],{"class":525},"model_cfg",[331,1162,641],{"class":353},[443,1164],{"data":1165,"kind":446},"Q29uZmlnIFlBTUw6Cl9hcmdzXzoKLSBfY29udmVydF86IGFsbAogIF90YXJnZXRfOiBsYWNvLmxhbmd1YWdlLk9yZGVyZWREaWN0LnRhcmdldAogIGl0ZW1zOgogIC0gLSBsaW5lYXIKICAgIC0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uTGluZWFyLCBpbl9mZWF0dXJlczogMTI4LCBvdXRfZmVhdHVyZXM6IDY0fQogIC0gLSByZWx1CiAgICAtIHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLlJlTFV9CiAgLSAtIGhlYWQKICAgIC0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uTGluZWFyLCBpbl9mZWF0dXJlczogNjQsIG91dF9mZWF0dXJlczogMTB9Cl9jb252ZXJ0XzogYWxsCl9sYWNvXzogMQpfdGFyZ2V0XzogdG9yY2gubm4uU2VxdWVudGlhbAoK",[322,1167,1169],{"className":324,"code":1168,"language":326,"meta":327,"style":327},"model = laco.instantiate(model_cfg)\nprint(\"Model:\", model)\nprint()\n\n# Named sub-modules are accessible by name:\nprint(\"Named children:\")\nfor name, child in model.named_children():\n    print(f\"  model.{name} = {child}\")\n",[224,1170,1171,1189,1208,1214,1218,1223,1238,1264],{"__ignoreMap":327},[331,1172,1173,1175,1177,1179,1181,1183,1185,1187],{"class":333,"line":334},[331,1174,805],{"class":341},[331,1176,517],{"class":516},[331,1178,350],{"class":341},[331,1180,231],{"class":353},[331,1182,814],{"class":525},[331,1184,406],{"class":353},[331,1186,1160],{"class":525},[331,1188,441],{"class":353},[331,1190,1191,1193,1195,1197,1200,1202,1204,1206],{"class":333,"line":345},[331,1192,403],{"class":402},[331,1194,406],{"class":353},[331,1196,410],{"class":409},[331,1198,1199],{"class":413},"Model:",[331,1201,410],{"class":409},[331,1203,419],{"class":353},[331,1205,838],{"class":525},[331,1207,441],{"class":353},[331,1209,1210,1212],{"class":333,"line":365},[331,1211,403],{"class":402},[331,1213,604],{"class":353},[331,1215,1216],{"class":333,"line":379},[331,1217,396],{"emptyLinePlaceholder":395},[331,1219,1220],{"class":333,"line":392},[331,1221,1222],{"class":497},"# Named sub-modules are accessible by name:\n",[331,1224,1225,1227,1229,1231,1234,1236],{"class":333,"line":399},[331,1226,403],{"class":402},[331,1228,406],{"class":353},[331,1230,410],{"class":409},[331,1232,1233],{"class":413},"Named children:",[331,1235,410],{"class":409},[331,1237,441],{"class":353},[331,1239,1240,1243,1246,1248,1251,1254,1256,1258,1261],{"class":333,"line":599},[331,1241,1242],{"class":337},"for",[331,1244,1245],{"class":341}," name",[331,1247,419],{"class":353},[331,1249,1250],{"class":341}," child ",[331,1252,1253],{"class":337},"in",[331,1255,838],{"class":341},[331,1257,231],{"class":353},[331,1259,1260],{"class":525},"named_children",[331,1262,1263],{"class":353},"():\n",[331,1265,1266,1269,1271,1275,1278,1281,1284,1287,1290,1292,1295,1297,1299],{"class":333,"line":607},[331,1267,1268],{"class":402},"    print",[331,1270,406],{"class":353},[331,1272,1274],{"class":1273},"sbsja","f",[331,1276,1277],{"class":413},"\"  model.",[331,1279,1280],{"class":548},"{",[331,1282,1283],{"class":525},"name",[331,1285,1286],{"class":548},"}",[331,1288,1289],{"class":413}," = ",[331,1291,1280],{"class":548},[331,1293,1294],{"class":525},"child",[331,1296,1286],{"class":548},[331,1298,410],{"class":413},[331,1300,441],{"class":353},[443,1302],{"data":1303,"kind":446},"TW9kZWw6IFNlcXVlbnRpYWwoCiAgKGxpbmVhcik6IExpbmVhcihpbl9mZWF0dXJlcz0xMjgsIG91dF9mZWF0dXJlcz02NCwgYmlhcz1UcnVlKQogIChyZWx1KTogUmVMVSgpCiAgKGhlYWQpOiBMaW5lYXIoaW5fZmVhdHVyZXM9NjQsIG91dF9mZWF0dXJlcz0xMCwgYmlhcz1UcnVlKQopCgpOYW1lZCBjaGlsZHJlbjoKICBtb2RlbC5saW5lYXIgPSBMaW5lYXIoaW5fZmVhdHVyZXM9MTI4LCBvdXRfZmVhdHVyZXM9NjQsIGJpYXM9VHJ1ZSkKICBtb2RlbC5yZWx1ID0gUmVMVSgpCiAgbW9kZWwuaGVhZCA9IExpbmVhcihpbl9mZWF0dXJlcz02NCwgb3V0X2ZlYXR1cmVzPTEwLCBiaWFzPVRydWUpCg==",[216,1305,1306],{},[219,1307,1308,1309,1311],{},"When to use ",[224,1310,256],{}," vs positional args:",[1313,1314,1315,1328],"table",{},[1316,1317,1318],"thead",{},[1319,1320,1321,1325],"tr",{},[1322,1323,1324],"th",{},"Style",[1322,1326,1327],{},"Use when",[1329,1330,1331,1343],"tbody",{},[1319,1332,1333,1340],{},[1334,1335,1336,1337],"td",{},"Positional args ",[224,1338,1339],{},"(L.call(nn.Linear)(...), ...)",[1334,1341,1342],{},"Order is all that matters; no need for named access",[1319,1344,1345,1350],{},[1334,1346,1347],{},[224,1348,1349],{},"L.OrderedDict((\"name\", cfg), ...)",[1334,1351,1352],{},"You want to access sub-modules by name (feature extraction, debugging, fine-tuning)",[448,1354],{},[451,1356,1358,1359],{"id":1357},"section-3-expand_argstrue","Section 3: ",[224,1360,265],{},[216,1362,1363,1364,1367,1368,1370,1371,1373,1374,1376],{},"Sometimes you want to pass a ",[219,1365,1366],{},"list"," of items as ",[224,1369,269],{}," (variadic positional arguments), not as a single positional argument containing the list. The ",[224,1372,265],{}," flag on ",[224,1375,246],{}," signals this intent.",[216,1378,1379,1386,1387,1389],{},[219,1380,1381,1382,1385],{},"Without ",[224,1383,1384],{},"expand_args",":"," the list is stored as a single ",[224,1388,899],{}," entry: the list itself is the first positional argument.",[216,1391,1392,1397,1398,300,1400,1402,1403,1406,1407,231],{},[219,1393,1394,1395,1385],{},"With ",[224,1396,265],{}," the list is stored in ",[224,1399,899],{},[224,1401,888],{}," unpacks it as ",[224,1404,1405],{},"constructor(*list_items)"," instead of ",[224,1408,1409],{},"constructor(list_items)",[216,1411,1412,1413,1415,1416,1419,1420,231],{},"This is critical for ",[224,1414,260],{},": it expects ",[224,1417,1418],{},"Sequential(layer1, layer2, ...)",", not ",[224,1421,1422],{},"Sequential([layer1, layer2, ...])",[322,1424,1426],{"className":324,"code":1425,"language":326,"meta":327,"style":327},"# L.repeat returns a lazy DictConfig node (a deferred laco.ops.repeat call),\n# NOT a Python list. The list of copies only materializes at instantiation.\n# Passing this node directly to nn.Sequential as a single arg would be wrong;\n# see expand_args below for the correct way to splat it into *args.\nlayers_node = L.repeat(3, L.call(nn.Linear)(in_features=64, out_features=64))\nprint(\"L.repeat(3, ...) node type:\", type(layers_node).__name__)\nprint(\"Instantiated length:\", len(laco.instantiate(layers_node)))\nprint()\n",[224,1427,1428,1433,1438,1443,1448,1501,1529,1562],{"__ignoreMap":327},[331,1429,1430],{"class":333,"line":334},[331,1431,1432],{"class":497},"# L.repeat returns a lazy DictConfig node (a deferred laco.ops.repeat call),\n",[331,1434,1435],{"class":333,"line":345},[331,1436,1437],{"class":497},"# NOT a Python list. The list of copies only materializes at instantiation.\n",[331,1439,1440],{"class":333,"line":365},[331,1441,1442],{"class":497},"# Passing this node directly to nn.Sequential as a single arg would be wrong;\n",[331,1444,1445],{"class":333,"line":379},[331,1446,1447],{"class":497},"# see expand_args below for the correct way to splat it into *args.\n",[331,1449,1450,1453,1455,1457,1459,1462,1464,1467,1469,1471,1473,1475,1477,1479,1481,1483,1485,1487,1489,1491,1493,1495,1497,1499],{"class":333,"line":392},[331,1451,1452],{"class":341},"layers_node ",[331,1454,517],{"class":516},[331,1456,520],{"class":341},[331,1458,231],{"class":353},[331,1460,1461],{"class":525},"repeat",[331,1463,406],{"class":353},[331,1465,1466],{"class":548},"3",[331,1468,419],{"class":353},[331,1470,520],{"class":525},[331,1472,231],{"class":353},[331,1474,526],{"class":525},[331,1476,406],{"class":353},[331,1478,531],{"class":525},[331,1480,231],{"class":353},[331,1482,536],{"class":356},[331,1484,539],{"class":353},[331,1486,543],{"class":542},[331,1488,517],{"class":516},[331,1490,559],{"class":548},[331,1492,419],{"class":353},[331,1494,554],{"class":542},[331,1496,517],{"class":516},[331,1498,559],{"class":548},[331,1500,641],{"class":353},[331,1502,1503,1505,1507,1509,1512,1514,1516,1518,1520,1523,1525,1527],{"class":333,"line":399},[331,1504,403],{"class":402},[331,1506,406],{"class":353},[331,1508,410],{"class":409},[331,1510,1511],{"class":413},"L.repeat(3, ...) node type:",[331,1513,410],{"class":409},[331,1515,419],{"class":353},[331,1517,584],{"class":583},[331,1519,406],{"class":353},[331,1521,1522],{"class":525},"layers_node",[331,1524,434],{"class":353},[331,1526,594],{"class":437},[331,1528,441],{"class":353},[331,1530,1531,1533,1535,1537,1540,1542,1544,1547,1549,1551,1553,1555,1557,1559],{"class":333,"line":599},[331,1532,403],{"class":402},[331,1534,406],{"class":353},[331,1536,410],{"class":409},[331,1538,1539],{"class":413},"Instantiated length:",[331,1541,410],{"class":409},[331,1543,419],{"class":353},[331,1545,1546],{"class":402}," len",[331,1548,406],{"class":353},[331,1550,320],{"class":525},[331,1552,231],{"class":353},[331,1554,814],{"class":525},[331,1556,406],{"class":353},[331,1558,1522],{"class":525},[331,1560,1561],{"class":353},")))\n",[331,1563,1564,1566],{"class":333,"line":607},[331,1565,403],{"class":402},[331,1567,604],{"class":353},[443,1569],{"data":1570,"kind":446},"TC5yZXBlYXQoMywgLi4uKSBub2RlIHR5cGU6IERpY3RDb25maWcKSW5zdGFudGlhdGVkIGxlbmd0aDogMwoK",[322,1572,1574],{"className":324,"code":1573,"language":326,"meta":327,"style":327},"# With expand_args=True: the list is unpacked as *args at instantiation time.\n# This is the correct way to build an nn.Sequential from L.repeat.\nseq_cfg = L.call(nn.Sequential, expand_args=True)(\n    L.repeat(3, L.call(nn.Linear)(in_features=64, out_features=64))\n)\n\nprint(\"Config YAML (note expand_args in the node):\")\nprint(laco.dump(seq_cfg))\n\nmodel = laco.instantiate(seq_cfg)\nprint(\"Instantiated:\", model)\nprint(f\"Number of children: {len(list(model.children()))}\")\n",[224,1575,1576,1581,1586,1619,1665,1669,1673,1688,1706,1710,1728,1747],{"__ignoreMap":327},[331,1577,1578],{"class":333,"line":334},[331,1579,1580],{"class":497},"# With expand_args=True: the list is unpacked as *args at instantiation time.\n",[331,1582,1583],{"class":333,"line":345},[331,1584,1585],{"class":497},"# This is the correct way to build an nn.Sequential from L.repeat.\n",[331,1587,1588,1590,1592,1594,1596,1598,1600,1602,1604,1606,1608,1611,1613,1617],{"class":333,"line":365},[331,1589,664],{"class":341},[331,1591,517],{"class":516},[331,1593,520],{"class":341},[331,1595,231],{"class":353},[331,1597,526],{"class":525},[331,1599,406],{"class":353},[331,1601,531],{"class":525},[331,1603,231],{"class":353},[331,1605,681],{"class":356},[331,1607,419],{"class":353},[331,1609,1610],{"class":542}," expand_args",[331,1612,517],{"class":516},[331,1614,1616],{"class":1615},"s39Yj","True",[331,1618,684],{"class":353},[331,1620,1621,1623,1625,1627,1629,1631,1633,1635,1637,1639,1641,1643,1645,1647,1649,1651,1653,1655,1657,1659,1661,1663],{"class":333,"line":379},[331,1622,689],{"class":525},[331,1624,231],{"class":353},[331,1626,1461],{"class":525},[331,1628,406],{"class":353},[331,1630,1466],{"class":548},[331,1632,419],{"class":353},[331,1634,520],{"class":525},[331,1636,231],{"class":353},[331,1638,526],{"class":525},[331,1640,406],{"class":353},[331,1642,531],{"class":525},[331,1644,231],{"class":353},[331,1646,536],{"class":356},[331,1648,539],{"class":353},[331,1650,543],{"class":542},[331,1652,517],{"class":516},[331,1654,559],{"class":548},[331,1656,419],{"class":353},[331,1658,554],{"class":542},[331,1660,517],{"class":516},[331,1662,559],{"class":548},[331,1664,641],{"class":353},[331,1666,1667],{"class":333,"line":392},[331,1668,441],{"class":353},[331,1670,1671],{"class":333,"line":399},[331,1672,396],{"emptyLinePlaceholder":395},[331,1674,1675,1677,1679,1681,1684,1686],{"class":333,"line":599},[331,1676,403],{"class":402},[331,1678,406],{"class":353},[331,1680,410],{"class":409},[331,1682,1683],{"class":413},"Config YAML (note expand_args in the node):",[331,1685,410],{"class":409},[331,1687,441],{"class":353},[331,1689,1690,1692,1694,1696,1698,1700,1702,1704],{"class":333,"line":607},[331,1691,403],{"class":402},[331,1693,406],{"class":353},[331,1695,320],{"class":525},[331,1697,231],{"class":353},[331,1699,634],{"class":525},[331,1701,406],{"class":353},[331,1703,780],{"class":525},[331,1705,641],{"class":353},[331,1707,1708],{"class":333,"line":623},[331,1709,396],{"emptyLinePlaceholder":395},[331,1711,1712,1714,1716,1718,1720,1722,1724,1726],{"class":333,"line":1129},[331,1713,805],{"class":341},[331,1715,517],{"class":516},[331,1717,350],{"class":341},[331,1719,231],{"class":353},[331,1721,814],{"class":525},[331,1723,406],{"class":353},[331,1725,780],{"class":525},[331,1727,441],{"class":353},[331,1729,1730,1732,1734,1736,1739,1741,1743,1745],{"class":333,"line":1145},[331,1731,403],{"class":402},[331,1733,406],{"class":353},[331,1735,410],{"class":409},[331,1737,1738],{"class":413},"Instantiated:",[331,1740,410],{"class":409},[331,1742,419],{"class":353},[331,1744,838],{"class":525},[331,1746,441],{"class":353},[331,1748,1750,1752,1754,1756,1759,1761,1764,1766,1768,1770,1772,1774,1777,1780,1782,1784],{"class":333,"line":1749},12,[331,1751,403],{"class":402},[331,1753,406],{"class":353},[331,1755,1274],{"class":1273},[331,1757,1758],{"class":413},"\"Number of children: ",[331,1760,1280],{"class":548},[331,1762,1763],{"class":402},"len",[331,1765,406],{"class":353},[331,1767,1366],{"class":583},[331,1769,406],{"class":353},[331,1771,862],{"class":525},[331,1773,231],{"class":353},[331,1775,1776],{"class":525},"children",[331,1778,1779],{"class":353},"()))",[331,1781,1286],{"class":548},[331,1783,410],{"class":413},[331,1785,441],{"class":353},[443,1787],{"data":1788,"kind":446},"Q29uZmlnIFlBTUwgKG5vdGUgZXhwYW5kX2FyZ3MgaW4gdGhlIG5vZGUpOgpfYXJnc186CiAgX2NvbnZlcnRfOiBhbGwKICBfdGFyZ2V0XzogbGFjby5vcHMucmVwZWF0CiAgbnVtOiAzCiAgc3JjOiB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5MaW5lYXIsIGluX2ZlYXR1cmVzOiA2NCwgb3V0X2ZlYXR1cmVzOiA2NH0KX2NvbnZlcnRfOiBhbGwKX2xhY29fOiAxCl90YXJnZXRfOiB0b3JjaC5ubi5TZXF1ZW50aWFsCgpJbnN0YW50aWF0ZWQ6IFNlcXVlbnRpYWwoCiAgKDApOiBMaW5lYXIoaW5fZmVhdHVyZXM9NjQsIG91dF9mZWF0dXJlcz02NCwgYmlhcz1UcnVlKQogICgxKTogTGluZWFyKGluX2ZlYXR1cmVzPTY0LCBvdXRfZmVhdHVyZXM9NjQsIGJpYXM9VHJ1ZSkKICAoMik6IExpbmVhcihpbl9mZWF0dXJlcz02NCwgb3V0X2ZlYXR1cmVzPTY0LCBiaWFzPVRydWUpCikKTnVtYmVyIG9mIGNoaWxkcmVuOiAzCg==",[448,1790],{},[451,1792,1794,1795,1797],{"id":1793},"section-4-lrepeat-replicated-structures","Section 4: ",[224,1796,274],{},", Replicated Structures",[216,1799,1800,464,1803,1810,1811,1814],{},[224,1801,1802],{},"L.repeat(n, item)",[219,1804,1805,1806,1809],{},"list of ",[224,1807,1808],{},"n"," deep-copies"," of ",[224,1812,1813],{},"item"," in the config tree. This is the idiomatic way to express \"N identical blocks\" without writing Python loops in your config files.",[216,1816,1817,1818,1821],{},"Because each copy is independent in the config tree, you can override individual copies after the fact: ",[224,1819,1820],{},"hps.num_layers=5"," would regenerate the list with 5 copies.",[322,1823,1825],{"className":324,"code":1824,"language":326,"meta":327,"style":327},"# Three identical linear layers. L.repeat builds a lazy DictConfig node;\n# instantiating it materializes the list of n deep-copies.\nblock_cfg = L.call(nn.Linear)(in_features=64, out_features=64)\nrepeated = L.repeat(3, block_cfg)\n\nprint(\"Type returned by L.repeat:\", type(repeated).__name__)\nprint()\nprint(\"The L.repeat node as YAML (num + src blueprint):\")\nprint(laco.dump(repeated))\n\n# Instantiate to get the actual list, then index\u002Fiterate it.\nlayers = laco.instantiate(repeated)\nprint(\"Instantiated type:\", type(layers).__name__)\nprint(\"Length:\", len(layers))\nprint(\"First element:\", layers[0])\n",[224,1826,1827,1832,1837,1876,1900,1904,1932,1938,1953,1971,1975,1980,1999,2028,2052],{"__ignoreMap":327},[331,1828,1829],{"class":333,"line":334},[331,1830,1831],{"class":497},"# Three identical linear layers. L.repeat builds a lazy DictConfig node;\n",[331,1833,1834],{"class":333,"line":345},[331,1835,1836],{"class":497},"# instantiating it materializes the list of n deep-copies.\n",[331,1838,1839,1842,1844,1846,1848,1850,1852,1854,1856,1858,1860,1862,1864,1866,1868,1870,1872,1874],{"class":333,"line":365},[331,1840,1841],{"class":341},"block_cfg ",[331,1843,517],{"class":516},[331,1845,520],{"class":341},[331,1847,231],{"class":353},[331,1849,526],{"class":525},[331,1851,406],{"class":353},[331,1853,531],{"class":525},[331,1855,231],{"class":353},[331,1857,536],{"class":356},[331,1859,539],{"class":353},[331,1861,543],{"class":542},[331,1863,517],{"class":516},[331,1865,559],{"class":548},[331,1867,419],{"class":353},[331,1869,554],{"class":542},[331,1871,517],{"class":516},[331,1873,559],{"class":548},[331,1875,441],{"class":353},[331,1877,1878,1881,1883,1885,1887,1889,1891,1893,1895,1898],{"class":333,"line":379},[331,1879,1880],{"class":341},"repeated ",[331,1882,517],{"class":516},[331,1884,520],{"class":341},[331,1886,231],{"class":353},[331,1888,1461],{"class":525},[331,1890,406],{"class":353},[331,1892,1466],{"class":548},[331,1894,419],{"class":353},[331,1896,1897],{"class":525}," block_cfg",[331,1899,441],{"class":353},[331,1901,1902],{"class":333,"line":392},[331,1903,396],{"emptyLinePlaceholder":395},[331,1905,1906,1908,1910,1912,1915,1917,1919,1921,1923,1926,1928,1930],{"class":333,"line":399},[331,1907,403],{"class":402},[331,1909,406],{"class":353},[331,1911,410],{"class":409},[331,1913,1914],{"class":413},"Type returned by L.repeat:",[331,1916,410],{"class":409},[331,1918,419],{"class":353},[331,1920,584],{"class":583},[331,1922,406],{"class":353},[331,1924,1925],{"class":525},"repeated",[331,1927,434],{"class":353},[331,1929,594],{"class":437},[331,1931,441],{"class":353},[331,1933,1934,1936],{"class":333,"line":599},[331,1935,403],{"class":402},[331,1937,604],{"class":353},[331,1939,1940,1942,1944,1946,1949,1951],{"class":333,"line":607},[331,1941,403],{"class":402},[331,1943,406],{"class":353},[331,1945,410],{"class":409},[331,1947,1948],{"class":413},"The L.repeat node as YAML (num + src blueprint):",[331,1950,410],{"class":409},[331,1952,441],{"class":353},[331,1954,1955,1957,1959,1961,1963,1965,1967,1969],{"class":333,"line":623},[331,1956,403],{"class":402},[331,1958,406],{"class":353},[331,1960,320],{"class":525},[331,1962,231],{"class":353},[331,1964,634],{"class":525},[331,1966,406],{"class":353},[331,1968,1925],{"class":525},[331,1970,641],{"class":353},[331,1972,1973],{"class":333,"line":1129},[331,1974,396],{"emptyLinePlaceholder":395},[331,1976,1977],{"class":333,"line":1145},[331,1978,1979],{"class":497},"# Instantiate to get the actual list, then index\u002Fiterate it.\n",[331,1981,1982,1985,1987,1989,1991,1993,1995,1997],{"class":333,"line":1749},[331,1983,1984],{"class":341},"layers ",[331,1986,517],{"class":516},[331,1988,350],{"class":341},[331,1990,231],{"class":353},[331,1992,814],{"class":525},[331,1994,406],{"class":353},[331,1996,1925],{"class":525},[331,1998,441],{"class":353},[331,2000,2002,2004,2006,2008,2011,2013,2015,2017,2019,2022,2024,2026],{"class":333,"line":2001},13,[331,2003,403],{"class":402},[331,2005,406],{"class":353},[331,2007,410],{"class":409},[331,2009,2010],{"class":413},"Instantiated type:",[331,2012,410],{"class":409},[331,2014,419],{"class":353},[331,2016,584],{"class":583},[331,2018,406],{"class":353},[331,2020,2021],{"class":525},"layers",[331,2023,434],{"class":353},[331,2025,594],{"class":437},[331,2027,441],{"class":353},[331,2029,2031,2033,2035,2037,2040,2042,2044,2046,2048,2050],{"class":333,"line":2030},14,[331,2032,403],{"class":402},[331,2034,406],{"class":353},[331,2036,410],{"class":409},[331,2038,2039],{"class":413},"Length:",[331,2041,410],{"class":409},[331,2043,419],{"class":353},[331,2045,1546],{"class":402},[331,2047,406],{"class":353},[331,2049,2021],{"class":525},[331,2051,641],{"class":353},[331,2053,2055,2057,2059,2061,2064,2066,2068,2071,2074,2077],{"class":333,"line":2054},15,[331,2056,403],{"class":402},[331,2058,406],{"class":353},[331,2060,410],{"class":409},[331,2062,2063],{"class":413},"First element:",[331,2065,410],{"class":409},[331,2067,419],{"class":353},[331,2069,2070],{"class":525}," layers",[331,2072,2073],{"class":353},"[",[331,2075,2076],{"class":548},"0",[331,2078,2079],{"class":353},"])\n",[443,2081],{"data":2082,"kind":446},"VHlwZSByZXR1cm5lZCBieSBMLnJlcGVhdDogRGljdENvbmZpZwoKVGhlIEwucmVwZWF0IG5vZGUgYXMgWUFNTCAobnVtICsgc3JjIGJsdWVwcmludCk6Cl9jb252ZXJ0XzogYWxsCl9sYWNvXzogMQpfdGFyZ2V0XzogbGFjby5vcHMucmVwZWF0Cm51bTogMwpzcmM6IHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLkxpbmVhciwgaW5fZmVhdHVyZXM6IDY0LCBvdXRfZmVhdHVyZXM6IDY0fQoKSW5zdGFudGlhdGVkIHR5cGU6IGxpc3QKTGVuZ3RoOiAzCkZpcnN0IGVsZW1lbnQ6IExpbmVhcihpbl9mZWF0dXJlcz02NCwgb3V0X2ZlYXR1cmVzPTY0LCBiaWFzPVRydWUpCg==",[322,2084,2086],{"className":324,"code":2085,"language":326,"meta":327,"style":327},"# Build a deep network from L.repeat + expand_args.\ndeep_net_cfg = L.call(nn.Sequential, expand_args=True)(\n    L.repeat(5, L.call(nn.Linear)(in_features=64, out_features=64))\n)\n\ndeep_net = laco.instantiate(deep_net_cfg)\nprint(\"Deep net (5 linear layers):\")\nprint(deep_net)\n",[224,2087,2088,2093,2124,2171,2175,2179,2199,2214],{"__ignoreMap":327},[331,2089,2090],{"class":333,"line":334},[331,2091,2092],{"class":497},"# Build a deep network from L.repeat + expand_args.\n",[331,2094,2095,2098,2100,2102,2104,2106,2108,2110,2112,2114,2116,2118,2120,2122],{"class":333,"line":345},[331,2096,2097],{"class":341},"deep_net_cfg ",[331,2099,517],{"class":516},[331,2101,520],{"class":341},[331,2103,231],{"class":353},[331,2105,526],{"class":525},[331,2107,406],{"class":353},[331,2109,531],{"class":525},[331,2111,231],{"class":353},[331,2113,681],{"class":356},[331,2115,419],{"class":353},[331,2117,1610],{"class":542},[331,2119,517],{"class":516},[331,2121,1616],{"class":1615},[331,2123,684],{"class":353},[331,2125,2126,2128,2130,2132,2134,2137,2139,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159,2161,2163,2165,2167,2169],{"class":333,"line":365},[331,2127,689],{"class":525},[331,2129,231],{"class":353},[331,2131,1461],{"class":525},[331,2133,406],{"class":353},[331,2135,2136],{"class":548},"5",[331,2138,419],{"class":353},[331,2140,520],{"class":525},[331,2142,231],{"class":353},[331,2144,526],{"class":525},[331,2146,406],{"class":353},[331,2148,531],{"class":525},[331,2150,231],{"class":353},[331,2152,536],{"class":356},[331,2154,539],{"class":353},[331,2156,543],{"class":542},[331,2158,517],{"class":516},[331,2160,559],{"class":548},[331,2162,419],{"class":353},[331,2164,554],{"class":542},[331,2166,517],{"class":516},[331,2168,559],{"class":548},[331,2170,641],{"class":353},[331,2172,2173],{"class":333,"line":379},[331,2174,441],{"class":353},[331,2176,2177],{"class":333,"line":392},[331,2178,396],{"emptyLinePlaceholder":395},[331,2180,2181,2184,2186,2188,2190,2192,2194,2197],{"class":333,"line":399},[331,2182,2183],{"class":341},"deep_net ",[331,2185,517],{"class":516},[331,2187,350],{"class":341},[331,2189,231],{"class":353},[331,2191,814],{"class":525},[331,2193,406],{"class":353},[331,2195,2196],{"class":525},"deep_net_cfg",[331,2198,441],{"class":353},[331,2200,2201,2203,2205,2207,2210,2212],{"class":333,"line":599},[331,2202,403],{"class":402},[331,2204,406],{"class":353},[331,2206,410],{"class":409},[331,2208,2209],{"class":413},"Deep net (5 linear layers):",[331,2211,410],{"class":409},[331,2213,441],{"class":353},[331,2215,2216,2218,2220,2223],{"class":333,"line":607},[331,2217,403],{"class":402},[331,2219,406],{"class":353},[331,2221,2222],{"class":525},"deep_net",[331,2224,441],{"class":353},[443,2226],{"data":2227,"kind":446},"RGVlcCBuZXQgKDUgbGluZWFyIGxheWVycyk6ClNlcXVlbnRpYWwoCiAgKDApOiBMaW5lYXIoaW5fZmVhdHVyZXM9NjQsIG91dF9mZWF0dXJlcz02NCwgYmlhcz1UcnVlKQogICgxKTogTGluZWFyKGluX2ZlYXR1cmVzPTY0LCBvdXRfZmVhdHVyZXM9NjQsIGJpYXM9VHJ1ZSkKICAoMik6IExpbmVhcihpbl9mZWF0dXJlcz02NCwgb3V0X2ZlYXR1cmVzPTY0LCBiaWFzPVRydWUpCiAgKDMpOiBMaW5lYXIoaW5fZmVhdHVyZXM9NjQsIG91dF9mZWF0dXJlcz02NCwgYmlhcz1UcnVlKQogICg0KTogTGluZWFyKGluX2ZlYXR1cmVzPTY0LCBvdXRfZmVhdHVyZXM9NjQsIGJpYXM9VHJ1ZSkKKQo=",[322,2229,2231],{"className":324,"code":2230,"language":326,"meta":327,"style":327},"# L.repeat deep-copies its source, so each entry is an independent module.\n# Instantiate the node to get the list, then inspect individual elements.\nmulti_cfg = L.repeat(3, L.call(nn.Linear)(in_features=64, out_features=64))\nmodules = laco.instantiate(multi_cfg)\nprint(\"Are copies distinct objects?\", modules[0] is not modules[1])\nprint(\"Copy 0:\", modules[0])\nprint(\"Copy 1:\", modules[1])\n",[224,2232,2233,2238,2243,2294,2314,2354,2377],{"__ignoreMap":327},[331,2234,2235],{"class":333,"line":334},[331,2236,2237],{"class":497},"# L.repeat deep-copies its source, so each entry is an independent module.\n",[331,2239,2240],{"class":333,"line":345},[331,2241,2242],{"class":497},"# Instantiate the node to get the list, then inspect individual elements.\n",[331,2244,2245,2248,2250,2252,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2282,2284,2286,2288,2290,2292],{"class":333,"line":365},[331,2246,2247],{"class":341},"multi_cfg ",[331,2249,517],{"class":516},[331,2251,520],{"class":341},[331,2253,231],{"class":353},[331,2255,1461],{"class":525},[331,2257,406],{"class":353},[331,2259,1466],{"class":548},[331,2261,419],{"class":353},[331,2263,520],{"class":525},[331,2265,231],{"class":353},[331,2267,526],{"class":525},[331,2269,406],{"class":353},[331,2271,531],{"class":525},[331,2273,231],{"class":353},[331,2275,536],{"class":356},[331,2277,539],{"class":353},[331,2279,543],{"class":542},[331,2281,517],{"class":516},[331,2283,559],{"class":548},[331,2285,419],{"class":353},[331,2287,554],{"class":542},[331,2289,517],{"class":516},[331,2291,559],{"class":548},[331,2293,641],{"class":353},[331,2295,2296,2299,2301,2303,2305,2307,2309,2312],{"class":333,"line":379},[331,2297,2298],{"class":341},"modules ",[331,2300,517],{"class":516},[331,2302,350],{"class":341},[331,2304,231],{"class":353},[331,2306,814],{"class":525},[331,2308,406],{"class":353},[331,2310,2311],{"class":525},"multi_cfg",[331,2313,441],{"class":353},[331,2315,2316,2318,2320,2322,2325,2327,2329,2332,2334,2336,2339,2342,2345,2347,2349,2352],{"class":333,"line":392},[331,2317,403],{"class":402},[331,2319,406],{"class":353},[331,2321,410],{"class":409},[331,2323,2324],{"class":413},"Are copies distinct objects?",[331,2326,410],{"class":409},[331,2328,419],{"class":353},[331,2330,2331],{"class":525}," modules",[331,2333,2073],{"class":353},[331,2335,2076],{"class":548},[331,2337,2338],{"class":353},"]",[331,2340,2341],{"class":337}," is",[331,2343,2344],{"class":337}," not",[331,2346,2331],{"class":525},[331,2348,2073],{"class":353},[331,2350,2351],{"class":548},"1",[331,2353,2079],{"class":353},[331,2355,2356,2358,2360,2362,2365,2367,2369,2371,2373,2375],{"class":333,"line":399},[331,2357,403],{"class":402},[331,2359,406],{"class":353},[331,2361,410],{"class":409},[331,2363,2364],{"class":413},"Copy 0:",[331,2366,410],{"class":409},[331,2368,419],{"class":353},[331,2370,2331],{"class":525},[331,2372,2073],{"class":353},[331,2374,2076],{"class":548},[331,2376,2079],{"class":353},[331,2378,2379,2381,2383,2385,2388,2390,2392,2394,2396,2398],{"class":333,"line":599},[331,2380,403],{"class":402},[331,2382,406],{"class":353},[331,2384,410],{"class":409},[331,2386,2387],{"class":413},"Copy 1:",[331,2389,410],{"class":409},[331,2391,419],{"class":353},[331,2393,2331],{"class":525},[331,2395,2073],{"class":353},[331,2397,2351],{"class":548},[331,2399,2079],{"class":353},[443,2401],{"data":2402,"kind":446},"QXJlIGNvcGllcyBkaXN0aW5jdCBvYmplY3RzPyBUcnVlCkNvcHkgMDogTGluZWFyKGluX2ZlYXR1cmVzPTY0LCBvdXRfZmVhdHVyZXM9NjQsIGJpYXM9VHJ1ZSkKQ29weSAxOiBMaW5lYXIoaW5fZmVhdHVyZXM9NjQsIG91dF9mZWF0dXJlcz02NCwgYmlhcz1UcnVlKQo=",[448,2404],{},[451,2406,2408],{"id":2407},"section-5-container-macros","Section 5: Container Macros",[216,2410,2411,2412,2414,2415,2418,2419,2421],{},"laco provides five typed container macros. Each one looks like a Python constructor but produces a ",[224,2413,250],{}," node (the ",[219,2416,2417],{},"lie-typing contract",", see the language module docstring). When you call ",[224,2420,888],{},", the node is resolved into the actual Python container.",[1313,2423,2424,2437],{},[1316,2425,2426],{},[1319,2427,2428,2431,2434],{},[1322,2429,2430],{},"Macro",[1322,2432,2433],{},"Static type",[1322,2435,2436],{},"Use case",[1329,2438,2439,2454,2469,2484,2499],{},[1319,2440,2441,2446,2451],{},[1334,2442,2443],{},[224,2444,2445],{},"L.List(*items)",[1334,2447,2448],{},[224,2449,2450],{},"list[T]",[1334,2452,2453],{},"Homogeneous list",[1319,2455,2456,2461,2466],{},[1334,2457,2458],{},[224,2459,2460],{},"L.Dict(**kwargs)",[1334,2462,2463],{},[224,2464,2465],{},"dict[str, T]",[1334,2467,2468],{},"String-keyed mapping",[1319,2470,2471,2476,2481],{},[1334,2472,2473],{},[224,2474,2475],{},"L.Tuple(*items)",[1334,2477,2478],{},[224,2479,2480],{},"tuple[...]",[1334,2482,2483],{},"Heterogeneous tuple",[1319,2485,2486,2491,2496],{},[1334,2487,2488],{},[224,2489,2490],{},"L.Set(*items)",[1334,2492,2493],{},[224,2494,2495],{},"set[T]",[1334,2497,2498],{},"Unordered, deduplicated set",[1319,2500,2501,2506,2511],{},[1334,2502,2503],{},[224,2504,2505],{},"L.OrderedDict((k,v), ...)",[1334,2507,2508],{},[224,2509,2510],{},"OrderedDict[str, T]",[1334,2512,2513],{},"Insertion-order mapping",[322,2515,2517],{"className":324,"code":2516,"language":326,"meta":327,"style":327},"# L.List — homogeneous list of items.\nlist_cfg = L.List(1, 2, 3)\nprint(\"L.List config type:\", type(list_cfg).__name__)\nresult = laco.instantiate(list_cfg)\nprint(\"Instantiated:\", result, \"| type:\", type(result).__name__)\n",[224,2518,2519,2524,2554,2582,2601],{"__ignoreMap":327},[331,2520,2521],{"class":333,"line":334},[331,2522,2523],{"class":497},"# L.List — homogeneous list of items.\n",[331,2525,2526,2529,2531,2533,2535,2538,2540,2542,2544,2547,2549,2552],{"class":333,"line":345},[331,2527,2528],{"class":341},"list_cfg ",[331,2530,517],{"class":516},[331,2532,520],{"class":341},[331,2534,231],{"class":353},[331,2536,2537],{"class":525},"List",[331,2539,406],{"class":353},[331,2541,2351],{"class":548},[331,2543,419],{"class":353},[331,2545,2546],{"class":548}," 2",[331,2548,419],{"class":353},[331,2550,2551],{"class":548}," 3",[331,2553,441],{"class":353},[331,2555,2556,2558,2560,2562,2565,2567,2569,2571,2573,2576,2578,2580],{"class":333,"line":365},[331,2557,403],{"class":402},[331,2559,406],{"class":353},[331,2561,410],{"class":409},[331,2563,2564],{"class":413},"L.List config type:",[331,2566,410],{"class":409},[331,2568,419],{"class":353},[331,2570,584],{"class":583},[331,2572,406],{"class":353},[331,2574,2575],{"class":525},"list_cfg",[331,2577,434],{"class":353},[331,2579,594],{"class":437},[331,2581,441],{"class":353},[331,2583,2584,2587,2589,2591,2593,2595,2597,2599],{"class":333,"line":379},[331,2585,2586],{"class":341},"result ",[331,2588,517],{"class":516},[331,2590,350],{"class":341},[331,2592,231],{"class":353},[331,2594,814],{"class":525},[331,2596,406],{"class":353},[331,2598,2575],{"class":525},[331,2600,441],{"class":353},[331,2602,2603,2605,2607,2609,2611,2613,2615,2618,2620,2623,2626,2628,2630,2632,2634,2637,2639,2641],{"class":333,"line":392},[331,2604,403],{"class":402},[331,2606,406],{"class":353},[331,2608,410],{"class":409},[331,2610,1738],{"class":413},[331,2612,410],{"class":409},[331,2614,419],{"class":353},[331,2616,2617],{"class":525}," result",[331,2619,419],{"class":353},[331,2621,2622],{"class":409}," \"",[331,2624,2625],{"class":413},"| type:",[331,2627,410],{"class":409},[331,2629,419],{"class":353},[331,2631,584],{"class":583},[331,2633,406],{"class":353},[331,2635,2636],{"class":525},"result",[331,2638,434],{"class":353},[331,2640,594],{"class":437},[331,2642,441],{"class":353},[443,2644],{"data":2645,"kind":446},"TC5MaXN0IGNvbmZpZyB0eXBlOiBEaWN0Q29uZmlnCkluc3RhbnRpYXRlZDogWzEsIDIsIDNdIHwgdHlwZTogbGlzdAo=",[322,2647,2649],{"className":324,"code":2648,"language":326,"meta":327,"style":327},"# L.Dict — string-keyed mapping via keyword arguments.\ndict_cfg = L.Dict(a=1, b=2, c=3)\nprint(\"L.Dict config type:\", type(dict_cfg).__name__)\nresult = laco.instantiate(dict_cfg)\nprint(\"Instantiated:\", result, \"| type:\", type(result).__name__)\n",[224,2650,2651,2656,2700,2728,2746],{"__ignoreMap":327},[331,2652,2653],{"class":333,"line":334},[331,2654,2655],{"class":497},"# L.Dict — string-keyed mapping via keyword arguments.\n",[331,2657,2658,2661,2663,2665,2667,2670,2672,2675,2677,2679,2681,2684,2686,2689,2691,2694,2696,2698],{"class":333,"line":345},[331,2659,2660],{"class":341},"dict_cfg ",[331,2662,517],{"class":516},[331,2664,520],{"class":341},[331,2666,231],{"class":353},[331,2668,2669],{"class":525},"Dict",[331,2671,406],{"class":353},[331,2673,2674],{"class":542},"a",[331,2676,517],{"class":516},[331,2678,2351],{"class":548},[331,2680,419],{"class":353},[331,2682,2683],{"class":542}," b",[331,2685,517],{"class":516},[331,2687,2688],{"class":548},"2",[331,2690,419],{"class":353},[331,2692,2693],{"class":542}," c",[331,2695,517],{"class":516},[331,2697,1466],{"class":548},[331,2699,441],{"class":353},[331,2701,2702,2704,2706,2708,2711,2713,2715,2717,2719,2722,2724,2726],{"class":333,"line":365},[331,2703,403],{"class":402},[331,2705,406],{"class":353},[331,2707,410],{"class":409},[331,2709,2710],{"class":413},"L.Dict config type:",[331,2712,410],{"class":409},[331,2714,419],{"class":353},[331,2716,584],{"class":583},[331,2718,406],{"class":353},[331,2720,2721],{"class":525},"dict_cfg",[331,2723,434],{"class":353},[331,2725,594],{"class":437},[331,2727,441],{"class":353},[331,2729,2730,2732,2734,2736,2738,2740,2742,2744],{"class":333,"line":379},[331,2731,2586],{"class":341},[331,2733,517],{"class":516},[331,2735,350],{"class":341},[331,2737,231],{"class":353},[331,2739,814],{"class":525},[331,2741,406],{"class":353},[331,2743,2721],{"class":525},[331,2745,441],{"class":353},[331,2747,2748,2750,2752,2754,2756,2758,2760,2762,2764,2766,2768,2770,2772,2774,2776,2778,2780,2782],{"class":333,"line":392},[331,2749,403],{"class":402},[331,2751,406],{"class":353},[331,2753,410],{"class":409},[331,2755,1738],{"class":413},[331,2757,410],{"class":409},[331,2759,419],{"class":353},[331,2761,2617],{"class":525},[331,2763,419],{"class":353},[331,2765,2622],{"class":409},[331,2767,2625],{"class":413},[331,2769,410],{"class":409},[331,2771,419],{"class":353},[331,2773,584],{"class":583},[331,2775,406],{"class":353},[331,2777,2636],{"class":525},[331,2779,434],{"class":353},[331,2781,594],{"class":437},[331,2783,441],{"class":353},[443,2785],{"data":2786,"kind":446},"TC5EaWN0IGNvbmZpZyB0eXBlOiBEaWN0Q29uZmlnCkluc3RhbnRpYXRlZDogeydhJzogMSwgJ2InOiAyLCAnYyc6IDN9IHwgdHlwZTogZGljdAo=",[322,2788,2790],{"className":324,"code":2789,"language":326,"meta":327,"style":327},"# L.Tuple — heterogeneous tuple.\n# Uses PEP 646 TypeVarTuple so mypy\u002Fpyright can track element types.\ntuple_cfg = L.Tuple(1, \"hello\", 3.14)\nprint(\"L.Tuple config type:\", type(tuple_cfg).__name__)\nresult = laco.instantiate(tuple_cfg)\nprint(\"Instantiated:\", result, \"| type:\", type(result).__name__)\n",[224,2791,2792,2797,2802,2836,2864,2882],{"__ignoreMap":327},[331,2793,2794],{"class":333,"line":334},[331,2795,2796],{"class":497},"# L.Tuple — heterogeneous tuple.\n",[331,2798,2799],{"class":333,"line":345},[331,2800,2801],{"class":497},"# Uses PEP 646 TypeVarTuple so mypy\u002Fpyright can track element types.\n",[331,2803,2804,2807,2809,2811,2813,2816,2818,2820,2822,2824,2827,2829,2831,2834],{"class":333,"line":365},[331,2805,2806],{"class":341},"tuple_cfg ",[331,2808,517],{"class":516},[331,2810,520],{"class":341},[331,2812,231],{"class":353},[331,2814,2815],{"class":525},"Tuple",[331,2817,406],{"class":353},[331,2819,2351],{"class":548},[331,2821,419],{"class":353},[331,2823,2622],{"class":409},[331,2825,2826],{"class":413},"hello",[331,2828,410],{"class":409},[331,2830,419],{"class":353},[331,2832,2833],{"class":548}," 3.14",[331,2835,441],{"class":353},[331,2837,2838,2840,2842,2844,2847,2849,2851,2853,2855,2858,2860,2862],{"class":333,"line":379},[331,2839,403],{"class":402},[331,2841,406],{"class":353},[331,2843,410],{"class":409},[331,2845,2846],{"class":413},"L.Tuple config type:",[331,2848,410],{"class":409},[331,2850,419],{"class":353},[331,2852,584],{"class":583},[331,2854,406],{"class":353},[331,2856,2857],{"class":525},"tuple_cfg",[331,2859,434],{"class":353},[331,2861,594],{"class":437},[331,2863,441],{"class":353},[331,2865,2866,2868,2870,2872,2874,2876,2878,2880],{"class":333,"line":392},[331,2867,2586],{"class":341},[331,2869,517],{"class":516},[331,2871,350],{"class":341},[331,2873,231],{"class":353},[331,2875,814],{"class":525},[331,2877,406],{"class":353},[331,2879,2857],{"class":525},[331,2881,441],{"class":353},[331,2883,2884,2886,2888,2890,2892,2894,2896,2898,2900,2902,2904,2906,2908,2910,2912,2914,2916,2918],{"class":333,"line":399},[331,2885,403],{"class":402},[331,2887,406],{"class":353},[331,2889,410],{"class":409},[331,2891,1738],{"class":413},[331,2893,410],{"class":409},[331,2895,419],{"class":353},[331,2897,2617],{"class":525},[331,2899,419],{"class":353},[331,2901,2622],{"class":409},[331,2903,2625],{"class":413},[331,2905,410],{"class":409},[331,2907,419],{"class":353},[331,2909,584],{"class":583},[331,2911,406],{"class":353},[331,2913,2636],{"class":525},[331,2915,434],{"class":353},[331,2917,594],{"class":437},[331,2919,441],{"class":353},[443,2921],{"data":2922,"kind":446},"TC5UdXBsZSBjb25maWcgdHlwZTogRGljdENvbmZpZwpJbnN0YW50aWF0ZWQ6ICgxLCAnaGVsbG8nLCAzLjE0KSB8IHR5cGU6IHR1cGxlCg==",[322,2924,2926],{"className":324,"code":2925,"language":326,"meta":327,"style":327},"# L.Set — deduplicated, unordered set.\nset_cfg = L.Set(1, 2, 3, 2, 1)\nprint(\"L.Set config type:\", type(set_cfg).__name__)\nresult = laco.instantiate(set_cfg)\nprint(\"Instantiated:\", result, \"| type:\", type(result).__name__)\nprint(\"Duplicates were removed:\", 2 in result and len(result) == 3)\n",[224,2927,2928,2933,2970,2998,3016,3054],{"__ignoreMap":327},[331,2929,2930],{"class":333,"line":334},[331,2931,2932],{"class":497},"# L.Set — deduplicated, unordered set.\n",[331,2934,2935,2938,2940,2942,2944,2947,2949,2951,2953,2955,2957,2959,2961,2963,2965,2968],{"class":333,"line":345},[331,2936,2937],{"class":341},"set_cfg ",[331,2939,517],{"class":516},[331,2941,520],{"class":341},[331,2943,231],{"class":353},[331,2945,2946],{"class":525},"Set",[331,2948,406],{"class":353},[331,2950,2351],{"class":548},[331,2952,419],{"class":353},[331,2954,2546],{"class":548},[331,2956,419],{"class":353},[331,2958,2551],{"class":548},[331,2960,419],{"class":353},[331,2962,2546],{"class":548},[331,2964,419],{"class":353},[331,2966,2967],{"class":548}," 1",[331,2969,441],{"class":353},[331,2971,2972,2974,2976,2978,2981,2983,2985,2987,2989,2992,2994,2996],{"class":333,"line":365},[331,2973,403],{"class":402},[331,2975,406],{"class":353},[331,2977,410],{"class":409},[331,2979,2980],{"class":413},"L.Set config type:",[331,2982,410],{"class":409},[331,2984,419],{"class":353},[331,2986,584],{"class":583},[331,2988,406],{"class":353},[331,2990,2991],{"class":525},"set_cfg",[331,2993,434],{"class":353},[331,2995,594],{"class":437},[331,2997,441],{"class":353},[331,2999,3000,3002,3004,3006,3008,3010,3012,3014],{"class":333,"line":379},[331,3001,2586],{"class":341},[331,3003,517],{"class":516},[331,3005,350],{"class":341},[331,3007,231],{"class":353},[331,3009,814],{"class":525},[331,3011,406],{"class":353},[331,3013,2991],{"class":525},[331,3015,441],{"class":353},[331,3017,3018,3020,3022,3024,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3046,3048,3050,3052],{"class":333,"line":392},[331,3019,403],{"class":402},[331,3021,406],{"class":353},[331,3023,410],{"class":409},[331,3025,1738],{"class":413},[331,3027,410],{"class":409},[331,3029,419],{"class":353},[331,3031,2617],{"class":525},[331,3033,419],{"class":353},[331,3035,2622],{"class":409},[331,3037,2625],{"class":413},[331,3039,410],{"class":409},[331,3041,419],{"class":353},[331,3043,584],{"class":583},[331,3045,406],{"class":353},[331,3047,2636],{"class":525},[331,3049,434],{"class":353},[331,3051,594],{"class":437},[331,3053,441],{"class":353},[331,3055,3056,3058,3060,3062,3065,3067,3069,3071,3074,3077,3080,3082,3084,3086,3089,3092,3094],{"class":333,"line":399},[331,3057,403],{"class":402},[331,3059,406],{"class":353},[331,3061,410],{"class":409},[331,3063,3064],{"class":413},"Duplicates were removed:",[331,3066,410],{"class":409},[331,3068,419],{"class":353},[331,3070,2546],{"class":548},[331,3072,3073],{"class":337}," in",[331,3075,3076],{"class":525}," result ",[331,3078,3079],{"class":337},"and",[331,3081,1546],{"class":402},[331,3083,406],{"class":353},[331,3085,2636],{"class":525},[331,3087,3088],{"class":353},")",[331,3090,3091],{"class":516}," ==",[331,3093,2551],{"class":548},[331,3095,441],{"class":353},[443,3097],{"data":3098,"kind":446},"TC5TZXQgY29uZmlnIHR5cGU6IERpY3RDb25maWcKSW5zdGFudGlhdGVkOiB7MSwgMiwgM30gfCB0eXBlOiBzZXQKRHVwbGljYXRlcyB3ZXJlIHJlbW92ZWQ6IFRydWUK",[322,3100,3102],{"className":324,"code":3101,"language":326,"meta":327,"style":327},"# L.OrderedDict — insertion-order preserved mapping.\nimport collections\nod_cfg = L.OrderedDict(\n    (\"first\",  10),\n    (\"second\", 20),\n    (\"third\",  30),\n)\nprint(\"L.OrderedDict config type:\", type(od_cfg).__name__)\nresult = laco.instantiate(od_cfg)\nprint(\"Instantiated:\", result, \"| type:\", type(result).__name__)\nprint(\"Keys in insertion order:\", list(result.keys()))\n",[224,3103,3104,3109,3116,3131,3150,3168,3186,3190,3218,3236,3274],{"__ignoreMap":327},[331,3105,3106],{"class":333,"line":334},[331,3107,3108],{"class":497},"# L.OrderedDict — insertion-order preserved mapping.\n",[331,3110,3111,3113],{"class":333,"line":345},[331,3112,338],{"class":337},[331,3114,3115],{"class":341}," collections\n",[331,3117,3118,3121,3123,3125,3127,3129],{"class":333,"line":365},[331,3119,3120],{"class":341},"od_cfg ",[331,3122,517],{"class":516},[331,3124,520],{"class":341},[331,3126,231],{"class":353},[331,3128,920],{"class":525},[331,3130,988],{"class":353},[331,3132,3133,3136,3138,3141,3143,3145,3148],{"class":333,"line":379},[331,3134,3135],{"class":353},"    (",[331,3137,410],{"class":409},[331,3139,3140],{"class":413},"first",[331,3142,410],{"class":409},[331,3144,419],{"class":353},[331,3146,3147],{"class":548},"  10",[331,3149,720],{"class":353},[331,3151,3152,3154,3156,3159,3161,3163,3166],{"class":333,"line":392},[331,3153,3135],{"class":353},[331,3155,410],{"class":409},[331,3157,3158],{"class":413},"second",[331,3160,410],{"class":409},[331,3162,419],{"class":353},[331,3164,3165],{"class":548}," 20",[331,3167,720],{"class":353},[331,3169,3170,3172,3174,3177,3179,3181,3184],{"class":333,"line":399},[331,3171,3135],{"class":353},[331,3173,410],{"class":409},[331,3175,3176],{"class":413},"third",[331,3178,410],{"class":409},[331,3180,419],{"class":353},[331,3182,3183],{"class":548},"  30",[331,3185,720],{"class":353},[331,3187,3188],{"class":333,"line":599},[331,3189,441],{"class":353},[331,3191,3192,3194,3196,3198,3201,3203,3205,3207,3209,3212,3214,3216],{"class":333,"line":607},[331,3193,403],{"class":402},[331,3195,406],{"class":353},[331,3197,410],{"class":409},[331,3199,3200],{"class":413},"L.OrderedDict config type:",[331,3202,410],{"class":409},[331,3204,419],{"class":353},[331,3206,584],{"class":583},[331,3208,406],{"class":353},[331,3210,3211],{"class":525},"od_cfg",[331,3213,434],{"class":353},[331,3215,594],{"class":437},[331,3217,441],{"class":353},[331,3219,3220,3222,3224,3226,3228,3230,3232,3234],{"class":333,"line":623},[331,3221,2586],{"class":341},[331,3223,517],{"class":516},[331,3225,350],{"class":341},[331,3227,231],{"class":353},[331,3229,814],{"class":525},[331,3231,406],{"class":353},[331,3233,3211],{"class":525},[331,3235,441],{"class":353},[331,3237,3238,3240,3242,3244,3246,3248,3250,3252,3254,3256,3258,3260,3262,3264,3266,3268,3270,3272],{"class":333,"line":1129},[331,3239,403],{"class":402},[331,3241,406],{"class":353},[331,3243,410],{"class":409},[331,3245,1738],{"class":413},[331,3247,410],{"class":409},[331,3249,419],{"class":353},[331,3251,2617],{"class":525},[331,3253,419],{"class":353},[331,3255,2622],{"class":409},[331,3257,2625],{"class":413},[331,3259,410],{"class":409},[331,3261,419],{"class":353},[331,3263,584],{"class":583},[331,3265,406],{"class":353},[331,3267,2636],{"class":525},[331,3269,434],{"class":353},[331,3271,594],{"class":437},[331,3273,441],{"class":353},[331,3275,3276,3278,3280,3282,3285,3287,3289,3292,3294,3296,3298,3300],{"class":333,"line":1145},[331,3277,403],{"class":402},[331,3279,406],{"class":353},[331,3281,410],{"class":409},[331,3283,3284],{"class":413},"Keys in insertion order:",[331,3286,410],{"class":409},[331,3288,419],{"class":353},[331,3290,3291],{"class":583}," list",[331,3293,406],{"class":353},[331,3295,2636],{"class":525},[331,3297,231],{"class":353},[331,3299,195],{"class":525},[331,3301,3302],{"class":353},"()))\n",[443,3304],{"data":3305,"kind":446},"TC5PcmRlcmVkRGljdCBjb25maWcgdHlwZTogRGljdENvbmZpZwpJbnN0YW50aWF0ZWQ6IE9yZGVyZWREaWN0KHsnZmlyc3QnOiAxMCwgJ3NlY29uZCc6IDIwLCAndGhpcmQnOiAzMH0pIHwgdHlwZTogT3JkZXJlZERpY3QKS2V5cyBpbiBpbnNlcnRpb24gb3JkZXI6IFsnZmlyc3QnLCAnc2Vjb25kJywgJ3RoaXJkJ10K",[322,3307,3309],{"className":324,"code":3308,"language":326,"meta":327,"style":327},"# Containers can hold nested L.call nodes — they instantiate recursively.\n# Example: L.Dict of two nn.Linear configs.\nlayers_dict_cfg = L.Dict(\n    encoder=L.call(nn.Linear)(in_features=128, out_features=64),\n    decoder=L.call(nn.Linear)(in_features=64,  out_features=128),\n)\nlayers = laco.instantiate(layers_dict_cfg)\nprint(\"Nested Dict instantiation:\")\nfor k, v in layers.items():\n    print(f\"  {k}: {v}\")\n",[224,3310,3311,3316,3321,3336,3376,3415,3419,3438,3453,3476],{"__ignoreMap":327},[331,3312,3313],{"class":333,"line":334},[331,3314,3315],{"class":497},"# Containers can hold nested L.call nodes — they instantiate recursively.\n",[331,3317,3318],{"class":333,"line":345},[331,3319,3320],{"class":497},"# Example: L.Dict of two nn.Linear configs.\n",[331,3322,3323,3326,3328,3330,3332,3334],{"class":333,"line":365},[331,3324,3325],{"class":341},"layers_dict_cfg ",[331,3327,517],{"class":516},[331,3329,520],{"class":341},[331,3331,231],{"class":353},[331,3333,2669],{"class":525},[331,3335,988],{"class":353},[331,3337,3338,3341,3343,3346,3348,3350,3352,3354,3356,3358,3360,3362,3364,3366,3368,3370,3372,3374],{"class":333,"line":379},[331,3339,3340],{"class":542},"    encoder",[331,3342,517],{"class":516},[331,3344,3345],{"class":525},"L",[331,3347,231],{"class":353},[331,3349,526],{"class":525},[331,3351,406],{"class":353},[331,3353,531],{"class":525},[331,3355,231],{"class":353},[331,3357,536],{"class":356},[331,3359,539],{"class":353},[331,3361,543],{"class":542},[331,3363,517],{"class":516},[331,3365,549],{"class":548},[331,3367,419],{"class":353},[331,3369,554],{"class":542},[331,3371,517],{"class":516},[331,3373,559],{"class":548},[331,3375,720],{"class":353},[331,3377,3378,3381,3383,3385,3387,3389,3391,3393,3395,3397,3399,3401,3403,3405,3407,3409,3411,3413],{"class":333,"line":392},[331,3379,3380],{"class":542},"    decoder",[331,3382,517],{"class":516},[331,3384,3345],{"class":525},[331,3386,231],{"class":353},[331,3388,526],{"class":525},[331,3390,406],{"class":353},[331,3392,531],{"class":525},[331,3394,231],{"class":353},[331,3396,536],{"class":356},[331,3398,539],{"class":353},[331,3400,543],{"class":542},[331,3402,517],{"class":516},[331,3404,559],{"class":548},[331,3406,419],{"class":353},[331,3408,1106],{"class":542},[331,3410,517],{"class":516},[331,3412,549],{"class":548},[331,3414,720],{"class":353},[331,3416,3417],{"class":333,"line":399},[331,3418,441],{"class":353},[331,3420,3421,3423,3425,3427,3429,3431,3433,3436],{"class":333,"line":599},[331,3422,1984],{"class":341},[331,3424,517],{"class":516},[331,3426,350],{"class":341},[331,3428,231],{"class":353},[331,3430,814],{"class":525},[331,3432,406],{"class":353},[331,3434,3435],{"class":525},"layers_dict_cfg",[331,3437,441],{"class":353},[331,3439,3440,3442,3444,3446,3449,3451],{"class":333,"line":607},[331,3441,403],{"class":402},[331,3443,406],{"class":353},[331,3445,410],{"class":409},[331,3447,3448],{"class":413},"Nested Dict instantiation:",[331,3450,410],{"class":409},[331,3452,441],{"class":353},[331,3454,3455,3457,3460,3462,3465,3467,3469,3471,3474],{"class":333,"line":623},[331,3456,1242],{"class":337},[331,3458,3459],{"class":341}," k",[331,3461,419],{"class":353},[331,3463,3464],{"class":341}," v ",[331,3466,1253],{"class":337},[331,3468,2070],{"class":341},[331,3470,231],{"class":353},[331,3472,3473],{"class":525},"items",[331,3475,1263],{"class":353},[331,3477,3478,3480,3482,3484,3487,3489,3492,3494,3497,3499,3502,3504,3506],{"class":333,"line":1129},[331,3479,1268],{"class":402},[331,3481,406],{"class":353},[331,3483,1274],{"class":1273},[331,3485,3486],{"class":413},"\"  ",[331,3488,1280],{"class":548},[331,3490,3491],{"class":525},"k",[331,3493,1286],{"class":548},[331,3495,3496],{"class":413},": ",[331,3498,1280],{"class":548},[331,3500,3501],{"class":525},"v",[331,3503,1286],{"class":548},[331,3505,410],{"class":413},[331,3507,441],{"class":353},[443,3509],{"data":3510,"kind":446},"TmVzdGVkIERpY3QgaW5zdGFudGlhdGlvbjoKICBlbmNvZGVyOiBMaW5lYXIoaW5fZmVhdHVyZXM9MTI4LCBvdXRfZmVhdHVyZXM9NjQsIGJpYXM9VHJ1ZSkKICBkZWNvZGVyOiBMaW5lYXIoaW5fZmVhdHVyZXM9NjQsIG91dF9mZWF0dXJlcz0xMjgsIGJpYXM9VHJ1ZSkK",[448,3512],{},[451,3514,3516,3517,3519],{"id":3515},"section-6-full-mlppy-walkthrough","Section 6: Full ",[224,3518,299],{}," Walkthrough",[216,3521,896,3522,3524],{},[224,3523,299],{}," example puts together nearly every concept from the previous sections. Let's read through it line by line, then build and visualize the resulting config tree.",[3526,3527,3529],"h3",{"id":3528},"the-full-source","The full source",[322,3531,3533],{"className":324,"code":3532,"language":326,"meta":327,"style":327},"import inspect\nfrom laco.examples import mlp\n\nprint(inspect.getsource(mlp))\n",[224,3534,3535,3542,3558,3562],{"__ignoreMap":327},[331,3536,3537,3539],{"class":333,"line":334},[331,3538,338],{"class":337},[331,3540,3541],{"class":341}," inspect\n",[331,3543,3544,3546,3548,3550,3553,3555],{"class":333,"line":345},[331,3545,368],{"class":337},[331,3547,350],{"class":341},[331,3549,231],{"class":353},[331,3551,3552],{"class":341},"examples ",[331,3554,338],{"class":337},[331,3556,3557],{"class":341}," mlp\n",[331,3559,3560],{"class":333,"line":365},[331,3561,396],{"emptyLinePlaceholder":395},[331,3563,3564,3566,3568,3571,3573,3576,3578,3581],{"class":333,"line":379},[331,3565,403],{"class":402},[331,3567,406],{"class":353},[331,3569,3570],{"class":525},"inspect",[331,3572,231],{"class":353},[331,3574,3575],{"class":525},"getsource",[331,3577,406],{"class":353},[331,3579,3580],{"class":525},"mlp",[331,3582,641],{"class":353},[443,3584],{"data":3585,"kind":446},"ciIiIk11bHRpbGF5ZXIgcGVyY2VwdHJvbiAoTUxQKSBleGFtcGxlLgoKU21hbGxlc3Qgbm9uLXRyaXZpYWwgbGFjbyBjb25maWc6IHN0YWNrcyBgYExpbmVhciDihpIgYWN0aXZhdGlvbmBgIGJsb2NrcyB2aWEKYGBMLnJlcGVhdGBgIGFuZCBncm91cHMgdGhlbSB3aXRoIGBgTC5PcmRlcmVkRGljdGBgLgoKVHdvIHdheXMgdG8gdXNlOgoKLSBMb2FkIGBgY29uZmlnczovL2V4YW1wbGVzL21scC5weSNtb2RlbGBgIGFuZCBvdmVycmlkZSBocHMuCi0gSW1wb3J0IDpmdW5jOmBtYWtlX21scGAgYW5kIHBhc3MgZXhwbGljaXQgaHlwZXJwYXJhbWV0ZXJzIHdoZW4gY29tcG9zaW5nCiAgaW50byBhIGxhcmdlciBwaXBlbGluZS4KCkZvciB0aGUgcmVzdCBvZiB0aGUgY3VycmljdWx1bSAoQ05OcywgdHJhbnNmb3JtZXJzLCB2aXNpb24vTExNIG1vZGVscywKTGlnaHRuaW5nICsgVHJhbnNmb3JtZXJzICsgVGVuc29yRGljdCBpbnRlZ3JhdGlvbnMsIGVuZC10by1lbmQgcGlwZWxpbmVzKSwKc2VlIHRoZSBzaWJsaW5nIGZpbGVzIHVuZGVyIGBgbGFjby9leGFtcGxlcy9gYC4KIiIiCgppbXBvcnQgbGFjby5sYW5ndWFnZSBhcyBMCmZyb20gdG9yY2ggaW1wb3J0IG5uCgpfX2FsbF9fID0gWyJtb2RlbCIsICJocHMiXQoKCkBMLnBhcmFtcwpjbGFzcyBocHM6CiAgICBkaW1faW46IGludCA9IDEyOAogICAgZGltX291dDogaW50ID0gMTI4CiAgICBkaW1faGlkZGVuOiBpbnQgPSAyNTYKICAgIG51bV9sYXllcnM6IGludCA9IDMKICAgIGFjdGl2YXRpb246IHR5cGVbbm4uTW9kdWxlXSA9IG5uLlJlTFUKCgpkZWYgbWFrZV9tbHAoKiwgZGltX2luLCBkaW1fb3V0LCBkaW1faGlkZGVuLCBudW1fbGF5ZXJzLCBhY3RpdmF0aW9uKToKICAgIHJldHVybiBMLmNhbGwobm4uU2VxdWVudGlhbCwgcm9vdD1UcnVlKSgKICAgICAgICBMLk9yZGVyZWREaWN0KAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAiaW5wdXQiLAogICAgICAgICAgICAgICAgTC5jYWxsKG5uLlNlcXVlbnRpYWwpKAogICAgICAgICAgICAgICAgICAgIEwuY2FsbChubi5MaW5lYXIpKAogICAgICAgICAgICAgICAgICAgICAgICBpbl9mZWF0dXJlcz1kaW1faW4sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dF9mZWF0dXJlcz1kaW1faGlkZGVuLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgTC5jYWxsKGFjdGl2YXRpb24pKCksCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAiaGlkZGVuIiwKICAgICAgICAgICAgICAgIEwuY2FsbChubi5TZXF1ZW50aWFsLCBleHBhbmRfYXJncz1UcnVlKSgKICAgICAgICAgICAgICAgICAgICBMLnJlcGVhdCgKICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2xheWVycywKICAgICAgICAgICAgICAgICAgICAgICAgTC5jYWxsKG5uLlNlcXVlbnRpYWwpKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTC5jYWxsKG5uLkxpbmVhcikoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZmVhdHVyZXM9ZGltX2hpZGRlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZmVhdHVyZXM9ZGltX2hpZGRlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMLmNhbGwoYWN0aXZhdGlvbikoKSwKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgIm91dHB1dCIsCiAgICAgICAgICAgICAgICBMLmNhbGwobm4uU2VxdWVudGlhbCkoCiAgICAgICAgICAgICAgICAgICAgTC5jYWxsKG5uLkxpbmVhcikoCiAgICAgICAgICAgICAgICAgICAgICAgIGluX2ZlYXR1cmVzPWRpbV9oaWRkZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dF9mZWF0dXJlcz1kaW1fb3V0LAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICksCiAgICAgICAgKQogICAgKQoKCm1vZGVsID0gbWFrZV9tbHAoCiAgICBkaW1faW49aHBzLmRpbV9pbiwKICAgIGRpbV9vdXQ9aHBzLmRpbV9vdXQsCiAgICBkaW1faGlkZGVuPWhwcy5kaW1faGlkZGVuLAogICAgbnVtX2xheWVycz1ocHMubnVtX2xheWVycywKICAgIGFjdGl2YXRpb249aHBzLmFjdGl2YXRpb24sCikKCg==",[3526,3587,3589],{"id":3588},"line-by-line-annotations","Line-by-line annotations",[322,3591,3593],{"className":324,"code":3592,"language":326,"meta":327,"style":327},"@L.params\nclass hps:\n    dim_in: int = 128\n    ...\n    activation: type[nn.Module] = nn.ReLU\n",[224,3594,3595,3609,3621,3637,3642],{"__ignoreMap":327},[331,3596,3597,3601,3604,3606],{"class":333,"line":334},[331,3598,3600],{"class":3599},"stp6e","@",[331,3602,3345],{"class":3603},"sGLFI",[331,3605,231],{"class":3599},[331,3607,3608],{"class":3603},"params\n",[331,3610,3611,3614,3618],{"class":333,"line":345},[331,3612,3613],{"class":1273},"class",[331,3615,3617],{"class":3616},"sbgvK"," hps",[331,3619,3620],{"class":353},":\n",[331,3622,3623,3626,3628,3631,3634],{"class":333,"line":365},[331,3624,3625],{"class":341},"    dim_in",[331,3627,1385],{"class":353},[331,3629,3630],{"class":583}," int",[331,3632,3633],{"class":516}," =",[331,3635,3636],{"class":548}," 128\n",[331,3638,3639],{"class":333,"line":379},[331,3640,3641],{"class":437},"    ...\n",[331,3643,3644,3647,3649,3651,3653,3655,3657,3660,3662,3664,3667,3669],{"class":333,"line":392},[331,3645,3646],{"class":341},"    activation",[331,3648,1385],{"class":353},[331,3650,584],{"class":341},[331,3652,2073],{"class":353},[331,3654,531],{"class":341},[331,3656,231],{"class":353},[331,3658,3659],{"class":356},"Module",[331,3661,2338],{"class":353},[331,3663,3633],{"class":516},[331,3665,3666],{"class":341}," nn",[331,3668,231],{"class":353},[331,3670,3671],{"class":356},"ReLU\n",[216,3673,3674,3677,3678,3681,3682,3685,3686,3689,3690,877,3693,3696],{},[224,3675,3676],{},"@L.params"," turns the class into a ",[882,3679,3680],{},"params wrapper",": a thin proxy that makes attribute access produce OmegaConf interpolation strings (",[224,3683,3684],{},"${hps.dim_in}",") rather than the raw Python values. This lets ",[224,3687,3688],{},"make_mlp"," compose a config that ",[882,3691,3692],{},"refers to",[224,3694,3695],{},"hps"," values without hard-coding them.",[448,3698],{},[322,3700,3702],{"className":324,"code":3701,"language":326,"meta":327,"style":327},"def make_mlp(*, dim_in, dim_out, dim_hidden, num_layers, activation):\n    return L.call(nn.Sequential, root=True)(\n",[224,3703,3704,3746],{"__ignoreMap":327},[331,3705,3706,3709,3712,3714,3717,3719,3723,3725,3728,3730,3733,3735,3738,3740,3743],{"class":333,"line":334},[331,3707,3708],{"class":1273},"def",[331,3710,3711],{"class":3603}," make_mlp",[331,3713,406],{"class":353},[331,3715,3716],{"class":516},"*",[331,3718,282],{"class":341},[331,3720,3722],{"class":3721},"sFwrP","dim_in",[331,3724,419],{"class":353},[331,3726,3727],{"class":3721}," dim_out",[331,3729,419],{"class":353},[331,3731,3732],{"class":3721}," dim_hidden",[331,3734,419],{"class":353},[331,3736,3737],{"class":3721}," num_layers",[331,3739,419],{"class":353},[331,3741,3742],{"class":3721}," activation",[331,3744,3745],{"class":353},"):\n",[331,3747,3748,3751,3753,3755,3757,3759,3761,3763,3765,3767,3770,3772,3774],{"class":333,"line":345},[331,3749,3750],{"class":337},"    return",[331,3752,520],{"class":341},[331,3754,231],{"class":353},[331,3756,526],{"class":525},[331,3758,406],{"class":353},[331,3760,531],{"class":525},[331,3762,231],{"class":353},[331,3764,681],{"class":356},[331,3766,419],{"class":353},[331,3768,3769],{"class":542}," root",[331,3771,517],{"class":516},[331,3773,1616],{"class":1615},[331,3775,684],{"class":353},[216,3777,3778,3781,3782,3785,3786,3788],{},[224,3779,3780],{},"root=True"," marks this node as the root of the config tree. The YAML marker ",[224,3783,3784],{},"_root_: true"," is stored in the node so that ",[224,3787,888],{}," knows where to start. It has no effect on the tree structure itself.",[448,3790],{},[322,3792,3794],{"className":324,"code":3793,"language":326,"meta":327,"style":327},"        L.OrderedDict(\n            (\"input\",  L.call(nn.Sequential)(linear, activation)),\n            (\"hidden\", L.call(nn.Sequential, expand_args=True)(L.repeat(num_layers, block))),\n            (\"output\", L.call(nn.Sequential)(linear_out)),\n        )\n",[224,3795,3796,3807,3846,3902,3936],{"__ignoreMap":327},[331,3797,3798,3801,3803,3805],{"class":333,"line":334},[331,3799,3800],{"class":341},"        L",[331,3802,231],{"class":353},[331,3804,920],{"class":525},[331,3806,988],{"class":353},[331,3808,3809,3812,3814,3817,3819,3821,3824,3826,3828,3830,3832,3834,3836,3838,3840,3842,3844],{"class":333,"line":345},[331,3810,3811],{"class":353},"            (",[331,3813,410],{"class":409},[331,3815,3816],{"class":413},"input",[331,3818,410],{"class":409},[331,3820,419],{"class":353},[331,3822,3823],{"class":525},"  L",[331,3825,231],{"class":353},[331,3827,526],{"class":525},[331,3829,406],{"class":353},[331,3831,531],{"class":525},[331,3833,231],{"class":353},[331,3835,681],{"class":356},[331,3837,539],{"class":353},[331,3839,998],{"class":525},[331,3841,419],{"class":353},[331,3843,3742],{"class":525},[331,3845,1035],{"class":353},[331,3847,3848,3850,3852,3855,3857,3859,3861,3863,3865,3867,3869,3871,3873,3875,3877,3879,3881,3883,3885,3887,3889,3891,3894,3896,3899],{"class":333,"line":365},[331,3849,3811],{"class":353},[331,3851,410],{"class":409},[331,3853,3854],{"class":413},"hidden",[331,3856,410],{"class":409},[331,3858,419],{"class":353},[331,3860,520],{"class":525},[331,3862,231],{"class":353},[331,3864,526],{"class":525},[331,3866,406],{"class":353},[331,3868,531],{"class":525},[331,3870,231],{"class":353},[331,3872,681],{"class":356},[331,3874,419],{"class":353},[331,3876,1610],{"class":542},[331,3878,517],{"class":516},[331,3880,1616],{"class":1615},[331,3882,539],{"class":353},[331,3884,3345],{"class":525},[331,3886,231],{"class":353},[331,3888,1461],{"class":525},[331,3890,406],{"class":353},[331,3892,3893],{"class":525},"num_layers",[331,3895,419],{"class":353},[331,3897,3898],{"class":525}," block",[331,3900,3901],{"class":353},"))),\n",[331,3903,3904,3906,3908,3911,3913,3915,3917,3919,3921,3923,3925,3927,3929,3931,3934],{"class":333,"line":379},[331,3905,3811],{"class":353},[331,3907,410],{"class":409},[331,3909,3910],{"class":413},"output",[331,3912,410],{"class":409},[331,3914,419],{"class":353},[331,3916,520],{"class":525},[331,3918,231],{"class":353},[331,3920,526],{"class":525},[331,3922,406],{"class":353},[331,3924,531],{"class":525},[331,3926,231],{"class":353},[331,3928,681],{"class":356},[331,3930,539],{"class":353},[331,3932,3933],{"class":525},"linear_out",[331,3935,1035],{"class":353},[331,3937,3938],{"class":333,"line":392},[331,3939,3940],{"class":353},"        )\n",[216,3942,3943,3945,3946,3948,3949,3951,3952,3954,3955,3957],{},[224,3944,256],{}," gives each section a name. The ",[224,3947,3854],{}," section uses ",[224,3950,265],{}," + ",[224,3953,274],{}," to build ",[224,3956,3893],{}," identical blocks. The number of hidden layers can be overridden at load time without changing this function.",[448,3959],{},[322,3961,3963],{"className":324,"code":3962,"language":326,"meta":327,"style":327},"model = make_mlp(\n    dim_in=hps.dim_in,     # expands to ${hps.dim_in}\n    ...\n)\n",[224,3964,3965,3975,3992,3996],{"__ignoreMap":327},[331,3966,3967,3969,3971,3973],{"class":333,"line":334},[331,3968,805],{"class":341},[331,3970,517],{"class":516},[331,3972,3711],{"class":525},[331,3974,988],{"class":353},[331,3976,3977,3979,3981,3983,3985,3987,3989],{"class":333,"line":345},[331,3978,3625],{"class":542},[331,3980,517],{"class":516},[331,3982,3695],{"class":525},[331,3984,231],{"class":353},[331,3986,3722],{"class":356},[331,3988,419],{"class":353},[331,3990,3991],{"class":497},"     # expands to ${hps.dim_in}\n",[331,3993,3994],{"class":333,"line":365},[331,3995,3641],{"class":402},[331,3997,3998],{"class":333,"line":379},[331,3999,441],{"class":353},[216,4001,4002,4003,4005,4006,4008],{},"The module-level ",[224,4004,862],{}," variable is the complete ",[224,4007,250],{}," tree for the default hyperparameters.",[322,4010,4012],{"className":324,"code":4011,"language":326,"meta":327,"style":327},"# Load the mlp config and inspect the full tree.\nmlp_cfg = laco.load(\"configs:\u002F\u002Fexamples\u002Fmlp.py\")\n\nprint(\"Top-level keys:\", list(mlp_cfg.keys()))\nprint()\nprint(\"Full config as YAML:\")\nprint(laco.dump(mlp_cfg))\n",[224,4013,4014,4019,4044,4048,4076,4082,4097],{"__ignoreMap":327},[331,4015,4016],{"class":333,"line":334},[331,4017,4018],{"class":497},"# Load the mlp config and inspect the full tree.\n",[331,4020,4021,4024,4026,4028,4030,4033,4035,4037,4040,4042],{"class":333,"line":345},[331,4022,4023],{"class":341},"mlp_cfg ",[331,4025,517],{"class":516},[331,4027,350],{"class":341},[331,4029,231],{"class":353},[331,4031,4032],{"class":525},"load",[331,4034,406],{"class":353},[331,4036,410],{"class":409},[331,4038,4039],{"class":413},"configs:\u002F\u002Fexamples\u002Fmlp.py",[331,4041,410],{"class":409},[331,4043,441],{"class":353},[331,4045,4046],{"class":333,"line":365},[331,4047,396],{"emptyLinePlaceholder":395},[331,4049,4050,4052,4054,4056,4059,4061,4063,4065,4067,4070,4072,4074],{"class":333,"line":379},[331,4051,403],{"class":402},[331,4053,406],{"class":353},[331,4055,410],{"class":409},[331,4057,4058],{"class":413},"Top-level keys:",[331,4060,410],{"class":409},[331,4062,419],{"class":353},[331,4064,3291],{"class":583},[331,4066,406],{"class":353},[331,4068,4069],{"class":525},"mlp_cfg",[331,4071,231],{"class":353},[331,4073,195],{"class":525},[331,4075,3302],{"class":353},[331,4077,4078,4080],{"class":333,"line":392},[331,4079,403],{"class":402},[331,4081,604],{"class":353},[331,4083,4084,4086,4088,4090,4093,4095],{"class":333,"line":399},[331,4085,403],{"class":402},[331,4087,406],{"class":353},[331,4089,410],{"class":409},[331,4091,4092],{"class":413},"Full config as YAML:",[331,4094,410],{"class":409},[331,4096,441],{"class":353},[331,4098,4099,4101,4103,4105,4107,4109,4111,4113],{"class":333,"line":599},[331,4100,403],{"class":402},[331,4102,406],{"class":353},[331,4104,320],{"class":525},[331,4106,231],{"class":353},[331,4108,634],{"class":525},[331,4110,406],{"class":353},[331,4112,4069],{"class":525},[331,4114,641],{"class":353},[443,4116],{"data":4117,"kind":446},"VG9wLWxldmVsIGtleXM6IFsnaHBzJywgJ21vZGVsJ10KCkZ1bGwgY29uZmlnIGFzIFlBTUw6Cl9sYWNvXzogMQpocHM6IHthY3RpdmF0aW9uOiAhIXB5dGhvbi9uYW1lOnRvcmNoLm5uLm1vZHVsZXMuYWN0aXZhdGlvbi5SZUxVICcnLCBkaW1faGlkZGVuOiAyNTYsCiAgZGltX2luOiAxMjgsIGRpbV9vdXQ6IDEyOCwgbnVtX2xheWVyczogM30KbW9kZWw6CiAgX2FyZ3NfOgogIC0gX2NvbnZlcnRfOiBhbGwKICAgIF90YXJnZXRfOiBsYWNvLmxhbmd1YWdlLk9yZGVyZWREaWN0LnRhcmdldAogICAgaXRlbXM6CiAgICAtIC0gaW5wdXQKICAgICAgLSBfYXJnc186CiAgICAgICAgLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5MaW5lYXIsIGluX2ZlYXR1cmVzOiAnJHtocHMuZGltX2lufScsCiAgICAgICAgICBvdXRfZmVhdHVyZXM6ICcke2hwcy5kaW1faGlkZGVufSd9CiAgICAgICAgLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5SZUxVfQogICAgICAgIF9jb252ZXJ0XzogYWxsCiAgICAgICAgX3RhcmdldF86IHRvcmNoLm5uLlNlcXVlbnRpYWwKICAgIC0gLSBoaWRkZW4KICAgICAgLSBfYXJnc186CiAgICAgICAgICBfY29udmVydF86IGFsbAogICAgICAgICAgX3RhcmdldF86IGxhY28ub3BzLnJlcGVhdAogICAgICAgICAgbnVtOiAke2hwcy5udW1fbGF5ZXJzfQogICAgICAgICAgc3JjOgogICAgICAgICAgICBfYXJnc186CiAgICAgICAgICAgIC0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uTGluZWFyLCBpbl9mZWF0dXJlczogJyR7aHBzLmRpbV9oaWRkZW59JywKICAgICAgICAgICAgICBvdXRfZmVhdHVyZXM6ICcke2hwcy5kaW1faGlkZGVufSd9CiAgICAgICAgICAgIC0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uUmVMVX0KICAgICAgICAgICAgX2NvbnZlcnRfOiBhbGwKICAgICAgICAgICAgX3RhcmdldF86IHRvcmNoLm5uLlNlcXVlbnRpYWwKICAgICAgICBfY29udmVydF86IGFsbAogICAgICAgIF90YXJnZXRfOiB0b3JjaC5ubi5TZXF1ZW50aWFsCiAgICAtIC0gb3V0cHV0CiAgICAgIC0gX2FyZ3NfOgogICAgICAgIC0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uTGluZWFyLCBpbl9mZWF0dXJlczogJyR7aHBzLmRpbV9oaWRkZW59JywKICAgICAgICAgIG91dF9mZWF0dXJlczogJyR7aHBzLmRpbV9vdXR9J30KICAgICAgICBfY29udmVydF86IGFsbAogICAgICAgIF90YXJnZXRfOiB0b3JjaC5ubi5TZXF1ZW50aWFsCiAgX2NvbnZlcnRfOiBhbGwKICBfdGFyZ2V0XzogdG9yY2gubm4uU2VxdWVudGlhbAoK",[322,4119,4121],{"className":324,"code":4120,"language":326,"meta":327,"style":327},"# Instantiate the MLP and inspect its structure.\nmodel_cfg = laco.load(\"configs:\u002F\u002Fexamples\u002Fmlp.py#model\")\nmlp_model = laco.instantiate(model_cfg)\nprint(\"Instantiated MLP:\")\nprint(mlp_model)\nprint()\nprint(\"Named sections:\")\nfor name, section in mlp_model.named_children():\n    print(f\"  {name}: {section}\")\n",[224,4122,4123,4128,4151,4170,4185,4196,4202,4217,4239],{"__ignoreMap":327},[331,4124,4125],{"class":333,"line":334},[331,4126,4127],{"class":497},"# Instantiate the MLP and inspect its structure.\n",[331,4129,4130,4132,4134,4136,4138,4140,4142,4144,4147,4149],{"class":333,"line":345},[331,4131,959],{"class":341},[331,4133,517],{"class":516},[331,4135,350],{"class":341},[331,4137,231],{"class":353},[331,4139,4032],{"class":525},[331,4141,406],{"class":353},[331,4143,410],{"class":409},[331,4145,4146],{"class":413},"configs:\u002F\u002Fexamples\u002Fmlp.py#model",[331,4148,410],{"class":409},[331,4150,441],{"class":353},[331,4152,4153,4156,4158,4160,4162,4164,4166,4168],{"class":333,"line":365},[331,4154,4155],{"class":341},"mlp_model ",[331,4157,517],{"class":516},[331,4159,350],{"class":341},[331,4161,231],{"class":353},[331,4163,814],{"class":525},[331,4165,406],{"class":353},[331,4167,1160],{"class":525},[331,4169,441],{"class":353},[331,4171,4172,4174,4176,4178,4181,4183],{"class":333,"line":379},[331,4173,403],{"class":402},[331,4175,406],{"class":353},[331,4177,410],{"class":409},[331,4179,4180],{"class":413},"Instantiated MLP:",[331,4182,410],{"class":409},[331,4184,441],{"class":353},[331,4186,4187,4189,4191,4194],{"class":333,"line":392},[331,4188,403],{"class":402},[331,4190,406],{"class":353},[331,4192,4193],{"class":525},"mlp_model",[331,4195,441],{"class":353},[331,4197,4198,4200],{"class":333,"line":399},[331,4199,403],{"class":402},[331,4201,604],{"class":353},[331,4203,4204,4206,4208,4210,4213,4215],{"class":333,"line":599},[331,4205,403],{"class":402},[331,4207,406],{"class":353},[331,4209,410],{"class":409},[331,4211,4212],{"class":413},"Named sections:",[331,4214,410],{"class":409},[331,4216,441],{"class":353},[331,4218,4219,4221,4223,4225,4228,4230,4233,4235,4237],{"class":333,"line":607},[331,4220,1242],{"class":337},[331,4222,1245],{"class":341},[331,4224,419],{"class":353},[331,4226,4227],{"class":341}," section ",[331,4229,1253],{"class":337},[331,4231,4232],{"class":341}," mlp_model",[331,4234,231],{"class":353},[331,4236,1260],{"class":525},[331,4238,1263],{"class":353},[331,4240,4241,4243,4245,4247,4249,4251,4253,4255,4257,4259,4262,4264,4266],{"class":333,"line":623},[331,4242,1268],{"class":402},[331,4244,406],{"class":353},[331,4246,1274],{"class":1273},[331,4248,3486],{"class":413},[331,4250,1280],{"class":548},[331,4252,1283],{"class":525},[331,4254,1286],{"class":548},[331,4256,3496],{"class":413},[331,4258,1280],{"class":548},[331,4260,4261],{"class":525},"section",[331,4263,1286],{"class":548},[331,4265,410],{"class":413},[331,4267,441],{"class":353},[443,4269],{"data":4270,"kind":446},"SW5zdGFudGlhdGVkIE1MUDoKU2VxdWVudGlhbCgKICAoaW5wdXQpOiBTZXF1ZW50aWFsKAogICAgKDApOiBMaW5lYXIoaW5fZmVhdHVyZXM9MTI4LCBvdXRfZmVhdHVyZXM9MjU2LCBiaWFzPVRydWUpCiAgICAoMSk6IFJlTFUoKQogICkKICAoaGlkZGVuKTogU2VxdWVudGlhbCgKICAgICgwKTogU2VxdWVudGlhbCgKICAgICAgKDApOiBMaW5lYXIoaW5fZmVhdHVyZXM9MjU2LCBvdXRfZmVhdHVyZXM9MjU2LCBiaWFzPVRydWUpCiAgICAgICgxKTogUmVMVSgpCiAgICApCiAgICAoMSk6IFNlcXVlbnRpYWwoCiAgICAgICgwKTogTGluZWFyKGluX2ZlYXR1cmVzPTI1Niwgb3V0X2ZlYXR1cmVzPTI1NiwgYmlhcz1UcnVlKQogICAgICAoMSk6IFJlTFUoKQogICAgKQogICAgKDIpOiBTZXF1ZW50aWFsKAogICAgICAoMCk6IExpbmVhcihpbl9mZWF0dXJlcz0yNTYsIG91dF9mZWF0dXJlcz0yNTYsIGJpYXM9VHJ1ZSkKICAgICAgKDEpOiBSZUxVKCkKICAgICkKICApCiAgKG91dHB1dCk6IFNlcXVlbnRpYWwoCiAgICAoMCk6IExpbmVhcihpbl9mZWF0dXJlcz0yNTYsIG91dF9mZWF0dXJlcz0xMjgsIGJpYXM9VHJ1ZSkKICApCikKCk5hbWVkIHNlY3Rpb25zOgogIGlucHV0OiBTZXF1ZW50aWFsKAogICgwKTogTGluZWFyKGluX2ZlYXR1cmVzPTEyOCwgb3V0X2ZlYXR1cmVzPTI1NiwgYmlhcz1UcnVlKQogICgxKTogUmVMVSgpCikKICBoaWRkZW46IFNlcXVlbnRpYWwoCiAgKDApOiBTZXF1ZW50aWFsKAogICAgKDApOiBMaW5lYXIoaW5fZmVhdHVyZXM9MjU2LCBvdXRfZmVhdHVyZXM9MjU2LCBiaWFzPVRydWUpCiAgICAoMSk6IFJlTFUoKQogICkKICAoMSk6IFNlcXVlbnRpYWwoCiAgICAoMCk6IExpbmVhcihpbl9mZWF0dXJlcz0yNTYsIG91dF9mZWF0dXJlcz0yNTYsIGJpYXM9VHJ1ZSkKICAgICgxKTogUmVMVSgpCiAgKQogICgyKTogU2VxdWVudGlhbCgKICAgICgwKTogTGluZWFyKGluX2ZlYXR1cmVzPTI1Niwgb3V0X2ZlYXR1cmVzPTI1NiwgYmlhcz1UcnVlKQogICAgKDEpOiBSZUxVKCkKICApCikKICBvdXRwdXQ6IFNlcXVlbnRpYWwoCiAgKDApOiBMaW5lYXIoaW5fZmVhdHVyZXM9MjU2LCBvdXRfZmVhdHVyZXM9MTI4LCBiaWFzPVRydWUpCikK",[322,4272,4274],{"className":324,"code":4273,"language":326,"meta":327,"style":327},"# Override the number of hidden layers and hidden dimension.\n# L.repeat uses the hps values at config-composition time, so we\n# must pass the overrides to laco.load (which re-runs make_mlp with new hps).\ncfg_wide = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Fmlp.py\",\n    \"hps.dim_hidden=512\",\n    \"hps.num_layers=5\",\n    key=\"model\",\n)\nwide_mlp = laco.instantiate(cfg_wide)\nprint(\"Overridden MLP (dim_hidden=512, num_layers=5):\")\nprint(wide_mlp)\n",[224,4275,4276,4281,4286,4291,4306,4318,4329,4339,4354,4358,4378,4393],{"__ignoreMap":327},[331,4277,4278],{"class":333,"line":334},[331,4279,4280],{"class":497},"# Override the number of hidden layers and hidden dimension.\n",[331,4282,4283],{"class":333,"line":345},[331,4284,4285],{"class":497},"# L.repeat uses the hps values at config-composition time, so we\n",[331,4287,4288],{"class":333,"line":365},[331,4289,4290],{"class":497},"# must pass the overrides to laco.load (which re-runs make_mlp with new hps).\n",[331,4292,4293,4296,4298,4300,4302,4304],{"class":333,"line":379},[331,4294,4295],{"class":341},"cfg_wide ",[331,4297,517],{"class":516},[331,4299,350],{"class":341},[331,4301,231],{"class":353},[331,4303,4032],{"class":525},[331,4305,988],{"class":353},[331,4307,4308,4311,4313,4315],{"class":333,"line":392},[331,4309,4310],{"class":409},"    \"",[331,4312,4039],{"class":413},[331,4314,410],{"class":409},[331,4316,4317],{"class":353},",\n",[331,4319,4320,4322,4325,4327],{"class":333,"line":399},[331,4321,4310],{"class":409},[331,4323,4324],{"class":413},"hps.dim_hidden=512",[331,4326,410],{"class":409},[331,4328,4317],{"class":353},[331,4330,4331,4333,4335,4337],{"class":333,"line":599},[331,4332,4310],{"class":409},[331,4334,1820],{"class":413},[331,4336,410],{"class":409},[331,4338,4317],{"class":353},[331,4340,4341,4344,4346,4348,4350,4352],{"class":333,"line":607},[331,4342,4343],{"class":542},"    key",[331,4345,517],{"class":516},[331,4347,410],{"class":409},[331,4349,862],{"class":413},[331,4351,410],{"class":409},[331,4353,4317],{"class":353},[331,4355,4356],{"class":333,"line":623},[331,4357,441],{"class":353},[331,4359,4360,4363,4365,4367,4369,4371,4373,4376],{"class":333,"line":1129},[331,4361,4362],{"class":341},"wide_mlp ",[331,4364,517],{"class":516},[331,4366,350],{"class":341},[331,4368,231],{"class":353},[331,4370,814],{"class":525},[331,4372,406],{"class":353},[331,4374,4375],{"class":525},"cfg_wide",[331,4377,441],{"class":353},[331,4379,4380,4382,4384,4386,4389,4391],{"class":333,"line":1145},[331,4381,403],{"class":402},[331,4383,406],{"class":353},[331,4385,410],{"class":409},[331,4387,4388],{"class":413},"Overridden MLP (dim_hidden=512, num_layers=5):",[331,4390,410],{"class":409},[331,4392,441],{"class":353},[331,4394,4395,4397,4399,4402],{"class":333,"line":1749},[331,4396,403],{"class":402},[331,4398,406],{"class":353},[331,4400,4401],{"class":525},"wide_mlp",[331,4403,441],{"class":353},[443,4405],{"data":4406,"kind":446},"T3ZlcnJpZGRlbiBNTFAgKGRpbV9oaWRkZW49NTEyLCBudW1fbGF5ZXJzPTUpOgpTZXF1ZW50aWFsKAogIChpbnB1dCk6IFNlcXVlbnRpYWwoCiAgICAoMCk6IExpbmVhcihpbl9mZWF0dXJlcz0xMjgsIG91dF9mZWF0dXJlcz01MTIsIGJpYXM9VHJ1ZSkKICAgICgxKTogUmVMVSgpCiAgKQogIChoaWRkZW4pOiBTZXF1ZW50aWFsKAogICAgKDApOiBTZXF1ZW50aWFsKAogICAgICAoMCk6IExpbmVhcihpbl9mZWF0dXJlcz01MTIsIG91dF9mZWF0dXJlcz01MTIsIGJpYXM9VHJ1ZSkKICAgICAgKDEpOiBSZUxVKCkKICAgICkKICAgICgxKTogU2VxdWVudGlhbCgKICAgICAgKDApOiBMaW5lYXIoaW5fZmVhdHVyZXM9NTEyLCBvdXRfZmVhdHVyZXM9NTEyLCBiaWFzPVRydWUpCiAgICAgICgxKTogUmVMVSgpCiAgICApCiAgICAoMik6IFNlcXVlbnRpYWwoCiAgICAgICgwKTogTGluZWFyKGluX2ZlYXR1cmVzPTUxMiwgb3V0X2ZlYXR1cmVzPTUxMiwgYmlhcz1UcnVlKQogICAgICAoMSk6IFJlTFUoKQogICAgKQogICAgKDMpOiBTZXF1ZW50aWFsKAogICAgICAoMCk6IExpbmVhcihpbl9mZWF0dXJlcz01MTIsIG91dF9mZWF0dXJlcz01MTIsIGJpYXM9VHJ1ZSkKICAgICAgKDEpOiBSZUxVKCkKICAgICkKICAgICg0KTogU2VxdWVudGlhbCgKICAgICAgKDApOiBMaW5lYXIoaW5fZmVhdHVyZXM9NTEyLCBvdXRfZmVhdHVyZXM9NTEyLCBiaWFzPVRydWUpCiAgICAgICgxKTogUmVMVSgpCiAgICApCiAgKQogIChvdXRwdXQpOiBTZXF1ZW50aWFsKAogICAgKDApOiBMaW5lYXIoaW5fZmVhdHVyZXM9NTEyLCBvdXRfZmVhdHVyZXM9MTI4LCBiaWFzPVRydWUpCiAgKQopCg==",[448,4408],{},[451,4410,4412,4413,4415],{"id":4411},"section-7-cnn_classifierpy-pattern","Section 7: ",[224,4414,303],{}," Pattern",[216,4417,4418,4419,231],{},"The CNN classifier introduces a key idiom: the ",[219,4420,4421],{},"config factory function",[322,4423,4425],{"className":324,"code":4424,"language":326,"meta":327,"style":327},"def _conv_block(in_ch, out_ch, *, pool: bool):\n    layers = [\n        L.call(nn.Conv2d)(...),\n        L.call(nn.BatchNorm2d)(...),\n        L.call(nn.ReLU)(inplace=True),\n    ]\n    if pool:\n        layers.append(L.call(nn.MaxPool2d)(...))\n    return L.call(nn.Sequential)(*layers)\n",[224,4426,4427,4461,4471,4495,4518,4545,4550,4560,4593],{"__ignoreMap":327},[331,4428,4429,4431,4434,4436,4439,4441,4444,4446,4449,4451,4454,4456,4459],{"class":333,"line":334},[331,4430,3708],{"class":1273},[331,4432,4433],{"class":3603}," _conv_block",[331,4435,406],{"class":353},[331,4437,4438],{"class":3721},"in_ch",[331,4440,419],{"class":353},[331,4442,4443],{"class":3721}," out_ch",[331,4445,419],{"class":353},[331,4447,4448],{"class":516}," *",[331,4450,282],{"class":341},[331,4452,4453],{"class":3721},"pool",[331,4455,1385],{"class":353},[331,4457,4458],{"class":583}," bool",[331,4460,3745],{"class":353},[331,4462,4463,4466,4468],{"class":333,"line":345},[331,4464,4465],{"class":341},"    layers ",[331,4467,517],{"class":516},[331,4469,4470],{"class":353}," [\n",[331,4472,4473,4475,4477,4479,4481,4483,4485,4488,4490,4493],{"class":333,"line":365},[331,4474,3800],{"class":341},[331,4476,231],{"class":353},[331,4478,526],{"class":525},[331,4480,406],{"class":353},[331,4482,531],{"class":525},[331,4484,231],{"class":353},[331,4486,4487],{"class":356},"Conv2d",[331,4489,539],{"class":353},[331,4491,4492],{"class":402},"...",[331,4494,720],{"class":353},[331,4496,4497,4499,4501,4503,4505,4507,4509,4512,4514,4516],{"class":333,"line":379},[331,4498,3800],{"class":341},[331,4500,231],{"class":353},[331,4502,526],{"class":525},[331,4504,406],{"class":353},[331,4506,531],{"class":525},[331,4508,231],{"class":353},[331,4510,4511],{"class":356},"BatchNorm2d",[331,4513,539],{"class":353},[331,4515,4492],{"class":402},[331,4517,720],{"class":353},[331,4519,4520,4522,4524,4526,4528,4530,4532,4534,4536,4539,4541,4543],{"class":333,"line":392},[331,4521,3800],{"class":341},[331,4523,231],{"class":353},[331,4525,526],{"class":525},[331,4527,406],{"class":353},[331,4529,531],{"class":525},[331,4531,231],{"class":353},[331,4533,737],{"class":356},[331,4535,539],{"class":353},[331,4537,4538],{"class":542},"inplace",[331,4540,517],{"class":516},[331,4542,1616],{"class":1615},[331,4544,720],{"class":353},[331,4546,4547],{"class":333,"line":399},[331,4548,4549],{"class":353},"    ]\n",[331,4551,4552,4555,4558],{"class":333,"line":599},[331,4553,4554],{"class":337},"    if",[331,4556,4557],{"class":341}," pool",[331,4559,3620],{"class":353},[331,4561,4562,4565,4567,4570,4572,4574,4576,4578,4580,4582,4584,4587,4589,4591],{"class":333,"line":607},[331,4563,4564],{"class":341},"        layers",[331,4566,231],{"class":353},[331,4568,4569],{"class":525},"append",[331,4571,406],{"class":353},[331,4573,3345],{"class":525},[331,4575,231],{"class":353},[331,4577,526],{"class":525},[331,4579,406],{"class":353},[331,4581,531],{"class":525},[331,4583,231],{"class":353},[331,4585,4586],{"class":356},"MaxPool2d",[331,4588,539],{"class":353},[331,4590,4492],{"class":402},[331,4592,641],{"class":353},[331,4594,4595,4597,4599,4601,4603,4605,4607,4609,4611,4613,4615,4617],{"class":333,"line":623},[331,4596,3750],{"class":337},[331,4598,520],{"class":341},[331,4600,231],{"class":353},[331,4602,526],{"class":525},[331,4604,406],{"class":353},[331,4606,531],{"class":525},[331,4608,231],{"class":353},[331,4610,681],{"class":356},[331,4612,539],{"class":353},[331,4614,3716],{"class":516},[331,4616,2021],{"class":525},[331,4618,441],{"class":353},[216,4620,4621,4624,4625,4628,4629,4631,4632,4635],{},[224,4622,4623],{},"_conv_block"," is a ",[219,4626,4627],{},"pure config factory",": it takes plain Python values as arguments and returns a ",[224,4630,250],{}," node. It never instantiates any ",[224,4633,4634],{},"nn.Module",". This keeps config construction cheap and side-effect-free.",[216,4637,896,4638,4641,4642,4644,4645,4648,4649,4651,4652,4654,4655,231],{},[224,4639,4640],{},"make_cnn_classifier"," function then uses ",[224,4643,274],{}," to replicate the block config ",[224,4646,4647],{},"num_stages"," times, and ",[224,4650,265],{}," to pass the resulting list as ",[224,4653,269],{}," to ",[224,4656,260],{},[322,4658,4660],{"className":324,"code":4659,"language":326,"meta":327,"style":327},"from laco.examples import cnn_classifier\nprint(inspect.getsource(cnn_classifier))\n",[224,4661,4662,4677],{"__ignoreMap":327},[331,4663,4664,4666,4668,4670,4672,4674],{"class":333,"line":334},[331,4665,368],{"class":337},[331,4667,350],{"class":341},[331,4669,231],{"class":353},[331,4671,3552],{"class":341},[331,4673,338],{"class":337},[331,4675,4676],{"class":341}," cnn_classifier\n",[331,4678,4679,4681,4683,4685,4687,4689,4691,4694],{"class":333,"line":345},[331,4680,403],{"class":402},[331,4682,406],{"class":353},[331,4684,3570],{"class":525},[331,4686,231],{"class":353},[331,4688,3575],{"class":525},[331,4690,406],{"class":353},[331,4692,4693],{"class":525},"cnn_classifier",[331,4695,641],{"class":353},[443,4697],{"data":4698,"kind":446},"ciIiIkNOTiBpbWFnZSBjbGFzc2lmaWVyOiBpbnRyb2R1Y2VzIGBgTC5yZXBlYXRgYCBmb3Igc3RhY2tlZCBjb252IHN0YWdlcy4KClN0ZW0gKENvbnYyZCDihpIgQmF0Y2hOb3JtMmQg4oaSIFJlTFUpIGxpZnRzIGBgaW5fY2hhbm5lbHMg4oaSIGJhc2VfY2hhbm5lbHNgYDsKYGBudW1fc3RhZ2VzYGAgaWRlbnRpY2FsIENvbnYg4oaSIEJOIOKGkiBSZUxVIOKGkiBNYXhQb29sIGJsb2NrcyB0aGVuIGhhbHZlIHRoZQpzcGF0aWFsIHNpemU7IGEgZ2xvYmFsLWF2ZXJhZ2UtcG9vbCBoZWFkIHByb2R1Y2VzIGxvZ2l0cy4KClR3byB3YXlzIHRvIHVzZSB0aGlzIGZyb20gYSBkb3duc3RyZWFtIGNvbmZpZzoKCi0gTG9hZCBgYGNvbmZpZ3M6Ly9leGFtcGxlcy9jbm5fY2xhc3NpZmllci5weSNtb2RlbGBgIGFuZCBvdmVycmlkZSBocHMuCi0gSW1wb3J0IDpmdW5jOmBtYWtlX2Nubl9jbGFzc2lmaWVyYCBhbmQgcGFzcyBleHBsaWNpdCBoeXBlcnBhcmFtZXRlcnMg4oCUCiAgdXNlZnVsIHdoZW4gY29tcG9zaW5nIGludG8gYSBsYXJnZXIgcGlwZWxpbmUuCiIiIgoKaW1wb3J0IGxhY28ubGFuZ3VhZ2UgYXMgTApmcm9tIHRvcmNoIGltcG9ydCBubgoKX19hbGxfXyA9IFsibW9kZWwiLCAiaHBzIl0KCgpATC5wYXJhbXMKY2xhc3MgaHBzOgogICAgaW5fY2hhbm5lbHM6IGludCA9IDMKICAgIGJhc2VfY2hhbm5lbHM6IGludCA9IDMyCiAgICBudW1fc3RhZ2VzOiBpbnQgPSAzCiAgICBudW1fY2xhc3NlczogaW50ID0gMTAKCgpkZWYgX2NvbnZfYmxvY2soaW5fY2gsIG91dF9jaCwgKiwgcG9vbDogYm9vbCk6CiAgICBsYXllcnMgPSBbCiAgICAgICAgTC5jYWxsKG5uLkNvbnYyZCkoCiAgICAgICAgICAgIGluX2NoYW5uZWxzPWluX2NoLAogICAgICAgICAgICBvdXRfY2hhbm5lbHM9b3V0X2NoLAogICAgICAgICAgICBrZXJuZWxfc2l6ZT0zLAogICAgICAgICAgICBwYWRkaW5nPTEsCiAgICAgICAgICAgIGJpYXM9RmFsc2UsCiAgICAgICAgKSwKICAgICAgICBMLmNhbGwobm4uQmF0Y2hOb3JtMmQpKG51bV9mZWF0dXJlcz1vdXRfY2gpLAogICAgICAgIEwuY2FsbChubi5SZUxVKShpbnBsYWNlPVRydWUpLAogICAgXQogICAgaWYgcG9vbDoKICAgICAgICBsYXllcnMuYXBwZW5kKEwuY2FsbChubi5NYXhQb29sMmQpKGtlcm5lbF9zaXplPTIsIHN0cmlkZT0yKSkKICAgIHJldHVybiBMLmNhbGwobm4uU2VxdWVudGlhbCkoKmxheWVycykKCgpkZWYgbWFrZV9jbm5fY2xhc3NpZmllcigKICAgICosCiAgICBpbl9jaGFubmVscywKICAgIGJhc2VfY2hhbm5lbHMsCiAgICBudW1fc3RhZ2VzLAogICAgbnVtX2NsYXNzZXMsCik6CiAgICByZXR1cm4gTC5jYWxsKG5uLlNlcXVlbnRpYWwsIHJvb3Q9VHJ1ZSkoCiAgICAgICAgTC5PcmRlcmVkRGljdCgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgInN0ZW0iLAogICAgICAgICAgICAgICAgX2NvbnZfYmxvY2soaW5fY2hhbm5lbHMsIGJhc2VfY2hhbm5lbHMsIHBvb2w9RmFsc2UpLAogICAgICAgICAgICApLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAic3RhZ2VzIiwKICAgICAgICAgICAgICAgIEwuY2FsbChubi5TZXF1ZW50aWFsLCBleHBhbmRfYXJncz1UcnVlKSgKICAgICAgICAgICAgICAgICAgICBMLnJlcGVhdCgKICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3N0YWdlcywKICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnZfYmxvY2soYmFzZV9jaGFubmVscywgYmFzZV9jaGFubmVscywgcG9vbD1UcnVlKSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgImhlYWQiLAogICAgICAgICAgICAgICAgTC5jYWxsKG5uLlNlcXVlbnRpYWwpKAogICAgICAgICAgICAgICAgICAgIEwuY2FsbChubi5BZGFwdGl2ZUF2Z1Bvb2wyZCkob3V0cHV0X3NpemU9MSksCiAgICAgICAgICAgICAgICAgICAgTC5jYWxsKG5uLkZsYXR0ZW4pKCksCiAgICAgICAgICAgICAgICAgICAgTC5jYWxsKG5uLkxpbmVhcikoCiAgICAgICAgICAgICAgICAgICAgICAgIGluX2ZlYXR1cmVzPWJhc2VfY2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgIG91dF9mZWF0dXJlcz1udW1fY2xhc3NlcywKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICApCiAgICApCgoKbW9kZWwgPSBtYWtlX2Nubl9jbGFzc2lmaWVyKAogICAgaW5fY2hhbm5lbHM9aHBzLmluX2NoYW5uZWxzLAogICAgYmFzZV9jaGFubmVscz1ocHMuYmFzZV9jaGFubmVscywKICAgIG51bV9zdGFnZXM9aHBzLm51bV9zdGFnZXMsCiAgICBudW1fY2xhc3Nlcz1ocHMubnVtX2NsYXNzZXMsCikKCg==",[322,4700,4702],{"className":324,"code":4701,"language":326,"meta":327,"style":327},"# Demonstrate the _conv_block factory independently.\nfrom laco.examples.cnn_classifier import _conv_block, make_cnn_classifier\n\nblock_without_pool = _conv_block(3, 32, pool=False)\nblock_with_pool    = _conv_block(32, 32, pool=True)\n\nprint(\"Conv block without pool:\")\nprint(laco.dump(block_without_pool))\nprint(\"Conv block with MaxPool:\")\nprint(laco.dump(block_with_pool))\n",[224,4703,4704,4709,4734,4738,4767,4795,4799,4814,4833,4848],{"__ignoreMap":327},[331,4705,4706],{"class":333,"line":334},[331,4707,4708],{"class":497},"# Demonstrate the _conv_block factory independently.\n",[331,4710,4711,4713,4715,4717,4720,4722,4725,4727,4729,4731],{"class":333,"line":345},[331,4712,368],{"class":337},[331,4714,350],{"class":341},[331,4716,231],{"class":353},[331,4718,4719],{"class":341},"examples",[331,4721,231],{"class":353},[331,4723,4724],{"class":341},"cnn_classifier ",[331,4726,338],{"class":337},[331,4728,4433],{"class":341},[331,4730,419],{"class":353},[331,4732,4733],{"class":341}," make_cnn_classifier\n",[331,4735,4736],{"class":333,"line":365},[331,4737,396],{"emptyLinePlaceholder":395},[331,4739,4740,4743,4745,4747,4749,4751,4753,4756,4758,4760,4762,4765],{"class":333,"line":379},[331,4741,4742],{"class":341},"block_without_pool ",[331,4744,517],{"class":516},[331,4746,4433],{"class":525},[331,4748,406],{"class":353},[331,4750,1466],{"class":548},[331,4752,419],{"class":353},[331,4754,4755],{"class":548}," 32",[331,4757,419],{"class":353},[331,4759,4557],{"class":542},[331,4761,517],{"class":516},[331,4763,4764],{"class":1615},"False",[331,4766,441],{"class":353},[331,4768,4769,4772,4774,4776,4778,4781,4783,4785,4787,4789,4791,4793],{"class":333,"line":392},[331,4770,4771],{"class":341},"block_with_pool    ",[331,4773,517],{"class":516},[331,4775,4433],{"class":525},[331,4777,406],{"class":353},[331,4779,4780],{"class":548},"32",[331,4782,419],{"class":353},[331,4784,4755],{"class":548},[331,4786,419],{"class":353},[331,4788,4557],{"class":542},[331,4790,517],{"class":516},[331,4792,1616],{"class":1615},[331,4794,441],{"class":353},[331,4796,4797],{"class":333,"line":399},[331,4798,396],{"emptyLinePlaceholder":395},[331,4800,4801,4803,4805,4807,4810,4812],{"class":333,"line":599},[331,4802,403],{"class":402},[331,4804,406],{"class":353},[331,4806,410],{"class":409},[331,4808,4809],{"class":413},"Conv block without pool:",[331,4811,410],{"class":409},[331,4813,441],{"class":353},[331,4815,4816,4818,4820,4822,4824,4826,4828,4831],{"class":333,"line":607},[331,4817,403],{"class":402},[331,4819,406],{"class":353},[331,4821,320],{"class":525},[331,4823,231],{"class":353},[331,4825,634],{"class":525},[331,4827,406],{"class":353},[331,4829,4830],{"class":525},"block_without_pool",[331,4832,641],{"class":353},[331,4834,4835,4837,4839,4841,4844,4846],{"class":333,"line":623},[331,4836,403],{"class":402},[331,4838,406],{"class":353},[331,4840,410],{"class":409},[331,4842,4843],{"class":413},"Conv block with MaxPool:",[331,4845,410],{"class":409},[331,4847,441],{"class":353},[331,4849,4850,4852,4854,4856,4858,4860,4862,4865],{"class":333,"line":1129},[331,4851,403],{"class":402},[331,4853,406],{"class":353},[331,4855,320],{"class":525},[331,4857,231],{"class":353},[331,4859,634],{"class":525},[331,4861,406],{"class":353},[331,4863,4864],{"class":525},"block_with_pool",[331,4866,641],{"class":353},[443,4868],{"data":4869,"kind":446},"Q29udiBibG9jayB3aXRob3V0IHBvb2w6Cl9hcmdzXzoKLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5Db252MmQsIGJpYXM6IGZhbHNlLCBpbl9jaGFubmVsczogMywga2VybmVsX3NpemU6IDMsCiAgb3V0X2NoYW5uZWxzOiAzMiwgcGFkZGluZzogMX0KLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5CYXRjaE5vcm0yZCwgbnVtX2ZlYXR1cmVzOiAzMn0KLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5SZUxVLCBpbnBsYWNlOiB0cnVlfQpfY29udmVydF86IGFsbApfbGFjb186IDEKX3RhcmdldF86IHRvcmNoLm5uLlNlcXVlbnRpYWwKCkNvbnYgYmxvY2sgd2l0aCBNYXhQb29sOgpfYXJnc186Ci0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uQ29udjJkLCBiaWFzOiBmYWxzZSwgaW5fY2hhbm5lbHM6IDMyLCBrZXJuZWxfc2l6ZTogMywKICBvdXRfY2hhbm5lbHM6IDMyLCBwYWRkaW5nOiAxfQotIHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLkJhdGNoTm9ybTJkLCBudW1fZmVhdHVyZXM6IDMyfQotIHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLlJlTFUsIGlucGxhY2U6IHRydWV9Ci0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uTWF4UG9vbDJkLCBrZXJuZWxfc2l6ZTogMiwgc3RyaWRlOiAyfQpfY29udmVydF86IGFsbApfbGFjb186IDEKX3RhcmdldF86IHRvcmNoLm5uLlNlcXVlbnRpYWwKCg==",[322,4871,4873],{"className":324,"code":4872,"language":326,"meta":327,"style":327},"# Build the full CNN config and show the stages section.\ncnn_full = laco.load(\"configs:\u002F\u002Fexamples\u002Fcnn_classifier.py\")\nprint(\"Top-level keys:\", list(cnn_full.keys()))\nprint()\nprint(\"Full CNN config YAML:\")\nprint(laco.dump(cnn_full))\n",[224,4874,4875,4880,4904,4931,4937,4952],{"__ignoreMap":327},[331,4876,4877],{"class":333,"line":334},[331,4878,4879],{"class":497},"# Build the full CNN config and show the stages section.\n",[331,4881,4882,4885,4887,4889,4891,4893,4895,4897,4900,4902],{"class":333,"line":345},[331,4883,4884],{"class":341},"cnn_full ",[331,4886,517],{"class":516},[331,4888,350],{"class":341},[331,4890,231],{"class":353},[331,4892,4032],{"class":525},[331,4894,406],{"class":353},[331,4896,410],{"class":409},[331,4898,4899],{"class":413},"configs:\u002F\u002Fexamples\u002Fcnn_classifier.py",[331,4901,410],{"class":409},[331,4903,441],{"class":353},[331,4905,4906,4908,4910,4912,4914,4916,4918,4920,4922,4925,4927,4929],{"class":333,"line":365},[331,4907,403],{"class":402},[331,4909,406],{"class":353},[331,4911,410],{"class":409},[331,4913,4058],{"class":413},[331,4915,410],{"class":409},[331,4917,419],{"class":353},[331,4919,3291],{"class":583},[331,4921,406],{"class":353},[331,4923,4924],{"class":525},"cnn_full",[331,4926,231],{"class":353},[331,4928,195],{"class":525},[331,4930,3302],{"class":353},[331,4932,4933,4935],{"class":333,"line":379},[331,4934,403],{"class":402},[331,4936,604],{"class":353},[331,4938,4939,4941,4943,4945,4948,4950],{"class":333,"line":392},[331,4940,403],{"class":402},[331,4942,406],{"class":353},[331,4944,410],{"class":409},[331,4946,4947],{"class":413},"Full CNN config YAML:",[331,4949,410],{"class":409},[331,4951,441],{"class":353},[331,4953,4954,4956,4958,4960,4962,4964,4966,4968],{"class":333,"line":399},[331,4955,403],{"class":402},[331,4957,406],{"class":353},[331,4959,320],{"class":525},[331,4961,231],{"class":353},[331,4963,634],{"class":525},[331,4965,406],{"class":353},[331,4967,4924],{"class":525},[331,4969,641],{"class":353},[443,4971],{"data":4972,"kind":446},"VG9wLWxldmVsIGtleXM6IFsnaHBzJywgJ21vZGVsJ10KCkZ1bGwgQ05OIGNvbmZpZyBZQU1MOgpfbGFjb186IDEKaHBzOiB7YmFzZV9jaGFubmVsczogMzIsIGluX2NoYW5uZWxzOiAzLCBudW1fY2xhc3NlczogMTAsIG51bV9zdGFnZXM6IDN9Cm1vZGVsOgogIF9hcmdzXzoKICAtIF9jb252ZXJ0XzogYWxsCiAgICBfdGFyZ2V0XzogbGFjby5sYW5ndWFnZS5PcmRlcmVkRGljdC50YXJnZXQKICAgIGl0ZW1zOgogICAgLSAtIHN0ZW0KICAgICAgLSBfYXJnc186CiAgICAgICAgLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5Db252MmQsIGJpYXM6IGZhbHNlLCBpbl9jaGFubmVsczogJyR7aHBzLmluX2NoYW5uZWxzfScsCiAgICAgICAgICBrZXJuZWxfc2l6ZTogMywgb3V0X2NoYW5uZWxzOiAnJHtocHMuYmFzZV9jaGFubmVsc30nLCBwYWRkaW5nOiAxfQogICAgICAgIC0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uQmF0Y2hOb3JtMmQsIG51bV9mZWF0dXJlczogJyR7aHBzLmJhc2VfY2hhbm5lbHN9J30KICAgICAgICAtIHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLlJlTFUsIGlucGxhY2U6IHRydWV9CiAgICAgICAgX2NvbnZlcnRfOiBhbGwKICAgICAgICBfdGFyZ2V0XzogdG9yY2gubm4uU2VxdWVudGlhbAogICAgLSAtIHN0YWdlcwogICAgICAtIF9hcmdzXzoKICAgICAgICAgIF9jb252ZXJ0XzogYWxsCiAgICAgICAgICBfdGFyZ2V0XzogbGFjby5vcHMucmVwZWF0CiAgICAgICAgICBudW06ICR7aHBzLm51bV9zdGFnZXN9CiAgICAgICAgICBzcmM6CiAgICAgICAgICAgIF9hcmdzXzoKICAgICAgICAgICAgLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5Db252MmQsIGJpYXM6IGZhbHNlLCBpbl9jaGFubmVsczogJyR7aHBzLmJhc2VfY2hhbm5lbHN9JywKICAgICAgICAgICAgICBrZXJuZWxfc2l6ZTogMywgb3V0X2NoYW5uZWxzOiAnJHtocHMuYmFzZV9jaGFubmVsc30nLCBwYWRkaW5nOiAxfQogICAgICAgICAgICAtIHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLkJhdGNoTm9ybTJkLCBudW1fZmVhdHVyZXM6ICcke2hwcy5iYXNlX2NoYW5uZWxzfSd9CiAgICAgICAgICAgIC0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uUmVMVSwgaW5wbGFjZTogdHJ1ZX0KICAgICAgICAgICAgLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5NYXhQb29sMmQsIGtlcm5lbF9zaXplOiAyLCBzdHJpZGU6IDJ9CiAgICAgICAgICAgIF9jb252ZXJ0XzogYWxsCiAgICAgICAgICAgIF90YXJnZXRfOiB0b3JjaC5ubi5TZXF1ZW50aWFsCiAgICAgICAgX2NvbnZlcnRfOiBhbGwKICAgICAgICBfdGFyZ2V0XzogdG9yY2gubm4uU2VxdWVudGlhbAogICAgLSAtIGhlYWQKICAgICAgLSBfYXJnc186CiAgICAgICAgLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5BZGFwdGl2ZUF2Z1Bvb2wyZCwgb3V0cHV0X3NpemU6IDF9CiAgICAgICAgLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5GbGF0dGVufQogICAgICAgIC0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uTGluZWFyLCBpbl9mZWF0dXJlczogJyR7aHBzLmJhc2VfY2hhbm5lbHN9JywKICAgICAgICAgIG91dF9mZWF0dXJlczogJyR7aHBzLm51bV9jbGFzc2VzfSd9CiAgICAgICAgX2NvbnZlcnRfOiBhbGwKICAgICAgICBfdGFyZ2V0XzogdG9yY2gubm4uU2VxdWVudGlhbAogIF9jb252ZXJ0XzogYWxsCiAgX3RhcmdldF86IHRvcmNoLm5uLlNlcXVlbnRpYWwKCg==",[322,4974,4976],{"className":324,"code":4975,"language":326,"meta":327,"style":327},"# The stages section is L.repeat(num_stages, conv_block_with_pool).\n# Override num_stages to 5 to get a deeper network.\ncnn_deep = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Fcnn_classifier.py\",\n    \"hps.num_stages=5\",\n    key=\"model\",\n)\ncnn_model = laco.instantiate(cnn_deep)\nprint(\"Deep CNN (5 stages):\")\nprint(cnn_model)\nprint()\nprint(\"Named sections:\")\nfor name, child in cnn_model.named_children():\n    child_count = len(list(child.children()))\n    print(f\"  {name}: {type(child).__name__} ({child_count} sub-modules)\")\n",[224,4977,4978,4983,4988,5003,5013,5024,5038,5042,5062,5077,5088,5094,5108,5129,5152],{"__ignoreMap":327},[331,4979,4980],{"class":333,"line":334},[331,4981,4982],{"class":497},"# The stages section is L.repeat(num_stages, conv_block_with_pool).\n",[331,4984,4985],{"class":333,"line":345},[331,4986,4987],{"class":497},"# Override num_stages to 5 to get a deeper network.\n",[331,4989,4990,4993,4995,4997,4999,5001],{"class":333,"line":365},[331,4991,4992],{"class":341},"cnn_deep ",[331,4994,517],{"class":516},[331,4996,350],{"class":341},[331,4998,231],{"class":353},[331,5000,4032],{"class":525},[331,5002,988],{"class":353},[331,5004,5005,5007,5009,5011],{"class":333,"line":379},[331,5006,4310],{"class":409},[331,5008,4899],{"class":413},[331,5010,410],{"class":409},[331,5012,4317],{"class":353},[331,5014,5015,5017,5020,5022],{"class":333,"line":392},[331,5016,4310],{"class":409},[331,5018,5019],{"class":413},"hps.num_stages=5",[331,5021,410],{"class":409},[331,5023,4317],{"class":353},[331,5025,5026,5028,5030,5032,5034,5036],{"class":333,"line":399},[331,5027,4343],{"class":542},[331,5029,517],{"class":516},[331,5031,410],{"class":409},[331,5033,862],{"class":413},[331,5035,410],{"class":409},[331,5037,4317],{"class":353},[331,5039,5040],{"class":333,"line":599},[331,5041,441],{"class":353},[331,5043,5044,5047,5049,5051,5053,5055,5057,5060],{"class":333,"line":607},[331,5045,5046],{"class":341},"cnn_model ",[331,5048,517],{"class":516},[331,5050,350],{"class":341},[331,5052,231],{"class":353},[331,5054,814],{"class":525},[331,5056,406],{"class":353},[331,5058,5059],{"class":525},"cnn_deep",[331,5061,441],{"class":353},[331,5063,5064,5066,5068,5070,5073,5075],{"class":333,"line":623},[331,5065,403],{"class":402},[331,5067,406],{"class":353},[331,5069,410],{"class":409},[331,5071,5072],{"class":413},"Deep CNN (5 stages):",[331,5074,410],{"class":409},[331,5076,441],{"class":353},[331,5078,5079,5081,5083,5086],{"class":333,"line":1129},[331,5080,403],{"class":402},[331,5082,406],{"class":353},[331,5084,5085],{"class":525},"cnn_model",[331,5087,441],{"class":353},[331,5089,5090,5092],{"class":333,"line":1145},[331,5091,403],{"class":402},[331,5093,604],{"class":353},[331,5095,5096,5098,5100,5102,5104,5106],{"class":333,"line":1749},[331,5097,403],{"class":402},[331,5099,406],{"class":353},[331,5101,410],{"class":409},[331,5103,4212],{"class":413},[331,5105,410],{"class":409},[331,5107,441],{"class":353},[331,5109,5110,5112,5114,5116,5118,5120,5123,5125,5127],{"class":333,"line":2001},[331,5111,1242],{"class":337},[331,5113,1245],{"class":341},[331,5115,419],{"class":353},[331,5117,1250],{"class":341},[331,5119,1253],{"class":337},[331,5121,5122],{"class":341}," cnn_model",[331,5124,231],{"class":353},[331,5126,1260],{"class":525},[331,5128,1263],{"class":353},[331,5130,5131,5134,5136,5138,5140,5142,5144,5146,5148,5150],{"class":333,"line":2030},[331,5132,5133],{"class":341},"    child_count ",[331,5135,517],{"class":516},[331,5137,1546],{"class":402},[331,5139,406],{"class":353},[331,5141,1366],{"class":583},[331,5143,406],{"class":353},[331,5145,1294],{"class":525},[331,5147,231],{"class":353},[331,5149,1776],{"class":525},[331,5151,3302],{"class":353},[331,5153,5154,5156,5158,5160,5162,5164,5166,5168,5170,5172,5175,5177,5179,5181,5183,5185,5188,5190,5193,5195,5198],{"class":333,"line":2054},[331,5155,1268],{"class":402},[331,5157,406],{"class":353},[331,5159,1274],{"class":1273},[331,5161,3486],{"class":413},[331,5163,1280],{"class":548},[331,5165,1283],{"class":525},[331,5167,1286],{"class":548},[331,5169,3496],{"class":413},[331,5171,1280],{"class":548},[331,5173,5174],{"class":583},"type",[331,5176,406],{"class":353},[331,5178,1294],{"class":525},[331,5180,434],{"class":353},[331,5182,594],{"class":437},[331,5184,1286],{"class":548},[331,5186,5187],{"class":413}," (",[331,5189,1280],{"class":548},[331,5191,5192],{"class":525},"child_count",[331,5194,1286],{"class":548},[331,5196,5197],{"class":413}," sub-modules)\"",[331,5199,441],{"class":353},[443,5201],{"data":5202,"kind":446},"RGVlcCBDTk4gKDUgc3RhZ2VzKToKU2VxdWVudGlhbCgKICAoc3RlbSk6IFNlcXVlbnRpYWwoCiAgICAoMCk6IENvbnYyZCgzLCAzMiwga2VybmVsX3NpemU9KDMsIDMpLCBzdHJpZGU9KDEsIDEpLCBwYWRkaW5nPSgxLCAxKSwgYmlhcz1GYWxzZSkKICAgICgxKTogQmF0Y2hOb3JtMmQoMzIsIGVwcz0xZS0wNSwgbW9tZW50dW09MC4xLCBhZmZpbmU9VHJ1ZSwgYmlhcz1UcnVlLCB0cmFja19ydW5uaW5nX3N0YXRzPVRydWUpCiAgICAoMik6IFJlTFUoaW5wbGFjZT1UcnVlKQogICkKICAoc3RhZ2VzKTogU2VxdWVudGlhbCgKICAgICgwKTogU2VxdWVudGlhbCgKICAgICAgKDApOiBDb252MmQoMzIsIDMyLCBrZXJuZWxfc2l6ZT0oMywgMyksIHN0cmlkZT0oMSwgMSksIHBhZGRpbmc9KDEsIDEpLCBiaWFzPUZhbHNlKQogICAgICAoMSk6IEJhdGNoTm9ybTJkKDMyLCBlcHM9MWUtMDUsIG1vbWVudHVtPTAuMSwgYWZmaW5lPVRydWUsIGJpYXM9VHJ1ZSwgdHJhY2tfcnVubmluZ19zdGF0cz1UcnVlKQogICAgICAoMik6IFJlTFUoaW5wbGFjZT1UcnVlKQogICAgICAoMyk6IE1heFBvb2wyZChrZXJuZWxfc2l6ZT0yLCBzdHJpZGU9MiwgcGFkZGluZz0wLCBkaWxhdGlvbj0xLCBjZWlsX21vZGU9RmFsc2UpCiAgICApCiAgICAoMSk6IFNlcXVlbnRpYWwoCiAgICAgICgwKTogQ29udjJkKDMyLCAzMiwga2VybmVsX3NpemU9KDMsIDMpLCBzdHJpZGU9KDEsIDEpLCBwYWRkaW5nPSgxLCAxKSwgYmlhcz1GYWxzZSkKICAgICAgKDEpOiBCYXRjaE5vcm0yZCgzMiwgZXBzPTFlLTA1LCBtb21lbnR1bT0wLjEsIGFmZmluZT1UcnVlLCBiaWFzPVRydWUsIHRyYWNrX3J1bm5pbmdfc3RhdHM9VHJ1ZSkKICAgICAgKDIpOiBSZUxVKGlucGxhY2U9VHJ1ZSkKICAgICAgKDMpOiBNYXhQb29sMmQoa2VybmVsX3NpemU9Miwgc3RyaWRlPTIsIHBhZGRpbmc9MCwgZGlsYXRpb249MSwgY2VpbF9tb2RlPUZhbHNlKQogICAgKQogICAgKDIpOiBTZXF1ZW50aWFsKAogICAgICAoMCk6IENvbnYyZCgzMiwgMzIsIGtlcm5lbF9zaXplPSgzLCAzKSwgc3RyaWRlPSgxLCAxKSwgcGFkZGluZz0oMSwgMSksIGJpYXM9RmFsc2UpCiAgICAgICgxKTogQmF0Y2hOb3JtMmQoMzIsIGVwcz0xZS0wNSwgbW9tZW50dW09MC4xLCBhZmZpbmU9VHJ1ZSwgYmlhcz1UcnVlLCB0cmFja19ydW5uaW5nX3N0YXRzPVRydWUpCiAgICAgICgyKTogUmVMVShpbnBsYWNlPVRydWUpCiAgICAgICgzKTogTWF4UG9vbDJkKGtlcm5lbF9zaXplPTIsIHN0cmlkZT0yLCBwYWRkaW5nPTAsIGRpbGF0aW9uPTEsIGNlaWxfbW9kZT1GYWxzZSkKICAgICkKICAgICgzKTogU2VxdWVudGlhbCgKICAgICAgKDApOiBDb252MmQoMzIsIDMyLCBrZXJuZWxfc2l6ZT0oMywgMyksIHN0cmlkZT0oMSwgMSksIHBhZGRpbmc9KDEsIDEpLCBiaWFzPUZhbHNlKQogICAgICAoMSk6IEJhdGNoTm9ybTJkKDMyLCBlcHM9MWUtMDUsIG1vbWVudHVtPTAuMSwgYWZmaW5lPVRydWUsIGJpYXM9VHJ1ZSwgdHJhY2tfcnVubmluZ19zdGF0cz1UcnVlKQogICAgICAoMik6IFJlTFUoaW5wbGFjZT1UcnVlKQogICAgICAoMyk6IE1heFBvb2wyZChrZXJuZWxfc2l6ZT0yLCBzdHJpZGU9MiwgcGFkZGluZz0wLCBkaWxhdGlvbj0xLCBjZWlsX21vZGU9RmFsc2UpCiAgICApCiAgICAoNCk6IFNlcXVlbnRpYWwoCiAgICAgICgwKTogQ29udjJkKDMyLCAzMiwga2VybmVsX3NpemU9KDMsIDMpLCBzdHJpZGU9KDEsIDEpLCBwYWRkaW5nPSgxLCAxKSwgYmlhcz1GYWxzZSkKICAgICAgKDEpOiBCYXRjaE5vcm0yZCgzMiwgZXBzPTFlLTA1LCBtb21lbnR1bT0wLjEsIGFmZmluZT1UcnVlLCBiaWFzPVRydWUsIHRyYWNrX3J1bm5pbmdfc3RhdHM9VHJ1ZSkKICAgICAgKDIpOiBSZUxVKGlucGxhY2U9VHJ1ZSkKICAgICAgKDMpOiBNYXhQb29sMmQoa2VybmVsX3NpemU9Miwgc3RyaWRlPTIsIHBhZGRpbmc9MCwgZGlsYXRpb249MSwgY2VpbF9tb2RlPUZhbHNlKQogICAgKQogICkKICAoaGVhZCk6IFNlcXVlbnRpYWwoCiAgICAoMCk6IEFkYXB0aXZlQXZnUG9vbDJkKG91dHB1dF9zaXplPTEpCiAgICAoMSk6IEZsYXR0ZW4oc3RhcnRfZGltPTEsIGVuZF9kaW09LTEpCiAgICAoMik6IExpbmVhcihpbl9mZWF0dXJlcz0zMiwgb3V0X2ZlYXR1cmVzPTEwLCBiaWFzPVRydWUpCiAgKQopCgpOYW1lZCBzZWN0aW9uczoKICBzdGVtOiBTZXF1ZW50aWFsICgzIHN1Yi1tb2R1bGVzKQogIHN0YWdlczogU2VxdWVudGlhbCAoNSBzdWItbW9kdWxlcykKICBoZWFkOiBTZXF1ZW50aWFsICgzIHN1Yi1tb2R1bGVzKQo=",[216,5204,5205],{},[219,5206,5207],{},"The factory pattern in summary:",[5209,5210,5211,5219,5233,5240],"ol",{},[241,5212,5213,5214,231],{},"Write a Python function that accepts plain hyperparameters and ",[219,5215,5216,5217],{},"returns a ",[224,5218,250],{},[241,5220,5221,5222,282,5224,282,5226,5228,5229,5232],{},"Use ",[224,5223,246],{},[224,5225,274],{},[224,5227,256],{},", etc. inside it; never ",[224,5230,5231],{},"nn.Module(...)"," directly.",[241,5234,5235,5236,5239],{},"Call the factory from the module level, binding ",[224,5237,5238],{},"hps.*"," values.",[241,5241,5242,5245],{},[224,5243,5244],{},"laco.load"," executes the file, evaluates the factory, and returns the config tree.",[216,5247,5248,5249,5252,5253,5256],{},"This separation of ",[882,5250,5251],{},"config building"," from ",[882,5254,5255],{},"object construction"," is the core laco design principle.",[448,5258],{},[451,5260,5262],{"id":5261},"section-8-config-tree-visualization","Section 8: Config Tree Visualization",[216,5264,5265],{},"A picture is worth a thousand YAML lines. Here is the MLP config structure:",[322,5267,5272],{"className":5268,"code":5270,"language":5271},[5269],"language-text","                nn.Sequential (root)\n               \u002F       |           \\\n           input     hidden (×3)   output\n          \u002F    \\       |    \\        |\n    nn.Linear  act  nn.Linear  act  nn.Linear\n","text",[224,5273,5270],{"__ignoreMap":327},[3526,5275,5277],{"id":5276},"corresponding-cnn-tree","Corresponding CNN tree",[216,5279,5280],{},"The CNN classifier has a similar but distinct structure:",[322,5282,5285],{"className":5283,"code":5284,"language":5271},[5269],"                nn.Sequential (root)\n              \u002F       |           \\\n           stem    stages (×N)   head\n           ...     L.repeat       |\n                   \u002F | \\         ...\n               blk blk blk\n",[224,5286,5284],{"__ignoreMap":327},[448,5288],{},[451,5290,5292],{"id":5291},"summary","Summary",[3526,5294,5296],{"id":5295},"primitives-covered","Primitives covered",[1313,5298,5299,5309],{},[1316,5300,5301],{},[1319,5302,5303,5306],{},[1322,5304,5305],{},"Primitive",[1322,5307,5308],{},"Purpose",[1329,5310,5311,5326,5336,5349,5363,5376,5384,5396,5408],{},[1319,5312,5313,5318],{},[1334,5314,5315],{},[224,5316,5317],{},"L.call(T)(**kw)",[1334,5319,5320,5321,5323,5324],{},"Lazy node: stores ",[224,5322,474],{}," + kwargs as ",[224,5325,250],{},[1319,5327,5328,5333],{},[1334,5329,5330],{},[224,5331,5332],{},"L.call(T, root=True)(**kw)",[1334,5334,5335],{},"Same, marks the top of the instantiation tree",[1319,5337,5338,5343],{},[1334,5339,5340],{},[224,5341,5342],{},"L.call(T, expand_args=True)(list)",[1334,5344,5345,5346,5348],{},"Unpack list as ",[224,5347,269],{}," when instantiating",[1319,5350,5351,5355],{},[1334,5352,5353],{},[224,5354,1802],{},[1334,5356,5357,5358,5360,5361],{},"List of ",[224,5359,1808],{}," independent deep-copies of ",[224,5362,1813],{},[1319,5364,5365,5370],{},[1334,5366,5367],{},[224,5368,5369],{},"L.OrderedDict((k, v), ...)",[1334,5371,5372,5373],{},"Named, ordered mapping → ",[224,5374,5375],{},"collections.OrderedDict",[1319,5377,5378,5382],{},[1334,5379,5380],{},[224,5381,2445],{},[1334,5383,2453],{},[1319,5385,5386,5390],{},[1334,5387,5388],{},[224,5389,2460],{},[1334,5391,5392,5393],{},"String-keyed ",[224,5394,5395],{},"dict",[1319,5397,5398,5402],{},[1334,5399,5400],{},[224,5401,2475],{},[1334,5403,5404,5405],{},"Heterogeneous ",[224,5406,5407],{},"tuple",[1319,5409,5410,5414],{},[1334,5411,5412],{},[224,5413,2490],{},[1334,5415,5416,5417],{},"Deduplicated ",[224,5418,5419],{},"set",[3526,5421,5423],{"id":5422},"the-config-factory-pattern","The config factory pattern",[5209,5425,5426,5434,5446,5455,5459],{},[241,5427,5428,5429,5431,5432,434],{},"Write a Python function that returns a ",[224,5430,250],{}," (never an ",[224,5433,4634],{},[241,5435,5436,5437,282,5440,282,5443,5445],{},"Accept hyperparameters as plain Python values (",[224,5438,5439],{},"int",[224,5441,5442],{},"float",[224,5444,5174],{},", …).",[241,5447,5221,5448,282,5450,282,5452,5454],{},[224,5449,246],{},[224,5451,274],{},[224,5453,256],{}," to compose the tree.",[241,5456,5235,5457,5239],{},[224,5458,5238],{},[241,5460,5461,5462,231],{},"Override at load time with ",[224,5463,5464],{},"laco.load(path, \"hps.x=y\")",[3526,5466,5468],{"id":5467},"next-steps","Next steps",[238,5470,5471,5477],{},[241,5472,5473,5476],{},[224,5474,5475],{},"07.typed-groups-and-schemas.ipynb"," covers config groups, defaults lists, and Hydra integration",[241,5478,5479,5482,5483,300,5486],{},[224,5480,5481],{},"10.tracing.ipynb"," covers the tracing API: ",[224,5484,5485],{},"@L.configurable",[224,5487,5488],{},"L.trace",[5490,5491,5492],"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 pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--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 .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--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 .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}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":327,"searchDepth":365,"depth":365,"links":5494},[5495,5497,5499,5501,5503,5504,5509,5511,5514],{"id":453,"depth":345,"text":5496},"Section 1: Nesting L.call Nodes",{"id":908,"depth":345,"text":5498},"Section 2: L.OrderedDict, Named Sub-modules",{"id":1357,"depth":345,"text":5500},"Section 3: expand_args=True",{"id":1793,"depth":345,"text":5502},"Section 4: L.repeat, Replicated Structures",{"id":2407,"depth":345,"text":2408},{"id":3515,"depth":345,"text":5505,"children":5506},"Section 6: Full mlp.py Walkthrough",[5507,5508],{"id":3528,"depth":365,"text":3529},{"id":3588,"depth":365,"text":3589},{"id":4411,"depth":345,"text":5510},"Section 7: cnn_classifier.py Pattern",{"id":5261,"depth":345,"text":5262,"children":5512},[5513],{"id":5276,"depth":365,"text":5277},{"id":5291,"depth":345,"text":5292,"children":5515},[5516,5517,5518],{"id":5295,"depth":365,"text":5296},{"id":5422,"depth":365,"text":5423},{"id":5467,"depth":365,"text":5468},"Prerequisites: 01.why-laco.ipynb through 04.hyperparameters-and-interpolation.ipynb.","md",{"notebook":395},{"icon":25},{"title":43,"description":5519},"f96u8wO5Pqeyhf5R6phK4Bpk7N8CVyvMa-8WLpb7IuE",{},1785687302012]