[{"data":1,"prerenderedAt":6002},["ShallowReactive",2],{"navigation":3,"api-navigation":184,"\u002Flearn\u002Ftutorials\u002Fpipeline-configs":206,"docyard:crossref-index":6001},[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":51,"body":208,"description":5995,"extension":5996,"meta":5997,"navigation":5998,"path":52,"seo":5999,"stem":53,"__hash__":6000},"content\u002F2.learn\u002F1.tutorials\u002F08.pipeline-configs.md",{"type":209,"value":210,"toc":5965},"minimark",[211,215,232,245,248,251,287,384,387,392,395,534,539,830,833,1129,1132,1155,1157,1164,1172,1449,1452,1560,1563,1571,1574,1707,1720,1722,1726,1733,1736,1926,1929,1936,1942,1960,1972,2308,2311,2313,2319,2325,2589,2592,2731,2734,2896,2899,3364,3367,3512,3515,3597,3600,3732,3735,3803,3806,3813,3819,3934,3949,3951,3955,3962,4043,4046,4124,4127,4267,4270,4530,4533,4537,4544,4639,4642,4646,4734,4736,4740,4743,4762,4774,4859,4882,4884,4891,4897,4905,4911,5036,5039,5158,5161,5168,5228,5243,5245,5249,5252,5615,5618,5620,5624,5633,5701,5704,5791,5794,5796,5800,5898,5903,5944,5946,5961],[212,213,51],"h1",{"id":214},"pipeline-configs",[216,217,218,222,223,227,228,231],"p",{},[219,220,221],"strong",{},"Prerequisites:"," ",[224,225,226],"code",{},"01.why-laco.ipynb"," through ",[224,229,230],{},"06.nested-configs-and-containers.ipynb",".",[216,233,234,222,237,240,241,244],{},[219,235,236],{},"Dependencies:",[224,238,239],{},"torch",", ",[224,242,243],{},"torchvision",". Real MNIST download cells are marked. Skip or mock them if offline.",[216,246,247],{},"The previous notebooks focused on a single component: one model, one optimizer, one\nschema. Real training pipelines wire many such components together: model, optimizer,\nloss function, dataset, and data loader, all addressable from a single config file.",[216,249,250],{},"This notebook introduces:",[252,253,254,258,264,267,274,277,280],"ol",{},[255,256,257],"li",{},"The progression from a single-component config to a full pipeline bundle.",[255,259,260,263],{},[224,261,262],{},"L.Dict",": the pipeline root that groups named components.",[255,265,266],{},"Relative imports between config files.",[255,268,269,270,273],{},"The complete ",[224,271,272],{},"pipelines\u002Fmnist_train.py"," example annotated line by line.",[255,275,276],{},"Override grammar for pipeline configs.",[255,278,279],{},"A composition diagram showing how source files relate.",[255,281,282,283,286],{},"The ",[224,284,285],{},"__file__","-loading pattern used by runnable pipeline modules.",[288,289,294],"pre",{"className":290,"code":291,"language":292,"meta":293,"style":293},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","import laco\nimport laco.language as L\nfrom omegaconf import OmegaConf\nfrom torch import nn, optim\nfrom torch.utils.data import DataLoader\n","python","",[224,295,296,309,329,343,362],{"__ignoreMap":293},[297,298,301,305],"span",{"class":299,"line":300},"line",1,[297,302,304],{"class":303},"sVHd0","import",[297,306,308],{"class":307},"su5hD"," laco\n",[297,310,312,314,317,320,323,326],{"class":299,"line":311},2,[297,313,304],{"class":303},[297,315,316],{"class":307}," laco",[297,318,231],{"class":319},"sP7_E",[297,321,198],{"class":322},"skxfh",[297,324,325],{"class":303}," as",[297,327,328],{"class":307}," L\n",[297,330,332,335,338,340],{"class":299,"line":331},3,[297,333,334],{"class":303},"from",[297,336,337],{"class":307}," omegaconf ",[297,339,304],{"class":303},[297,341,342],{"class":307}," OmegaConf\n",[297,344,346,348,351,353,356,359],{"class":299,"line":345},4,[297,347,334],{"class":303},[297,349,350],{"class":307}," torch ",[297,352,304],{"class":303},[297,354,355],{"class":307}," nn",[297,357,358],{"class":319},",",[297,360,361],{"class":307}," optim\n",[297,363,365,367,370,372,374,376,379,381],{"class":299,"line":364},5,[297,366,334],{"class":303},[297,368,369],{"class":307}," torch",[297,371,231],{"class":319},[297,373,204],{"class":307},[297,375,231],{"class":319},[297,377,378],{"class":307},"data ",[297,380,304],{"class":303},[297,382,383],{"class":307}," DataLoader\n",[385,386],"hr",{},[388,389,391],"h2",{"id":390},"section-1-from-single-component-to-pipeline","Section 1: From Single-Component to Pipeline",[216,393,394],{},"This section traces the natural progression. Each step exposes a new need.",[288,396,398],{"className":290,"code":397,"language":292,"meta":293,"style":293},"# ============================================================\n# Step 1 — A single model config\n# ============================================================\nmodel_cfg = laco.load(\"configs:\u002F\u002Fexamples\u002Ftyped\u002Fmlp.py#model\")\nprint(\"=== Single model ===\")\n# We have a recipe for one component — great.\nprint(list(OmegaConf.to_container(model_cfg, resolve=False).keys())[:3], \"...\")\n",[224,399,400,406,411,415,448,465,471],{"__ignoreMap":293},[297,401,402],{"class":299,"line":300},[297,403,405],{"class":404},"sutJx","# ============================================================\n",[297,407,408],{"class":299,"line":311},[297,409,410],{"class":404},"# Step 1 — A single model config\n",[297,412,413],{"class":299,"line":331},[297,414,405],{"class":404},[297,416,417,420,424,426,428,432,435,439,443,445],{"class":299,"line":345},[297,418,419],{"class":307},"model_cfg ",[297,421,423],{"class":422},"smGrS","=",[297,425,316],{"class":307},[297,427,231],{"class":319},[297,429,431],{"class":430},"slqww","load",[297,433,434],{"class":319},"(",[297,436,438],{"class":437},"sjJ54","\"",[297,440,442],{"class":441},"s_sjI","configs:\u002F\u002Fexamples\u002Ftyped\u002Fmlp.py#model",[297,444,438],{"class":437},[297,446,447],{"class":319},")\n",[297,449,450,454,456,458,461,463],{"class":299,"line":364},[297,451,453],{"class":452},"sptTA","print",[297,455,434],{"class":319},[297,457,438],{"class":437},[297,459,460],{"class":441},"=== Single model ===",[297,462,438],{"class":437},[297,464,447],{"class":319},[297,466,468],{"class":299,"line":467},6,[297,469,470],{"class":404},"# We have a recipe for one component — great.\n",[297,472,474,476,478,482,484,487,489,492,494,497,499,503,505,509,512,514,517,521,524,527,530,532],{"class":299,"line":473},7,[297,475,453],{"class":452},[297,477,434],{"class":319},[297,479,481],{"class":480},"sZMiF","list",[297,483,434],{"class":319},[297,485,486],{"class":430},"OmegaConf",[297,488,231],{"class":319},[297,490,491],{"class":430},"to_container",[297,493,434],{"class":319},[297,495,496],{"class":430},"model_cfg",[297,498,358],{"class":319},[297,500,502],{"class":501},"s99_P"," resolve",[297,504,423],{"class":422},[297,506,508],{"class":507},"s39Yj","False",[297,510,511],{"class":319},").",[297,513,195],{"class":430},[297,515,516],{"class":319},"())[:",[297,518,520],{"class":519},"srdBf","3",[297,522,523],{"class":319},"],",[297,525,526],{"class":437}," \"",[297,528,529],{"class":441},"...",[297,531,438],{"class":437},[297,533,447],{"class":319},[535,536],"docyard-notebook-output",{"data":537,"kind":538},"PT09IFNpbmdsZSBtb2RlbCA9PT0KWydfdGFyZ2V0XycsICdfYXJnc18nLCAnX2NvbnZlcnRfJ10gLi4uCg==","stream",[288,540,542],{"className":290,"code":541,"language":292,"meta":293,"style":293},"# ============================================================\n# Step 2 — Model + optimizer as two separate objects\n# ============================================================\nfrom laco.examples.typed.linear_regression import (\n    model as lr_model_cfg,\n    optimizer as lr_optim_cfg,\n    OptimGroup,\n)\n\n# The two exports are *different kinds* of node:\n#   - model     : a fully-formed DictConfig recipe (it has a _target_)\n#   - optimizer : L.chosen(OptimGroup) — a *slot reference* into a typed\n#                 group (an interpolation like '${optimgroup}'), not a\n#                 standalone recipe, so it has no _target_ of its own.\nprint(\"model type        :\", type(lr_model_cfg).__name__)\nprint(\"model _target_    :\", lr_model_cfg._target_)   # type: ignore[union-attr]  # noqa: LACO001\nprint(\"optimizer type    :\", type(lr_optim_cfg).__name__)\nprint(\"optimizer ref     :\", str(lr_optim_cfg))\nprint(\"chosen variant    :\", OptimGroup.sgd._target_)  # what the slot resolves to\n\n# Problem: they are two separate objects with no shared namespace.\n# A training loop would call laco.load() twice, with different fragment paths.\n# There is no way to load *all components at once* or serialize the whole pipeline.\n",[224,543,544,548,553,557,583,597,609,616,621,628,634,640,646,652,658,690,719,748,774,807,812,818,824],{"__ignoreMap":293},[297,545,546],{"class":299,"line":300},[297,547,405],{"class":404},[297,549,550],{"class":299,"line":311},[297,551,552],{"class":404},"# Step 2 — Model + optimizer as two separate objects\n",[297,554,555],{"class":299,"line":331},[297,556,405],{"class":404},[297,558,559,561,563,565,568,570,573,575,578,580],{"class":299,"line":345},[297,560,334],{"class":303},[297,562,316],{"class":307},[297,564,231],{"class":319},[297,566,567],{"class":307},"examples",[297,569,231],{"class":319},[297,571,572],{"class":307},"typed",[297,574,231],{"class":319},[297,576,577],{"class":307},"linear_regression ",[297,579,304],{"class":303},[297,581,582],{"class":319}," (\n",[297,584,585,588,591,594],{"class":299,"line":364},[297,586,587],{"class":307},"    model ",[297,589,590],{"class":303},"as",[297,592,593],{"class":307}," lr_model_cfg",[297,595,596],{"class":319},",\n",[297,598,599,602,604,607],{"class":299,"line":467},[297,600,601],{"class":307},"    optimizer ",[297,603,590],{"class":303},[297,605,606],{"class":307}," lr_optim_cfg",[297,608,596],{"class":319},[297,610,611,614],{"class":299,"line":473},[297,612,613],{"class":307},"    OptimGroup",[297,615,596],{"class":319},[297,617,619],{"class":299,"line":618},8,[297,620,447],{"class":319},[297,622,624],{"class":299,"line":623},9,[297,625,627],{"emptyLinePlaceholder":626},true,"\n",[297,629,631],{"class":299,"line":630},10,[297,632,633],{"class":404},"# The two exports are *different kinds* of node:\n",[297,635,637],{"class":299,"line":636},11,[297,638,639],{"class":404},"#   - model     : a fully-formed DictConfig recipe (it has a _target_)\n",[297,641,643],{"class":299,"line":642},12,[297,644,645],{"class":404},"#   - optimizer : L.chosen(OptimGroup) — a *slot reference* into a typed\n",[297,647,649],{"class":299,"line":648},13,[297,650,651],{"class":404},"#                 group (an interpolation like '${optimgroup}'), not a\n",[297,653,655],{"class":299,"line":654},14,[297,656,657],{"class":404},"#                 standalone recipe, so it has no _target_ of its own.\n",[297,659,661,663,665,667,670,672,674,677,679,682,684,688],{"class":299,"line":660},15,[297,662,453],{"class":452},[297,664,434],{"class":319},[297,666,438],{"class":437},[297,668,669],{"class":441},"model type        :",[297,671,438],{"class":437},[297,673,358],{"class":319},[297,675,676],{"class":480}," type",[297,678,434],{"class":319},[297,680,681],{"class":430},"lr_model_cfg",[297,683,511],{"class":319},[297,685,687],{"class":686},"s_hVV","__name__",[297,689,447],{"class":319},[297,691,693,695,697,699,702,704,706,708,710,713,716],{"class":299,"line":692},16,[297,694,453],{"class":452},[297,696,434],{"class":319},[297,698,438],{"class":437},[297,700,701],{"class":441},"model _target_    :",[297,703,438],{"class":437},[297,705,358],{"class":319},[297,707,593],{"class":430},[297,709,231],{"class":319},[297,711,712],{"class":322},"_target_",[297,714,715],{"class":319},")",[297,717,718],{"class":404},"   # type: ignore[union-attr]  # noqa: LACO001\n",[297,720,722,724,726,728,731,733,735,737,739,742,744,746],{"class":299,"line":721},17,[297,723,453],{"class":452},[297,725,434],{"class":319},[297,727,438],{"class":437},[297,729,730],{"class":441},"optimizer type    :",[297,732,438],{"class":437},[297,734,358],{"class":319},[297,736,676],{"class":480},[297,738,434],{"class":319},[297,740,741],{"class":430},"lr_optim_cfg",[297,743,511],{"class":319},[297,745,687],{"class":686},[297,747,447],{"class":319},[297,749,751,753,755,757,760,762,764,767,769,771],{"class":299,"line":750},18,[297,752,453],{"class":452},[297,754,434],{"class":319},[297,756,438],{"class":437},[297,758,759],{"class":441},"optimizer ref     :",[297,761,438],{"class":437},[297,763,358],{"class":319},[297,765,766],{"class":480}," str",[297,768,434],{"class":319},[297,770,741],{"class":430},[297,772,773],{"class":319},"))\n",[297,775,777,779,781,783,786,788,790,793,795,798,800,802,804],{"class":299,"line":776},19,[297,778,453],{"class":452},[297,780,434],{"class":319},[297,782,438],{"class":437},[297,784,785],{"class":441},"chosen variant    :",[297,787,438],{"class":437},[297,789,358],{"class":319},[297,791,792],{"class":430}," OptimGroup",[297,794,231],{"class":319},[297,796,797],{"class":322},"sgd",[297,799,231],{"class":319},[297,801,712],{"class":322},[297,803,715],{"class":319},[297,805,806],{"class":404},"  # what the slot resolves to\n",[297,808,810],{"class":299,"line":809},20,[297,811,627],{"emptyLinePlaceholder":626},[297,813,815],{"class":299,"line":814},21,[297,816,817],{"class":404},"# Problem: they are two separate objects with no shared namespace.\n",[297,819,821],{"class":299,"line":820},22,[297,822,823],{"class":404},"# A training loop would call laco.load() twice, with different fragment paths.\n",[297,825,827],{"class":299,"line":826},23,[297,828,829],{"class":404},"# There is no way to load *all components at once* or serialize the whole pipeline.\n",[535,831],{"data":832,"kind":538},"bW9kZWwgdHlwZSAgICAgICAgOiBEaWN0Q29uZmlnCm1vZGVsIF90YXJnZXRfICAgIDogdG9yY2gubm4uTGluZWFyCm9wdGltaXplciB0eXBlICAgIDogX1Nsb3RSZWYKb3B0aW1pemVyIHJlZiAgICAgOiAke29wdGltZ3JvdXB9CmNob3NlbiB2YXJpYW50ICAgIDogdG9yY2gub3B0aW0uU0dECg==",[288,834,836],{"className":290,"code":835,"language":292,"meta":293,"style":293},"# ============================================================\n# Step 3 — Bundle them into one tree\n# ============================================================\n# The model recipe references '${schema.*}' interpolations, and the optimizer\n# is a group slot. To dump\u002Finstantiate a *self-contained* bundle, gather the\n# components together with a concrete `schema` node so the references resolve\n# (laco.load does this bundling for you when it reads a whole file; here we do\n# it by hand for an isolated fragment).\nfrom laco.examples.typed.linear_regression import (\n    model as lr_model_cfg,\n    OptimGroup,\n)\n\ntrain_bundle = OmegaConf.create({\n    \"schema\": {\"in_features\": 4, \"out_features\": 1, \"bias\": True},\n    \"model\": lr_model_cfg,\n    \"optimizer\": OptimGroup.sgd,   # the concrete optimizer the slot resolves to\n})\n\nprint(\"Bundle keys:\", list(OmegaConf.to_container(train_bundle, resolve=False).keys()))\nprint(\"\\n--- bundle dump (schema lets the model's interpolations resolve) ---\")\nprint(laco.dump(train_bundle))\n",[224,837,838,842,847,851,856,861,866,871,876,898,908,914,918,922,940,999,1014,1036,1041,1045,1091,1109],{"__ignoreMap":293},[297,839,840],{"class":299,"line":300},[297,841,405],{"class":404},[297,843,844],{"class":299,"line":311},[297,845,846],{"class":404},"# Step 3 — Bundle them into one tree\n",[297,848,849],{"class":299,"line":331},[297,850,405],{"class":404},[297,852,853],{"class":299,"line":345},[297,854,855],{"class":404},"# The model recipe references '${schema.*}' interpolations, and the optimizer\n",[297,857,858],{"class":299,"line":364},[297,859,860],{"class":404},"# is a group slot. To dump\u002Finstantiate a *self-contained* bundle, gather the\n",[297,862,863],{"class":299,"line":467},[297,864,865],{"class":404},"# components together with a concrete `schema` node so the references resolve\n",[297,867,868],{"class":299,"line":473},[297,869,870],{"class":404},"# (laco.load does this bundling for you when it reads a whole file; here we do\n",[297,872,873],{"class":299,"line":618},[297,874,875],{"class":404},"# it by hand for an isolated fragment).\n",[297,877,878,880,882,884,886,888,890,892,894,896],{"class":299,"line":623},[297,879,334],{"class":303},[297,881,316],{"class":307},[297,883,231],{"class":319},[297,885,567],{"class":307},[297,887,231],{"class":319},[297,889,572],{"class":307},[297,891,231],{"class":319},[297,893,577],{"class":307},[297,895,304],{"class":303},[297,897,582],{"class":319},[297,899,900,902,904,906],{"class":299,"line":630},[297,901,587],{"class":307},[297,903,590],{"class":303},[297,905,593],{"class":307},[297,907,596],{"class":319},[297,909,910,912],{"class":299,"line":636},[297,911,613],{"class":307},[297,913,596],{"class":319},[297,915,916],{"class":299,"line":642},[297,917,447],{"class":319},[297,919,920],{"class":299,"line":648},[297,921,627],{"emptyLinePlaceholder":626},[297,923,924,927,929,932,934,937],{"class":299,"line":654},[297,925,926],{"class":307},"train_bundle ",[297,928,423],{"class":422},[297,930,931],{"class":307}," OmegaConf",[297,933,231],{"class":319},[297,935,936],{"class":430},"create",[297,938,939],{"class":319},"({\n",[297,941,942,945,948,950,953,956,958,961,963,965,968,970,972,975,977,979,982,984,986,989,991,993,996],{"class":299,"line":660},[297,943,944],{"class":437},"    \"",[297,946,947],{"class":441},"schema",[297,949,438],{"class":437},[297,951,952],{"class":319},":",[297,954,955],{"class":319}," {",[297,957,438],{"class":437},[297,959,960],{"class":441},"in_features",[297,962,438],{"class":437},[297,964,952],{"class":319},[297,966,967],{"class":519}," 4",[297,969,358],{"class":319},[297,971,526],{"class":437},[297,973,974],{"class":441},"out_features",[297,976,438],{"class":437},[297,978,952],{"class":319},[297,980,981],{"class":519}," 1",[297,983,358],{"class":319},[297,985,526],{"class":437},[297,987,988],{"class":441},"bias",[297,990,438],{"class":437},[297,992,952],{"class":319},[297,994,995],{"class":507}," True",[297,997,998],{"class":319},"},\n",[297,1000,1001,1003,1006,1008,1010,1012],{"class":299,"line":692},[297,1002,944],{"class":437},[297,1004,1005],{"class":441},"model",[297,1007,438],{"class":437},[297,1009,952],{"class":319},[297,1011,593],{"class":430},[297,1013,596],{"class":319},[297,1015,1016,1018,1021,1023,1025,1027,1029,1031,1033],{"class":299,"line":721},[297,1017,944],{"class":437},[297,1019,1020],{"class":441},"optimizer",[297,1022,438],{"class":437},[297,1024,952],{"class":319},[297,1026,792],{"class":430},[297,1028,231],{"class":319},[297,1030,797],{"class":322},[297,1032,358],{"class":319},[297,1034,1035],{"class":404},"   # the concrete optimizer the slot resolves to\n",[297,1037,1038],{"class":299,"line":750},[297,1039,1040],{"class":319},"})\n",[297,1042,1043],{"class":299,"line":776},[297,1044,627],{"emptyLinePlaceholder":626},[297,1046,1047,1049,1051,1053,1056,1058,1060,1063,1065,1067,1069,1071,1073,1076,1078,1080,1082,1084,1086,1088],{"class":299,"line":809},[297,1048,453],{"class":452},[297,1050,434],{"class":319},[297,1052,438],{"class":437},[297,1054,1055],{"class":441},"Bundle keys:",[297,1057,438],{"class":437},[297,1059,358],{"class":319},[297,1061,1062],{"class":480}," list",[297,1064,434],{"class":319},[297,1066,486],{"class":430},[297,1068,231],{"class":319},[297,1070,491],{"class":430},[297,1072,434],{"class":319},[297,1074,1075],{"class":430},"train_bundle",[297,1077,358],{"class":319},[297,1079,502],{"class":501},[297,1081,423],{"class":422},[297,1083,508],{"class":507},[297,1085,511],{"class":319},[297,1087,195],{"class":430},[297,1089,1090],{"class":319},"()))\n",[297,1092,1093,1095,1097,1099,1102,1105,1107],{"class":299,"line":814},[297,1094,453],{"class":452},[297,1096,434],{"class":319},[297,1098,438],{"class":437},[297,1100,1101],{"class":686},"\\n",[297,1103,1104],{"class":441},"--- bundle dump (schema lets the model's interpolations resolve) ---",[297,1106,438],{"class":437},[297,1108,447],{"class":319},[297,1110,1111,1113,1115,1118,1120,1123,1125,1127],{"class":299,"line":820},[297,1112,453],{"class":452},[297,1114,434],{"class":319},[297,1116,1117],{"class":430},"laco",[297,1119,231],{"class":319},[297,1121,1122],{"class":430},"dump",[297,1124,434],{"class":319},[297,1126,1075],{"class":430},[297,1128,773],{"class":319},[535,1130],{"data":1131,"kind":538},"QnVuZGxlIGtleXM6IFsnc2NoZW1hJywgJ21vZGVsJywgJ29wdGltaXplciddCgotLS0gYnVuZGxlIGR1bXAgKHNjaGVtYSBsZXRzIHRoZSBtb2RlbCdzIGludGVycG9sYXRpb25zIHJlc29sdmUpIC0tLQpfbGFjb186IDEKbW9kZWw6IHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLkxpbmVhciwgYmlhczogJyR7c2NoZW1hLmJpYXN9JywgaW5fZmVhdHVyZXM6ICcke3NjaGVtYS5pbl9mZWF0dXJlc30nLAogIG91dF9mZWF0dXJlczogJyR7c2NoZW1hLm91dF9mZWF0dXJlc30nfQpvcHRpbWl6ZXI6IHtfY29udmVydF86IGFsbCwgX3BhcnRpYWxfOiB0cnVlLCBfdGFyZ2V0XzogdG9yY2gub3B0aW0uU0dELCBscjogMC4wMSwKICBtb21lbnR1bTogMC45fQpzY2hlbWE6IHtiaWFzOiB0cnVlLCBpbl9mZWF0dXJlczogNCwgb3V0X2ZlYXR1cmVzOiAxfQoK",[216,1133,1134,1136,1137,1140,1141,1143,1144,1147,1148,596,1151,1154],{},[224,1135,262],{}," is a plain ",[224,1138,1139],{},"DictConfig"," wrapper: it does not add any ",[224,1142,712],{}," key of its\nown. After ",[224,1145,1146],{},"laco.load(\"pipeline.py#train\")"," the bundle config can be inspected,\nserialized, or passed to a training loop that calls ",[224,1149,1150],{},"laco.instantiate(cfg.model)",[224,1152,1153],{},"laco.instantiate(cfg.optimizer, model.parameters())",", etc.",[385,1156],{},[388,1158,1160,1161,1163],{"id":1159},"section-2-ldict-the-pipeline-root","Section 2: ",[224,1162,262],{},", The Pipeline Root",[216,1165,1166,1168,1169,1171],{},[224,1167,262],{}," accepts keyword arguments whose values are config nodes and produces a single\n",[224,1170,1139],{}," that holds all of them under their keyword names. This lets a downstream\ncaller get all components from a single fragment:",[288,1173,1175],{"className":290,"code":1174,"language":292,"meta":293,"style":293},"# Build a minimal pipeline bundle inline (no actual MNIST)\nmodel_cfg   = L.call(nn.Linear)(in_features=784, out_features=10)\noptimizer_cfg = L.partial(optim.Adam)(lr=1e-3)\nloss_cfg    = L.call(nn.CrossEntropyLoss)()\n\npipeline = L.Dict(\n    model=model_cfg,\n    optimizer=optimizer_cfg,\n    loss=loss_cfg,\n)\n\nprint(\"Top-level keys:\", list(OmegaConf.to_container(pipeline, resolve=False).keys()))\n\n# Each sub-node is a fully self-contained DictConfig recipe\nprint(\"\\nmodel node:\")\nprint(laco.dump(pipeline.model))   # type: ignore[union-attr]  # noqa: LACO001\n",[224,1176,1177,1182,1229,1265,1290,1294,1311,1322,1334,1346,1350,1354,1398,1402,1407,1424],{"__ignoreMap":293},[297,1178,1179],{"class":299,"line":300},[297,1180,1181],{"class":404},"# Build a minimal pipeline bundle inline (no actual MNIST)\n",[297,1183,1184,1187,1189,1192,1194,1197,1199,1202,1204,1207,1210,1212,1214,1217,1219,1222,1224,1227],{"class":299,"line":311},[297,1185,1186],{"class":307},"model_cfg   ",[297,1188,423],{"class":422},[297,1190,1191],{"class":307}," L",[297,1193,231],{"class":319},[297,1195,1196],{"class":430},"call",[297,1198,434],{"class":319},[297,1200,1201],{"class":430},"nn",[297,1203,231],{"class":319},[297,1205,1206],{"class":322},"Linear",[297,1208,1209],{"class":319},")(",[297,1211,960],{"class":501},[297,1213,423],{"class":422},[297,1215,1216],{"class":519},"784",[297,1218,358],{"class":319},[297,1220,1221],{"class":501}," out_features",[297,1223,423],{"class":422},[297,1225,1226],{"class":519},"10",[297,1228,447],{"class":319},[297,1230,1231,1234,1236,1238,1240,1243,1245,1248,1250,1253,1255,1258,1260,1263],{"class":299,"line":331},[297,1232,1233],{"class":307},"optimizer_cfg ",[297,1235,423],{"class":422},[297,1237,1191],{"class":307},[297,1239,231],{"class":319},[297,1241,1242],{"class":430},"partial",[297,1244,434],{"class":319},[297,1246,1247],{"class":430},"optim",[297,1249,231],{"class":319},[297,1251,1252],{"class":322},"Adam",[297,1254,1209],{"class":319},[297,1256,1257],{"class":501},"lr",[297,1259,423],{"class":422},[297,1261,1262],{"class":519},"1e-3",[297,1264,447],{"class":319},[297,1266,1267,1270,1272,1274,1276,1278,1280,1282,1284,1287],{"class":299,"line":345},[297,1268,1269],{"class":307},"loss_cfg    ",[297,1271,423],{"class":422},[297,1273,1191],{"class":307},[297,1275,231],{"class":319},[297,1277,1196],{"class":430},[297,1279,434],{"class":319},[297,1281,1201],{"class":430},[297,1283,231],{"class":319},[297,1285,1286],{"class":322},"CrossEntropyLoss",[297,1288,1289],{"class":319},")()\n",[297,1291,1292],{"class":299,"line":364},[297,1293,627],{"emptyLinePlaceholder":626},[297,1295,1296,1299,1301,1303,1305,1308],{"class":299,"line":467},[297,1297,1298],{"class":307},"pipeline ",[297,1300,423],{"class":422},[297,1302,1191],{"class":307},[297,1304,231],{"class":319},[297,1306,1307],{"class":430},"Dict",[297,1309,1310],{"class":319},"(\n",[297,1312,1313,1316,1318,1320],{"class":299,"line":473},[297,1314,1315],{"class":501},"    model",[297,1317,423],{"class":422},[297,1319,496],{"class":430},[297,1321,596],{"class":319},[297,1323,1324,1327,1329,1332],{"class":299,"line":618},[297,1325,1326],{"class":501},"    optimizer",[297,1328,423],{"class":422},[297,1330,1331],{"class":430},"optimizer_cfg",[297,1333,596],{"class":319},[297,1335,1336,1339,1341,1344],{"class":299,"line":623},[297,1337,1338],{"class":501},"    loss",[297,1340,423],{"class":422},[297,1342,1343],{"class":430},"loss_cfg",[297,1345,596],{"class":319},[297,1347,1348],{"class":299,"line":630},[297,1349,447],{"class":319},[297,1351,1352],{"class":299,"line":636},[297,1353,627],{"emptyLinePlaceholder":626},[297,1355,1356,1358,1360,1362,1365,1367,1369,1371,1373,1375,1377,1379,1381,1384,1386,1388,1390,1392,1394,1396],{"class":299,"line":642},[297,1357,453],{"class":452},[297,1359,434],{"class":319},[297,1361,438],{"class":437},[297,1363,1364],{"class":441},"Top-level keys:",[297,1366,438],{"class":437},[297,1368,358],{"class":319},[297,1370,1062],{"class":480},[297,1372,434],{"class":319},[297,1374,486],{"class":430},[297,1376,231],{"class":319},[297,1378,491],{"class":430},[297,1380,434],{"class":319},[297,1382,1383],{"class":430},"pipeline",[297,1385,358],{"class":319},[297,1387,502],{"class":501},[297,1389,423],{"class":422},[297,1391,508],{"class":507},[297,1393,511],{"class":319},[297,1395,195],{"class":430},[297,1397,1090],{"class":319},[297,1399,1400],{"class":299,"line":648},[297,1401,627],{"emptyLinePlaceholder":626},[297,1403,1404],{"class":299,"line":654},[297,1405,1406],{"class":404},"# Each sub-node is a fully self-contained DictConfig recipe\n",[297,1408,1409,1411,1413,1415,1417,1420,1422],{"class":299,"line":660},[297,1410,453],{"class":452},[297,1412,434],{"class":319},[297,1414,438],{"class":437},[297,1416,1101],{"class":686},[297,1418,1419],{"class":441},"model node:",[297,1421,438],{"class":437},[297,1423,447],{"class":319},[297,1425,1426,1428,1430,1432,1434,1436,1438,1440,1442,1444,1447],{"class":299,"line":692},[297,1427,453],{"class":452},[297,1429,434],{"class":319},[297,1431,1117],{"class":430},[297,1433,231],{"class":319},[297,1435,1122],{"class":430},[297,1437,434],{"class":319},[297,1439,1383],{"class":430},[297,1441,231],{"class":319},[297,1443,1005],{"class":322},[297,1445,1446],{"class":319},"))",[297,1448,718],{"class":404},[535,1450],{"data":1451,"kind":538},"VG9wLWxldmVsIGtleXM6IFsnX3RhcmdldF8nLCAnX2NvbnZlcnRfJywgJ21vZGVsJywgJ29wdGltaXplcicsICdsb3NzJ10KCm1vZGVsIG5vZGU6CntfY29udmVydF86IGFsbCwgX2xhY29fOiAxLCBfdGFyZ2V0XzogdG9yY2gubm4uTGluZWFyLCBpbl9mZWF0dXJlczogNzg0LCBvdXRfZmVhdHVyZXM6IDEwfQoK",[288,1453,1455],{"className":290,"code":1454,"language":292,"meta":293,"style":293},"# Instantiate only what you need — no need to materialise the whole pipeline\nmodel_obj = laco.instantiate(pipeline.model)        # type: ignore[union-attr]  # noqa: LACO001\nloss_obj  = laco.instantiate(pipeline.loss)         # type: ignore[union-attr]  # noqa: LACO001\n\nprint(\"model:\", model_obj)\nprint(\"loss: \", loss_obj)\n",[224,1456,1457,1462,1489,1516,1520,1540],{"__ignoreMap":293},[297,1458,1459],{"class":299,"line":300},[297,1460,1461],{"class":404},"# Instantiate only what you need — no need to materialise the whole pipeline\n",[297,1463,1464,1467,1469,1471,1473,1476,1478,1480,1482,1484,1486],{"class":299,"line":311},[297,1465,1466],{"class":307},"model_obj ",[297,1468,423],{"class":422},[297,1470,316],{"class":307},[297,1472,231],{"class":319},[297,1474,1475],{"class":430},"instantiate",[297,1477,434],{"class":319},[297,1479,1383],{"class":430},[297,1481,231],{"class":319},[297,1483,1005],{"class":322},[297,1485,715],{"class":319},[297,1487,1488],{"class":404},"        # type: ignore[union-attr]  # noqa: LACO001\n",[297,1490,1491,1494,1496,1498,1500,1502,1504,1506,1508,1511,1513],{"class":299,"line":331},[297,1492,1493],{"class":307},"loss_obj  ",[297,1495,423],{"class":422},[297,1497,316],{"class":307},[297,1499,231],{"class":319},[297,1501,1475],{"class":430},[297,1503,434],{"class":319},[297,1505,1383],{"class":430},[297,1507,231],{"class":319},[297,1509,1510],{"class":322},"loss",[297,1512,715],{"class":319},[297,1514,1515],{"class":404},"         # type: ignore[union-attr]  # noqa: LACO001\n",[297,1517,1518],{"class":299,"line":345},[297,1519,627],{"emptyLinePlaceholder":626},[297,1521,1522,1524,1526,1528,1531,1533,1535,1538],{"class":299,"line":364},[297,1523,453],{"class":452},[297,1525,434],{"class":319},[297,1527,438],{"class":437},[297,1529,1530],{"class":441},"model:",[297,1532,438],{"class":437},[297,1534,358],{"class":319},[297,1536,1537],{"class":430}," model_obj",[297,1539,447],{"class":319},[297,1541,1542,1544,1546,1548,1551,1553,1555,1558],{"class":299,"line":467},[297,1543,453],{"class":452},[297,1545,434],{"class":319},[297,1547,438],{"class":437},[297,1549,1550],{"class":441},"loss: ",[297,1552,438],{"class":437},[297,1554,358],{"class":319},[297,1556,1557],{"class":430}," loss_obj",[297,1559,447],{"class":319},[535,1561],{"data":1562,"kind":538},"bW9kZWw6IExpbmVhcihpbl9mZWF0dXJlcz03ODQsIG91dF9mZWF0dXJlcz0xMCwgYmlhcz1UcnVlKQpsb3NzOiAgQ3Jvc3NFbnRyb3B5TG9zcygpCg==",[1564,1565,282,1567,1570],"h3",{"id":1566},"the-train-fragment-pattern",[224,1568,1569],{},"#train"," fragment pattern",[216,1572,1573],{},"In a real config file you expose the bundle under a stable name:",[288,1575,1577],{"className":290,"code":1576,"language":292,"meta":293,"style":293},"# pipeline.py\nmodel     = L.call(MyModel)(...)\noptimizer = L.partial(optim.Adam)(lr=1e-3)\nloss      = L.call(nn.CrossEntropyLoss)()\n\ntrain = L.Dict(model=model, optimizer=optimizer, loss=loss)\n",[224,1578,1579,1584,1608,1639,1662,1666],{"__ignoreMap":293},[297,1580,1581],{"class":299,"line":300},[297,1582,1583],{"class":404},"# pipeline.py\n",[297,1585,1586,1589,1591,1593,1595,1597,1599,1602,1604,1606],{"class":299,"line":311},[297,1587,1588],{"class":307},"model     ",[297,1590,423],{"class":422},[297,1592,1191],{"class":307},[297,1594,231],{"class":319},[297,1596,1196],{"class":430},[297,1598,434],{"class":319},[297,1600,1601],{"class":430},"MyModel",[297,1603,1209],{"class":319},[297,1605,529],{"class":452},[297,1607,447],{"class":319},[297,1609,1610,1613,1615,1617,1619,1621,1623,1625,1627,1629,1631,1633,1635,1637],{"class":299,"line":331},[297,1611,1612],{"class":307},"optimizer ",[297,1614,423],{"class":422},[297,1616,1191],{"class":307},[297,1618,231],{"class":319},[297,1620,1242],{"class":430},[297,1622,434],{"class":319},[297,1624,1247],{"class":430},[297,1626,231],{"class":319},[297,1628,1252],{"class":322},[297,1630,1209],{"class":319},[297,1632,1257],{"class":501},[297,1634,423],{"class":422},[297,1636,1262],{"class":519},[297,1638,447],{"class":319},[297,1640,1641,1644,1646,1648,1650,1652,1654,1656,1658,1660],{"class":299,"line":345},[297,1642,1643],{"class":307},"loss      ",[297,1645,423],{"class":422},[297,1647,1191],{"class":307},[297,1649,231],{"class":319},[297,1651,1196],{"class":430},[297,1653,434],{"class":319},[297,1655,1201],{"class":430},[297,1657,231],{"class":319},[297,1659,1286],{"class":322},[297,1661,1289],{"class":319},[297,1663,1664],{"class":299,"line":364},[297,1665,627],{"emptyLinePlaceholder":626},[297,1667,1668,1671,1673,1675,1677,1679,1681,1683,1685,1687,1689,1692,1694,1696,1698,1701,1703,1705],{"class":299,"line":467},[297,1669,1670],{"class":307},"train ",[297,1672,423],{"class":422},[297,1674,1191],{"class":307},[297,1676,231],{"class":319},[297,1678,1307],{"class":430},[297,1680,434],{"class":319},[297,1682,1005],{"class":501},[297,1684,423],{"class":422},[297,1686,1005],{"class":430},[297,1688,358],{"class":319},[297,1690,1691],{"class":501}," optimizer",[297,1693,423],{"class":422},[297,1695,1020],{"class":430},[297,1697,358],{"class":319},[297,1699,1700],{"class":501}," loss",[297,1702,423],{"class":422},[297,1704,1510],{"class":430},[297,1706,447],{"class":319},[216,1708,1709,1710,1712,1713,1715,1716,1719],{},"Then a caller loads ",[224,1711,1146],{}," and gets a single ",[224,1714,1139],{},"\ncontaining all three components. Individual components are still accessible via\n",[224,1717,1718],{},"laco.load(\"pipeline.py#model\")",". The two access patterns coexist.",[385,1721],{},[388,1723,1725],{"id":1724},"section-3-relative-imports-in-config-files","Section 3: Relative Imports in Config Files",[216,1727,1728,1729,1732],{},"Config files are regular Python modules. This means they can import from each other\nusing the standard ",[224,1730,1731],{},"from package.module import name"," pattern.",[216,1734,1735],{},"The MNIST pipeline imports a factory from the CNN classifier example:",[288,1737,1739],{"className":290,"code":1738,"language":292,"meta":293,"style":293},"# The import at the top of mnist_train.py:\n#\n#   from laco.examples.cnn_classifier import make_cnn_classifier\n#\n# This imports a Python *function* (not a DictConfig node).\n# The function returns a DictConfig tree when called, so calling it inside\n# the pipeline file is like inlining the config construction.\n\nfrom laco.examples.cnn_classifier import make_cnn_classifier\n\n# Calling the factory with explicit arguments returns a DictConfig tree\ncnn_cfg = make_cnn_classifier(\n    in_channels=1,\n    base_channels=16,\n    num_stages=2,\n    num_classes=10,\n)\n\nprint(\"type:\", type(cnn_cfg))\nprint(\"_target_:\", cnn_cfg._target_)  # noqa: LACO001\n",[224,1740,1741,1746,1751,1756,1760,1765,1770,1775,1779,1799,1803,1808,1820,1832,1844,1856,1867,1871,1875,1899],{"__ignoreMap":293},[297,1742,1743],{"class":299,"line":300},[297,1744,1745],{"class":404},"# The import at the top of mnist_train.py:\n",[297,1747,1748],{"class":299,"line":311},[297,1749,1750],{"class":404},"#\n",[297,1752,1753],{"class":299,"line":331},[297,1754,1755],{"class":404},"#   from laco.examples.cnn_classifier import make_cnn_classifier\n",[297,1757,1758],{"class":299,"line":345},[297,1759,1750],{"class":404},[297,1761,1762],{"class":299,"line":364},[297,1763,1764],{"class":404},"# This imports a Python *function* (not a DictConfig node).\n",[297,1766,1767],{"class":299,"line":467},[297,1768,1769],{"class":404},"# The function returns a DictConfig tree when called, so calling it inside\n",[297,1771,1772],{"class":299,"line":473},[297,1773,1774],{"class":404},"# the pipeline file is like inlining the config construction.\n",[297,1776,1777],{"class":299,"line":618},[297,1778,627],{"emptyLinePlaceholder":626},[297,1780,1781,1783,1785,1787,1789,1791,1794,1796],{"class":299,"line":623},[297,1782,334],{"class":303},[297,1784,316],{"class":307},[297,1786,231],{"class":319},[297,1788,567],{"class":307},[297,1790,231],{"class":319},[297,1792,1793],{"class":307},"cnn_classifier ",[297,1795,304],{"class":303},[297,1797,1798],{"class":307}," make_cnn_classifier\n",[297,1800,1801],{"class":299,"line":630},[297,1802,627],{"emptyLinePlaceholder":626},[297,1804,1805],{"class":299,"line":636},[297,1806,1807],{"class":404},"# Calling the factory with explicit arguments returns a DictConfig tree\n",[297,1809,1810,1813,1815,1818],{"class":299,"line":642},[297,1811,1812],{"class":307},"cnn_cfg ",[297,1814,423],{"class":422},[297,1816,1817],{"class":430}," make_cnn_classifier",[297,1819,1310],{"class":319},[297,1821,1822,1825,1827,1830],{"class":299,"line":648},[297,1823,1824],{"class":501},"    in_channels",[297,1826,423],{"class":422},[297,1828,1829],{"class":519},"1",[297,1831,596],{"class":319},[297,1833,1834,1837,1839,1842],{"class":299,"line":654},[297,1835,1836],{"class":501},"    base_channels",[297,1838,423],{"class":422},[297,1840,1841],{"class":519},"16",[297,1843,596],{"class":319},[297,1845,1846,1849,1851,1854],{"class":299,"line":660},[297,1847,1848],{"class":501},"    num_stages",[297,1850,423],{"class":422},[297,1852,1853],{"class":519},"2",[297,1855,596],{"class":319},[297,1857,1858,1861,1863,1865],{"class":299,"line":692},[297,1859,1860],{"class":501},"    num_classes",[297,1862,423],{"class":422},[297,1864,1226],{"class":519},[297,1866,596],{"class":319},[297,1868,1869],{"class":299,"line":721},[297,1870,447],{"class":319},[297,1872,1873],{"class":299,"line":750},[297,1874,627],{"emptyLinePlaceholder":626},[297,1876,1877,1879,1881,1883,1886,1888,1890,1892,1894,1897],{"class":299,"line":776},[297,1878,453],{"class":452},[297,1880,434],{"class":319},[297,1882,438],{"class":437},[297,1884,1885],{"class":441},"type:",[297,1887,438],{"class":437},[297,1889,358],{"class":319},[297,1891,676],{"class":480},[297,1893,434],{"class":319},[297,1895,1896],{"class":430},"cnn_cfg",[297,1898,773],{"class":319},[297,1900,1901,1903,1905,1907,1910,1912,1914,1917,1919,1921,1923],{"class":299,"line":809},[297,1902,453],{"class":452},[297,1904,434],{"class":319},[297,1906,438],{"class":437},[297,1908,1909],{"class":441},"_target_:",[297,1911,438],{"class":437},[297,1913,358],{"class":319},[297,1915,1916],{"class":430}," cnn_cfg",[297,1918,231],{"class":319},[297,1920,712],{"class":322},[297,1922,715],{"class":319},[297,1924,1925],{"class":404},"  # noqa: LACO001\n",[535,1927],{"data":1928,"kind":538},"dHlwZTogPGNsYXNzICdvbWVnYWNvbmYuZGljdGNvbmZpZy5EaWN0Q29uZmlnJz4KX3RhcmdldF86IHRvcmNoLm5uLlNlcXVlbnRpYWwK",[1564,1930,1932,1933,1935],{"id":1931},"why-a-factory-function-instead-of-a-module-level-model-attribute","Why a factory function instead of a module-level ",[224,1934,1005],{}," attribute?",[216,1937,282,1938,1941],{},[224,1939,1940],{},"cnn_classifier.py"," module exposes both:",[1943,1944,1945,1954],"ul",{},[255,1946,1947,1949,1950,1953],{},[224,1948,1005],{},": a pre-built DictConfig node with default ",[224,1951,1952],{},"hps"," values.",[255,1955,1956,1959],{},[224,1957,1958],{},"make_cnn_classifier(**kwargs)",": a factory that accepts explicit values.",[216,1961,1962,1963,1966,1967,1971],{},"The pipeline uses the factory because it needs to pass values from its own ",[224,1964,1965],{},"@L.params class hps",", which are ",[1968,1969,1970],"em",{},"interpolation references",", not literal integers. A factory\nfunction called with those references builds the DictConfig tree with the right\ninterpolation strings already in place.",[288,1973,1975],{"className":290,"code":1974,"language":292,"meta":293,"style":293},"# How the pipeline threads interpolations through the factory:\n@L.params\nclass pipeline_hps:\n    in_channels:   int = 1\n    base_channels: int = 32\n    num_stages:    int = 3\n    num_classes:   int = 10\n\n# pipeline_hps.in_channels is NOT the integer 1 —\n# it is the interpolation string '${pipeline_hps.in_channels}'\n# (or however laco names the params namespace)\nmodel_with_refs = make_cnn_classifier(\n    in_channels=pipeline_hps.in_channels,\n    base_channels=pipeline_hps.base_channels,\n    num_stages=pipeline_hps.num_stages,\n    num_classes=pipeline_hps.num_classes,\n)\n\n# The resulting DictConfig stores the interpolations, not literal values.\n# To resolve them we bundle the params node alongside the model (calling\n# pipeline_hps() materialises the namespace as a plain dict). Overriding\n# pipeline_hps.num_classes=5 on this bundle would then propagate everywhere.\nbundle = OmegaConf.create({\"pipeline_hps\": pipeline_hps(), \"model\": model_with_refs})\nhead_lines = [l for l in laco.dump(bundle).splitlines() if \"num_classes\" in l]\nprint(\"head out_features references:\", head_lines)\n",[224,1976,1977,1982,1997,2010,2025,2039,2053,2066,2070,2075,2080,2085,2096,2112,2127,2142,2157,2161,2165,2170,2175,2180,2185,2227,2287],{"__ignoreMap":293},[297,1978,1979],{"class":299,"line":300},[297,1980,1981],{"class":404},"# How the pipeline threads interpolations through the factory:\n",[297,1983,1984,1988,1992,1994],{"class":299,"line":311},[297,1985,1987],{"class":1986},"stp6e","@",[297,1989,1991],{"class":1990},"sGLFI","L",[297,1993,231],{"class":1986},[297,1995,1996],{"class":1990},"params\n",[297,1998,1999,2003,2007],{"class":299,"line":331},[297,2000,2002],{"class":2001},"sbsja","class",[297,2004,2006],{"class":2005},"sbgvK"," pipeline_hps",[297,2008,2009],{"class":319},":\n",[297,2011,2012,2014,2016,2019,2022],{"class":299,"line":345},[297,2013,1824],{"class":307},[297,2015,952],{"class":319},[297,2017,2018],{"class":480},"   int",[297,2020,2021],{"class":422}," =",[297,2023,2024],{"class":519}," 1\n",[297,2026,2027,2029,2031,2034,2036],{"class":299,"line":364},[297,2028,1836],{"class":307},[297,2030,952],{"class":319},[297,2032,2033],{"class":480}," int",[297,2035,2021],{"class":422},[297,2037,2038],{"class":519}," 32\n",[297,2040,2041,2043,2045,2048,2050],{"class":299,"line":467},[297,2042,1848],{"class":307},[297,2044,952],{"class":319},[297,2046,2047],{"class":480},"    int",[297,2049,2021],{"class":422},[297,2051,2052],{"class":519}," 3\n",[297,2054,2055,2057,2059,2061,2063],{"class":299,"line":473},[297,2056,1860],{"class":307},[297,2058,952],{"class":319},[297,2060,2018],{"class":480},[297,2062,2021],{"class":422},[297,2064,2065],{"class":519}," 10\n",[297,2067,2068],{"class":299,"line":618},[297,2069,627],{"emptyLinePlaceholder":626},[297,2071,2072],{"class":299,"line":623},[297,2073,2074],{"class":404},"# pipeline_hps.in_channels is NOT the integer 1 —\n",[297,2076,2077],{"class":299,"line":630},[297,2078,2079],{"class":404},"# it is the interpolation string '${pipeline_hps.in_channels}'\n",[297,2081,2082],{"class":299,"line":636},[297,2083,2084],{"class":404},"# (or however laco names the params namespace)\n",[297,2086,2087,2090,2092,2094],{"class":299,"line":642},[297,2088,2089],{"class":307},"model_with_refs ",[297,2091,423],{"class":422},[297,2093,1817],{"class":430},[297,2095,1310],{"class":319},[297,2097,2098,2100,2102,2105,2107,2110],{"class":299,"line":648},[297,2099,1824],{"class":501},[297,2101,423],{"class":422},[297,2103,2104],{"class":430},"pipeline_hps",[297,2106,231],{"class":319},[297,2108,2109],{"class":322},"in_channels",[297,2111,596],{"class":319},[297,2113,2114,2116,2118,2120,2122,2125],{"class":299,"line":654},[297,2115,1836],{"class":501},[297,2117,423],{"class":422},[297,2119,2104],{"class":430},[297,2121,231],{"class":319},[297,2123,2124],{"class":322},"base_channels",[297,2126,596],{"class":319},[297,2128,2129,2131,2133,2135,2137,2140],{"class":299,"line":660},[297,2130,1848],{"class":501},[297,2132,423],{"class":422},[297,2134,2104],{"class":430},[297,2136,231],{"class":319},[297,2138,2139],{"class":322},"num_stages",[297,2141,596],{"class":319},[297,2143,2144,2146,2148,2150,2152,2155],{"class":299,"line":692},[297,2145,1860],{"class":501},[297,2147,423],{"class":422},[297,2149,2104],{"class":430},[297,2151,231],{"class":319},[297,2153,2154],{"class":322},"num_classes",[297,2156,596],{"class":319},[297,2158,2159],{"class":299,"line":721},[297,2160,447],{"class":319},[297,2162,2163],{"class":299,"line":750},[297,2164,627],{"emptyLinePlaceholder":626},[297,2166,2167],{"class":299,"line":776},[297,2168,2169],{"class":404},"# The resulting DictConfig stores the interpolations, not literal values.\n",[297,2171,2172],{"class":299,"line":809},[297,2173,2174],{"class":404},"# To resolve them we bundle the params node alongside the model (calling\n",[297,2176,2177],{"class":299,"line":814},[297,2178,2179],{"class":404},"# pipeline_hps() materialises the namespace as a plain dict). Overriding\n",[297,2181,2182],{"class":299,"line":820},[297,2183,2184],{"class":404},"# pipeline_hps.num_classes=5 on this bundle would then propagate everywhere.\n",[297,2186,2187,2190,2192,2194,2196,2198,2201,2203,2205,2207,2209,2211,2214,2216,2218,2220,2222,2225],{"class":299,"line":826},[297,2188,2189],{"class":307},"bundle ",[297,2191,423],{"class":422},[297,2193,931],{"class":307},[297,2195,231],{"class":319},[297,2197,936],{"class":430},[297,2199,2200],{"class":319},"({",[297,2202,438],{"class":437},[297,2204,2104],{"class":441},[297,2206,438],{"class":437},[297,2208,952],{"class":319},[297,2210,2006],{"class":430},[297,2212,2213],{"class":319},"(),",[297,2215,526],{"class":437},[297,2217,1005],{"class":441},[297,2219,438],{"class":437},[297,2221,952],{"class":319},[297,2223,2224],{"class":430}," model_with_refs",[297,2226,1040],{"class":319},[297,2228,2230,2233,2235,2238,2241,2244,2247,2250,2252,2254,2256,2258,2261,2263,2266,2269,2272,2274,2276,2278,2281,2284],{"class":299,"line":2229},24,[297,2231,2232],{"class":307},"head_lines ",[297,2234,423],{"class":422},[297,2236,2237],{"class":319}," [",[297,2239,2240],{"class":307},"l ",[297,2242,2243],{"class":303},"for",[297,2245,2246],{"class":307}," l ",[297,2248,2249],{"class":303},"in",[297,2251,316],{"class":307},[297,2253,231],{"class":319},[297,2255,1122],{"class":430},[297,2257,434],{"class":319},[297,2259,2260],{"class":430},"bundle",[297,2262,511],{"class":319},[297,2264,2265],{"class":430},"splitlines",[297,2267,2268],{"class":319},"()",[297,2270,2271],{"class":303}," if",[297,2273,526],{"class":437},[297,2275,2154],{"class":441},[297,2277,438],{"class":437},[297,2279,2280],{"class":422}," in",[297,2282,2283],{"class":307}," l",[297,2285,2286],{"class":319},"]\n",[297,2288,2290,2292,2294,2296,2299,2301,2303,2306],{"class":299,"line":2289},25,[297,2291,453],{"class":452},[297,2293,434],{"class":319},[297,2295,438],{"class":437},[297,2297,2298],{"class":441},"head out_features references:",[297,2300,438],{"class":437},[297,2302,358],{"class":319},[297,2304,2305],{"class":430}," head_lines",[297,2307,447],{"class":319},[535,2309],{"data":2310,"kind":538},"aGVhZCBvdXRfZmVhdHVyZXMgcmVmZXJlbmNlczogWyIgICAgICAgICAgb3V0X2ZlYXR1cmVzOiAnJHtwaXBlbGluZV9ocHMubnVtX2NsYXNzZXN9J30iLCAncGlwZWxpbmVfaHBzOiB7YmFzZV9jaGFubmVsczogMzIsIGluX2NoYW5uZWxzOiAxLCBudW1fY2xhc3NlczogMTAsIG51bV9zdGFnZXM6IDN9J10K",[385,2312],{},[388,2314,2316,2317],{"id":2315},"section-4-full-walkthrough-pipelinesmnist_trainpy","Section 4: Full Walkthrough, ",[224,2318,272],{},[216,2320,2321,2322,231],{},"This section reads through the complete pipeline config, annotating every section. The\nsource is at ",[224,2323,2324],{},"sources\u002Flaco\u002Fexamples\u002Fpipelines\u002Fmnist_train.py",[288,2326,2328],{"className":290,"code":2327,"language":292,"meta":293,"style":293},"# ============================================================\n# Section A — Hyperparameters\n# ============================================================\n# @L.params creates a DictConfig namespace whose attributes are interpolation\n# strings. Every other config node in the file can reference these via\n# '${hps.batch_size}' etc.\n\nfrom torchvision.datasets import MNIST\nfrom torchvision import transforms\n\n@L.params\nclass hps:\n    data_root:     str   = \".\u002Fdata\"\n    batch_size:    int   = 64\n    learning_rate: float = 1e-3\n    num_workers:   int   = 0\n    # Architecture hyperparameters — shared with the model factory\n    in_channels:   int   = 1\n    base_channels: int   = 32\n    num_stages:    int   = 3\n    num_classes:   int   = 10\n\nprint(\"hps type:\", type(hps))\nprint(\"hps.batch_size (runtime):\", repr(hps.batch_size))  # noqa: LACO001\n",[224,2329,2330,2334,2339,2343,2348,2353,2358,2362,2379,2391,2395,2405,2414,2435,2449,2464,2478,2483,2495,2507,2519,2531,2535,2558],{"__ignoreMap":293},[297,2331,2332],{"class":299,"line":300},[297,2333,405],{"class":404},[297,2335,2336],{"class":299,"line":311},[297,2337,2338],{"class":404},"# Section A — Hyperparameters\n",[297,2340,2341],{"class":299,"line":331},[297,2342,405],{"class":404},[297,2344,2345],{"class":299,"line":345},[297,2346,2347],{"class":404},"# @L.params creates a DictConfig namespace whose attributes are interpolation\n",[297,2349,2350],{"class":299,"line":364},[297,2351,2352],{"class":404},"# strings. Every other config node in the file can reference these via\n",[297,2354,2355],{"class":299,"line":467},[297,2356,2357],{"class":404},"# '${hps.batch_size}' etc.\n",[297,2359,2360],{"class":299,"line":473},[297,2361,627],{"emptyLinePlaceholder":626},[297,2363,2364,2366,2369,2371,2374,2376],{"class":299,"line":618},[297,2365,334],{"class":303},[297,2367,2368],{"class":307}," torchvision",[297,2370,231],{"class":319},[297,2372,2373],{"class":307},"datasets ",[297,2375,304],{"class":303},[297,2377,2378],{"class":686}," MNIST\n",[297,2380,2381,2383,2386,2388],{"class":299,"line":623},[297,2382,334],{"class":303},[297,2384,2385],{"class":307}," torchvision ",[297,2387,304],{"class":303},[297,2389,2390],{"class":307}," transforms\n",[297,2392,2393],{"class":299,"line":630},[297,2394,627],{"emptyLinePlaceholder":626},[297,2396,2397,2399,2401,2403],{"class":299,"line":636},[297,2398,1987],{"class":1986},[297,2400,1991],{"class":1990},[297,2402,231],{"class":1986},[297,2404,1996],{"class":1990},[297,2406,2407,2409,2412],{"class":299,"line":642},[297,2408,2002],{"class":2001},[297,2410,2411],{"class":2005}," hps",[297,2413,2009],{"class":319},[297,2415,2416,2419,2421,2424,2427,2429,2432],{"class":299,"line":648},[297,2417,2418],{"class":307},"    data_root",[297,2420,952],{"class":319},[297,2422,2423],{"class":480},"     str",[297,2425,2426],{"class":422},"   =",[297,2428,526],{"class":437},[297,2430,2431],{"class":441},".\u002Fdata",[297,2433,2434],{"class":437},"\"\n",[297,2436,2437,2440,2442,2444,2446],{"class":299,"line":654},[297,2438,2439],{"class":307},"    batch_size",[297,2441,952],{"class":319},[297,2443,2047],{"class":480},[297,2445,2426],{"class":422},[297,2447,2448],{"class":519}," 64\n",[297,2450,2451,2454,2456,2459,2461],{"class":299,"line":660},[297,2452,2453],{"class":307},"    learning_rate",[297,2455,952],{"class":319},[297,2457,2458],{"class":480}," float",[297,2460,2021],{"class":422},[297,2462,2463],{"class":519}," 1e-3\n",[297,2465,2466,2469,2471,2473,2475],{"class":299,"line":692},[297,2467,2468],{"class":307},"    num_workers",[297,2470,952],{"class":319},[297,2472,2018],{"class":480},[297,2474,2426],{"class":422},[297,2476,2477],{"class":519}," 0\n",[297,2479,2480],{"class":299,"line":721},[297,2481,2482],{"class":404},"    # Architecture hyperparameters — shared with the model factory\n",[297,2484,2485,2487,2489,2491,2493],{"class":299,"line":750},[297,2486,1824],{"class":307},[297,2488,952],{"class":319},[297,2490,2018],{"class":480},[297,2492,2426],{"class":422},[297,2494,2024],{"class":519},[297,2496,2497,2499,2501,2503,2505],{"class":299,"line":776},[297,2498,1836],{"class":307},[297,2500,952],{"class":319},[297,2502,2033],{"class":480},[297,2504,2426],{"class":422},[297,2506,2038],{"class":519},[297,2508,2509,2511,2513,2515,2517],{"class":299,"line":809},[297,2510,1848],{"class":307},[297,2512,952],{"class":319},[297,2514,2047],{"class":480},[297,2516,2426],{"class":422},[297,2518,2052],{"class":519},[297,2520,2521,2523,2525,2527,2529],{"class":299,"line":814},[297,2522,1860],{"class":307},[297,2524,952],{"class":319},[297,2526,2018],{"class":480},[297,2528,2426],{"class":422},[297,2530,2065],{"class":519},[297,2532,2533],{"class":299,"line":820},[297,2534,627],{"emptyLinePlaceholder":626},[297,2536,2537,2539,2541,2543,2546,2548,2550,2552,2554,2556],{"class":299,"line":826},[297,2538,453],{"class":452},[297,2540,434],{"class":319},[297,2542,438],{"class":437},[297,2544,2545],{"class":441},"hps type:",[297,2547,438],{"class":437},[297,2549,358],{"class":319},[297,2551,676],{"class":480},[297,2553,434],{"class":319},[297,2555,1952],{"class":430},[297,2557,773],{"class":319},[297,2559,2560,2562,2564,2566,2569,2571,2573,2576,2578,2580,2582,2585,2587],{"class":299,"line":2229},[297,2561,453],{"class":452},[297,2563,434],{"class":319},[297,2565,438],{"class":437},[297,2567,2568],{"class":441},"hps.batch_size (runtime):",[297,2570,438],{"class":437},[297,2572,358],{"class":319},[297,2574,2575],{"class":452}," repr",[297,2577,434],{"class":319},[297,2579,1952],{"class":430},[297,2581,231],{"class":319},[297,2583,2584],{"class":322},"batch_size",[297,2586,1446],{"class":319},[297,2588,1925],{"class":404},[535,2590],{"data":2591,"kind":538},"aHBzIHR5cGU6IDxjbGFzcyAnbGFjby5sYW5ndWFnZS5QYXJhbXNXcmFwcGVyJz4KaHBzLmJhdGNoX3NpemUgKHJ1bnRpbWUpOiAnJHtocHMuYmF0Y2hfc2l6ZX0nCg==",[288,2593,2595],{"className":290,"code":2594,"language":292,"meta":293,"style":293},"# ============================================================\n# Section B — Model\n# ============================================================\n# make_cnn_classifier is called with interpolation references.\n# The factory returns a DictConfig tree where every architecture\n# dimension is a '${hps.*}' string — overriding hps.num_stages=2\n# at load time changes the depth of the CNN without re-running this file.\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)\nprint(\"model _target_:\", model._target_)  # noqa: LACO001\n",[224,2596,2597,2601,2606,2610,2615,2620,2625,2630,2634,2645,2659,2673,2687,2701,2705],{"__ignoreMap":293},[297,2598,2599],{"class":299,"line":300},[297,2600,405],{"class":404},[297,2602,2603],{"class":299,"line":311},[297,2604,2605],{"class":404},"# Section B — Model\n",[297,2607,2608],{"class":299,"line":331},[297,2609,405],{"class":404},[297,2611,2612],{"class":299,"line":345},[297,2613,2614],{"class":404},"# make_cnn_classifier is called with interpolation references.\n",[297,2616,2617],{"class":299,"line":364},[297,2618,2619],{"class":404},"# The factory returns a DictConfig tree where every architecture\n",[297,2621,2622],{"class":299,"line":467},[297,2623,2624],{"class":404},"# dimension is a '${hps.*}' string — overriding hps.num_stages=2\n",[297,2626,2627],{"class":299,"line":473},[297,2628,2629],{"class":404},"# at load time changes the depth of the CNN without re-running this file.\n",[297,2631,2632],{"class":299,"line":618},[297,2633,627],{"emptyLinePlaceholder":626},[297,2635,2636,2639,2641,2643],{"class":299,"line":623},[297,2637,2638],{"class":307},"model ",[297,2640,423],{"class":422},[297,2642,1817],{"class":430},[297,2644,1310],{"class":319},[297,2646,2647,2649,2651,2653,2655,2657],{"class":299,"line":630},[297,2648,1824],{"class":501},[297,2650,423],{"class":422},[297,2652,1952],{"class":430},[297,2654,231],{"class":319},[297,2656,2109],{"class":322},[297,2658,596],{"class":319},[297,2660,2661,2663,2665,2667,2669,2671],{"class":299,"line":636},[297,2662,1836],{"class":501},[297,2664,423],{"class":422},[297,2666,1952],{"class":430},[297,2668,231],{"class":319},[297,2670,2124],{"class":322},[297,2672,596],{"class":319},[297,2674,2675,2677,2679,2681,2683,2685],{"class":299,"line":642},[297,2676,1848],{"class":501},[297,2678,423],{"class":422},[297,2680,1952],{"class":430},[297,2682,231],{"class":319},[297,2684,2139],{"class":322},[297,2686,596],{"class":319},[297,2688,2689,2691,2693,2695,2697,2699],{"class":299,"line":648},[297,2690,1860],{"class":501},[297,2692,423],{"class":422},[297,2694,1952],{"class":430},[297,2696,231],{"class":319},[297,2698,2154],{"class":322},[297,2700,596],{"class":319},[297,2702,2703],{"class":299,"line":654},[297,2704,447],{"class":319},[297,2706,2707,2709,2711,2713,2716,2718,2720,2723,2725,2727,2729],{"class":299,"line":660},[297,2708,453],{"class":452},[297,2710,434],{"class":319},[297,2712,438],{"class":437},[297,2714,2715],{"class":441},"model _target_:",[297,2717,438],{"class":437},[297,2719,358],{"class":319},[297,2721,2722],{"class":430}," model",[297,2724,231],{"class":319},[297,2726,712],{"class":322},[297,2728,715],{"class":319},[297,2730,1925],{"class":404},[535,2732],{"data":2733,"kind":538},"bW9kZWwgX3RhcmdldF86IHRvcmNoLm5uLlNlcXVlbnRpYWwK",[288,2735,2737],{"className":290,"code":2736,"language":292,"meta":293,"style":293},"# ============================================================\n# Section C — Optimizer and loss\n# ============================================================\n# L.partial produces a \"partial constructor\" node (_partial_: true).\n# At instantiation time you still pass model.parameters() — the optimizer\n# cannot be fully instantiated without the model weights.\noptimizer = L.partial(optim.Adam)(lr=hps.learning_rate)\n\n# L.call produces a full constructor node — CrossEntropyLoss takes no\n# required arguments, so it can be instantiated directly.\nloss = L.call(nn.CrossEntropyLoss)()\n\nprint(\"optimizer _partial_:\", optimizer._partial_)   # noqa: LACO001\nprint(\"loss _target_      :\", loss._target_)          # noqa: LACO001\n",[224,2738,2739,2743,2748,2752,2757,2762,2767,2802,2806,2811,2816,2839,2843,2870],{"__ignoreMap":293},[297,2740,2741],{"class":299,"line":300},[297,2742,405],{"class":404},[297,2744,2745],{"class":299,"line":311},[297,2746,2747],{"class":404},"# Section C — Optimizer and loss\n",[297,2749,2750],{"class":299,"line":331},[297,2751,405],{"class":404},[297,2753,2754],{"class":299,"line":345},[297,2755,2756],{"class":404},"# L.partial produces a \"partial constructor\" node (_partial_: true).\n",[297,2758,2759],{"class":299,"line":364},[297,2760,2761],{"class":404},"# At instantiation time you still pass model.parameters() — the optimizer\n",[297,2763,2764],{"class":299,"line":467},[297,2765,2766],{"class":404},"# cannot be fully instantiated without the model weights.\n",[297,2768,2769,2771,2773,2775,2777,2779,2781,2783,2785,2787,2789,2791,2793,2795,2797,2800],{"class":299,"line":473},[297,2770,1612],{"class":307},[297,2772,423],{"class":422},[297,2774,1191],{"class":307},[297,2776,231],{"class":319},[297,2778,1242],{"class":430},[297,2780,434],{"class":319},[297,2782,1247],{"class":430},[297,2784,231],{"class":319},[297,2786,1252],{"class":322},[297,2788,1209],{"class":319},[297,2790,1257],{"class":501},[297,2792,423],{"class":422},[297,2794,1952],{"class":430},[297,2796,231],{"class":319},[297,2798,2799],{"class":322},"learning_rate",[297,2801,447],{"class":319},[297,2803,2804],{"class":299,"line":618},[297,2805,627],{"emptyLinePlaceholder":626},[297,2807,2808],{"class":299,"line":623},[297,2809,2810],{"class":404},"# L.call produces a full constructor node — CrossEntropyLoss takes no\n",[297,2812,2813],{"class":299,"line":630},[297,2814,2815],{"class":404},"# required arguments, so it can be instantiated directly.\n",[297,2817,2818,2821,2823,2825,2827,2829,2831,2833,2835,2837],{"class":299,"line":636},[297,2819,2820],{"class":307},"loss ",[297,2822,423],{"class":422},[297,2824,1191],{"class":307},[297,2826,231],{"class":319},[297,2828,1196],{"class":430},[297,2830,434],{"class":319},[297,2832,1201],{"class":430},[297,2834,231],{"class":319},[297,2836,1286],{"class":322},[297,2838,1289],{"class":319},[297,2840,2841],{"class":299,"line":642},[297,2842,627],{"emptyLinePlaceholder":626},[297,2844,2845,2847,2849,2851,2854,2856,2858,2860,2862,2865,2867],{"class":299,"line":648},[297,2846,453],{"class":452},[297,2848,434],{"class":319},[297,2850,438],{"class":437},[297,2852,2853],{"class":441},"optimizer _partial_:",[297,2855,438],{"class":437},[297,2857,358],{"class":319},[297,2859,1691],{"class":430},[297,2861,231],{"class":319},[297,2863,2864],{"class":322},"_partial_",[297,2866,715],{"class":319},[297,2868,2869],{"class":404},"   # noqa: LACO001\n",[297,2871,2872,2874,2876,2878,2881,2883,2885,2887,2889,2891,2893],{"class":299,"line":654},[297,2873,453],{"class":452},[297,2875,434],{"class":319},[297,2877,438],{"class":437},[297,2879,2880],{"class":441},"loss _target_      :",[297,2882,438],{"class":437},[297,2884,358],{"class":319},[297,2886,1700],{"class":430},[297,2888,231],{"class":319},[297,2890,712],{"class":322},[297,2892,715],{"class":319},[297,2894,2895],{"class":404},"          # noqa: LACO001\n",[535,2897],{"data":2898,"kind":538},"b3B0aW1pemVyIF9wYXJ0aWFsXzogVHJ1ZQpsb3NzIF90YXJnZXRfICAgICAgOiB0b3JjaC5ubi5Dcm9zc0VudHJvcHlMb3NzCg==",[288,2900,2902],{"className":290,"code":2901,"language":292,"meta":293,"style":293},"# ============================================================\n# Section D — Data pipeline\n# ============================================================\n# L.List is a DictConfig list wrapper — it holds an ordered sequence of\n# config nodes. transforms.Compose accepts a list of transforms, so we\n# build the entire transform pipeline as a config tree.\n\n_transform = L.call(transforms.Compose)(\n    L.List(\n        L.call(transforms.ToTensor)(),\n        L.call(transforms.Normalize)(\n            mean=L.List(0.1307),   # single-channel mean\n            std=L.List(0.3081),    # single-channel std\n        ),\n    )\n)\n\nprint(\"transform _target_:\", _transform._target_)  # noqa: LACO001\n\n# Dataset: MNIST with root, split, download, and the transform node above.\n# 'download=True' is a literal bool — not an interpolation; it is part of the recipe.\ndataset = L.call(MNIST)(\n    root=hps.data_root,\n    train=True,\n    download=True,\n    transform=_transform,\n)\n\n# DataLoader wraps the dataset — note that 'dataset=' receives the DictConfig\n# recipe for MNIST, not an instantiated Dataset object. Hydra will\n# recursively instantiate nested nodes automatically.\nloader = L.call(DataLoader)(\n    dataset=dataset,\n    batch_size=hps.batch_size,\n    shuffle=True,\n    num_workers=hps.num_workers,\n)\n\nprint(\"loader _target_  :\", loader._target_)   # noqa: LACO001\nprint(\"dataset _target_ :\", loader.dataset._target_)  # noqa: LACO001  # nested!\n",[224,2903,2904,2908,2913,2917,2922,2927,2932,2936,2962,2974,2995,3014,3038,3061,3066,3071,3075,3079,3105,3109,3114,3119,3139,3155,3167,3178,3191,3196,3201,3207,3213,3219,3240,3253,3268,3280,3296,3301,3306,3333],{"__ignoreMap":293},[297,2905,2906],{"class":299,"line":300},[297,2907,405],{"class":404},[297,2909,2910],{"class":299,"line":311},[297,2911,2912],{"class":404},"# Section D — Data pipeline\n",[297,2914,2915],{"class":299,"line":331},[297,2916,405],{"class":404},[297,2918,2919],{"class":299,"line":345},[297,2920,2921],{"class":404},"# L.List is a DictConfig list wrapper — it holds an ordered sequence of\n",[297,2923,2924],{"class":299,"line":364},[297,2925,2926],{"class":404},"# config nodes. transforms.Compose accepts a list of transforms, so we\n",[297,2928,2929],{"class":299,"line":467},[297,2930,2931],{"class":404},"# build the entire transform pipeline as a config tree.\n",[297,2933,2934],{"class":299,"line":473},[297,2935,627],{"emptyLinePlaceholder":626},[297,2937,2938,2941,2943,2945,2947,2949,2951,2954,2956,2959],{"class":299,"line":618},[297,2939,2940],{"class":307},"_transform ",[297,2942,423],{"class":422},[297,2944,1191],{"class":307},[297,2946,231],{"class":319},[297,2948,1196],{"class":430},[297,2950,434],{"class":319},[297,2952,2953],{"class":430},"transforms",[297,2955,231],{"class":319},[297,2957,2958],{"class":322},"Compose",[297,2960,2961],{"class":319},")(\n",[297,2963,2964,2967,2969,2972],{"class":299,"line":623},[297,2965,2966],{"class":430},"    L",[297,2968,231],{"class":319},[297,2970,2971],{"class":430},"List",[297,2973,1310],{"class":319},[297,2975,2976,2979,2981,2983,2985,2987,2989,2992],{"class":299,"line":630},[297,2977,2978],{"class":430},"        L",[297,2980,231],{"class":319},[297,2982,1196],{"class":430},[297,2984,434],{"class":319},[297,2986,2953],{"class":430},[297,2988,231],{"class":319},[297,2990,2991],{"class":322},"ToTensor",[297,2993,2994],{"class":319},")(),\n",[297,2996,2997,2999,3001,3003,3005,3007,3009,3012],{"class":299,"line":636},[297,2998,2978],{"class":430},[297,3000,231],{"class":319},[297,3002,1196],{"class":430},[297,3004,434],{"class":319},[297,3006,2953],{"class":430},[297,3008,231],{"class":319},[297,3010,3011],{"class":322},"Normalize",[297,3013,2961],{"class":319},[297,3015,3016,3019,3021,3023,3025,3027,3029,3032,3035],{"class":299,"line":642},[297,3017,3018],{"class":501},"            mean",[297,3020,423],{"class":422},[297,3022,1991],{"class":430},[297,3024,231],{"class":319},[297,3026,2971],{"class":430},[297,3028,434],{"class":319},[297,3030,3031],{"class":519},"0.1307",[297,3033,3034],{"class":319},"),",[297,3036,3037],{"class":404},"   # single-channel mean\n",[297,3039,3040,3043,3045,3047,3049,3051,3053,3056,3058],{"class":299,"line":648},[297,3041,3042],{"class":501},"            std",[297,3044,423],{"class":422},[297,3046,1991],{"class":430},[297,3048,231],{"class":319},[297,3050,2971],{"class":430},[297,3052,434],{"class":319},[297,3054,3055],{"class":519},"0.3081",[297,3057,3034],{"class":319},[297,3059,3060],{"class":404},"    # single-channel std\n",[297,3062,3063],{"class":299,"line":654},[297,3064,3065],{"class":319},"        ),\n",[297,3067,3068],{"class":299,"line":660},[297,3069,3070],{"class":319},"    )\n",[297,3072,3073],{"class":299,"line":692},[297,3074,447],{"class":319},[297,3076,3077],{"class":299,"line":721},[297,3078,627],{"emptyLinePlaceholder":626},[297,3080,3081,3083,3085,3087,3090,3092,3094,3097,3099,3101,3103],{"class":299,"line":750},[297,3082,453],{"class":452},[297,3084,434],{"class":319},[297,3086,438],{"class":437},[297,3088,3089],{"class":441},"transform _target_:",[297,3091,438],{"class":437},[297,3093,358],{"class":319},[297,3095,3096],{"class":430}," _transform",[297,3098,231],{"class":319},[297,3100,712],{"class":322},[297,3102,715],{"class":319},[297,3104,1925],{"class":404},[297,3106,3107],{"class":299,"line":776},[297,3108,627],{"emptyLinePlaceholder":626},[297,3110,3111],{"class":299,"line":809},[297,3112,3113],{"class":404},"# Dataset: MNIST with root, split, download, and the transform node above.\n",[297,3115,3116],{"class":299,"line":814},[297,3117,3118],{"class":404},"# 'download=True' is a literal bool — not an interpolation; it is part of the recipe.\n",[297,3120,3121,3124,3126,3128,3130,3132,3134,3137],{"class":299,"line":820},[297,3122,3123],{"class":307},"dataset ",[297,3125,423],{"class":422},[297,3127,1191],{"class":307},[297,3129,231],{"class":319},[297,3131,1196],{"class":430},[297,3133,434],{"class":319},[297,3135,3136],{"class":452},"MNIST",[297,3138,2961],{"class":319},[297,3140,3141,3144,3146,3148,3150,3153],{"class":299,"line":826},[297,3142,3143],{"class":501},"    root",[297,3145,423],{"class":422},[297,3147,1952],{"class":430},[297,3149,231],{"class":319},[297,3151,3152],{"class":322},"data_root",[297,3154,596],{"class":319},[297,3156,3157,3160,3162,3165],{"class":299,"line":2229},[297,3158,3159],{"class":501},"    train",[297,3161,423],{"class":422},[297,3163,3164],{"class":507},"True",[297,3166,596],{"class":319},[297,3168,3169,3172,3174,3176],{"class":299,"line":2289},[297,3170,3171],{"class":501},"    download",[297,3173,423],{"class":422},[297,3175,3164],{"class":507},[297,3177,596],{"class":319},[297,3179,3181,3184,3186,3189],{"class":299,"line":3180},26,[297,3182,3183],{"class":501},"    transform",[297,3185,423],{"class":422},[297,3187,3188],{"class":430},"_transform",[297,3190,596],{"class":319},[297,3192,3194],{"class":299,"line":3193},27,[297,3195,447],{"class":319},[297,3197,3199],{"class":299,"line":3198},28,[297,3200,627],{"emptyLinePlaceholder":626},[297,3202,3204],{"class":299,"line":3203},29,[297,3205,3206],{"class":404},"# DataLoader wraps the dataset — note that 'dataset=' receives the DictConfig\n",[297,3208,3210],{"class":299,"line":3209},30,[297,3211,3212],{"class":404},"# recipe for MNIST, not an instantiated Dataset object. Hydra will\n",[297,3214,3216],{"class":299,"line":3215},31,[297,3217,3218],{"class":404},"# recursively instantiate nested nodes automatically.\n",[297,3220,3222,3225,3227,3229,3231,3233,3235,3238],{"class":299,"line":3221},32,[297,3223,3224],{"class":307},"loader ",[297,3226,423],{"class":422},[297,3228,1191],{"class":307},[297,3230,231],{"class":319},[297,3232,1196],{"class":430},[297,3234,434],{"class":319},[297,3236,3237],{"class":430},"DataLoader",[297,3239,2961],{"class":319},[297,3241,3243,3246,3248,3251],{"class":299,"line":3242},33,[297,3244,3245],{"class":501},"    dataset",[297,3247,423],{"class":422},[297,3249,3250],{"class":430},"dataset",[297,3252,596],{"class":319},[297,3254,3256,3258,3260,3262,3264,3266],{"class":299,"line":3255},34,[297,3257,2439],{"class":501},[297,3259,423],{"class":422},[297,3261,1952],{"class":430},[297,3263,231],{"class":319},[297,3265,2584],{"class":322},[297,3267,596],{"class":319},[297,3269,3271,3274,3276,3278],{"class":299,"line":3270},35,[297,3272,3273],{"class":501},"    shuffle",[297,3275,423],{"class":422},[297,3277,3164],{"class":507},[297,3279,596],{"class":319},[297,3281,3283,3285,3287,3289,3291,3294],{"class":299,"line":3282},36,[297,3284,2468],{"class":501},[297,3286,423],{"class":422},[297,3288,1952],{"class":430},[297,3290,231],{"class":319},[297,3292,3293],{"class":322},"num_workers",[297,3295,596],{"class":319},[297,3297,3299],{"class":299,"line":3298},37,[297,3300,447],{"class":319},[297,3302,3304],{"class":299,"line":3303},38,[297,3305,627],{"emptyLinePlaceholder":626},[297,3307,3309,3311,3313,3315,3318,3320,3322,3325,3327,3329,3331],{"class":299,"line":3308},39,[297,3310,453],{"class":452},[297,3312,434],{"class":319},[297,3314,438],{"class":437},[297,3316,3317],{"class":441},"loader _target_  :",[297,3319,438],{"class":437},[297,3321,358],{"class":319},[297,3323,3324],{"class":430}," loader",[297,3326,231],{"class":319},[297,3328,712],{"class":322},[297,3330,715],{"class":319},[297,3332,2869],{"class":404},[297,3334,3336,3338,3340,3342,3345,3347,3349,3351,3353,3355,3357,3359,3361],{"class":299,"line":3335},40,[297,3337,453],{"class":452},[297,3339,434],{"class":319},[297,3341,438],{"class":437},[297,3343,3344],{"class":441},"dataset _target_ :",[297,3346,438],{"class":437},[297,3348,358],{"class":319},[297,3350,3324],{"class":430},[297,3352,231],{"class":319},[297,3354,3250],{"class":322},[297,3356,231],{"class":319},[297,3358,712],{"class":322},[297,3360,715],{"class":319},[297,3362,3363],{"class":404},"  # noqa: LACO001  # nested!\n",[535,3365],{"data":3366,"kind":538},"dHJhbnNmb3JtIF90YXJnZXRfOiB0b3JjaHZpc2lvbi50cmFuc2Zvcm1zLkNvbXBvc2UKbG9hZGVyIF90YXJnZXRfICA6IHRvcmNoLnV0aWxzLmRhdGEuRGF0YUxvYWRlcgpkYXRhc2V0IF90YXJnZXRfIDogdG9yY2h2aXNpb24uZGF0YXNldHMuTU5JU1QK",[288,3368,3370],{"className":290,"code":3369,"language":292,"meta":293,"style":293},"# ============================================================\n# Section E — The train bundle\n# ============================================================\n# L.Dict collects all components under a single DictConfig root.\n# This is the fragment a training script loads with:\n#   cfg = laco.load(\"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#train\")\n\ntrain = L.Dict(\n    model=model,\n    optimizer=optimizer,\n    loss=loss,\n    loader=loader,\n)\n\nprint(\"train bundle keys:\", list(OmegaConf.to_container(train, resolve=False).keys()))\n",[224,3371,3372,3376,3381,3385,3390,3395,3400,3404,3418,3428,3438,3448,3460,3464,3468],{"__ignoreMap":293},[297,3373,3374],{"class":299,"line":300},[297,3375,405],{"class":404},[297,3377,3378],{"class":299,"line":311},[297,3379,3380],{"class":404},"# Section E — The train bundle\n",[297,3382,3383],{"class":299,"line":331},[297,3384,405],{"class":404},[297,3386,3387],{"class":299,"line":345},[297,3388,3389],{"class":404},"# L.Dict collects all components under a single DictConfig root.\n",[297,3391,3392],{"class":299,"line":364},[297,3393,3394],{"class":404},"# This is the fragment a training script loads with:\n",[297,3396,3397],{"class":299,"line":467},[297,3398,3399],{"class":404},"#   cfg = laco.load(\"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#train\")\n",[297,3401,3402],{"class":299,"line":473},[297,3403,627],{"emptyLinePlaceholder":626},[297,3405,3406,3408,3410,3412,3414,3416],{"class":299,"line":618},[297,3407,1670],{"class":307},[297,3409,423],{"class":422},[297,3411,1191],{"class":307},[297,3413,231],{"class":319},[297,3415,1307],{"class":430},[297,3417,1310],{"class":319},[297,3419,3420,3422,3424,3426],{"class":299,"line":623},[297,3421,1315],{"class":501},[297,3423,423],{"class":422},[297,3425,1005],{"class":430},[297,3427,596],{"class":319},[297,3429,3430,3432,3434,3436],{"class":299,"line":630},[297,3431,1326],{"class":501},[297,3433,423],{"class":422},[297,3435,1020],{"class":430},[297,3437,596],{"class":319},[297,3439,3440,3442,3444,3446],{"class":299,"line":636},[297,3441,1338],{"class":501},[297,3443,423],{"class":422},[297,3445,1510],{"class":430},[297,3447,596],{"class":319},[297,3449,3450,3453,3455,3458],{"class":299,"line":642},[297,3451,3452],{"class":501},"    loader",[297,3454,423],{"class":422},[297,3456,3457],{"class":430},"loader",[297,3459,596],{"class":319},[297,3461,3462],{"class":299,"line":648},[297,3463,447],{"class":319},[297,3465,3466],{"class":299,"line":654},[297,3467,627],{"emptyLinePlaceholder":626},[297,3469,3470,3472,3474,3476,3479,3481,3483,3485,3487,3489,3491,3493,3495,3498,3500,3502,3504,3506,3508,3510],{"class":299,"line":660},[297,3471,453],{"class":452},[297,3473,434],{"class":319},[297,3475,438],{"class":437},[297,3477,3478],{"class":441},"train bundle keys:",[297,3480,438],{"class":437},[297,3482,358],{"class":319},[297,3484,1062],{"class":480},[297,3486,434],{"class":319},[297,3488,486],{"class":430},[297,3490,231],{"class":319},[297,3492,491],{"class":430},[297,3494,434],{"class":319},[297,3496,3497],{"class":430},"train",[297,3499,358],{"class":319},[297,3501,502],{"class":501},[297,3503,423],{"class":422},[297,3505,508],{"class":507},[297,3507,511],{"class":319},[297,3509,195],{"class":430},[297,3511,1090],{"class":319},[535,3513],{"data":3514,"kind":538},"dHJhaW4gYnVuZGxlIGtleXM6IFsnX3RhcmdldF8nLCAnX2NvbnZlcnRfJywgJ21vZGVsJywgJ29wdGltaXplcicsICdsb3NzJywgJ2xvYWRlciddCg==",[288,3516,3518],{"className":290,"code":3517,"language":292,"meta":293,"style":293},"# Load the actual file from the examples package (does not instantiate anything)\nfull_cfg = laco.load(\"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py\")\n\nprint(\"Top-level fragments:\", list(OmegaConf.to_container(full_cfg, resolve=False).keys()))\n",[224,3519,3520,3525,3549,3553],{"__ignoreMap":293},[297,3521,3522],{"class":299,"line":300},[297,3523,3524],{"class":404},"# Load the actual file from the examples package (does not instantiate anything)\n",[297,3526,3527,3530,3532,3534,3536,3538,3540,3542,3545,3547],{"class":299,"line":311},[297,3528,3529],{"class":307},"full_cfg ",[297,3531,423],{"class":422},[297,3533,316],{"class":307},[297,3535,231],{"class":319},[297,3537,431],{"class":430},[297,3539,434],{"class":319},[297,3541,438],{"class":437},[297,3543,3544],{"class":441},"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py",[297,3546,438],{"class":437},[297,3548,447],{"class":319},[297,3550,3551],{"class":299,"line":331},[297,3552,627],{"emptyLinePlaceholder":626},[297,3554,3555,3557,3559,3561,3564,3566,3568,3570,3572,3574,3576,3578,3580,3583,3585,3587,3589,3591,3593,3595],{"class":299,"line":345},[297,3556,453],{"class":452},[297,3558,434],{"class":319},[297,3560,438],{"class":437},[297,3562,3563],{"class":441},"Top-level fragments:",[297,3565,438],{"class":437},[297,3567,358],{"class":319},[297,3569,1062],{"class":480},[297,3571,434],{"class":319},[297,3573,486],{"class":430},[297,3575,231],{"class":319},[297,3577,491],{"class":430},[297,3579,434],{"class":319},[297,3581,3582],{"class":430},"full_cfg",[297,3584,358],{"class":319},[297,3586,502],{"class":501},[297,3588,423],{"class":422},[297,3590,508],{"class":507},[297,3592,511],{"class":319},[297,3594,195],{"class":430},[297,3596,1090],{"class":319},[535,3598],{"data":3599,"kind":538},"VG9wLWxldmVsIGZyYWdtZW50czogWydocHMnLCAnbW9kZWwnLCAnb3B0aW1pemVyJywgJ2xvc3MnLCAnZGF0YXNldCcsICdsb2FkZXInLCAndHJhaW4nXQo=",[288,3601,3603],{"className":290,"code":3602,"language":292,"meta":293,"style":293},"# Load just the train bundle fragment\ntrain_cfg = laco.load(\"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#train\")\nprint(\"train bundle keys:\", list(OmegaConf.to_container(train_cfg, resolve=False).keys()))\nprint()\n\n# model and optimizer are immediately available as sub-configs\nprint(\"=== model ===\")\nprint(laco.dump(train_cfg.model))   # type: ignore[union-attr]  # noqa: LACO001\n",[224,3604,3605,3610,3634,3677,3684,3688,3693,3708],{"__ignoreMap":293},[297,3606,3607],{"class":299,"line":300},[297,3608,3609],{"class":404},"# Load just the train bundle fragment\n",[297,3611,3612,3615,3617,3619,3621,3623,3625,3627,3630,3632],{"class":299,"line":311},[297,3613,3614],{"class":307},"train_cfg ",[297,3616,423],{"class":422},[297,3618,316],{"class":307},[297,3620,231],{"class":319},[297,3622,431],{"class":430},[297,3624,434],{"class":319},[297,3626,438],{"class":437},[297,3628,3629],{"class":441},"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#train",[297,3631,438],{"class":437},[297,3633,447],{"class":319},[297,3635,3636,3638,3640,3642,3644,3646,3648,3650,3652,3654,3656,3658,3660,3663,3665,3667,3669,3671,3673,3675],{"class":299,"line":331},[297,3637,453],{"class":452},[297,3639,434],{"class":319},[297,3641,438],{"class":437},[297,3643,3478],{"class":441},[297,3645,438],{"class":437},[297,3647,358],{"class":319},[297,3649,1062],{"class":480},[297,3651,434],{"class":319},[297,3653,486],{"class":430},[297,3655,231],{"class":319},[297,3657,491],{"class":430},[297,3659,434],{"class":319},[297,3661,3662],{"class":430},"train_cfg",[297,3664,358],{"class":319},[297,3666,502],{"class":501},[297,3668,423],{"class":422},[297,3670,508],{"class":507},[297,3672,511],{"class":319},[297,3674,195],{"class":430},[297,3676,1090],{"class":319},[297,3678,3679,3681],{"class":299,"line":345},[297,3680,453],{"class":452},[297,3682,3683],{"class":319},"()\n",[297,3685,3686],{"class":299,"line":364},[297,3687,627],{"emptyLinePlaceholder":626},[297,3689,3690],{"class":299,"line":467},[297,3691,3692],{"class":404},"# model and optimizer are immediately available as sub-configs\n",[297,3694,3695,3697,3699,3701,3704,3706],{"class":299,"line":473},[297,3696,453],{"class":452},[297,3698,434],{"class":319},[297,3700,438],{"class":437},[297,3702,3703],{"class":441},"=== model ===",[297,3705,438],{"class":437},[297,3707,447],{"class":319},[297,3709,3710,3712,3714,3716,3718,3720,3722,3724,3726,3728,3730],{"class":299,"line":618},[297,3711,453],{"class":452},[297,3713,434],{"class":319},[297,3715,1117],{"class":430},[297,3717,231],{"class":319},[297,3719,1122],{"class":430},[297,3721,434],{"class":319},[297,3723,3662],{"class":430},[297,3725,231],{"class":319},[297,3727,1005],{"class":322},[297,3729,1446],{"class":319},[297,3731,718],{"class":404},[535,3733],{"data":3734,"kind":538},"dHJhaW4gYnVuZGxlIGtleXM6IFsnX3RhcmdldF8nLCAnX2NvbnZlcnRfJywgJ21vZGVsJywgJ29wdGltaXplcicsICdsb3NzJywgJ2xvYWRlciddCgo9PT0gbW9kZWwgPT09Cl9hcmdzXzoKLSBfY29udmVydF86IGFsbAogIF90YXJnZXRfOiBsYWNvLmxhbmd1YWdlLk9yZGVyZWREaWN0LnRhcmdldAogIGl0ZW1zOgogIC0gLSBzdGVtCiAgICAtIF9hcmdzXzoKICAgICAgLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5Db252MmQsIGJpYXM6IGZhbHNlLCBpbl9jaGFubmVsczogJyR7aHBzLmluX2NoYW5uZWxzfScsCiAgICAgICAga2VybmVsX3NpemU6IDMsIG91dF9jaGFubmVsczogJyR7aHBzLmJhc2VfY2hhbm5lbHN9JywgcGFkZGluZzogMX0KICAgICAgLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5CYXRjaE5vcm0yZCwgbnVtX2ZlYXR1cmVzOiAnJHtocHMuYmFzZV9jaGFubmVsc30nfQogICAgICAtIHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLlJlTFUsIGlucGxhY2U6IHRydWV9CiAgICAgIF9jb252ZXJ0XzogYWxsCiAgICAgIF90YXJnZXRfOiB0b3JjaC5ubi5TZXF1ZW50aWFsCiAgLSAtIHN0YWdlcwogICAgLSBfYXJnc186CiAgICAgICAgX2NvbnZlcnRfOiBhbGwKICAgICAgICBfdGFyZ2V0XzogbGFjby5vcHMucmVwZWF0CiAgICAgICAgbnVtOiAke2hwcy5udW1fc3RhZ2VzfQogICAgICAgIHNyYzoKICAgICAgICAgIF9hcmdzXzoKICAgICAgICAgIC0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uQ29udjJkLCBiaWFzOiBmYWxzZSwgaW5fY2hhbm5lbHM6ICcke2hwcy5iYXNlX2NoYW5uZWxzfScsCiAgICAgICAgICAgIGtlcm5lbF9zaXplOiAzLCBvdXRfY2hhbm5lbHM6ICcke2hwcy5iYXNlX2NoYW5uZWxzfScsIHBhZGRpbmc6IDF9CiAgICAgICAgICAtIHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLkJhdGNoTm9ybTJkLCBudW1fZmVhdHVyZXM6ICcke2hwcy5iYXNlX2NoYW5uZWxzfSd9CiAgICAgICAgICAtIHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLlJlTFUsIGlucGxhY2U6IHRydWV9CiAgICAgICAgICAtIHtfY29udmVydF86IGFsbCwgX3RhcmdldF86IHRvcmNoLm5uLk1heFBvb2wyZCwga2VybmVsX3NpemU6IDIsIHN0cmlkZTogMn0KICAgICAgICAgIF9jb252ZXJ0XzogYWxsCiAgICAgICAgICBfdGFyZ2V0XzogdG9yY2gubm4uU2VxdWVudGlhbAogICAgICBfY29udmVydF86IGFsbAogICAgICBfdGFyZ2V0XzogdG9yY2gubm4uU2VxdWVudGlhbAogIC0gLSBoZWFkCiAgICAtIF9hcmdzXzoKICAgICAgLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5BZGFwdGl2ZUF2Z1Bvb2wyZCwgb3V0cHV0X3NpemU6IDF9CiAgICAgIC0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2gubm4uRmxhdHRlbn0KICAgICAgLSB7X2NvbnZlcnRfOiBhbGwsIF90YXJnZXRfOiB0b3JjaC5ubi5MaW5lYXIsIGluX2ZlYXR1cmVzOiAnJHtocHMuYmFzZV9jaGFubmVsc30nLAogICAgICAgIG91dF9mZWF0dXJlczogJyR7aHBzLm51bV9jbGFzc2VzfSd9CiAgICAgIF9jb252ZXJ0XzogYWxsCiAgICAgIF90YXJnZXRfOiB0b3JjaC5ubi5TZXF1ZW50aWFsCl9jb252ZXJ0XzogYWxsCl9sYWNvXzogMQpfdGFyZ2V0XzogdG9yY2gubm4uU2VxdWVudGlhbAoK",[288,3736,3738],{"className":290,"code":3737,"language":292,"meta":293,"style":293},"# The hps namespace is also addressable as its own fragment\nhps_cfg = laco.load(\"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#hps\")\nprint(\"=== hps ===\")\nprint(laco.dump(hps_cfg))\n",[224,3739,3740,3745,3769,3784],{"__ignoreMap":293},[297,3741,3742],{"class":299,"line":300},[297,3743,3744],{"class":404},"# The hps namespace is also addressable as its own fragment\n",[297,3746,3747,3750,3752,3754,3756,3758,3760,3762,3765,3767],{"class":299,"line":311},[297,3748,3749],{"class":307},"hps_cfg ",[297,3751,423],{"class":422},[297,3753,316],{"class":307},[297,3755,231],{"class":319},[297,3757,431],{"class":430},[297,3759,434],{"class":319},[297,3761,438],{"class":437},[297,3763,3764],{"class":441},"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#hps",[297,3766,438],{"class":437},[297,3768,447],{"class":319},[297,3770,3771,3773,3775,3777,3780,3782],{"class":299,"line":331},[297,3772,453],{"class":452},[297,3774,434],{"class":319},[297,3776,438],{"class":437},[297,3778,3779],{"class":441},"=== hps ===",[297,3781,438],{"class":437},[297,3783,447],{"class":319},[297,3785,3786,3788,3790,3792,3794,3796,3798,3801],{"class":299,"line":345},[297,3787,453],{"class":452},[297,3789,434],{"class":319},[297,3791,1117],{"class":430},[297,3793,231],{"class":319},[297,3795,1122],{"class":430},[297,3797,434],{"class":319},[297,3799,3800],{"class":430},"hps_cfg",[297,3802,773],{"class":319},[535,3804],{"data":3805,"kind":538},"PT09IGhwcyA9PT0Ke19sYWNvXzogMSwgYmFzZV9jaGFubmVsczogMzIsIGJhdGNoX3NpemU6IDY0LCBkYXRhX3Jvb3Q6IC4vZGF0YSwgaW5fY2hhbm5lbHM6IDEsCiAgbGVhcm5pbmdfcmF0ZTogMC4wMDEsIG51bV9jbGFzc2VzOiAxMCwgbnVtX3N0YWdlczogMywgbnVtX3dvcmtlcnM6IDB9Cgo=",[1564,3807,282,3809,3812],{"id":3808},"the-ltask-decorator-preview",[224,3810,3811],{},"@L.task"," decorator (preview)",[216,3814,282,3815,3818],{},[224,3816,3817],{},"mnist_train.py"," file also defines:",[288,3820,3822],{"className":290,"code":3821,"language":292,"meta":293,"style":293},"@L.task\ndef task(\n    model: nn.Module,\n    optimizer: optim.Optimizer,\n    loss: nn.Module,\n    loader: DataLoader,\n    num_steps: int = 1,\n) -> None:\n    ...\n",[224,3823,3824,3835,3845,3861,3877,3891,3902,3917,3929],{"__ignoreMap":293},[297,3825,3826,3828,3830,3832],{"class":299,"line":300},[297,3827,1987],{"class":1986},[297,3829,1991],{"class":1990},[297,3831,231],{"class":1986},[297,3833,3834],{"class":1990},"task\n",[297,3836,3837,3840,3843],{"class":299,"line":311},[297,3838,3839],{"class":2001},"def",[297,3841,3842],{"class":1990}," task",[297,3844,1310],{"class":319},[297,3846,3847,3850,3852,3854,3856,3859],{"class":299,"line":331},[297,3848,1315],{"class":3849},"sFwrP",[297,3851,952],{"class":319},[297,3853,355],{"class":307},[297,3855,231],{"class":319},[297,3857,3858],{"class":322},"Module",[297,3860,596],{"class":319},[297,3862,3863,3865,3867,3870,3872,3875],{"class":299,"line":345},[297,3864,1326],{"class":3849},[297,3866,952],{"class":319},[297,3868,3869],{"class":307}," optim",[297,3871,231],{"class":319},[297,3873,3874],{"class":322},"Optimizer",[297,3876,596],{"class":319},[297,3878,3879,3881,3883,3885,3887,3889],{"class":299,"line":364},[297,3880,1338],{"class":3849},[297,3882,952],{"class":319},[297,3884,355],{"class":307},[297,3886,231],{"class":319},[297,3888,3858],{"class":322},[297,3890,596],{"class":319},[297,3892,3893,3895,3897,3900],{"class":299,"line":467},[297,3894,3452],{"class":3849},[297,3896,952],{"class":319},[297,3898,3899],{"class":307}," DataLoader",[297,3901,596],{"class":319},[297,3903,3904,3907,3909,3911,3913,3915],{"class":299,"line":473},[297,3905,3906],{"class":3849},"    num_steps",[297,3908,952],{"class":319},[297,3910,2033],{"class":480},[297,3912,2021],{"class":422},[297,3914,981],{"class":519},[297,3916,596],{"class":319},[297,3918,3919,3921,3924,3927],{"class":299,"line":618},[297,3920,715],{"class":319},[297,3922,3923],{"class":319}," ->",[297,3925,3926],{"class":507}," None",[297,3928,2009],{"class":319},[297,3930,3931],{"class":299,"line":623},[297,3932,3933],{"class":686},"    ...\n",[216,3935,3936,3938,3939,3941,3942,3945,3946,231],{},[224,3937,3811],{}," is a decorator that turns the function into a callable that accepts a\nsingle DictConfig (the ",[224,3940,3497],{}," bundle) and instantiates the arguments by name before\ncalling the underlying function. This is covered in ",[224,3943,3944],{},"09.tasks-and-app-loop.ipynb","; for\nnow, note that it is what powers ",[224,3947,3948],{},"python -m laco.examples.pipelines.mnist_train num_steps=2",[385,3950],{},[388,3952,3954],{"id":3953},"section-5-override-grammar-deep-dive","Section 5: Override Grammar Deep-Dive",[216,3956,3957,3958,3961],{},"Overrides follow the Hydra dotpath syntax: ",[224,3959,3960],{},"key.subkey=value",". Laco threads them\nthrough to OmegaConf merge semantics.",[288,3963,3965],{"className":290,"code":3964,"language":292,"meta":293,"style":293},"# Basic scalar override — change batch_size\ncfg_bs128 = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#hps\",\n    \"hps.batch_size=128\",\n)\nprint(f\"batch_size: {cfg_bs128.batch_size}\")   # noqa: LACO001\n",[224,3966,3967,3972,3987,3997,4008,4012],{"__ignoreMap":293},[297,3968,3969],{"class":299,"line":300},[297,3970,3971],{"class":404},"# Basic scalar override — change batch_size\n",[297,3973,3974,3977,3979,3981,3983,3985],{"class":299,"line":311},[297,3975,3976],{"class":307},"cfg_bs128 ",[297,3978,423],{"class":422},[297,3980,316],{"class":307},[297,3982,231],{"class":319},[297,3984,431],{"class":430},[297,3986,1310],{"class":319},[297,3988,3989,3991,3993,3995],{"class":299,"line":331},[297,3990,944],{"class":437},[297,3992,3764],{"class":441},[297,3994,438],{"class":437},[297,3996,596],{"class":319},[297,3998,3999,4001,4004,4006],{"class":299,"line":345},[297,4000,944],{"class":437},[297,4002,4003],{"class":441},"hps.batch_size=128",[297,4005,438],{"class":437},[297,4007,596],{"class":319},[297,4009,4010],{"class":299,"line":364},[297,4011,447],{"class":319},[297,4013,4014,4016,4018,4021,4024,4027,4030,4032,4034,4037,4039,4041],{"class":299,"line":467},[297,4015,453],{"class":452},[297,4017,434],{"class":319},[297,4019,4020],{"class":2001},"f",[297,4022,4023],{"class":441},"\"batch_size: ",[297,4025,4026],{"class":519},"{",[297,4028,4029],{"class":430},"cfg_bs128",[297,4031,231],{"class":319},[297,4033,2584],{"class":322},[297,4035,4036],{"class":519},"}",[297,4038,438],{"class":441},[297,4040,715],{"class":319},[297,4042,2869],{"class":404},[535,4044],{"data":4045,"kind":538},"YmF0Y2hfc2l6ZTogMTI4Cg==",[288,4047,4049],{"className":290,"code":4048,"language":292,"meta":293,"style":293},"# Float override — scientific notation is supported\ncfg_lr = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#hps\",\n    \"hps.learning_rate=5e-4\",\n)\nprint(f\"learning_rate: {cfg_lr.learning_rate}\")  # noqa: LACO001\n",[224,4050,4051,4056,4071,4081,4092,4096],{"__ignoreMap":293},[297,4052,4053],{"class":299,"line":300},[297,4054,4055],{"class":404},"# Float override — scientific notation is supported\n",[297,4057,4058,4061,4063,4065,4067,4069],{"class":299,"line":311},[297,4059,4060],{"class":307},"cfg_lr ",[297,4062,423],{"class":422},[297,4064,316],{"class":307},[297,4066,231],{"class":319},[297,4068,431],{"class":430},[297,4070,1310],{"class":319},[297,4072,4073,4075,4077,4079],{"class":299,"line":331},[297,4074,944],{"class":437},[297,4076,3764],{"class":441},[297,4078,438],{"class":437},[297,4080,596],{"class":319},[297,4082,4083,4085,4088,4090],{"class":299,"line":345},[297,4084,944],{"class":437},[297,4086,4087],{"class":441},"hps.learning_rate=5e-4",[297,4089,438],{"class":437},[297,4091,596],{"class":319},[297,4093,4094],{"class":299,"line":364},[297,4095,447],{"class":319},[297,4097,4098,4100,4102,4104,4107,4109,4112,4114,4116,4118,4120,4122],{"class":299,"line":467},[297,4099,453],{"class":452},[297,4101,434],{"class":319},[297,4103,4020],{"class":2001},[297,4105,4106],{"class":441},"\"learning_rate: ",[297,4108,4026],{"class":519},[297,4110,4111],{"class":430},"cfg_lr",[297,4113,231],{"class":319},[297,4115,2799],{"class":322},[297,4117,4036],{"class":519},[297,4119,438],{"class":441},[297,4121,715],{"class":319},[297,4123,1925],{"class":404},[535,4125],{"data":4126,"kind":538},"bGVhcm5pbmdfcmF0ZTogMC4wMDA1Cg==",[288,4128,4130],{"className":290,"code":4129,"language":292,"meta":293,"style":293},"# Multiple overrides in a single call\ncfg_multi = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#hps\",\n    \"hps.batch_size=256\",\n    \"hps.num_stages=2\",\n    \"hps.base_channels=16\",\n)\nprint(f\"batch_size={cfg_multi.batch_size}  \"\n      f\"num_stages={cfg_multi.num_stages}  \"\n      f\"base_channels={cfg_multi.base_channels}\")  # noqa: LACO001\n",[224,4131,4132,4137,4152,4162,4173,4184,4195,4199,4224,4244],{"__ignoreMap":293},[297,4133,4134],{"class":299,"line":300},[297,4135,4136],{"class":404},"# Multiple overrides in a single call\n",[297,4138,4139,4142,4144,4146,4148,4150],{"class":299,"line":311},[297,4140,4141],{"class":307},"cfg_multi ",[297,4143,423],{"class":422},[297,4145,316],{"class":307},[297,4147,231],{"class":319},[297,4149,431],{"class":430},[297,4151,1310],{"class":319},[297,4153,4154,4156,4158,4160],{"class":299,"line":331},[297,4155,944],{"class":437},[297,4157,3764],{"class":441},[297,4159,438],{"class":437},[297,4161,596],{"class":319},[297,4163,4164,4166,4169,4171],{"class":299,"line":345},[297,4165,944],{"class":437},[297,4167,4168],{"class":441},"hps.batch_size=256",[297,4170,438],{"class":437},[297,4172,596],{"class":319},[297,4174,4175,4177,4180,4182],{"class":299,"line":364},[297,4176,944],{"class":437},[297,4178,4179],{"class":441},"hps.num_stages=2",[297,4181,438],{"class":437},[297,4183,596],{"class":319},[297,4185,4186,4188,4191,4193],{"class":299,"line":467},[297,4187,944],{"class":437},[297,4189,4190],{"class":441},"hps.base_channels=16",[297,4192,438],{"class":437},[297,4194,596],{"class":319},[297,4196,4197],{"class":299,"line":473},[297,4198,447],{"class":319},[297,4200,4201,4203,4205,4207,4210,4212,4215,4217,4219,4221],{"class":299,"line":618},[297,4202,453],{"class":452},[297,4204,434],{"class":319},[297,4206,4020],{"class":2001},[297,4208,4209],{"class":441},"\"batch_size=",[297,4211,4026],{"class":519},[297,4213,4214],{"class":430},"cfg_multi",[297,4216,231],{"class":319},[297,4218,2584],{"class":322},[297,4220,4036],{"class":519},[297,4222,4223],{"class":441},"  \"\n",[297,4225,4226,4229,4232,4234,4236,4238,4240,4242],{"class":299,"line":623},[297,4227,4228],{"class":2001},"      f",[297,4230,4231],{"class":441},"\"num_stages=",[297,4233,4026],{"class":519},[297,4235,4214],{"class":430},[297,4237,231],{"class":319},[297,4239,2139],{"class":322},[297,4241,4036],{"class":519},[297,4243,4223],{"class":441},[297,4245,4246,4248,4251,4253,4255,4257,4259,4261,4263,4265],{"class":299,"line":630},[297,4247,4228],{"class":2001},[297,4249,4250],{"class":441},"\"base_channels=",[297,4252,4026],{"class":519},[297,4254,4214],{"class":430},[297,4256,231],{"class":319},[297,4258,2124],{"class":322},[297,4260,4036],{"class":519},[297,4262,438],{"class":441},[297,4264,715],{"class":319},[297,4266,1925],{"class":404},[535,4268],{"data":4269,"kind":538},"YmF0Y2hfc2l6ZT0yNTYgIG51bV9zdGFnZXM9MiAgYmFzZV9jaGFubmVscz0xNgo=",[288,4271,4273],{"className":290,"code":4272,"language":292,"meta":293,"style":293},"# Show what changed between base and overridden configs\nbase_hps = laco.load(\"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#hps\")\novrd_hps = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#hps\",\n    \"hps.batch_size=128\",\n    \"hps.learning_rate=5e-4\",\n)\n\nfor key in (\"batch_size\", \"learning_rate\", \"num_stages\"):\n    before = OmegaConf.select(base_hps, key)\n    after  = OmegaConf.select(ovrd_hps, key)\n    changed = \"\u003C-- changed\" if before != after else \"\"\n    print(f\"  {key:\u003C18} {before!r:>12}  →  {after!r:\u003C12} {changed}\")\n",[224,4274,4275,4280,4303,4318,4328,4338,4348,4352,4356,4393,4419,4443,4474],{"__ignoreMap":293},[297,4276,4277],{"class":299,"line":300},[297,4278,4279],{"class":404},"# Show what changed between base and overridden configs\n",[297,4281,4282,4285,4287,4289,4291,4293,4295,4297,4299,4301],{"class":299,"line":311},[297,4283,4284],{"class":307},"base_hps ",[297,4286,423],{"class":422},[297,4288,316],{"class":307},[297,4290,231],{"class":319},[297,4292,431],{"class":430},[297,4294,434],{"class":319},[297,4296,438],{"class":437},[297,4298,3764],{"class":441},[297,4300,438],{"class":437},[297,4302,447],{"class":319},[297,4304,4305,4308,4310,4312,4314,4316],{"class":299,"line":331},[297,4306,4307],{"class":307},"ovrd_hps ",[297,4309,423],{"class":422},[297,4311,316],{"class":307},[297,4313,231],{"class":319},[297,4315,431],{"class":430},[297,4317,1310],{"class":319},[297,4319,4320,4322,4324,4326],{"class":299,"line":345},[297,4321,944],{"class":437},[297,4323,3764],{"class":441},[297,4325,438],{"class":437},[297,4327,596],{"class":319},[297,4329,4330,4332,4334,4336],{"class":299,"line":364},[297,4331,944],{"class":437},[297,4333,4003],{"class":441},[297,4335,438],{"class":437},[297,4337,596],{"class":319},[297,4339,4340,4342,4344,4346],{"class":299,"line":467},[297,4341,944],{"class":437},[297,4343,4087],{"class":441},[297,4345,438],{"class":437},[297,4347,596],{"class":319},[297,4349,4350],{"class":299,"line":473},[297,4351,447],{"class":319},[297,4353,4354],{"class":299,"line":618},[297,4355,627],{"emptyLinePlaceholder":626},[297,4357,4358,4360,4363,4365,4368,4370,4372,4374,4376,4378,4380,4382,4384,4386,4388,4390],{"class":299,"line":623},[297,4359,2243],{"class":303},[297,4361,4362],{"class":307}," key ",[297,4364,2249],{"class":303},[297,4366,4367],{"class":319}," (",[297,4369,438],{"class":437},[297,4371,2584],{"class":441},[297,4373,438],{"class":437},[297,4375,358],{"class":319},[297,4377,526],{"class":437},[297,4379,2799],{"class":441},[297,4381,438],{"class":437},[297,4383,358],{"class":319},[297,4385,526],{"class":437},[297,4387,2139],{"class":441},[297,4389,438],{"class":437},[297,4391,4392],{"class":319},"):\n",[297,4394,4395,4398,4400,4402,4404,4407,4409,4412,4414,4417],{"class":299,"line":630},[297,4396,4397],{"class":307},"    before ",[297,4399,423],{"class":422},[297,4401,931],{"class":307},[297,4403,231],{"class":319},[297,4405,4406],{"class":430},"select",[297,4408,434],{"class":319},[297,4410,4411],{"class":430},"base_hps",[297,4413,358],{"class":319},[297,4415,4416],{"class":430}," key",[297,4418,447],{"class":319},[297,4420,4421,4424,4426,4428,4430,4432,4434,4437,4439,4441],{"class":299,"line":636},[297,4422,4423],{"class":307},"    after  ",[297,4425,423],{"class":422},[297,4427,931],{"class":307},[297,4429,231],{"class":319},[297,4431,4406],{"class":430},[297,4433,434],{"class":319},[297,4435,4436],{"class":430},"ovrd_hps",[297,4438,358],{"class":319},[297,4440,4416],{"class":430},[297,4442,447],{"class":319},[297,4444,4445,4448,4450,4452,4455,4457,4459,4462,4465,4468,4471],{"class":299,"line":642},[297,4446,4447],{"class":307},"    changed ",[297,4449,423],{"class":422},[297,4451,526],{"class":437},[297,4453,4454],{"class":441},"\u003C-- changed",[297,4456,438],{"class":437},[297,4458,2271],{"class":303},[297,4460,4461],{"class":307}," before ",[297,4463,4464],{"class":422},"!=",[297,4466,4467],{"class":307}," after ",[297,4469,4470],{"class":303},"else",[297,4472,4473],{"class":437}," \"\"\n",[297,4475,4476,4479,4481,4483,4486,4488,4491,4494,4496,4498,4501,4504,4506,4509,4511,4514,4517,4519,4521,4524,4526,4528],{"class":299,"line":648},[297,4477,4478],{"class":452},"    print",[297,4480,434],{"class":319},[297,4482,4020],{"class":2001},[297,4484,4485],{"class":441},"\"  ",[297,4487,4026],{"class":519},[297,4489,4490],{"class":430},"key",[297,4492,4493],{"class":2001},":\u003C18",[297,4495,4036],{"class":519},[297,4497,955],{"class":519},[297,4499,4500],{"class":430},"before",[297,4502,4503],{"class":2001},"!r:>12",[297,4505,4036],{"class":519},[297,4507,4508],{"class":441},"  →  ",[297,4510,4026],{"class":519},[297,4512,4513],{"class":430},"after",[297,4515,4516],{"class":2001},"!r:\u003C12",[297,4518,4036],{"class":519},[297,4520,955],{"class":519},[297,4522,4523],{"class":430},"changed",[297,4525,4036],{"class":519},[297,4527,438],{"class":441},[297,4529,447],{"class":319},[535,4531],{"data":4532,"kind":538},"ICBiYXRjaF9zaXplICAgICAgICAgICAgICAgICAgIDY0ICDihpIgIDEyOCAgICAgICAgICA8LS0gY2hhbmdlZAogIGxlYXJuaW5nX3JhdGUgICAgICAgICAgICAgMC4wMDEgIOKGkiAgMC4wMDA1ICAgICAgIDwtLSBjaGFuZ2VkCiAgbnVtX3N0YWdlcyAgICAgICAgICAgICAgICAgICAgMyAg4oaSICAzICAgICAgICAgICAgCg==",[1564,4534,4536],{"id":4535},"url-style-overrides","URL-style overrides",[216,4538,4539,4540,4543],{},"Laco also accepts overrides embedded in the URL string using ",[224,4541,4542],{},"?key=value"," syntax,\nwhich is convenient when the full config path is stored in a single variable:",[288,4545,4547],{"className":290,"code":4546,"language":292,"meta":293,"style":293},"# URL-style: ?key=value before the # fragment separator\ncfg_url = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py\"\n    \"?hps.batch_size=32&hps.learning_rate=2e-3\"\n    \"#hps\"\n)\nprint(f\"batch_size={cfg_url.batch_size}  learning_rate={cfg_url.learning_rate}\")  # noqa: LACO001\n",[224,4548,4549,4554,4569,4577,4586,4595,4599],{"__ignoreMap":293},[297,4550,4551],{"class":299,"line":300},[297,4552,4553],{"class":404},"# URL-style: ?key=value before the # fragment separator\n",[297,4555,4556,4559,4561,4563,4565,4567],{"class":299,"line":311},[297,4557,4558],{"class":307},"cfg_url ",[297,4560,423],{"class":422},[297,4562,316],{"class":307},[297,4564,231],{"class":319},[297,4566,431],{"class":430},[297,4568,1310],{"class":319},[297,4570,4571,4573,4575],{"class":299,"line":331},[297,4572,944],{"class":437},[297,4574,3544],{"class":441},[297,4576,2434],{"class":437},[297,4578,4579,4581,4584],{"class":299,"line":345},[297,4580,944],{"class":437},[297,4582,4583],{"class":441},"?hps.batch_size=32&hps.learning_rate=2e-3",[297,4585,2434],{"class":437},[297,4587,4588,4590,4593],{"class":299,"line":364},[297,4589,944],{"class":437},[297,4591,4592],{"class":441},"#hps",[297,4594,2434],{"class":437},[297,4596,4597],{"class":299,"line":467},[297,4598,447],{"class":319},[297,4600,4601,4603,4605,4607,4609,4611,4614,4616,4618,4620,4623,4625,4627,4629,4631,4633,4635,4637],{"class":299,"line":473},[297,4602,453],{"class":452},[297,4604,434],{"class":319},[297,4606,4020],{"class":2001},[297,4608,4209],{"class":441},[297,4610,4026],{"class":519},[297,4612,4613],{"class":430},"cfg_url",[297,4615,231],{"class":319},[297,4617,2584],{"class":322},[297,4619,4036],{"class":519},[297,4621,4622],{"class":441},"  learning_rate=",[297,4624,4026],{"class":519},[297,4626,4613],{"class":430},[297,4628,231],{"class":319},[297,4630,2799],{"class":322},[297,4632,4036],{"class":519},[297,4634,438],{"class":441},[297,4636,715],{"class":319},[297,4638,1925],{"class":404},[535,4640],{"data":4641,"kind":538},"YmF0Y2hfc2l6ZT0zMiAgbGVhcm5pbmdfcmF0ZT0wLjAwMgo=",[1564,4643,4645],{"id":4644},"override-grammar-summary","Override grammar summary",[4647,4648,4649,4662],"table",{},[4650,4651,4652],"thead",{},[4653,4654,4655,4659],"tr",{},[4656,4657,4658],"th",{},"Syntax",[4656,4660,4661],{},"Meaning",[4663,4664,4665,4676,4685,4699,4712,4724],"tbody",{},[4653,4666,4667,4673],{},[4668,4669,4670],"td",{},[224,4671,4672],{},"key=value",[4668,4674,4675],{},"Set a scalar value",[4653,4677,4678,4682],{},[4668,4679,4680],{},[224,4681,3960],{},[4668,4683,4684],{},"Set a nested scalar",[4653,4686,4687,4692],{},[4668,4688,4689],{},[224,4690,4691],{},"+key=value",[4668,4693,4694,4695,4698],{},"Append a new key (Hydra ",[224,4696,4697],{},"+"," prefix)",[4653,4700,4701,4706],{},[4668,4702,4703],{},[224,4704,4705],{},"~key",[4668,4707,4708,4709,4698],{},"Remove a defaults-list entry (Hydra ",[224,4710,4711],{},"~",[4653,4713,4714,4718],{},[4668,4715,4716],{},[224,4717,4542],{},[4668,4719,4720,4721,715],{},"URL-style inline override (before ",[224,4722,4723],{},"#",[4653,4725,4726,4731],{},[4668,4727,4728],{},[224,4729,4730],{},"?key=v1&key2=v2",[4668,4732,4733],{},"Multiple URL-style overrides",[385,4735],{},[388,4737,4739],{"id":4738},"section-6-config-composition","Section 6: Config Composition",[216,4741,4742],{},"How the two source files relate, and how the pipeline bundle is assembled at\ncompose time.",[216,4744,4745,4747,4748,4750,4751,4754,4755,4758,4759,231],{},[224,4746,1940],{}," declares ",[224,4749,1965],{}," and ",[224,4752,4753],{},"make_cnn_classifier(**kw)",",\nwhich builds ",[224,4756,4757],{},"L.call(nn.Sequential, root=True)(stem, stages, head)"," and exposes it as\n",[224,4760,4761],{},"model = make_cnn_classifier(...)",[216,4763,4764,4766,4767,4770,4771,4773],{},[224,4765,3817],{}," imports ",[224,4768,4769],{},"make_cnn_classifier"," from ",[224,4772,1940],{}," and declares:",[4647,4775,4776,4786],{},[4650,4777,4778],{},[4653,4779,4780,4783],{},[4656,4781,4782],{},"Name",[4656,4784,4785],{},"Built with",[4663,4787,4788,4799,4815,4826,4837,4848],{},[4653,4789,4790,4794],{},[4668,4791,4792],{},[224,4793,1952],{},[4668,4795,4796],{},[224,4797,4798],{},"@L.params",[4653,4800,4801,4805],{},[4668,4802,4803],{},[224,4804,1005],{},[4668,4806,4807,4810,4811,4814],{},[224,4808,4809],{},"make_cnn_classifier(...)",", threaded with ",[224,4812,4813],{},"hps.*"," references",[4653,4816,4817,4821],{},[4668,4818,4819],{},[224,4820,1020],{},[4668,4822,4823],{},[224,4824,4825],{},"L.partial(Adam)(...)",[4653,4827,4828,4832],{},[4668,4829,4830],{},[224,4831,1510],{},[4668,4833,4834],{},[224,4835,4836],{},"L.call(CrossEntropyLoss)()",[4653,4838,4839,4843],{},[4668,4840,4841],{},[224,4842,3250],{},[4668,4844,4845],{},[224,4846,4847],{},"L.call(MNIST)(...)",[4653,4849,4850,4854],{},[4668,4851,4852],{},[224,4853,3457],{},[4668,4855,4856],{},[224,4857,4858],{},"L.call(DataLoader)(...)",[216,4860,4861,4862,4865,4866,4869,4870,4872,4873,596,4875,240,4877,240,4879,4881],{},"All five are collected into ",[224,4863,4864],{},"train = L.Dict(model=model, optimizer=optimizer, loss=loss, loader=loader)",".\nLoading ",[224,4867,4868],{},"\"...mnist_train.py#train\""," returns a single ",[224,4871,1139],{}," with keys ",[224,4874,1005],{},[224,4876,1020],{},[224,4878,1510],{},[224,4880,3457],{}," — the whole pipeline in one fragment.",[385,4883],{},[388,4885,4887,4888,4890],{"id":4886},"section-7-__file__-loading-and-runnable-pipeline-modules","Section 7: ",[224,4889,285],{},"-Loading and Runnable Pipeline Modules",[216,4892,4893,4894,4896],{},"A config file that defines a ",[224,4895,3811],{}," entry point can be run directly as a module:",[288,4898,4903],{"className":4899,"code":4901,"language":4902},[4900],"language-text","python -m laco.examples.pipelines.mnist_train num_steps=2\n","text",[224,4904,4901],{"__ignoreMap":293},[216,4906,4907,4908,4910],{},"The canonical pattern for making a config file self-runnable is to use Python's\n",[224,4909,285],{}," sentinel:",[288,4912,4914],{"className":290,"code":4913,"language":292,"meta":293,"style":293},"# From the bottom of mnist_train.py:\n#\n#   if __name__ == \"__main__\":\n#       import laco\n#       cfg = laco.load(__file__ + \"#train\")\n#       task(cfg)\n#\n# Why __file__ instead of \"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py\"?\n#\n# __file__ is the absolute path on disk.  laco.load() accepts both:\n#   - a \"configs:\u002F\u002F\" URL (resolved against the package search path)\n#   - a raw filesystem path (resolved directly)\n# Using __file__ makes the script relocatable — it works even if the module\n# is installed in a virtualenv, editable-installed, or symlinked.\n\nimport laco.examples.pipelines.mnist_train as _mt_module\nprint(\"Module file:\", _mt_module.__file__)\n",[224,4915,4916,4921,4925,4930,4935,4940,4945,4949,4954,4958,4963,4968,4973,4978,4983,4987,5012],{"__ignoreMap":293},[297,4917,4918],{"class":299,"line":300},[297,4919,4920],{"class":404},"# From the bottom of mnist_train.py:\n",[297,4922,4923],{"class":299,"line":311},[297,4924,1750],{"class":404},[297,4926,4927],{"class":299,"line":331},[297,4928,4929],{"class":404},"#   if __name__ == \"__main__\":\n",[297,4931,4932],{"class":299,"line":345},[297,4933,4934],{"class":404},"#       import laco\n",[297,4936,4937],{"class":299,"line":364},[297,4938,4939],{"class":404},"#       cfg = laco.load(__file__ + \"#train\")\n",[297,4941,4942],{"class":299,"line":467},[297,4943,4944],{"class":404},"#       task(cfg)\n",[297,4946,4947],{"class":299,"line":473},[297,4948,1750],{"class":404},[297,4950,4951],{"class":299,"line":618},[297,4952,4953],{"class":404},"# Why __file__ instead of \"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py\"?\n",[297,4955,4956],{"class":299,"line":623},[297,4957,1750],{"class":404},[297,4959,4960],{"class":299,"line":630},[297,4961,4962],{"class":404},"# __file__ is the absolute path on disk.  laco.load() accepts both:\n",[297,4964,4965],{"class":299,"line":636},[297,4966,4967],{"class":404},"#   - a \"configs:\u002F\u002F\" URL (resolved against the package search path)\n",[297,4969,4970],{"class":299,"line":642},[297,4971,4972],{"class":404},"#   - a raw filesystem path (resolved directly)\n",[297,4974,4975],{"class":299,"line":648},[297,4976,4977],{"class":404},"# Using __file__ makes the script relocatable — it works even if the module\n",[297,4979,4980],{"class":299,"line":654},[297,4981,4982],{"class":404},"# is installed in a virtualenv, editable-installed, or symlinked.\n",[297,4984,4985],{"class":299,"line":660},[297,4986,627],{"emptyLinePlaceholder":626},[297,4988,4989,4991,4993,4995,4997,4999,5002,5004,5007,5009],{"class":299,"line":692},[297,4990,304],{"class":303},[297,4992,316],{"class":307},[297,4994,231],{"class":319},[297,4996,567],{"class":322},[297,4998,231],{"class":319},[297,5000,5001],{"class":322},"pipelines",[297,5003,231],{"class":319},[297,5005,5006],{"class":322},"mnist_train",[297,5008,325],{"class":303},[297,5010,5011],{"class":307}," _mt_module\n",[297,5013,5014,5016,5018,5020,5023,5025,5027,5030,5032,5034],{"class":299,"line":721},[297,5015,453],{"class":452},[297,5017,434],{"class":319},[297,5019,438],{"class":437},[297,5021,5022],{"class":441},"Module file:",[297,5024,438],{"class":437},[297,5026,358],{"class":319},[297,5028,5029],{"class":430}," _mt_module",[297,5031,231],{"class":319},[297,5033,285],{"class":686},[297,5035,447],{"class":319},[535,5037],{"data":5038,"kind":538},"TW9kdWxlIGZpbGU6IC9uaXgvc3RvcmUvMTE3OHltZDc4ODN2aDRmbTcwYnFxbjU3MGFnMmlrZHktbGFjby1lbnYvbGliL3B5dGhvbjMuMTMvc2l0ZS1wYWNrYWdlcy9sYWNvL2V4YW1wbGVzL3BpcGVsaW5lcy9tbmlzdF90cmFpbi5weQo=",[288,5040,5042],{"className":290,"code":5041,"language":292,"meta":293,"style":293},"# Load via filesystem path (same as __file__ + \"#train\" from inside the module)\nimport importlib.resources, pathlib\n\nmodule_path = pathlib.Path(_mt_module.__file__)\ncfg_via_file = laco.load(str(module_path) + \"#hps\")\nprint(\"Loaded via __file__ path — batch_size:\", cfg_via_file.batch_size)  # noqa: LACO001\n",[224,5043,5044,5049,5066,5070,5096,5132],{"__ignoreMap":293},[297,5045,5046],{"class":299,"line":300},[297,5047,5048],{"class":404},"# Load via filesystem path (same as __file__ + \"#train\" from inside the module)\n",[297,5050,5051,5053,5056,5058,5061,5063],{"class":299,"line":311},[297,5052,304],{"class":303},[297,5054,5055],{"class":307}," importlib",[297,5057,231],{"class":319},[297,5059,5060],{"class":322},"resources",[297,5062,358],{"class":319},[297,5064,5065],{"class":307}," pathlib\n",[297,5067,5068],{"class":299,"line":331},[297,5069,627],{"emptyLinePlaceholder":626},[297,5071,5072,5075,5077,5080,5082,5085,5087,5090,5092,5094],{"class":299,"line":345},[297,5073,5074],{"class":307},"module_path ",[297,5076,423],{"class":422},[297,5078,5079],{"class":307}," pathlib",[297,5081,231],{"class":319},[297,5083,5084],{"class":430},"Path",[297,5086,434],{"class":319},[297,5088,5089],{"class":430},"_mt_module",[297,5091,231],{"class":319},[297,5093,285],{"class":686},[297,5095,447],{"class":319},[297,5097,5098,5101,5103,5105,5107,5109,5111,5114,5116,5119,5121,5124,5126,5128,5130],{"class":299,"line":364},[297,5099,5100],{"class":307},"cfg_via_file ",[297,5102,423],{"class":422},[297,5104,316],{"class":307},[297,5106,231],{"class":319},[297,5108,431],{"class":430},[297,5110,434],{"class":319},[297,5112,5113],{"class":480},"str",[297,5115,434],{"class":319},[297,5117,5118],{"class":430},"module_path",[297,5120,715],{"class":319},[297,5122,5123],{"class":422}," +",[297,5125,526],{"class":437},[297,5127,4592],{"class":441},[297,5129,438],{"class":437},[297,5131,447],{"class":319},[297,5133,5134,5136,5138,5140,5143,5145,5147,5150,5152,5154,5156],{"class":299,"line":467},[297,5135,453],{"class":452},[297,5137,434],{"class":319},[297,5139,438],{"class":437},[297,5141,5142],{"class":441},"Loaded via __file__ path — batch_size:",[297,5144,438],{"class":437},[297,5146,358],{"class":319},[297,5148,5149],{"class":430}," cfg_via_file",[297,5151,231],{"class":319},[297,5153,2584],{"class":322},[297,5155,715],{"class":319},[297,5157,1925],{"class":404},[535,5159],{"data":5160,"kind":538},"TG9hZGVkIHZpYSBfX2ZpbGVfXyBwYXRoIOKAlCBiYXRjaF9zaXplOiA2NAo=",[1564,5162,5164,5167],{"id":5163},"configs-url-vs-filesystem-path",[224,5165,5166],{},"configs:\u002F\u002F"," URL vs filesystem path",[4647,5169,5170,5183],{},[4650,5171,5172],{},[4653,5173,5174,5177,5180],{},[4656,5175,5176],{},"Form",[4656,5178,5179],{},"Example",[4656,5181,5182],{},"When to use",[4663,5184,5185,5202,5215],{},[4653,5186,5187,5192,5196],{},[4668,5188,5189,5191],{},[224,5190,5166],{}," URL",[4668,5193,5194],{},[224,5195,3544],{},[4668,5197,5198,5199,5201],{},"References into the installed ",[224,5200,1117],{}," package's examples; stable across installs",[4653,5203,5204,5207,5212],{},[4668,5205,5206],{},"Filesystem path",[4668,5208,5209],{},[224,5210,5211],{},"str(__file__) + \"#fragment\"",[4668,5213,5214],{},"Self-loading from within the config file itself; works even outside the package",[4653,5216,5217,5220,5225],{},[4668,5218,5219],{},"Relative path",[4668,5221,5222],{},[224,5223,5224],{},"\".\u002Fmy_config.py\"",[4668,5226,5227],{},"Local project configs not installed in any package",[216,5229,282,5230,5232,5233,5236,5237,5239,5240,231],{},[224,5231,5166],{}," scheme is the recommended form for ",[219,5234,5235],{},"referencing library examples",".\nThe ",[224,5238,285],{}," form is the recommended form for ",[219,5241,5242],{},"self-running modules",[385,5244],{},[388,5246,5248],{"id":5247},"section-8-instantiating-a-full-pipeline-bundle","Section 8: Instantiating a Full Pipeline Bundle",[216,5250,5251],{},"With all pieces in place, here is how a training script consumes the pipeline config:",[288,5253,5255],{"className":290,"code":5254,"language":292,"meta":293,"style":293},"# Load the train bundle\ntrain_cfg = laco.load(\n    \"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#train\",\n    \"hps.base_channels=16\",   # smaller model for faster instantiation in this notebook\n    \"hps.num_stages=2\",\n)\n\n# Instantiate each component individually\nmodel_obj     = laco.instantiate(train_cfg.model)      # type: ignore[union-attr]  # noqa: LACO001\noptimizer_fn  = laco.instantiate(train_cfg.optimizer)  # type: ignore[union-attr]  # noqa: LACO001\nloss_obj      = laco.instantiate(train_cfg.loss)       # type: ignore[union-attr]  # noqa: LACO001\n\n# optimizer is a partial — call it with model.parameters()\nopt = optimizer_fn(model_obj.parameters())\n\nprint(\"model     :\", type(model_obj).__name__)\nprint(\"optimizer :\", type(opt).__name__)\nprint(\"loss      :\", type(loss_obj).__name__)\n\n# Verify model works with a dummy forward pass\nimport torch\ndummy = torch.randn(2, 1, 28, 28)  # batch=2, channels=1, 28x28\nout = model_obj(dummy)\nprint(\"output shape:\", out.shape)   # should be [2, 10]\n",[224,5256,5257,5262,5276,5286,5299,5309,5313,5317,5322,5348,5374,5400,5404,5409,5432,5436,5463,5491,5519,5523,5528,5535,5571,5587],{"__ignoreMap":293},[297,5258,5259],{"class":299,"line":300},[297,5260,5261],{"class":404},"# Load the train bundle\n",[297,5263,5264,5266,5268,5270,5272,5274],{"class":299,"line":311},[297,5265,3614],{"class":307},[297,5267,423],{"class":422},[297,5269,316],{"class":307},[297,5271,231],{"class":319},[297,5273,431],{"class":430},[297,5275,1310],{"class":319},[297,5277,5278,5280,5282,5284],{"class":299,"line":331},[297,5279,944],{"class":437},[297,5281,3629],{"class":441},[297,5283,438],{"class":437},[297,5285,596],{"class":319},[297,5287,5288,5290,5292,5294,5296],{"class":299,"line":345},[297,5289,944],{"class":437},[297,5291,4190],{"class":441},[297,5293,438],{"class":437},[297,5295,358],{"class":319},[297,5297,5298],{"class":404},"   # smaller model for faster instantiation in this notebook\n",[297,5300,5301,5303,5305,5307],{"class":299,"line":364},[297,5302,944],{"class":437},[297,5304,4179],{"class":441},[297,5306,438],{"class":437},[297,5308,596],{"class":319},[297,5310,5311],{"class":299,"line":467},[297,5312,447],{"class":319},[297,5314,5315],{"class":299,"line":473},[297,5316,627],{"emptyLinePlaceholder":626},[297,5318,5319],{"class":299,"line":618},[297,5320,5321],{"class":404},"# Instantiate each component individually\n",[297,5323,5324,5327,5329,5331,5333,5335,5337,5339,5341,5343,5345],{"class":299,"line":623},[297,5325,5326],{"class":307},"model_obj     ",[297,5328,423],{"class":422},[297,5330,316],{"class":307},[297,5332,231],{"class":319},[297,5334,1475],{"class":430},[297,5336,434],{"class":319},[297,5338,3662],{"class":430},[297,5340,231],{"class":319},[297,5342,1005],{"class":322},[297,5344,715],{"class":319},[297,5346,5347],{"class":404},"      # type: ignore[union-attr]  # noqa: LACO001\n",[297,5349,5350,5353,5355,5357,5359,5361,5363,5365,5367,5369,5371],{"class":299,"line":630},[297,5351,5352],{"class":307},"optimizer_fn  ",[297,5354,423],{"class":422},[297,5356,316],{"class":307},[297,5358,231],{"class":319},[297,5360,1475],{"class":430},[297,5362,434],{"class":319},[297,5364,3662],{"class":430},[297,5366,231],{"class":319},[297,5368,1020],{"class":322},[297,5370,715],{"class":319},[297,5372,5373],{"class":404},"  # type: ignore[union-attr]  # noqa: LACO001\n",[297,5375,5376,5379,5381,5383,5385,5387,5389,5391,5393,5395,5397],{"class":299,"line":636},[297,5377,5378],{"class":307},"loss_obj      ",[297,5380,423],{"class":422},[297,5382,316],{"class":307},[297,5384,231],{"class":319},[297,5386,1475],{"class":430},[297,5388,434],{"class":319},[297,5390,3662],{"class":430},[297,5392,231],{"class":319},[297,5394,1510],{"class":322},[297,5396,715],{"class":319},[297,5398,5399],{"class":404},"       # type: ignore[union-attr]  # noqa: LACO001\n",[297,5401,5402],{"class":299,"line":642},[297,5403,627],{"emptyLinePlaceholder":626},[297,5405,5406],{"class":299,"line":648},[297,5407,5408],{"class":404},"# optimizer is a partial — call it with model.parameters()\n",[297,5410,5411,5414,5416,5419,5421,5424,5426,5429],{"class":299,"line":654},[297,5412,5413],{"class":307},"opt ",[297,5415,423],{"class":422},[297,5417,5418],{"class":430}," optimizer_fn",[297,5420,434],{"class":319},[297,5422,5423],{"class":430},"model_obj",[297,5425,231],{"class":319},[297,5427,5428],{"class":430},"parameters",[297,5430,5431],{"class":319},"())\n",[297,5433,5434],{"class":299,"line":660},[297,5435,627],{"emptyLinePlaceholder":626},[297,5437,5438,5440,5442,5444,5447,5449,5451,5453,5455,5457,5459,5461],{"class":299,"line":692},[297,5439,453],{"class":452},[297,5441,434],{"class":319},[297,5443,438],{"class":437},[297,5445,5446],{"class":441},"model     :",[297,5448,438],{"class":437},[297,5450,358],{"class":319},[297,5452,676],{"class":480},[297,5454,434],{"class":319},[297,5456,5423],{"class":430},[297,5458,511],{"class":319},[297,5460,687],{"class":686},[297,5462,447],{"class":319},[297,5464,5465,5467,5469,5471,5474,5476,5478,5480,5482,5485,5487,5489],{"class":299,"line":721},[297,5466,453],{"class":452},[297,5468,434],{"class":319},[297,5470,438],{"class":437},[297,5472,5473],{"class":441},"optimizer :",[297,5475,438],{"class":437},[297,5477,358],{"class":319},[297,5479,676],{"class":480},[297,5481,434],{"class":319},[297,5483,5484],{"class":430},"opt",[297,5486,511],{"class":319},[297,5488,687],{"class":686},[297,5490,447],{"class":319},[297,5492,5493,5495,5497,5499,5502,5504,5506,5508,5510,5513,5515,5517],{"class":299,"line":750},[297,5494,453],{"class":452},[297,5496,434],{"class":319},[297,5498,438],{"class":437},[297,5500,5501],{"class":441},"loss      :",[297,5503,438],{"class":437},[297,5505,358],{"class":319},[297,5507,676],{"class":480},[297,5509,434],{"class":319},[297,5511,5512],{"class":430},"loss_obj",[297,5514,511],{"class":319},[297,5516,687],{"class":686},[297,5518,447],{"class":319},[297,5520,5521],{"class":299,"line":776},[297,5522,627],{"emptyLinePlaceholder":626},[297,5524,5525],{"class":299,"line":809},[297,5526,5527],{"class":404},"# Verify model works with a dummy forward pass\n",[297,5529,5530,5532],{"class":299,"line":814},[297,5531,304],{"class":303},[297,5533,5534],{"class":307}," torch\n",[297,5536,5537,5540,5542,5544,5546,5549,5551,5553,5555,5557,5559,5562,5564,5566,5568],{"class":299,"line":820},[297,5538,5539],{"class":307},"dummy ",[297,5541,423],{"class":422},[297,5543,369],{"class":307},[297,5545,231],{"class":319},[297,5547,5548],{"class":430},"randn",[297,5550,434],{"class":319},[297,5552,1853],{"class":519},[297,5554,358],{"class":319},[297,5556,981],{"class":519},[297,5558,358],{"class":319},[297,5560,5561],{"class":519}," 28",[297,5563,358],{"class":319},[297,5565,5561],{"class":519},[297,5567,715],{"class":319},[297,5569,5570],{"class":404},"  # batch=2, channels=1, 28x28\n",[297,5572,5573,5576,5578,5580,5582,5585],{"class":299,"line":826},[297,5574,5575],{"class":307},"out ",[297,5577,423],{"class":422},[297,5579,1537],{"class":430},[297,5581,434],{"class":319},[297,5583,5584],{"class":430},"dummy",[297,5586,447],{"class":319},[297,5588,5589,5591,5593,5595,5598,5600,5602,5605,5607,5610,5612],{"class":299,"line":2229},[297,5590,453],{"class":452},[297,5592,434],{"class":319},[297,5594,438],{"class":437},[297,5596,5597],{"class":441},"output shape:",[297,5599,438],{"class":437},[297,5601,358],{"class":319},[297,5603,5604],{"class":430}," out",[297,5606,231],{"class":319},[297,5608,5609],{"class":322},"shape",[297,5611,715],{"class":319},[297,5613,5614],{"class":404},"   # should be [2, 10]\n",[535,5616],{"data":5617,"kind":538},"bW9kZWwgICAgIDogU2VxdWVudGlhbApvcHRpbWl6ZXIgOiBBZGFtCmxvc3MgICAgICA6IENyb3NzRW50cm9weUxvc3MKb3V0cHV0IHNoYXBlOiB0b3JjaC5TaXplKFsyLCAxMF0pCg==",[385,5619],{},[388,5621,5623],{"id":5622},"section-9-nested-instantiation-dataloader-with-nested-mnist","Section 9: Nested Instantiation, DataLoader with Nested MNIST",[216,5625,5626,5627,240,5629,5632],{},"Recursive instantiation is inherited from Hydra: when a config node contains a nested\nnode with a ",[224,5628,712],{},[224,5630,5631],{},"laco.instantiate"," will build the inner object first and pass\nit to the outer constructor automatically.",[288,5634,5636],{"className":290,"code":5635,"language":292,"meta":293,"style":293},"# Inspect the loader config — it contains a nested dataset node\nloader_cfg = laco.load(\"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#loader\")\nprint(\"=== loader config ===\")\nprint(laco.dump(loader_cfg))\n",[224,5637,5638,5643,5667,5682],{"__ignoreMap":293},[297,5639,5640],{"class":299,"line":300},[297,5641,5642],{"class":404},"# Inspect the loader config — it contains a nested dataset node\n",[297,5644,5645,5648,5650,5652,5654,5656,5658,5660,5663,5665],{"class":299,"line":311},[297,5646,5647],{"class":307},"loader_cfg ",[297,5649,423],{"class":422},[297,5651,316],{"class":307},[297,5653,231],{"class":319},[297,5655,431],{"class":430},[297,5657,434],{"class":319},[297,5659,438],{"class":437},[297,5661,5662],{"class":441},"configs:\u002F\u002Fexamples\u002Fpipelines\u002Fmnist_train.py#loader",[297,5664,438],{"class":437},[297,5666,447],{"class":319},[297,5668,5669,5671,5673,5675,5678,5680],{"class":299,"line":331},[297,5670,453],{"class":452},[297,5672,434],{"class":319},[297,5674,438],{"class":437},[297,5676,5677],{"class":441},"=== loader config ===",[297,5679,438],{"class":437},[297,5681,447],{"class":319},[297,5683,5684,5686,5688,5690,5692,5694,5696,5699],{"class":299,"line":345},[297,5685,453],{"class":452},[297,5687,434],{"class":319},[297,5689,1117],{"class":430},[297,5691,231],{"class":319},[297,5693,1122],{"class":430},[297,5695,434],{"class":319},[297,5697,5698],{"class":430},"loader_cfg",[297,5700,773],{"class":319},[535,5702],{"data":5703,"kind":538},"PT09IGxvYWRlciBjb25maWcgPT09Cl9jb252ZXJ0XzogYWxsCl9sYWNvXzogMQpfdGFyZ2V0XzogdG9yY2gudXRpbHMuZGF0YS5EYXRhTG9hZGVyCmJhdGNoX3NpemU6ICR7aHBzLmJhdGNoX3NpemV9CmRhdGFzZXQ6CiAgX2NvbnZlcnRfOiBhbGwKICBfdGFyZ2V0XzogdG9yY2h2aXNpb24uZGF0YXNldHMuTU5JU1QKICBkb3dubG9hZDogdHJ1ZQogIHJvb3Q6ICR7aHBzLmRhdGFfcm9vdH0KICB0cmFpbjogdHJ1ZQogIHRyYW5zZm9ybToKICAgIF9hcmdzXzoKICAgIC0gX2NvbnZlcnRfOiBhbGwKICAgICAgX3RhcmdldF86IGxhY28ubGFuZ3VhZ2UuTGlzdC50YXJnZXQKICAgICAgaXRlbXM6CiAgICAgIC0ge19jb252ZXJ0XzogYWxsLCBfdGFyZ2V0XzogdG9yY2h2aXNpb24udHJhbnNmb3Jtcy5Ub1RlbnNvcn0KICAgICAgLSBfY29udmVydF86IGFsbAogICAgICAgIF90YXJnZXRfOiB0b3JjaHZpc2lvbi50cmFuc2Zvcm1zLk5vcm1hbGl6ZQogICAgICAgIG1lYW46CiAgICAgICAgICBfY29udmVydF86IGFsbAogICAgICAgICAgX3RhcmdldF86IGxhY28ubGFuZ3VhZ2UuTGlzdC50YXJnZXQKICAgICAgICAgIGl0ZW1zOiBbMC4xMzA3XQogICAgICAgIHN0ZDoKICAgICAgICAgIF9jb252ZXJ0XzogYWxsCiAgICAgICAgICBfdGFyZ2V0XzogbGFjby5sYW5ndWFnZS5MaXN0LnRhcmdldAogICAgICAgICAgaXRlbXM6IFswLjMwODFdCiAgICBfY29udmVydF86IGFsbAogICAgX3RhcmdldF86IHRvcmNodmlzaW9uLnRyYW5zZm9ybXMuQ29tcG9zZQpudW1fd29ya2VyczogJHtocHMubnVtX3dvcmtlcnN9CnNodWZmbGU6IHRydWUKCg==",[288,5705,5707],{"className":290,"code":5706,"language":292,"meta":293,"style":293},"# The nesting depth: loader → dataset → transform → [ToTensor, Normalize]\n# laco.instantiate(loader_cfg) would:\n#   1. Build Normalize(mean=[0.1307], std=[0.3081])\n#   2. Build ToTensor()\n#   3. Build Compose([ToTensor(), Normalize(...)])\n#   4. Build MNIST(root=..., transform=Compose(...))\n#   5. Build DataLoader(dataset=MNIST(...), batch_size=64, ...)\n#\n# This cell is *illustrative* — MNIST download would be triggered.\n# Uncomment the line below in an environment with internet access:\n\n# loader_obj = laco.instantiate(loader_cfg)\n# print(\"loader:\", loader_obj)\n\nprint(\"(Skipped — would download MNIST.  Run in a connected environment to verify.)\")\n",[224,5708,5709,5714,5719,5724,5729,5734,5739,5744,5748,5753,5758,5762,5767,5772,5776],{"__ignoreMap":293},[297,5710,5711],{"class":299,"line":300},[297,5712,5713],{"class":404},"# The nesting depth: loader → dataset → transform → [ToTensor, Normalize]\n",[297,5715,5716],{"class":299,"line":311},[297,5717,5718],{"class":404},"# laco.instantiate(loader_cfg) would:\n",[297,5720,5721],{"class":299,"line":331},[297,5722,5723],{"class":404},"#   1. Build Normalize(mean=[0.1307], std=[0.3081])\n",[297,5725,5726],{"class":299,"line":345},[297,5727,5728],{"class":404},"#   2. Build ToTensor()\n",[297,5730,5731],{"class":299,"line":364},[297,5732,5733],{"class":404},"#   3. Build Compose([ToTensor(), Normalize(...)])\n",[297,5735,5736],{"class":299,"line":467},[297,5737,5738],{"class":404},"#   4. Build MNIST(root=..., transform=Compose(...))\n",[297,5740,5741],{"class":299,"line":473},[297,5742,5743],{"class":404},"#   5. Build DataLoader(dataset=MNIST(...), batch_size=64, ...)\n",[297,5745,5746],{"class":299,"line":618},[297,5747,1750],{"class":404},[297,5749,5750],{"class":299,"line":623},[297,5751,5752],{"class":404},"# This cell is *illustrative* — MNIST download would be triggered.\n",[297,5754,5755],{"class":299,"line":630},[297,5756,5757],{"class":404},"# Uncomment the line below in an environment with internet access:\n",[297,5759,5760],{"class":299,"line":636},[297,5761,627],{"emptyLinePlaceholder":626},[297,5763,5764],{"class":299,"line":642},[297,5765,5766],{"class":404},"# loader_obj = laco.instantiate(loader_cfg)\n",[297,5768,5769],{"class":299,"line":648},[297,5770,5771],{"class":404},"# print(\"loader:\", loader_obj)\n",[297,5773,5774],{"class":299,"line":654},[297,5775,627],{"emptyLinePlaceholder":626},[297,5777,5778,5780,5782,5784,5787,5789],{"class":299,"line":660},[297,5779,453],{"class":452},[297,5781,434],{"class":319},[297,5783,438],{"class":437},[297,5785,5786],{"class":441},"(Skipped — would download MNIST.  Run in a connected environment to verify.)",[297,5788,438],{"class":437},[297,5790,447],{"class":319},[535,5792],{"data":5793,"kind":538},"KFNraXBwZWQg4oCUIHdvdWxkIGRvd25sb2FkIE1OSVNULiAgUnVuIGluIGEgY29ubmVjdGVkIGVudmlyb25tZW50IHRvIHZlcmlmeS4pCg==",[385,5795],{},[388,5797,5799],{"id":5798},"summary","Summary",[4647,5801,5802,5812],{},[4650,5803,5804],{},[4653,5805,5806,5809],{},[4656,5807,5808],{},"Concept",[4656,5810,5811],{},"What it does",[4663,5813,5814,5827,5837,5854,5865,5874,5887],{},[4653,5815,5816,5821],{},[4668,5817,5818],{},[224,5819,5820],{},"L.Dict(k=v, ...)",[4668,5822,5823,5824],{},"Groups named config nodes into a single DictConfig root; accessed via ",[224,5825,5826],{},"#fragment",[4653,5828,5829,5834],{},[4668,5830,5831],{},[224,5832,5833],{},"L.List(n1, n2, ...)",[4668,5835,5836],{},"An ordered DictConfig list of nodes; used for sequences like transform pipelines",[4653,5838,5839,5844],{},[4668,5840,5841],{},[224,5842,5843],{},"L.partial(T)(**kw)",[4668,5845,5846,5847,5850,5851,715],{},"A \"partial constructor\" node; instantiation returns ",[224,5848,5849],{},"functools.partial(T, **kw)",", which requires further arguments (e.g. ",[224,5852,5853],{},"model.parameters()",[4653,5855,5856,5859],{},[4668,5857,5858],{},"Factory import pattern",[4668,5860,5861,5862,5864],{},"A config file imports a factory function from another module and calls it with interpolation references to thread ",[224,5863,4798],{}," values through",[4653,5866,5867,5871],{},[4668,5868,5869,5191],{},[224,5870,5166],{},[4668,5872,5873],{},"Resolves against the installed package's config root; stable across environments",[4653,5875,5876,5881],{},[4668,5877,5878,5880],{},[224,5879,285],{}," loading",[4668,5882,5883,5884],{},"A config module loads itself by path; makes the module self-runnable as ",[224,5885,5886],{},"python -m ...",[4653,5888,5889,5892],{},[4668,5890,5891],{},"Recursive instantiation",[4668,5893,5894,5897],{},[224,5895,5896],{},"laco.instantiate(cfg)"," builds nested objects bottom-up automatically",[216,5899,5900],{},[219,5901,5902],{},"Putting it all together:",[252,5904,5905,5911,5921,5927,5937],{},[255,5906,5907,5908,5910],{},"Use ",[224,5909,4798],{}," to collect scalar hyperparameters in one place.",[255,5912,5907,5913,5916,5917,5920],{},[224,5914,5915],{},"L.call"," \u002F ",[224,5918,5919],{},"L.partial"," to build lazy construction nodes for every component.",[255,5922,5923,5924,5926],{},"Thread ",[224,5925,4798],{}," values through factory functions to keep the graph parametric.",[255,5928,5929,5930,5933,5934,5936],{},"Collect everything into ",[224,5931,5932],{},"L.Dict(model=..., optimizer=..., ...)"," as the ",[224,5935,3497],{}," bundle.",[255,5938,5939,5940,5943],{},"Load with ",[224,5941,5942],{},"laco.load(\"...#train\")"," and instantiate each component as needed.",[385,5945],{},[216,5947,5948,222,5951,5953,5954,5956,5957,5960],{},[219,5949,5950],{},"Next:",[224,5952,3944],{}," covers ",[224,5955,3811],{},", the ",[224,5958,5959],{},"laco run"," CLI, and\nhow to structure a project so experiments are fully reproducible and launch-able from\nthe command line.",[5962,5963,5964],"style",{},"html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .slqww, html code.shiki .slqww{--shiki-light:#6182B8;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .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 .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .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 .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .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 .sFwrP, html code.shiki .sFwrP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#24292E;--shiki-default-font-style:inherit;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit}",{"title":293,"searchDepth":331,"depth":331,"links":5966},[5967,5968,5973,5977,5982,5986,5987,5992,5993,5994],{"id":390,"depth":311,"text":391},{"id":1159,"depth":311,"text":5969,"children":5970},"Section 2: L.Dict, The Pipeline Root",[5971],{"id":1566,"depth":331,"text":5972},"The #train fragment pattern",{"id":1724,"depth":311,"text":1725,"children":5974},[5975],{"id":1931,"depth":331,"text":5976},"Why a factory function instead of a module-level model attribute?",{"id":2315,"depth":311,"text":5978,"children":5979},"Section 4: Full Walkthrough, pipelines\u002Fmnist_train.py",[5980],{"id":3808,"depth":331,"text":5981},"The @L.task decorator (preview)",{"id":3953,"depth":311,"text":3954,"children":5983},[5984,5985],{"id":4535,"depth":331,"text":4536},{"id":4644,"depth":331,"text":4645},{"id":4738,"depth":311,"text":4739},{"id":4886,"depth":311,"text":5988,"children":5989},"Section 7: __file__-Loading and Runnable Pipeline Modules",[5990],{"id":5163,"depth":331,"text":5991},"configs:\u002F\u002F URL vs filesystem path",{"id":5247,"depth":311,"text":5248},{"id":5622,"depth":311,"text":5623},{"id":5798,"depth":311,"text":5799},"Prerequisites: 01.why-laco.ipynb through 06.nested-configs-and-containers.ipynb.","md",{"notebook":626},{"icon":25},{"title":51,"description":5995},"2erS8nKjCLpZzEbPOSfouSqfEyPRhHqkjvIvdMaQ7tQ",{},1785687302336]