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