[{"data":1,"prerenderedAt":3625},["ShallowReactive",2],{"navigation":3,"api-navigation":184,"\u002Flearn\u002Fexamples\u002Ftyped-variants":206,"docyard:crossref-index":3624},[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":148,"body":208,"description":385,"extension":3620,"meta":3621,"navigation":432,"path":149,"seo":3622,"stem":150,"__hash__":3623},"content\u002F2.learn\u002F4.examples\u002F3.typed-variants.md",{"type":209,"value":210,"toc":3592},"minimark",[211,215,252,259,262,267,277,344,346,356,368,374,379,1373,1377,1393,1414,1432,1440,1459,1466,1582,1586,1762,1766,1800,1802,1810,1820,1827,1830,2316,2319,2335,2360,2385,2404,2407,2623,2626,2660,2662,2675,2685,2695,2698,3176,3179,3201,3219,3238,3259,3263,3410,3425,3428,3452,3454,3461,3588],[212,213,148],"h1",{"id":214},"typed-group-variants",[216,217,218],"blockquote",{},[219,220,221,222,226,227,230,231,234,235,234,238,234,241,234,244,247,248,251],"p",{},"Tier 0–1 Typed: each foundation example has a sibling in ",[223,224,225],"code",{},"examples\u002Ftyped\u002F"," that replaces ",[223,228,229],{},"@L.params"," with the typed-group API: ",[223,232,233],{},"L.Group",", ",[223,236,237],{},"@L.config",[223,239,240],{},"L.slot",[223,242,243],{},"L.bind",[223,245,246],{},"L.chosen",", and ",[223,249,250],{},"L.ref",". The model topology is identical; only the schema declaration changes.",[219,253,254,255,258],{},"All source files live under ",[223,256,257],{},"sources\u002Flaco\u002Fexamples\u002Ftyped\u002F",".",[260,261],"hr",{},[263,264,266],"h2",{"id":265},"why-typed-groups","Why typed groups?",[219,268,269,271,272,276],{},[223,270,229],{}," is a flat interpolation namespace. It works well for scalar hyperparameters but cannot express ",[273,274,275],"em",{},"swappable sub-configs"," (e.g. \"this field can be one of several optimizer variants\"). The typed-group API adds:",[278,279,280,293,300,308,316,324,332],"ul",{},[281,282,283,289,290],"li",{},[284,285,286],"strong",{},[223,287,288],{},"L.Group[T]",": an enumeration of named config variants, all of type ",[223,291,292],{},"T",[281,294,295,299],{},[284,296,297],{},[223,298,237],{},": a structured dataclass schema with real types visible to static analyzers",[281,301,302,307],{},[284,303,304],{},[223,305,306],{},"L.slot(Group)",": a field that holds a chosen group variant",[281,309,310,315],{},[284,311,312],{},[223,313,314],{},"L.Defaults(...)",": declares which variant is selected by default",[281,317,318,323],{},[284,319,320],{},[223,321,322],{},"L.bind(field, variant)",": pairs a schema slot with a specific group member",[281,325,326,331],{},[284,327,328],{},[223,329,330],{},"L.chosen(Group)",": references whichever variant the defaults\u002Fcaller selected",[281,333,334,339,340,343],{},[284,335,336],{},[223,337,338],{},"L.ref(\"${path}\")",": interpolation reference to a schema field (replaces direct ",[223,341,342],{},"hps.attr"," access)",[260,345],{},[263,347,349,350,353,354],{"id":348},"_1-typedmlppy-swappable-activations-with-lgroup","1. ",[223,351,352],{},"typed\u002Fmlp.py",": Swappable activations with ",[223,355,233],{},[216,357,358],{},[219,359,360,361],{},"Source: ",[362,363,365],"a",{"href":364},"..\u002F..\u002Fsources\u002Flaco\u002Fexamples\u002Ftyped\u002Fmlp.py",[223,366,367],{},"sources\u002Flaco\u002Fexamples\u002Ftyped\u002Fmlp.py",[219,369,370,371,373],{},"Rewrites the ",[223,372,229],{}," MLP using a typed activation group so the caller can switch between ReLU, GELU, and SiLU with a single override.",[375,376,378],"h3",{"id":377},"full-source","Full source",[380,381,386],"pre",{"className":382,"code":383,"language":384,"meta":385,"style":385},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","import laco.language as L\nfrom torch import nn\n\n\nclass ActivationGroup(L.Group[nn.Module]):\n    \"\"\"Swappable activation functions.\"\"\"\n\n    relu = L.call(nn.ReLU)()\n    gelu = L.call(nn.GELU)()\n    silu = L.call(nn.SiLU)()\n\n\n@L.config\nclass MLPSchema:\n    \"\"\"Typed schema for the MLP example.\"\"\"\n\n    dim_in: int = 128\n    dim_out: int = 128\n    dim_hidden: int = 256\n    num_layers: int = 3\n    activation: nn.Module = L.slot(ActivationGroup)\n\n\nschema = MLPSchema\n\ndefaults = L.Defaults(\n    L.self_,\n    L.bind(MLPSchema.activation, ActivationGroup.relu),\n)\n\nmodel = 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=L.ref(\"${schema.dim_in}\"),\n                    out_features=L.ref(\"${schema.dim_hidden}\"),\n                ),\n                L.chosen(ActivationGroup),\n            ),\n        ),\n        (\n            \"hidden\",\n            L.call(nn.Sequential, expand_args=True)(\n                L.repeat(\n                    L.ref(\"${schema.num_layers}\"),\n                    L.call(nn.Sequential)(\n                        L.call(nn.Linear)(\n                            in_features=L.ref(\"${schema.dim_hidden}\"),\n                            out_features=L.ref(\"${schema.dim_hidden}\"),\n                        ),\n                        L.chosen(ActivationGroup),\n                    ),\n                ),\n            ),\n        ),\n        (\n            \"output\",\n            L.call(nn.Sequential)(\n                L.call(nn.Linear)(\n                    in_features=L.ref(\"${schema.dim_hidden}\"),\n                    out_features=L.ref(\"${schema.dim_out}\"),\n                )\n            ),\n        ),\n    )\n)\n","python","",[223,387,388,413,427,434,439,475,489,494,525,551,576,581,586,601,612,622,627,647,661,676,691,723,728,733,744,749,767,781,814,819,824,862,874,880,896,916,937,966,993,999,1015,1021,1027,1032,1044,1072,1084,1107,1126,1146,1172,1198,1204,1219,1225,1230,1235,1240,1245,1257,1276,1295,1320,1346,1352,1357,1362,1368],{"__ignoreMap":385},[389,390,393,397,401,404,407,410],"span",{"class":391,"line":392},"line",1,[389,394,396],{"class":395},"sVHd0","import",[389,398,400],{"class":399},"su5hD"," laco",[389,402,258],{"class":403},"sP7_E",[389,405,198],{"class":406},"skxfh",[389,408,409],{"class":395}," as",[389,411,412],{"class":399}," L\n",[389,414,416,419,422,424],{"class":391,"line":415},2,[389,417,418],{"class":395},"from",[389,420,421],{"class":399}," torch ",[389,423,396],{"class":395},[389,425,426],{"class":399}," nn\n",[389,428,430],{"class":391,"line":429},3,[389,431,433],{"emptyLinePlaceholder":432},true,"\n",[389,435,437],{"class":391,"line":436},4,[389,438,433],{"emptyLinePlaceholder":432},[389,440,442,446,450,453,456,458,461,464,467,469,472],{"class":391,"line":441},5,[389,443,445],{"class":444},"sbsja","class",[389,447,449],{"class":448},"sbgvK"," ActivationGroup",[389,451,452],{"class":403},"(",[389,454,455],{"class":448},"L",[389,457,258],{"class":403},[389,459,460],{"class":406},"Group",[389,462,463],{"class":403},"[",[389,465,466],{"class":406},"nn",[389,468,258],{"class":403},[389,470,471],{"class":406},"Module",[389,473,474],{"class":403},"]):\n",[389,476,478,482,486],{"class":391,"line":477},6,[389,479,481],{"class":480},"s2W-s","    \"\"\"",[389,483,485],{"class":484},"sithA","Swappable activation functions.",[389,487,488],{"class":480},"\"\"\"\n",[389,490,492],{"class":391,"line":491},7,[389,493,433],{"emptyLinePlaceholder":432},[389,495,497,500,504,507,509,513,515,517,519,522],{"class":391,"line":496},8,[389,498,499],{"class":399},"    relu ",[389,501,503],{"class":502},"smGrS","=",[389,505,506],{"class":399}," L",[389,508,258],{"class":403},[389,510,512],{"class":511},"slqww","call",[389,514,452],{"class":403},[389,516,466],{"class":511},[389,518,258],{"class":403},[389,520,521],{"class":406},"ReLU",[389,523,524],{"class":403},")()\n",[389,526,528,531,533,535,537,539,541,543,545,549],{"class":391,"line":527},9,[389,529,530],{"class":399},"    gelu ",[389,532,503],{"class":502},[389,534,506],{"class":399},[389,536,258],{"class":403},[389,538,512],{"class":511},[389,540,452],{"class":403},[389,542,466],{"class":511},[389,544,258],{"class":403},[389,546,548],{"class":547},"swQdS","GELU",[389,550,524],{"class":403},[389,552,554,557,559,561,563,565,567,569,571,574],{"class":391,"line":553},10,[389,555,556],{"class":399},"    silu ",[389,558,503],{"class":502},[389,560,506],{"class":399},[389,562,258],{"class":403},[389,564,512],{"class":511},[389,566,452],{"class":403},[389,568,466],{"class":511},[389,570,258],{"class":403},[389,572,573],{"class":406},"SiLU",[389,575,524],{"class":403},[389,577,579],{"class":391,"line":578},11,[389,580,433],{"emptyLinePlaceholder":432},[389,582,584],{"class":391,"line":583},12,[389,585,433],{"emptyLinePlaceholder":432},[389,587,589,593,596,598],{"class":391,"line":588},13,[389,590,592],{"class":591},"stp6e","@",[389,594,455],{"class":595},"sGLFI",[389,597,258],{"class":591},[389,599,600],{"class":595},"config\n",[389,602,604,606,609],{"class":391,"line":603},14,[389,605,445],{"class":444},[389,607,608],{"class":448}," MLPSchema",[389,610,611],{"class":403},":\n",[389,613,615,617,620],{"class":391,"line":614},15,[389,616,481],{"class":480},[389,618,619],{"class":484},"Typed schema for the MLP example.",[389,621,488],{"class":480},[389,623,625],{"class":391,"line":624},16,[389,626,433],{"emptyLinePlaceholder":432},[389,628,630,633,636,640,643],{"class":391,"line":629},17,[389,631,632],{"class":399},"    dim_in",[389,634,635],{"class":403},":",[389,637,639],{"class":638},"sZMiF"," int",[389,641,642],{"class":502}," =",[389,644,646],{"class":645},"srdBf"," 128\n",[389,648,650,653,655,657,659],{"class":391,"line":649},18,[389,651,652],{"class":399},"    dim_out",[389,654,635],{"class":403},[389,656,639],{"class":638},[389,658,642],{"class":502},[389,660,646],{"class":645},[389,662,664,667,669,671,673],{"class":391,"line":663},19,[389,665,666],{"class":399},"    dim_hidden",[389,668,635],{"class":403},[389,670,639],{"class":638},[389,672,642],{"class":502},[389,674,675],{"class":645}," 256\n",[389,677,679,682,684,686,688],{"class":391,"line":678},20,[389,680,681],{"class":399},"    num_layers",[389,683,635],{"class":403},[389,685,639],{"class":638},[389,687,642],{"class":502},[389,689,690],{"class":645}," 3\n",[389,692,694,697,699,702,704,706,708,710,712,715,717,720],{"class":391,"line":693},21,[389,695,696],{"class":399},"    activation",[389,698,635],{"class":403},[389,700,701],{"class":399}," nn",[389,703,258],{"class":403},[389,705,471],{"class":406},[389,707,642],{"class":502},[389,709,506],{"class":399},[389,711,258],{"class":403},[389,713,714],{"class":511},"slot",[389,716,452],{"class":403},[389,718,719],{"class":511},"ActivationGroup",[389,721,722],{"class":403},")\n",[389,724,726],{"class":391,"line":725},22,[389,727,433],{"emptyLinePlaceholder":432},[389,729,731],{"class":391,"line":730},23,[389,732,433],{"emptyLinePlaceholder":432},[389,734,736,739,741],{"class":391,"line":735},24,[389,737,738],{"class":399},"schema ",[389,740,503],{"class":502},[389,742,743],{"class":399}," MLPSchema\n",[389,745,747],{"class":391,"line":746},25,[389,748,433],{"emptyLinePlaceholder":432},[389,750,752,755,757,759,761,764],{"class":391,"line":751},26,[389,753,754],{"class":399},"defaults ",[389,756,503],{"class":502},[389,758,506],{"class":399},[389,760,258],{"class":403},[389,762,763],{"class":511},"Defaults",[389,765,766],{"class":403},"(\n",[389,768,770,773,775,778],{"class":391,"line":769},27,[389,771,772],{"class":511},"    L",[389,774,258],{"class":403},[389,776,777],{"class":406},"self_",[389,779,780],{"class":403},",\n",[389,782,784,786,788,791,793,796,798,801,804,806,808,811],{"class":391,"line":783},28,[389,785,772],{"class":511},[389,787,258],{"class":403},[389,789,790],{"class":511},"bind",[389,792,452],{"class":403},[389,794,795],{"class":511},"MLPSchema",[389,797,258],{"class":403},[389,799,800],{"class":406},"activation",[389,802,803],{"class":403},",",[389,805,449],{"class":511},[389,807,258],{"class":403},[389,809,810],{"class":406},"relu",[389,812,813],{"class":403},"),\n",[389,815,817],{"class":391,"line":816},29,[389,818,722],{"class":403},[389,820,822],{"class":391,"line":821},30,[389,823,433],{"emptyLinePlaceholder":432},[389,825,827,830,832,834,836,838,840,842,844,847,849,853,855,859],{"class":391,"line":826},31,[389,828,829],{"class":399},"model ",[389,831,503],{"class":502},[389,833,506],{"class":399},[389,835,258],{"class":403},[389,837,512],{"class":511},[389,839,452],{"class":403},[389,841,466],{"class":511},[389,843,258],{"class":403},[389,845,846],{"class":406},"Sequential",[389,848,803],{"class":403},[389,850,852],{"class":851},"s99_P"," root",[389,854,503],{"class":502},[389,856,858],{"class":857},"s39Yj","True",[389,860,861],{"class":403},")(\n",[389,863,865,867,869,872],{"class":391,"line":864},32,[389,866,772],{"class":511},[389,868,258],{"class":403},[389,870,871],{"class":511},"OrderedDict",[389,873,766],{"class":403},[389,875,877],{"class":391,"line":876},33,[389,878,879],{"class":403},"        (\n",[389,881,883,887,891,894],{"class":391,"line":882},34,[389,884,886],{"class":885},"sjJ54","            \"",[389,888,890],{"class":889},"s_sjI","input",[389,892,893],{"class":885},"\"",[389,895,780],{"class":403},[389,897,899,902,904,906,908,910,912,914],{"class":391,"line":898},35,[389,900,901],{"class":511},"            L",[389,903,258],{"class":403},[389,905,512],{"class":511},[389,907,452],{"class":403},[389,909,466],{"class":511},[389,911,258],{"class":403},[389,913,846],{"class":406},[389,915,861],{"class":403},[389,917,919,922,924,926,928,930,932,935],{"class":391,"line":918},36,[389,920,921],{"class":511},"                L",[389,923,258],{"class":403},[389,925,512],{"class":511},[389,927,452],{"class":403},[389,929,466],{"class":511},[389,931,258],{"class":403},[389,933,934],{"class":406},"Linear",[389,936,861],{"class":403},[389,938,940,943,945,947,949,952,954,956,959,962,964],{"class":391,"line":939},37,[389,941,942],{"class":851},"                    in_features",[389,944,503],{"class":502},[389,946,455],{"class":511},[389,948,258],{"class":403},[389,950,951],{"class":511},"ref",[389,953,452],{"class":403},[389,955,893],{"class":885},[389,957,958],{"class":889},"$",[389,960,961],{"class":645},"{schema.dim_in}",[389,963,893],{"class":885},[389,965,813],{"class":403},[389,967,969,972,974,976,978,980,982,984,986,989,991],{"class":391,"line":968},38,[389,970,971],{"class":851},"                    out_features",[389,973,503],{"class":502},[389,975,455],{"class":511},[389,977,258],{"class":403},[389,979,951],{"class":511},[389,981,452],{"class":403},[389,983,893],{"class":885},[389,985,958],{"class":889},[389,987,988],{"class":645},"{schema.dim_hidden}",[389,990,893],{"class":885},[389,992,813],{"class":403},[389,994,996],{"class":391,"line":995},39,[389,997,998],{"class":403},"                ),\n",[389,1000,1002,1004,1006,1009,1011,1013],{"class":391,"line":1001},40,[389,1003,921],{"class":511},[389,1005,258],{"class":403},[389,1007,1008],{"class":511},"chosen",[389,1010,452],{"class":403},[389,1012,719],{"class":511},[389,1014,813],{"class":403},[389,1016,1018],{"class":391,"line":1017},41,[389,1019,1020],{"class":403},"            ),\n",[389,1022,1024],{"class":391,"line":1023},42,[389,1025,1026],{"class":403},"        ),\n",[389,1028,1030],{"class":391,"line":1029},43,[389,1031,879],{"class":403},[389,1033,1035,1037,1040,1042],{"class":391,"line":1034},44,[389,1036,886],{"class":885},[389,1038,1039],{"class":889},"hidden",[389,1041,893],{"class":885},[389,1043,780],{"class":403},[389,1045,1047,1049,1051,1053,1055,1057,1059,1061,1063,1066,1068,1070],{"class":391,"line":1046},45,[389,1048,901],{"class":511},[389,1050,258],{"class":403},[389,1052,512],{"class":511},[389,1054,452],{"class":403},[389,1056,466],{"class":511},[389,1058,258],{"class":403},[389,1060,846],{"class":406},[389,1062,803],{"class":403},[389,1064,1065],{"class":851}," expand_args",[389,1067,503],{"class":502},[389,1069,858],{"class":857},[389,1071,861],{"class":403},[389,1073,1075,1077,1079,1082],{"class":391,"line":1074},46,[389,1076,921],{"class":511},[389,1078,258],{"class":403},[389,1080,1081],{"class":511},"repeat",[389,1083,766],{"class":403},[389,1085,1087,1090,1092,1094,1096,1098,1100,1103,1105],{"class":391,"line":1086},47,[389,1088,1089],{"class":511},"                    L",[389,1091,258],{"class":403},[389,1093,951],{"class":511},[389,1095,452],{"class":403},[389,1097,893],{"class":885},[389,1099,958],{"class":889},[389,1101,1102],{"class":645},"{schema.num_layers}",[389,1104,893],{"class":885},[389,1106,813],{"class":403},[389,1108,1110,1112,1114,1116,1118,1120,1122,1124],{"class":391,"line":1109},48,[389,1111,1089],{"class":511},[389,1113,258],{"class":403},[389,1115,512],{"class":511},[389,1117,452],{"class":403},[389,1119,466],{"class":511},[389,1121,258],{"class":403},[389,1123,846],{"class":406},[389,1125,861],{"class":403},[389,1127,1129,1132,1134,1136,1138,1140,1142,1144],{"class":391,"line":1128},49,[389,1130,1131],{"class":511},"                        L",[389,1133,258],{"class":403},[389,1135,512],{"class":511},[389,1137,452],{"class":403},[389,1139,466],{"class":511},[389,1141,258],{"class":403},[389,1143,934],{"class":406},[389,1145,861],{"class":403},[389,1147,1149,1152,1154,1156,1158,1160,1162,1164,1166,1168,1170],{"class":391,"line":1148},50,[389,1150,1151],{"class":851},"                            in_features",[389,1153,503],{"class":502},[389,1155,455],{"class":511},[389,1157,258],{"class":403},[389,1159,951],{"class":511},[389,1161,452],{"class":403},[389,1163,893],{"class":885},[389,1165,958],{"class":889},[389,1167,988],{"class":645},[389,1169,893],{"class":885},[389,1171,813],{"class":403},[389,1173,1175,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196],{"class":391,"line":1174},51,[389,1176,1177],{"class":851},"                            out_features",[389,1179,503],{"class":502},[389,1181,455],{"class":511},[389,1183,258],{"class":403},[389,1185,951],{"class":511},[389,1187,452],{"class":403},[389,1189,893],{"class":885},[389,1191,958],{"class":889},[389,1193,988],{"class":645},[389,1195,893],{"class":885},[389,1197,813],{"class":403},[389,1199,1201],{"class":391,"line":1200},52,[389,1202,1203],{"class":403},"                        ),\n",[389,1205,1207,1209,1211,1213,1215,1217],{"class":391,"line":1206},53,[389,1208,1131],{"class":511},[389,1210,258],{"class":403},[389,1212,1008],{"class":511},[389,1214,452],{"class":403},[389,1216,719],{"class":511},[389,1218,813],{"class":403},[389,1220,1222],{"class":391,"line":1221},54,[389,1223,1224],{"class":403},"                    ),\n",[389,1226,1228],{"class":391,"line":1227},55,[389,1229,998],{"class":403},[389,1231,1233],{"class":391,"line":1232},56,[389,1234,1020],{"class":403},[389,1236,1238],{"class":391,"line":1237},57,[389,1239,1026],{"class":403},[389,1241,1243],{"class":391,"line":1242},58,[389,1244,879],{"class":403},[389,1246,1248,1250,1253,1255],{"class":391,"line":1247},59,[389,1249,886],{"class":885},[389,1251,1252],{"class":889},"output",[389,1254,893],{"class":885},[389,1256,780],{"class":403},[389,1258,1260,1262,1264,1266,1268,1270,1272,1274],{"class":391,"line":1259},60,[389,1261,901],{"class":511},[389,1263,258],{"class":403},[389,1265,512],{"class":511},[389,1267,452],{"class":403},[389,1269,466],{"class":511},[389,1271,258],{"class":403},[389,1273,846],{"class":406},[389,1275,861],{"class":403},[389,1277,1279,1281,1283,1285,1287,1289,1291,1293],{"class":391,"line":1278},61,[389,1280,921],{"class":511},[389,1282,258],{"class":403},[389,1284,512],{"class":511},[389,1286,452],{"class":403},[389,1288,466],{"class":511},[389,1290,258],{"class":403},[389,1292,934],{"class":406},[389,1294,861],{"class":403},[389,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318],{"class":391,"line":1297},62,[389,1299,942],{"class":851},[389,1301,503],{"class":502},[389,1303,455],{"class":511},[389,1305,258],{"class":403},[389,1307,951],{"class":511},[389,1309,452],{"class":403},[389,1311,893],{"class":885},[389,1313,958],{"class":889},[389,1315,988],{"class":645},[389,1317,893],{"class":885},[389,1319,813],{"class":403},[389,1321,1323,1325,1327,1329,1331,1333,1335,1337,1339,1342,1344],{"class":391,"line":1322},63,[389,1324,971],{"class":851},[389,1326,503],{"class":502},[389,1328,455],{"class":511},[389,1330,258],{"class":403},[389,1332,951],{"class":511},[389,1334,452],{"class":403},[389,1336,893],{"class":885},[389,1338,958],{"class":889},[389,1340,1341],{"class":645},"{schema.dim_out}",[389,1343,893],{"class":885},[389,1345,813],{"class":403},[389,1347,1349],{"class":391,"line":1348},64,[389,1350,1351],{"class":403},"                )\n",[389,1353,1355],{"class":391,"line":1354},65,[389,1356,1020],{"class":403},[389,1358,1360],{"class":391,"line":1359},66,[389,1361,1026],{"class":403},[389,1363,1365],{"class":391,"line":1364},67,[389,1366,1367],{"class":403},"    )\n",[389,1369,1371],{"class":391,"line":1370},68,[389,1372,722],{"class":403},[375,1374,1376],{"id":1375},"annotated-walkthrough","Annotated walkthrough",[219,1378,1379,1384,1385,1388,1389,1392],{},[284,1380,1381],{},[223,1382,1383],{},"class ActivationGroup(L.Group[nn.Module])","\nEach class attribute is a named variant. The type parameter ",[223,1386,1387],{},"[nn.Module]"," constrains every member to be instantiable as an ",[223,1390,1391],{},"nn.Module",". Adding a new activation is one line; the override key is the attribute name.",[219,1394,1395,1400,1401,234,1404,1407,1408,1411,1412,258],{},[284,1396,1397],{},[223,1398,1399],{},"@L.config class MLPSchema","\nDeclares a structured config dataclass. Static analyzers see ",[223,1402,1403],{},"MLPSchema.dim_in: int",[223,1405,1406],{},"MLPSchema.activation: nn.Module",". The ",[223,1409,1410],{},"L.slot(ActivationGroup)"," default tells laco this field must be populated from ",[223,1413,719],{},[219,1415,1416,1421,1424,1425,1428,1429,1431],{},[284,1417,1418],{},[223,1419,1420],{},"defaults = L.Defaults(L.self_, L.bind(MLPSchema.activation, ActivationGroup.relu))",[223,1422,1423],{},"L.Defaults"," is the laco defaults list. ",[223,1426,1427],{},"L.self_"," means \"this config file is the primary config\". ",[223,1430,322],{}," selects the default group member for a slot.",[219,1433,1434,1439],{},[284,1435,1436],{},[223,1437,1438],{},"L.chosen(ActivationGroup)","\nA reference that resolves to whichever variant is currently selected. Used inline in the model body wherever the activation should appear.",[219,1441,1442,1447,1448,1450,1451,1454,1455,1458],{},[284,1443,1444],{},[223,1445,1446],{},"L.ref(\"${schema.dim_in}\")","\nInterpolation reference to the typed schema. In the ",[223,1449,229],{}," variant these were bare ",[223,1452,1453],{},"hps.dim_in"," attribute accesses; here the schema lives at the ",[223,1456,1457],{},"schema"," key and must be referenced via an interpolation string.",[375,1460,1462,1463,1465],{"id":1461},"side-by-side-lparams-vs-typed-group","Side-by-side: ",[223,1464,229],{}," vs typed group",[1467,1468,1469,1492],"table",{},[1470,1471,1472],"thead",{},[1473,1474,1475,1479,1484],"tr",{},[1476,1477,1478],"th",{},"Aspect",[1476,1480,1481,1483],{},[223,1482,229],{}," (mlp.py)",[1476,1485,1486,1488,1489,1491],{},[223,1487,237],{}," + ",[223,1490,233],{}," (typed\u002Fmlp.py)",[1493,1494,1495,1510,1523,1538,1551,1567],"tbody",{},[1473,1496,1497,1501,1506],{},[1498,1499,1500],"td",{},"Schema declaration",[1498,1502,1503],{},[223,1504,1505],{},"@L.params class hps",[1498,1507,1508],{},[223,1509,1399],{},[1473,1511,1512,1515,1519],{},[1498,1513,1514],{},"Field access in model",[1498,1516,1517],{},[223,1518,1453],{},[1498,1520,1521],{},[223,1522,1446],{},[1473,1524,1525,1528,1533],{},[1498,1526,1527],{},"Activation field type",[1498,1529,1530],{},[223,1531,1532],{},"activation: type[nn.Module] = nn.ReLU",[1498,1534,1535],{},[223,1536,1537],{},"activation: nn.Module = L.slot(ActivationGroup)",[1473,1539,1540,1543,1546],{},[1498,1541,1542],{},"Swappable variants",[1498,1544,1545],{},"No, must override the class path",[1498,1547,1548,1549],{},"Yes, named members in ",[223,1550,719],{},[1473,1552,1553,1556,1562],{},[1498,1554,1555],{},"Static type of field",[1498,1557,1558,1561],{},[223,1559,1560],{},"type[nn.Module]"," (class, not instance)",[1498,1563,1564,1566],{},[223,1565,1391],{}," (typed as the final instance)",[1473,1568,1569,1572,1577],{},[1498,1570,1571],{},"Override syntax",[1498,1573,1574],{},[223,1575,1576],{},"hps.activation=torch.nn.GELU",[1498,1578,1579],{},[223,1580,1581],{},"activation=gelu",[375,1583,1585],{"id":1584},"load-and-override","Load and override",[380,1587,1589],{"className":382,"code":1588,"language":384,"meta":385,"style":385},"import laco\n\n# Default (ReLU)\ncfg = laco.load(\"configs:\u002F\u002Fexamples\u002Ftyped\u002Fmlp.py#model\")\nmodel = laco.instantiate(cfg)\n\n# Switch to GELU\ncfg = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Ftyped\u002Fmlp.py\",\n    \"activation=gelu\",\n)\nmodel = laco.instantiate(cfg.model)\n\n# Change dimensions\ncfg = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Ftyped\u002Fmlp.py?schema.dim_in=64&schema.dim_hidden=512#model\"\n)\n",[223,1590,1591,1598,1602,1608,1633,1653,1657,1662,1676,1688,1698,1702,1725,1729,1734,1748,1758],{"__ignoreMap":385},[389,1592,1593,1595],{"class":391,"line":392},[389,1594,396],{"class":395},[389,1596,1597],{"class":399}," laco\n",[389,1599,1600],{"class":391,"line":415},[389,1601,433],{"emptyLinePlaceholder":432},[389,1603,1604],{"class":391,"line":429},[389,1605,1607],{"class":1606},"sutJx","# Default (ReLU)\n",[389,1609,1610,1613,1615,1617,1619,1622,1624,1626,1629,1631],{"class":391,"line":436},[389,1611,1612],{"class":399},"cfg ",[389,1614,503],{"class":502},[389,1616,400],{"class":399},[389,1618,258],{"class":403},[389,1620,1621],{"class":511},"load",[389,1623,452],{"class":403},[389,1625,893],{"class":885},[389,1627,1628],{"class":889},"configs:\u002F\u002Fexamples\u002Ftyped\u002Fmlp.py#model",[389,1630,893],{"class":885},[389,1632,722],{"class":403},[389,1634,1635,1637,1639,1641,1643,1646,1648,1651],{"class":391,"line":441},[389,1636,829],{"class":399},[389,1638,503],{"class":502},[389,1640,400],{"class":399},[389,1642,258],{"class":403},[389,1644,1645],{"class":511},"instantiate",[389,1647,452],{"class":403},[389,1649,1650],{"class":511},"cfg",[389,1652,722],{"class":403},[389,1654,1655],{"class":391,"line":477},[389,1656,433],{"emptyLinePlaceholder":432},[389,1658,1659],{"class":391,"line":491},[389,1660,1661],{"class":1606},"# Switch to GELU\n",[389,1663,1664,1666,1668,1670,1672,1674],{"class":391,"line":496},[389,1665,1612],{"class":399},[389,1667,503],{"class":502},[389,1669,400],{"class":399},[389,1671,258],{"class":403},[389,1673,1621],{"class":511},[389,1675,766],{"class":403},[389,1677,1678,1681,1684,1686],{"class":391,"line":527},[389,1679,1680],{"class":885},"    \"",[389,1682,1683],{"class":889},"configs:\u002F\u002Fexamples\u002Ftyped\u002Fmlp.py",[389,1685,893],{"class":885},[389,1687,780],{"class":403},[389,1689,1690,1692,1694,1696],{"class":391,"line":553},[389,1691,1680],{"class":885},[389,1693,1581],{"class":889},[389,1695,893],{"class":885},[389,1697,780],{"class":403},[389,1699,1700],{"class":391,"line":578},[389,1701,722],{"class":403},[389,1703,1704,1706,1708,1710,1712,1714,1716,1718,1720,1723],{"class":391,"line":583},[389,1705,829],{"class":399},[389,1707,503],{"class":502},[389,1709,400],{"class":399},[389,1711,258],{"class":403},[389,1713,1645],{"class":511},[389,1715,452],{"class":403},[389,1717,1650],{"class":511},[389,1719,258],{"class":403},[389,1721,1722],{"class":406},"model",[389,1724,722],{"class":403},[389,1726,1727],{"class":391,"line":588},[389,1728,433],{"emptyLinePlaceholder":432},[389,1730,1731],{"class":391,"line":603},[389,1732,1733],{"class":1606},"# Change dimensions\n",[389,1735,1736,1738,1740,1742,1744,1746],{"class":391,"line":614},[389,1737,1612],{"class":399},[389,1739,503],{"class":502},[389,1741,400],{"class":399},[389,1743,258],{"class":403},[389,1745,1621],{"class":511},[389,1747,766],{"class":403},[389,1749,1750,1752,1755],{"class":391,"line":624},[389,1751,1680],{"class":885},[389,1753,1754],{"class":889},"configs:\u002F\u002Fexamples\u002Ftyped\u002Fmlp.py?schema.dim_in=64&schema.dim_hidden=512#model",[389,1756,1757],{"class":885},"\"\n",[389,1759,1760],{"class":391,"line":629},[389,1761,722],{"class":403},[375,1763,1765],{"id":1764},"what-this-demonstrates","What this demonstrates",[278,1767,1768,1773,1778,1783,1790,1795],{},[281,1769,1770,1772],{},[223,1771,288],{},": named variant enumeration with a shared type bound",[281,1774,1775,1777],{},[223,1776,237],{},": structured dataclass schema with real type annotations",[281,1779,1780,1782],{},[223,1781,306],{},": schema field populated from a group",[281,1784,1785,1488,1787,1789],{},[223,1786,1423],{},[223,1788,243],{},": default group selection",[281,1791,1792,1794],{},[223,1793,330],{},": inline reference to the currently selected variant",[281,1796,1797,1799],{},[223,1798,338],{},": typed interpolation to schema fields",[260,1801],{},[263,1803,1805,1806,1809],{"id":1804},"_2-typedlinear_regressionpy-swappable-optimizers","2. ",[223,1807,1808],{},"typed\u002Flinear_regression.py",": Swappable optimizers",[216,1811,1812],{},[219,1813,360,1814],{},[362,1815,1817],{"href":1816},"..\u002F..\u002Fsources\u002Flaco\u002Fexamples\u002Ftyped\u002Flinear_regression.py",[223,1818,1819],{},"sources\u002Flaco\u002Fexamples\u002Ftyped\u002Flinear_regression.py",[219,1821,1822,1823,1826],{},"Rewrites the linear regression example with an ",[223,1824,1825],{},"OptimGroup"," so the caller can switch between SGD and Adam at config time.",[375,1828,378],{"id":1829},"full-source-1",[380,1831,1833],{"className":382,"code":1832,"language":384,"meta":385,"style":385},"import laco.language as L\nfrom torch import nn, optim\n\n\nclass OptimGroup(L.Group[optim.Optimizer]):\n    \"\"\"Swappable optimizer variants.\"\"\"\n\n    sgd = L.partial(optim.SGD)(lr=1e-2, momentum=0.9)\n    adam = L.partial(optim.Adam)(lr=1e-3)\n\n\n@L.config\nclass LinearRegressionSchema:\n    \"\"\"Typed schema for the linear-regression example.\"\"\"\n\n    in_features: int = 8\n    out_features: int = 1\n    bias: bool = True\n    optimizer: optim.Optimizer = L.slot(OptimGroup)\n\n\nschema = LinearRegressionSchema\n\ndefaults = L.Defaults(\n    L.self_,\n    L.bind(LinearRegressionSchema.optimizer, OptimGroup.sgd),\n)\n\nmodel = L.call(nn.Linear, root=True)(\n    in_features=L.ref(\"${schema.in_features}\"),\n    out_features=L.ref(\"${schema.out_features}\"),\n    bias=L.ref(\"${schema.bias}\"),\n)\n\noptimizer = L.chosen(OptimGroup)\n",[223,1834,1835,1849,1864,1868,1872,1899,1908,1912,1958,1991,1995,1999,2009,2018,2027,2031,2045,2059,2074,2102,2106,2110,2119,2123,2137,2147,2176,2180,2184,2214,2239,2264,2289,2293,2297],{"__ignoreMap":385},[389,1836,1837,1839,1841,1843,1845,1847],{"class":391,"line":392},[389,1838,396],{"class":395},[389,1840,400],{"class":399},[389,1842,258],{"class":403},[389,1844,198],{"class":406},[389,1846,409],{"class":395},[389,1848,412],{"class":399},[389,1850,1851,1853,1855,1857,1859,1861],{"class":391,"line":415},[389,1852,418],{"class":395},[389,1854,421],{"class":399},[389,1856,396],{"class":395},[389,1858,701],{"class":399},[389,1860,803],{"class":403},[389,1862,1863],{"class":399}," optim\n",[389,1865,1866],{"class":391,"line":429},[389,1867,433],{"emptyLinePlaceholder":432},[389,1869,1870],{"class":391,"line":436},[389,1871,433],{"emptyLinePlaceholder":432},[389,1873,1874,1876,1879,1881,1883,1885,1887,1889,1892,1894,1897],{"class":391,"line":441},[389,1875,445],{"class":444},[389,1877,1878],{"class":448}," OptimGroup",[389,1880,452],{"class":403},[389,1882,455],{"class":448},[389,1884,258],{"class":403},[389,1886,460],{"class":406},[389,1888,463],{"class":403},[389,1890,1891],{"class":406},"optim",[389,1893,258],{"class":403},[389,1895,1896],{"class":406},"Optimizer",[389,1898,474],{"class":403},[389,1900,1901,1903,1906],{"class":391,"line":477},[389,1902,481],{"class":480},[389,1904,1905],{"class":484},"Swappable optimizer variants.",[389,1907,488],{"class":480},[389,1909,1910],{"class":391,"line":491},[389,1911,433],{"emptyLinePlaceholder":432},[389,1913,1914,1917,1919,1921,1923,1926,1928,1930,1932,1935,1938,1941,1943,1946,1948,1951,1953,1956],{"class":391,"line":496},[389,1915,1916],{"class":399},"    sgd ",[389,1918,503],{"class":502},[389,1920,506],{"class":399},[389,1922,258],{"class":403},[389,1924,1925],{"class":511},"partial",[389,1927,452],{"class":403},[389,1929,1891],{"class":511},[389,1931,258],{"class":403},[389,1933,1934],{"class":547},"SGD",[389,1936,1937],{"class":403},")(",[389,1939,1940],{"class":851},"lr",[389,1942,503],{"class":502},[389,1944,1945],{"class":645},"1e-2",[389,1947,803],{"class":403},[389,1949,1950],{"class":851}," momentum",[389,1952,503],{"class":502},[389,1954,1955],{"class":645},"0.9",[389,1957,722],{"class":403},[389,1959,1960,1963,1965,1967,1969,1971,1973,1975,1977,1980,1982,1984,1986,1989],{"class":391,"line":527},[389,1961,1962],{"class":399},"    adam ",[389,1964,503],{"class":502},[389,1966,506],{"class":399},[389,1968,258],{"class":403},[389,1970,1925],{"class":511},[389,1972,452],{"class":403},[389,1974,1891],{"class":511},[389,1976,258],{"class":403},[389,1978,1979],{"class":406},"Adam",[389,1981,1937],{"class":403},[389,1983,1940],{"class":851},[389,1985,503],{"class":502},[389,1987,1988],{"class":645},"1e-3",[389,1990,722],{"class":403},[389,1992,1993],{"class":391,"line":553},[389,1994,433],{"emptyLinePlaceholder":432},[389,1996,1997],{"class":391,"line":578},[389,1998,433],{"emptyLinePlaceholder":432},[389,2000,2001,2003,2005,2007],{"class":391,"line":583},[389,2002,592],{"class":591},[389,2004,455],{"class":595},[389,2006,258],{"class":591},[389,2008,600],{"class":595},[389,2010,2011,2013,2016],{"class":391,"line":588},[389,2012,445],{"class":444},[389,2014,2015],{"class":448}," LinearRegressionSchema",[389,2017,611],{"class":403},[389,2019,2020,2022,2025],{"class":391,"line":603},[389,2021,481],{"class":480},[389,2023,2024],{"class":484},"Typed schema for the linear-regression example.",[389,2026,488],{"class":480},[389,2028,2029],{"class":391,"line":614},[389,2030,433],{"emptyLinePlaceholder":432},[389,2032,2033,2036,2038,2040,2042],{"class":391,"line":624},[389,2034,2035],{"class":399},"    in_features",[389,2037,635],{"class":403},[389,2039,639],{"class":638},[389,2041,642],{"class":502},[389,2043,2044],{"class":645}," 8\n",[389,2046,2047,2050,2052,2054,2056],{"class":391,"line":629},[389,2048,2049],{"class":399},"    out_features",[389,2051,635],{"class":403},[389,2053,639],{"class":638},[389,2055,642],{"class":502},[389,2057,2058],{"class":645}," 1\n",[389,2060,2061,2064,2066,2069,2071],{"class":391,"line":649},[389,2062,2063],{"class":399},"    bias",[389,2065,635],{"class":403},[389,2067,2068],{"class":638}," bool",[389,2070,642],{"class":502},[389,2072,2073],{"class":857}," True\n",[389,2075,2076,2079,2081,2084,2086,2088,2090,2092,2094,2096,2098,2100],{"class":391,"line":663},[389,2077,2078],{"class":399},"    optimizer",[389,2080,635],{"class":403},[389,2082,2083],{"class":399}," optim",[389,2085,258],{"class":403},[389,2087,1896],{"class":406},[389,2089,642],{"class":502},[389,2091,506],{"class":399},[389,2093,258],{"class":403},[389,2095,714],{"class":511},[389,2097,452],{"class":403},[389,2099,1825],{"class":511},[389,2101,722],{"class":403},[389,2103,2104],{"class":391,"line":678},[389,2105,433],{"emptyLinePlaceholder":432},[389,2107,2108],{"class":391,"line":693},[389,2109,433],{"emptyLinePlaceholder":432},[389,2111,2112,2114,2116],{"class":391,"line":725},[389,2113,738],{"class":399},[389,2115,503],{"class":502},[389,2117,2118],{"class":399}," LinearRegressionSchema\n",[389,2120,2121],{"class":391,"line":730},[389,2122,433],{"emptyLinePlaceholder":432},[389,2124,2125,2127,2129,2131,2133,2135],{"class":391,"line":735},[389,2126,754],{"class":399},[389,2128,503],{"class":502},[389,2130,506],{"class":399},[389,2132,258],{"class":403},[389,2134,763],{"class":511},[389,2136,766],{"class":403},[389,2138,2139,2141,2143,2145],{"class":391,"line":746},[389,2140,772],{"class":511},[389,2142,258],{"class":403},[389,2144,777],{"class":406},[389,2146,780],{"class":403},[389,2148,2149,2151,2153,2155,2157,2160,2162,2165,2167,2169,2171,2174],{"class":391,"line":751},[389,2150,772],{"class":511},[389,2152,258],{"class":403},[389,2154,790],{"class":511},[389,2156,452],{"class":403},[389,2158,2159],{"class":511},"LinearRegressionSchema",[389,2161,258],{"class":403},[389,2163,2164],{"class":406},"optimizer",[389,2166,803],{"class":403},[389,2168,1878],{"class":511},[389,2170,258],{"class":403},[389,2172,2173],{"class":406},"sgd",[389,2175,813],{"class":403},[389,2177,2178],{"class":391,"line":769},[389,2179,722],{"class":403},[389,2181,2182],{"class":391,"line":783},[389,2183,433],{"emptyLinePlaceholder":432},[389,2185,2186,2188,2190,2192,2194,2196,2198,2200,2202,2204,2206,2208,2210,2212],{"class":391,"line":816},[389,2187,829],{"class":399},[389,2189,503],{"class":502},[389,2191,506],{"class":399},[389,2193,258],{"class":403},[389,2195,512],{"class":511},[389,2197,452],{"class":403},[389,2199,466],{"class":511},[389,2201,258],{"class":403},[389,2203,934],{"class":406},[389,2205,803],{"class":403},[389,2207,852],{"class":851},[389,2209,503],{"class":502},[389,2211,858],{"class":857},[389,2213,861],{"class":403},[389,2215,2216,2218,2220,2222,2224,2226,2228,2230,2232,2235,2237],{"class":391,"line":821},[389,2217,2035],{"class":851},[389,2219,503],{"class":502},[389,2221,455],{"class":511},[389,2223,258],{"class":403},[389,2225,951],{"class":511},[389,2227,452],{"class":403},[389,2229,893],{"class":885},[389,2231,958],{"class":889},[389,2233,2234],{"class":645},"{schema.in_features}",[389,2236,893],{"class":885},[389,2238,813],{"class":403},[389,2240,2241,2243,2245,2247,2249,2251,2253,2255,2257,2260,2262],{"class":391,"line":826},[389,2242,2049],{"class":851},[389,2244,503],{"class":502},[389,2246,455],{"class":511},[389,2248,258],{"class":403},[389,2250,951],{"class":511},[389,2252,452],{"class":403},[389,2254,893],{"class":885},[389,2256,958],{"class":889},[389,2258,2259],{"class":645},"{schema.out_features}",[389,2261,893],{"class":885},[389,2263,813],{"class":403},[389,2265,2266,2268,2270,2272,2274,2276,2278,2280,2282,2285,2287],{"class":391,"line":864},[389,2267,2063],{"class":851},[389,2269,503],{"class":502},[389,2271,455],{"class":511},[389,2273,258],{"class":403},[389,2275,951],{"class":511},[389,2277,452],{"class":403},[389,2279,893],{"class":885},[389,2281,958],{"class":889},[389,2283,2284],{"class":645},"{schema.bias}",[389,2286,893],{"class":885},[389,2288,813],{"class":403},[389,2290,2291],{"class":391,"line":876},[389,2292,722],{"class":403},[389,2294,2295],{"class":391,"line":882},[389,2296,433],{"emptyLinePlaceholder":432},[389,2298,2299,2302,2304,2306,2308,2310,2312,2314],{"class":391,"line":898},[389,2300,2301],{"class":399},"optimizer ",[389,2303,503],{"class":502},[389,2305,506],{"class":399},[389,2307,258],{"class":403},[389,2309,1008],{"class":511},[389,2311,452],{"class":403},[389,2313,1825],{"class":511},[389,2315,722],{"class":403},[375,2317,1376],{"id":2318},"annotated-walkthrough-1",[219,2320,2321,2326,2327,2330,2331,2334],{},[284,2322,2323],{},[223,2324,2325],{},"OptimGroup(L.Group[optim.Optimizer])","\nEach member uses ",[223,2328,2329],{},"L.partial"," (not ",[223,2332,2333],{},"L.call",") because optimizers are deferred factories. The learning rate and other hyperparameters are baked in per-variant; individual hps can still be overridden per-key.",[219,2336,2337,2343,2344,2346,2347,2349,2350,2353,2354,2357,2358,258],{},[284,2338,2339,2342],{},[223,2340,2341],{},"L.slot(OptimGroup)"," in the schema","\nDeclares that ",[223,2345,2164],{}," is a slot populated from ",[223,2348,1825],{},". The static type annotation ",[223,2351,2352],{},"optimizer: optim.Optimizer"," is accurate: after instantiation it will be a partial that, when called with ",[223,2355,2356],{},"model.parameters()",", returns an ",[223,2359,1896],{},[219,2361,2362,2367,2368,2370,2371,2374,2375,2377,2378,2381,2382,258],{},[284,2363,2364],{},[223,2365,2366],{},"optimizer = L.chosen(OptimGroup)"," (module-level)\nUnlike the ",[223,2369,229],{}," variant where ",[223,2372,2373],{},"optimizer = L.partial(optim.SGD)(...)"," is hardcoded, this resolves to whichever optimizer the caller selects. The ",[223,2376,2164],{}," variable is exported in ",[223,2379,2380],{},"__all__"," and can be loaded as ",[223,2383,2384],{},"laco.load(\"...#optimizer\")",[219,2386,2387,2393,2394,2397,2398,2400,2401,2403],{},[284,2388,2389,2392],{},[223,2390,2391],{},"L.ref(\"${schema.in_features}\")"," in the model","\nThe model body does not reference ",[223,2395,2396],{},"hps.*"," directly; it uses ",[223,2399,250],{}," interpolation into the typed schema. This is the key difference from ",[223,2402,229],{},": the schema is a separate structured node, not an ambient namespace.",[375,2405,1585],{"id":2406},"load-and-override-1",[380,2408,2410],{"className":382,"code":2409,"language":384,"meta":385,"style":385},"import laco\n\n# Default (SGD)\ncfg = laco.load(\"configs:\u002F\u002Fexamples\u002Ftyped\u002Flinear_regression.py\")\nmodel = laco.instantiate(cfg.model)\nopt_factory = laco.instantiate(cfg.optimizer)\nopt = opt_factory(model.parameters())\n\n# Switch to Adam\ncfg = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Ftyped\u002Flinear_regression.py\",\n    \"optimizer=adam\",\n)\n\n# Override Adam's learning rate\ncfg = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Ftyped\u002Flinear_regression.py\",\n    \"optimizer=adam\",\n    \"optimizer.lr=5e-4\",\n)\n",[223,2411,2412,2418,2422,2427,2450,2472,2495,2517,2521,2526,2540,2550,2561,2565,2569,2574,2588,2598,2608,2619],{"__ignoreMap":385},[389,2413,2414,2416],{"class":391,"line":392},[389,2415,396],{"class":395},[389,2417,1597],{"class":399},[389,2419,2420],{"class":391,"line":415},[389,2421,433],{"emptyLinePlaceholder":432},[389,2423,2424],{"class":391,"line":429},[389,2425,2426],{"class":1606},"# Default (SGD)\n",[389,2428,2429,2431,2433,2435,2437,2439,2441,2443,2446,2448],{"class":391,"line":436},[389,2430,1612],{"class":399},[389,2432,503],{"class":502},[389,2434,400],{"class":399},[389,2436,258],{"class":403},[389,2438,1621],{"class":511},[389,2440,452],{"class":403},[389,2442,893],{"class":885},[389,2444,2445],{"class":889},"configs:\u002F\u002Fexamples\u002Ftyped\u002Flinear_regression.py",[389,2447,893],{"class":885},[389,2449,722],{"class":403},[389,2451,2452,2454,2456,2458,2460,2462,2464,2466,2468,2470],{"class":391,"line":441},[389,2453,829],{"class":399},[389,2455,503],{"class":502},[389,2457,400],{"class":399},[389,2459,258],{"class":403},[389,2461,1645],{"class":511},[389,2463,452],{"class":403},[389,2465,1650],{"class":511},[389,2467,258],{"class":403},[389,2469,1722],{"class":406},[389,2471,722],{"class":403},[389,2473,2474,2477,2479,2481,2483,2485,2487,2489,2491,2493],{"class":391,"line":477},[389,2475,2476],{"class":399},"opt_factory ",[389,2478,503],{"class":502},[389,2480,400],{"class":399},[389,2482,258],{"class":403},[389,2484,1645],{"class":511},[389,2486,452],{"class":403},[389,2488,1650],{"class":511},[389,2490,258],{"class":403},[389,2492,2164],{"class":406},[389,2494,722],{"class":403},[389,2496,2497,2500,2502,2505,2507,2509,2511,2514],{"class":391,"line":491},[389,2498,2499],{"class":399},"opt ",[389,2501,503],{"class":502},[389,2503,2504],{"class":511}," opt_factory",[389,2506,452],{"class":403},[389,2508,1722],{"class":511},[389,2510,258],{"class":403},[389,2512,2513],{"class":511},"parameters",[389,2515,2516],{"class":403},"())\n",[389,2518,2519],{"class":391,"line":496},[389,2520,433],{"emptyLinePlaceholder":432},[389,2522,2523],{"class":391,"line":527},[389,2524,2525],{"class":1606},"# Switch to Adam\n",[389,2527,2528,2530,2532,2534,2536,2538],{"class":391,"line":553},[389,2529,1612],{"class":399},[389,2531,503],{"class":502},[389,2533,400],{"class":399},[389,2535,258],{"class":403},[389,2537,1621],{"class":511},[389,2539,766],{"class":403},[389,2541,2542,2544,2546,2548],{"class":391,"line":578},[389,2543,1680],{"class":885},[389,2545,2445],{"class":889},[389,2547,893],{"class":885},[389,2549,780],{"class":403},[389,2551,2552,2554,2557,2559],{"class":391,"line":583},[389,2553,1680],{"class":885},[389,2555,2556],{"class":889},"optimizer=adam",[389,2558,893],{"class":885},[389,2560,780],{"class":403},[389,2562,2563],{"class":391,"line":588},[389,2564,722],{"class":403},[389,2566,2567],{"class":391,"line":603},[389,2568,433],{"emptyLinePlaceholder":432},[389,2570,2571],{"class":391,"line":614},[389,2572,2573],{"class":1606},"# Override Adam's learning rate\n",[389,2575,2576,2578,2580,2582,2584,2586],{"class":391,"line":624},[389,2577,1612],{"class":399},[389,2579,503],{"class":502},[389,2581,400],{"class":399},[389,2583,258],{"class":403},[389,2585,1621],{"class":511},[389,2587,766],{"class":403},[389,2589,2590,2592,2594,2596],{"class":391,"line":629},[389,2591,1680],{"class":885},[389,2593,2445],{"class":889},[389,2595,893],{"class":885},[389,2597,780],{"class":403},[389,2599,2600,2602,2604,2606],{"class":391,"line":649},[389,2601,1680],{"class":885},[389,2603,2556],{"class":889},[389,2605,893],{"class":885},[389,2607,780],{"class":403},[389,2609,2610,2612,2615,2617],{"class":391,"line":663},[389,2611,1680],{"class":885},[389,2613,2614],{"class":889},"optimizer.lr=5e-4",[389,2616,893],{"class":885},[389,2618,780],{"class":403},[389,2620,2621],{"class":391,"line":678},[389,2622,722],{"class":403},[375,2624,1765],{"id":2625},"what-this-demonstrates-1",[278,2627,2628,2637,2644,2650],{},[281,2629,2630,2633,2634,2636],{},[223,2631,2632],{},"L.Group[optim.Optimizer]"," with ",[223,2635,2329],{}," members: swappable deferred factories",[281,2638,2639,2640,2643],{},"Schema slot typed as ",[223,2641,2642],{},"optim.Optimizer"," for correct static analysis",[281,2645,2646,2647,2649],{},"Module-level ",[223,2648,2366],{},": the exported optimizer node resolves dynamically",[281,2651,2652,2653,2655,2656,2659],{},"Per-variant hyperparameter overrides (",[223,2654,2614],{}," after selecting ",[223,2657,2658],{},"adam",")",[260,2661],{},[263,2663,2665,2666,2669,2670,2633,2672],{"id":2664},"_3-typedtext_classifierpy-lconfig-with-lrequired","3. ",[223,2667,2668],{},"typed\u002Ftext_classifier.py",": ",[223,2671,237],{},[223,2673,2674],{},"L.required",[216,2676,2677],{},[219,2678,360,2679],{},[362,2680,2682],{"href":2681},"..\u002F..\u002Fsources\u002Flaco\u002Fexamples\u002Ftyped\u002Ftext_classifier.py",[223,2683,2684],{},"sources\u002Flaco\u002Fexamples\u002Ftyped\u002Ftext_classifier.py",[219,2686,2687,2688,2690,2691,2694],{},"Rewrites the text classifier with a ",[223,2689,237],{}," schema that preserves the ",[223,2692,2693],{},"L.required[int]()"," mandatory sentinel, demonstrating that required fields work identically in both APIs, but with better static typing in the typed variant.",[375,2696,378],{"id":2697},"full-source-2",[380,2699,2701],{"className":382,"code":2700,"language":384,"meta":385,"style":385},"import laco.language as L\nfrom laco.examples.layers.mean_pool import MeanPool\nfrom torch import nn\n\n\n@L.config\nclass TextClassifierSchema:\n    \"\"\"Typed schema; ``vocab_size`` is required (no default).\"\"\"\n\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\nschema = TextClassifierSchema\n\nmodel = L.call(nn.Sequential, root=True)(\n    L.OrderedDict(\n        (\n            \"embed\",\n            L.call(nn.Embedding)(\n                num_embeddings=L.ref(\"${schema.vocab_size}\"),\n                embedding_dim=L.ref(\"${schema.embed_dim}\"),\n                padding_idx=L.ref(\"${schema.padding_idx}\"),\n            ),\n        ),\n        (\"pool\", L.call(MeanPool)()),\n        (\n            \"head\",\n            L.call(nn.Linear)(\n                in_features=L.ref(\"${schema.embed_dim}\"),\n                out_features=L.ref(\"${schema.num_classes}\"),\n            ),\n        ),\n    )\n)\n",[223,2702,2703,2717,2743,2753,2757,2761,2771,2780,2789,2793,2819,2833,2847,2867,2871,2875,2884,2888,2918,2928,2932,2943,2962,2988,3014,3040,3044,3048,3076,3080,3091,3109,3134,3160,3164,3168,3172],{"__ignoreMap":385},[389,2704,2705,2707,2709,2711,2713,2715],{"class":391,"line":392},[389,2706,396],{"class":395},[389,2708,400],{"class":399},[389,2710,258],{"class":403},[389,2712,198],{"class":406},[389,2714,409],{"class":395},[389,2716,412],{"class":399},[389,2718,2719,2721,2723,2725,2728,2730,2733,2735,2738,2740],{"class":391,"line":415},[389,2720,418],{"class":395},[389,2722,400],{"class":399},[389,2724,258],{"class":403},[389,2726,2727],{"class":399},"examples",[389,2729,258],{"class":403},[389,2731,2732],{"class":399},"layers",[389,2734,258],{"class":403},[389,2736,2737],{"class":399},"mean_pool ",[389,2739,396],{"class":395},[389,2741,2742],{"class":399}," MeanPool\n",[389,2744,2745,2747,2749,2751],{"class":391,"line":429},[389,2746,418],{"class":395},[389,2748,421],{"class":399},[389,2750,396],{"class":395},[389,2752,426],{"class":399},[389,2754,2755],{"class":391,"line":436},[389,2756,433],{"emptyLinePlaceholder":432},[389,2758,2759],{"class":391,"line":441},[389,2760,433],{"emptyLinePlaceholder":432},[389,2762,2763,2765,2767,2769],{"class":391,"line":477},[389,2764,592],{"class":591},[389,2766,455],{"class":595},[389,2768,258],{"class":591},[389,2770,600],{"class":595},[389,2772,2773,2775,2778],{"class":391,"line":491},[389,2774,445],{"class":444},[389,2776,2777],{"class":448}," TextClassifierSchema",[389,2779,611],{"class":403},[389,2781,2782,2784,2787],{"class":391,"line":496},[389,2783,481],{"class":480},[389,2785,2786],{"class":484},"Typed schema; ``vocab_size`` is required (no default).",[389,2788,488],{"class":480},[389,2790,2791],{"class":391,"line":527},[389,2792,433],{"emptyLinePlaceholder":432},[389,2794,2795,2798,2800,2802,2804,2806,2808,2811,2813,2816],{"class":391,"line":553},[389,2796,2797],{"class":399},"    vocab_size",[389,2799,635],{"class":403},[389,2801,639],{"class":638},[389,2803,642],{"class":502},[389,2805,506],{"class":399},[389,2807,258],{"class":403},[389,2809,2810],{"class":406},"required",[389,2812,463],{"class":403},[389,2814,2815],{"class":638},"int",[389,2817,2818],{"class":403},"]()\n",[389,2820,2821,2824,2826,2828,2830],{"class":391,"line":578},[389,2822,2823],{"class":399},"    embed_dim",[389,2825,635],{"class":403},[389,2827,639],{"class":638},[389,2829,642],{"class":502},[389,2831,2832],{"class":645}," 64\n",[389,2834,2835,2838,2840,2842,2844],{"class":391,"line":583},[389,2836,2837],{"class":399},"    num_classes",[389,2839,635],{"class":403},[389,2841,639],{"class":638},[389,2843,642],{"class":502},[389,2845,2846],{"class":645}," 2\n",[389,2848,2849,2852,2854,2856,2859,2862,2864],{"class":391,"line":588},[389,2850,2851],{"class":399},"    padding_idx",[389,2853,635],{"class":403},[389,2855,639],{"class":638},[389,2857,2858],{"class":502}," |",[389,2860,2861],{"class":857}," None",[389,2863,642],{"class":502},[389,2865,2866],{"class":645}," 0\n",[389,2868,2869],{"class":391,"line":603},[389,2870,433],{"emptyLinePlaceholder":432},[389,2872,2873],{"class":391,"line":614},[389,2874,433],{"emptyLinePlaceholder":432},[389,2876,2877,2879,2881],{"class":391,"line":624},[389,2878,738],{"class":399},[389,2880,503],{"class":502},[389,2882,2883],{"class":399}," TextClassifierSchema\n",[389,2885,2886],{"class":391,"line":629},[389,2887,433],{"emptyLinePlaceholder":432},[389,2889,2890,2892,2894,2896,2898,2900,2902,2904,2906,2908,2910,2912,2914,2916],{"class":391,"line":649},[389,2891,829],{"class":399},[389,2893,503],{"class":502},[389,2895,506],{"class":399},[389,2897,258],{"class":403},[389,2899,512],{"class":511},[389,2901,452],{"class":403},[389,2903,466],{"class":511},[389,2905,258],{"class":403},[389,2907,846],{"class":406},[389,2909,803],{"class":403},[389,2911,852],{"class":851},[389,2913,503],{"class":502},[389,2915,858],{"class":857},[389,2917,861],{"class":403},[389,2919,2920,2922,2924,2926],{"class":391,"line":663},[389,2921,772],{"class":511},[389,2923,258],{"class":403},[389,2925,871],{"class":511},[389,2927,766],{"class":403},[389,2929,2930],{"class":391,"line":678},[389,2931,879],{"class":403},[389,2933,2934,2936,2939,2941],{"class":391,"line":693},[389,2935,886],{"class":885},[389,2937,2938],{"class":889},"embed",[389,2940,893],{"class":885},[389,2942,780],{"class":403},[389,2944,2945,2947,2949,2951,2953,2955,2957,2960],{"class":391,"line":725},[389,2946,901],{"class":511},[389,2948,258],{"class":403},[389,2950,512],{"class":511},[389,2952,452],{"class":403},[389,2954,466],{"class":511},[389,2956,258],{"class":403},[389,2958,2959],{"class":406},"Embedding",[389,2961,861],{"class":403},[389,2963,2964,2967,2969,2971,2973,2975,2977,2979,2981,2984,2986],{"class":391,"line":730},[389,2965,2966],{"class":851},"                num_embeddings",[389,2968,503],{"class":502},[389,2970,455],{"class":511},[389,2972,258],{"class":403},[389,2974,951],{"class":511},[389,2976,452],{"class":403},[389,2978,893],{"class":885},[389,2980,958],{"class":889},[389,2982,2983],{"class":645},"{schema.vocab_size}",[389,2985,893],{"class":885},[389,2987,813],{"class":403},[389,2989,2990,2993,2995,2997,2999,3001,3003,3005,3007,3010,3012],{"class":391,"line":735},[389,2991,2992],{"class":851},"                embedding_dim",[389,2994,503],{"class":502},[389,2996,455],{"class":511},[389,2998,258],{"class":403},[389,3000,951],{"class":511},[389,3002,452],{"class":403},[389,3004,893],{"class":885},[389,3006,958],{"class":889},[389,3008,3009],{"class":645},"{schema.embed_dim}",[389,3011,893],{"class":885},[389,3013,813],{"class":403},[389,3015,3016,3019,3021,3023,3025,3027,3029,3031,3033,3036,3038],{"class":391,"line":746},[389,3017,3018],{"class":851},"                padding_idx",[389,3020,503],{"class":502},[389,3022,455],{"class":511},[389,3024,258],{"class":403},[389,3026,951],{"class":511},[389,3028,452],{"class":403},[389,3030,893],{"class":885},[389,3032,958],{"class":889},[389,3034,3035],{"class":645},"{schema.padding_idx}",[389,3037,893],{"class":885},[389,3039,813],{"class":403},[389,3041,3042],{"class":391,"line":751},[389,3043,1020],{"class":403},[389,3045,3046],{"class":391,"line":769},[389,3047,1026],{"class":403},[389,3049,3050,3053,3055,3058,3060,3062,3064,3066,3068,3070,3073],{"class":391,"line":783},[389,3051,3052],{"class":403},"        (",[389,3054,893],{"class":885},[389,3056,3057],{"class":889},"pool",[389,3059,893],{"class":885},[389,3061,803],{"class":403},[389,3063,506],{"class":511},[389,3065,258],{"class":403},[389,3067,512],{"class":511},[389,3069,452],{"class":403},[389,3071,3072],{"class":511},"MeanPool",[389,3074,3075],{"class":403},")()),\n",[389,3077,3078],{"class":391,"line":816},[389,3079,879],{"class":403},[389,3081,3082,3084,3087,3089],{"class":391,"line":821},[389,3083,886],{"class":885},[389,3085,3086],{"class":889},"head",[389,3088,893],{"class":885},[389,3090,780],{"class":403},[389,3092,3093,3095,3097,3099,3101,3103,3105,3107],{"class":391,"line":826},[389,3094,901],{"class":511},[389,3096,258],{"class":403},[389,3098,512],{"class":511},[389,3100,452],{"class":403},[389,3102,466],{"class":511},[389,3104,258],{"class":403},[389,3106,934],{"class":406},[389,3108,861],{"class":403},[389,3110,3111,3114,3116,3118,3120,3122,3124,3126,3128,3130,3132],{"class":391,"line":864},[389,3112,3113],{"class":851},"                in_features",[389,3115,503],{"class":502},[389,3117,455],{"class":511},[389,3119,258],{"class":403},[389,3121,951],{"class":511},[389,3123,452],{"class":403},[389,3125,893],{"class":885},[389,3127,958],{"class":889},[389,3129,3009],{"class":645},[389,3131,893],{"class":885},[389,3133,813],{"class":403},[389,3135,3136,3139,3141,3143,3145,3147,3149,3151,3153,3156,3158],{"class":391,"line":876},[389,3137,3138],{"class":851},"                out_features",[389,3140,503],{"class":502},[389,3142,455],{"class":511},[389,3144,258],{"class":403},[389,3146,951],{"class":511},[389,3148,452],{"class":403},[389,3150,893],{"class":885},[389,3152,958],{"class":889},[389,3154,3155],{"class":645},"{schema.num_classes}",[389,3157,893],{"class":885},[389,3159,813],{"class":403},[389,3161,3162],{"class":391,"line":882},[389,3163,1020],{"class":403},[389,3165,3166],{"class":391,"line":898},[389,3167,1026],{"class":403},[389,3169,3170],{"class":391,"line":918},[389,3171,1367],{"class":403},[389,3173,3174],{"class":391,"line":939},[389,3175,722],{"class":403},[375,3177,1376],{"id":3178},"annotated-walkthrough-2",[219,3180,3181,3186,3187,3189,3190,3193,3194,2330,3197,3200],{},[284,3182,3183],{},[223,3184,3185],{},"@L.config class TextClassifierSchema","\nA structured dataclass schema. ",[223,3188,237],{}," accepts ",[223,3191,3192],{},"L.required[T]()"," as a field default: the type parameter flows through to the dataclass annotation so pyright reports ",[223,3195,3196],{},"vocab_size: int",[223,3198,3199],{},"vocab_size: Any"," as with a plain sentinel).",[219,3202,3203,3208,3209,3211,3212,3215,3216,3218],{},[284,3204,3205],{},[223,3206,3207],{},"vocab_size: int = L.required[int]()","\nIdentical semantics to the ",[223,3210,229],{}," variant: laco raises ",[223,3213,3214],{},"MissingMandatoryValue"," if the field is not overridden before instantiation. The difference is static visibility: the ",[223,3217,237],{}," form makes the field type explicit to type checkers without extra stubs.",[219,3220,3221,3226,3227,3229,3230,3233,3234,3237],{},[284,3222,3223],{},[223,3224,3225],{},"L.ref(\"${schema.vocab_size}\")","\nAll model references go through the typed schema. There is no ",[223,3228,2396],{}," namespace; the schema node is exported at module level as ",[223,3231,3232],{},"schema = TextClassifierSchema"," and referenced via ",[223,3235,3236],{},"\"${schema.*}\""," interpolation strings.",[219,3239,3240,3248,3249,3252,3253,3255,3256,3258],{},[284,3241,3242,3243,3245,3246],{},"No ",[223,3244,233],{}," or ",[223,3247,1423],{},"\nThis example has no swappable variants, so there is no ",[223,3250,3251],{},"defaults"," list. ",[223,3254,237],{}," alone (without ",[223,3257,233],{},") is appropriate when the goal is structured typing of a flat schema rather than variant selection.",[375,3260,3262],{"id":3261},"load-with-the-required-field-supplied","Load with the required field supplied",[380,3264,3266],{"className":382,"code":3265,"language":384,"meta":385,"style":385},"import laco\n\n# Via query-string\ncfg = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Ftyped\u002Ftext_classifier.py?schema.vocab_size=1000#model\"\n)\nmodel = laco.instantiate(cfg)\n\n# Via positional override\ncfg = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Ftyped\u002Ftext_classifier.py\",\n    \"schema.vocab_size=30000\",\n    \"schema.embed_dim=256\",\n)\nmodel = laco.instantiate(cfg.model)\n",[223,3267,3268,3274,3278,3283,3297,3306,3310,3328,3332,3337,3351,3362,3373,3384,3388],{"__ignoreMap":385},[389,3269,3270,3272],{"class":391,"line":392},[389,3271,396],{"class":395},[389,3273,1597],{"class":399},[389,3275,3276],{"class":391,"line":415},[389,3277,433],{"emptyLinePlaceholder":432},[389,3279,3280],{"class":391,"line":429},[389,3281,3282],{"class":1606},"# Via query-string\n",[389,3284,3285,3287,3289,3291,3293,3295],{"class":391,"line":436},[389,3286,1612],{"class":399},[389,3288,503],{"class":502},[389,3290,400],{"class":399},[389,3292,258],{"class":403},[389,3294,1621],{"class":511},[389,3296,766],{"class":403},[389,3298,3299,3301,3304],{"class":391,"line":441},[389,3300,1680],{"class":885},[389,3302,3303],{"class":889},"configs:\u002F\u002Fexamples\u002Ftyped\u002Ftext_classifier.py?schema.vocab_size=1000#model",[389,3305,1757],{"class":885},[389,3307,3308],{"class":391,"line":477},[389,3309,722],{"class":403},[389,3311,3312,3314,3316,3318,3320,3322,3324,3326],{"class":391,"line":491},[389,3313,829],{"class":399},[389,3315,503],{"class":502},[389,3317,400],{"class":399},[389,3319,258],{"class":403},[389,3321,1645],{"class":511},[389,3323,452],{"class":403},[389,3325,1650],{"class":511},[389,3327,722],{"class":403},[389,3329,3330],{"class":391,"line":496},[389,3331,433],{"emptyLinePlaceholder":432},[389,3333,3334],{"class":391,"line":527},[389,3335,3336],{"class":1606},"# Via positional override\n",[389,3338,3339,3341,3343,3345,3347,3349],{"class":391,"line":553},[389,3340,1612],{"class":399},[389,3342,503],{"class":502},[389,3344,400],{"class":399},[389,3346,258],{"class":403},[389,3348,1621],{"class":511},[389,3350,766],{"class":403},[389,3352,3353,3355,3358,3360],{"class":391,"line":578},[389,3354,1680],{"class":885},[389,3356,3357],{"class":889},"configs:\u002F\u002Fexamples\u002Ftyped\u002Ftext_classifier.py",[389,3359,893],{"class":885},[389,3361,780],{"class":403},[389,3363,3364,3366,3369,3371],{"class":391,"line":583},[389,3365,1680],{"class":885},[389,3367,3368],{"class":889},"schema.vocab_size=30000",[389,3370,893],{"class":885},[389,3372,780],{"class":403},[389,3374,3375,3377,3380,3382],{"class":391,"line":588},[389,3376,1680],{"class":885},[389,3378,3379],{"class":889},"schema.embed_dim=256",[389,3381,893],{"class":885},[389,3383,780],{"class":403},[389,3385,3386],{"class":391,"line":603},[389,3387,722],{"class":403},[389,3389,3390,3392,3394,3396,3398,3400,3402,3404,3406,3408],{"class":391,"line":614},[389,3391,829],{"class":399},[389,3393,503],{"class":502},[389,3395,400],{"class":399},[389,3397,258],{"class":403},[389,3399,1645],{"class":511},[389,3401,452],{"class":403},[389,3403,1650],{"class":511},[389,3405,258],{"class":403},[389,3407,1722],{"class":406},[389,3409,722],{"class":403},[219,3411,3412,3413,2330,3416,3419,3420,3422,3423,258],{},"Note: the override key is ",[223,3414,3415],{},"schema.vocab_size",[223,3417,3418],{},"hps.vocab_size",") because the schema is declared with ",[223,3421,237],{}," and exported as ",[223,3424,1457],{},[375,3426,1765],{"id":3427},"what-this-demonstrates-2",[278,3429,3430,3437,3446],{},[281,3431,3432,1488,3434,3436],{},[223,3433,237],{},[223,3435,3192],{},": mandatory field with accurate static type annotation",[281,3438,3439,3440,3443,3444],{},"Schema-based field access with ",[223,3441,3442],{},"L.ref(\"${schema.*}\")"," instead of ",[223,3445,2396],{},[281,3447,3448,3449,3451],{},"The ",[223,3450,237],{}," form gives pyright\u002Fmypy the correct field type without extra stubs",[260,3453],{},[263,3455,3457,3458,3460],{"id":3456},"comparison-lparams-vs-typed-groups","Comparison: ",[223,3459,229],{}," vs Typed groups",[1467,3462,3463,3480],{},[1470,3464,3465],{},[1473,3466,3467,3470,3474],{},[1476,3468,3469],{},"Property",[1476,3471,3472],{},[223,3473,229],{},[1476,3475,3476,1488,3478],{},[223,3477,237],{},[223,3479,233],{},[1493,3481,3482,3493,3506,3517,3535,3548,3563,3577],{},[1473,3483,3484,3487,3490],{},[1498,3485,3486],{},"Schema type",[1498,3488,3489],{},"Interpolation namespace",[1498,3491,3492],{},"Structured dataclass",[1473,3494,3495,3497,3500],{},[1498,3496,1542],{},[1498,3498,3499],{},"No (must override class path)",[1498,3501,3502,3503,3505],{},"Yes, named ",[223,3504,233],{}," members",[1473,3507,3508,3511,3514],{},[1498,3509,3510],{},"Static type of fields",[1498,3512,3513],{},"Inferred from default value",[1498,3515,3516],{},"Declared annotation, accurate for required fields",[1473,3518,3519,3522,3528],{},[1498,3520,3521],{},"Pyright sees required field as",[1498,3523,3524,3527],{},[223,3525,3526],{},"Any"," (sentinel default)",[1498,3529,3530,3532,3533,2659],{},[223,3531,2815],{}," (type parameter of ",[223,3534,2693],{},[1473,3536,3537,3540,3544],{},[1498,3538,3539],{},"Override key for activation",[1498,3541,3542],{},[223,3543,1576],{},[1498,3545,3546],{},[223,3547,1581],{},[1473,3549,3550,3553,3558],{},[1498,3551,3552],{},"Override key for schema field",[1498,3554,3555],{},[223,3556,3557],{},"hps.vocab_size=1000",[1498,3559,3560],{},[223,3561,3562],{},"schema.vocab_size=1000",[1473,3564,3565,3568,3573],{},[1498,3566,3567],{},"Interpolation in model body",[1498,3569,3570,3572],{},[223,3571,1453],{}," (direct attribute)",[1498,3574,3575],{},[223,3576,1446],{},[1473,3578,3579,3582,3585],{},[1498,3580,3581],{},"When to use",[1498,3583,3584],{},"Flat scalar hps, no variants needed",[1498,3586,3587],{},"Variants, structured typing, or shared schemas",[3589,3590,3591],"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 .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s2W-s, html code.shiki .s2W-s{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#032F62;--shiki-default-font-style:inherit;--shiki-dark:#9ECBFF;--shiki-dark-font-style:inherit}html pre.shiki code .sithA, html code.shiki .sithA{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#032F62;--shiki-default-font-style:inherit;--shiki-dark:#9ECBFF;--shiki-dark-font-style:inherit}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .slqww, html code.shiki .slqww{--shiki-light:#6182B8;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .swQdS, html code.shiki .swQdS{--shiki-light:#E53935;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .stp6e, html code.shiki .stp6e{--shiki-light:#39ADB5;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .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}",{"title":385,"searchDepth":429,"depth":429,"links":3593},[3594,3595,3604,3611,3618],{"id":265,"depth":415,"text":266},{"id":348,"depth":415,"text":3596,"children":3597},"1. typed\u002Fmlp.py: Swappable activations with L.Group",[3598,3599,3600,3602,3603],{"id":377,"depth":429,"text":378},{"id":1375,"depth":429,"text":1376},{"id":1461,"depth":429,"text":3601},"Side-by-side: @L.params vs typed group",{"id":1584,"depth":429,"text":1585},{"id":1764,"depth":429,"text":1765},{"id":1804,"depth":415,"text":3605,"children":3606},"2. typed\u002Flinear_regression.py: Swappable optimizers",[3607,3608,3609,3610],{"id":1829,"depth":429,"text":378},{"id":2318,"depth":429,"text":1376},{"id":2406,"depth":429,"text":1585},{"id":2625,"depth":429,"text":1765},{"id":2664,"depth":415,"text":3612,"children":3613},"3. typed\u002Ftext_classifier.py: @L.config with L.required",[3614,3615,3616,3617],{"id":2697,"depth":429,"text":378},{"id":3178,"depth":429,"text":1376},{"id":3261,"depth":429,"text":3262},{"id":3427,"depth":429,"text":1765},{"id":3456,"depth":415,"text":3619},"Comparison: @L.params vs Typed groups","md",{},{"title":148,"description":385},"bMHXnlZJqC9UrMF3gf8xT3YHlhsWWxRRZpZ5-YIG93I",{},1785687303411]