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