[{"data":1,"prerenderedAt":1769},["ShallowReactive",2],{"navigation":3,"api-navigation":184,"\u002Flearn\u002Fhow-to\u002Fmigrate-from-argparse":206,"docyard:crossref-index":1768},[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":130,"body":208,"description":245,"extension":1764,"meta":1765,"navigation":298,"path":131,"seo":1766,"stem":132,"__hash__":1767},"content\u002F2.learn\u002F3.how-to\u002F7.migrate-from-argparse.md",{"type":209,"value":210,"toc":1755},"minimark",[211,215,234,239,696,700,707,1005,1009,1147,1150,1187,1194,1548,1564,1568,1672,1701,1705,1751],[212,213,130],"h1",{"id":214},"migrate-from-argparse",[216,217,218],"blockquote",{},[219,220,221,225,226,229,225,232],"p",{},[222,223,224],"strong",{},"Tutorial:"," ",[227,228,22],"a",{"href":23},[222,230,231],{},"See also:",[227,233,5],{"href":6},[235,236,238],"h2",{"id":237},"before-argparse","Before: argparse",[240,241,246],"pre",{"className":242,"code":243,"language":244,"meta":245,"style":245},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","# train.py (argparse version)\nimport argparse, torch, torch.nn as nn\n\ndef main():\n    p = argparse.ArgumentParser()\n    p.add_argument(\"--lr\", type=float, default=1e-3)\n    p.add_argument(\"--hidden\", type=int, default=256)\n    p.add_argument(\"--epochs\", type=int, default=10)\n    args = p.parse_args()\n\n    model = nn.Sequential(\n        nn.Linear(784, args.hidden),\n        nn.ReLU(),\n        nn.Linear(args.hidden, 10),\n    )\n    optimizer = torch.optim.Adam(model.parameters(), lr=args.lr)\n    for epoch in range(args.epochs):\n        ...   # training loop\n\nif __name__ == \"__main__\":\n    main()\n","python","",[247,248,249,258,293,300,314,335,385,423,460,478,483,502,531,544,569,575,622,650,660,665,688],"code",{"__ignoreMap":245},[250,251,254],"span",{"class":252,"line":253},"line",1,[250,255,257],{"class":256},"sutJx","# train.py (argparse version)\n",[250,259,261,265,269,273,276,278,280,283,287,290],{"class":252,"line":260},2,[250,262,264],{"class":263},"sVHd0","import",[250,266,268],{"class":267},"su5hD"," argparse",[250,270,272],{"class":271},"sP7_E",",",[250,274,275],{"class":267}," torch",[250,277,272],{"class":271},[250,279,275],{"class":267},[250,281,282],{"class":271},".",[250,284,286],{"class":285},"skxfh","nn",[250,288,289],{"class":263}," as",[250,291,292],{"class":267}," nn\n",[250,294,296],{"class":252,"line":295},3,[250,297,299],{"emptyLinePlaceholder":298},true,"\n",[250,301,303,307,311],{"class":252,"line":302},4,[250,304,306],{"class":305},"sbsja","def",[250,308,310],{"class":309},"sGLFI"," main",[250,312,313],{"class":271},"():\n",[250,315,317,320,324,326,328,332],{"class":252,"line":316},5,[250,318,319],{"class":267},"    p ",[250,321,323],{"class":322},"smGrS","=",[250,325,268],{"class":267},[250,327,282],{"class":271},[250,329,331],{"class":330},"slqww","ArgumentParser",[250,333,334],{"class":271},"()\n",[250,336,338,341,343,346,349,353,357,359,361,365,367,371,373,376,378,382],{"class":252,"line":337},6,[250,339,340],{"class":267},"    p",[250,342,282],{"class":271},[250,344,345],{"class":330},"add_argument",[250,347,348],{"class":271},"(",[250,350,352],{"class":351},"sjJ54","\"",[250,354,356],{"class":355},"s_sjI","--lr",[250,358,352],{"class":351},[250,360,272],{"class":271},[250,362,364],{"class":363},"s99_P"," type",[250,366,323],{"class":322},[250,368,370],{"class":369},"sZMiF","float",[250,372,272],{"class":271},[250,374,375],{"class":363}," default",[250,377,323],{"class":322},[250,379,381],{"class":380},"srdBf","1e-3",[250,383,384],{"class":271},")\n",[250,386,388,390,392,394,396,398,401,403,405,407,409,412,414,416,418,421],{"class":252,"line":387},7,[250,389,340],{"class":267},[250,391,282],{"class":271},[250,393,345],{"class":330},[250,395,348],{"class":271},[250,397,352],{"class":351},[250,399,400],{"class":355},"--hidden",[250,402,352],{"class":351},[250,404,272],{"class":271},[250,406,364],{"class":363},[250,408,323],{"class":322},[250,410,411],{"class":369},"int",[250,413,272],{"class":271},[250,415,375],{"class":363},[250,417,323],{"class":322},[250,419,420],{"class":380},"256",[250,422,384],{"class":271},[250,424,426,428,430,432,434,436,439,441,443,445,447,449,451,453,455,458],{"class":252,"line":425},8,[250,427,340],{"class":267},[250,429,282],{"class":271},[250,431,345],{"class":330},[250,433,348],{"class":271},[250,435,352],{"class":351},[250,437,438],{"class":355},"--epochs",[250,440,352],{"class":351},[250,442,272],{"class":271},[250,444,364],{"class":363},[250,446,323],{"class":322},[250,448,411],{"class":369},[250,450,272],{"class":271},[250,452,375],{"class":363},[250,454,323],{"class":322},[250,456,457],{"class":380},"10",[250,459,384],{"class":271},[250,461,463,466,468,471,473,476],{"class":252,"line":462},9,[250,464,465],{"class":267},"    args ",[250,467,323],{"class":322},[250,469,470],{"class":267}," p",[250,472,282],{"class":271},[250,474,475],{"class":330},"parse_args",[250,477,334],{"class":271},[250,479,481],{"class":252,"line":480},10,[250,482,299],{"emptyLinePlaceholder":298},[250,484,486,489,491,494,496,499],{"class":252,"line":485},11,[250,487,488],{"class":267},"    model ",[250,490,323],{"class":322},[250,492,493],{"class":267}," nn",[250,495,282],{"class":271},[250,497,498],{"class":330},"Sequential",[250,500,501],{"class":271},"(\n",[250,503,505,508,510,513,515,518,520,523,525,528],{"class":252,"line":504},12,[250,506,507],{"class":330},"        nn",[250,509,282],{"class":271},[250,511,512],{"class":330},"Linear",[250,514,348],{"class":271},[250,516,517],{"class":380},"784",[250,519,272],{"class":271},[250,521,522],{"class":330}," args",[250,524,282],{"class":271},[250,526,527],{"class":285},"hidden",[250,529,530],{"class":271},"),\n",[250,532,534,536,538,541],{"class":252,"line":533},13,[250,535,507],{"class":330},[250,537,282],{"class":271},[250,539,540],{"class":330},"ReLU",[250,542,543],{"class":271},"(),\n",[250,545,547,549,551,553,555,558,560,562,564,567],{"class":252,"line":546},14,[250,548,507],{"class":330},[250,550,282],{"class":271},[250,552,512],{"class":330},[250,554,348],{"class":271},[250,556,557],{"class":330},"args",[250,559,282],{"class":271},[250,561,527],{"class":285},[250,563,272],{"class":271},[250,565,566],{"class":380}," 10",[250,568,530],{"class":271},[250,570,572],{"class":252,"line":571},15,[250,573,574],{"class":271},"    )\n",[250,576,578,581,583,585,587,590,592,595,597,600,602,605,608,611,613,615,617,620],{"class":252,"line":577},16,[250,579,580],{"class":267},"    optimizer ",[250,582,323],{"class":322},[250,584,275],{"class":267},[250,586,282],{"class":271},[250,588,589],{"class":285},"optim",[250,591,282],{"class":271},[250,593,594],{"class":330},"Adam",[250,596,348],{"class":271},[250,598,599],{"class":330},"model",[250,601,282],{"class":271},[250,603,604],{"class":330},"parameters",[250,606,607],{"class":271},"(),",[250,609,610],{"class":363}," lr",[250,612,323],{"class":322},[250,614,557],{"class":330},[250,616,282],{"class":271},[250,618,619],{"class":285},"lr",[250,621,384],{"class":271},[250,623,625,628,631,634,638,640,642,644,647],{"class":252,"line":624},17,[250,626,627],{"class":263},"    for",[250,629,630],{"class":267}," epoch ",[250,632,633],{"class":263},"in",[250,635,637],{"class":636},"sptTA"," range",[250,639,348],{"class":271},[250,641,557],{"class":330},[250,643,282],{"class":271},[250,645,646],{"class":285},"epochs",[250,648,649],{"class":271},"):\n",[250,651,653,657],{"class":252,"line":652},18,[250,654,656],{"class":655},"s_hVV","        ...",[250,658,659],{"class":256},"   # training loop\n",[250,661,663],{"class":252,"line":662},19,[250,664,299],{"emptyLinePlaceholder":298},[250,666,668,671,674,677,680,683,685],{"class":252,"line":667},20,[250,669,670],{"class":263},"if",[250,672,673],{"class":655}," __name__",[250,675,676],{"class":322}," ==",[250,678,679],{"class":351}," \"",[250,681,682],{"class":355},"__main__",[250,684,352],{"class":351},[250,686,687],{"class":271},":\n",[250,689,691,694],{"class":252,"line":690},21,[250,692,693],{"class":330},"    main",[250,695,334],{"class":271},[235,697,699],{"id":698},"step-1-extract-hyperparameters","Step 1: Extract Hyperparameters",[219,701,702,703,706],{},"Create a config file with ",[247,704,705],{},"@L.params"," for the scalar hyperparameters:",[240,708,710],{"className":242,"code":709,"language":244,"meta":245,"style":245},"# configs\u002Ftrain.py\nimport laco.language as L\nimport torch.nn as nn, torch.optim as optim\n\n@L.params\nclass hps:\n    lr: float = 1e-3\n    hidden: int = 256\n    epochs: int = 10\n\nmodel = L.call(nn.Sequential)(\n    L.call(nn.Linear)(in_features=784, out_features=hps.hidden),\n    L.call(nn.ReLU)(),\n    L.call(nn.Linear)(in_features=hps.hidden, out_features=10),\n)\noptimizer = L.partial(optim.Adam)(lr=hps.lr)\n",[247,711,712,717,733,760,764,778,789,806,821,835,839,865,908,927,965,969],{"__ignoreMap":245},[250,713,714],{"class":252,"line":253},[250,715,716],{"class":256},"# configs\u002Ftrain.py\n",[250,718,719,721,724,726,728,730],{"class":252,"line":260},[250,720,264],{"class":263},[250,722,723],{"class":267}," laco",[250,725,282],{"class":271},[250,727,198],{"class":285},[250,729,289],{"class":263},[250,731,732],{"class":267}," L\n",[250,734,735,737,739,741,743,745,747,749,751,753,755,757],{"class":252,"line":295},[250,736,264],{"class":263},[250,738,275],{"class":267},[250,740,282],{"class":271},[250,742,286],{"class":285},[250,744,289],{"class":263},[250,746,493],{"class":267},[250,748,272],{"class":271},[250,750,275],{"class":267},[250,752,282],{"class":271},[250,754,589],{"class":285},[250,756,289],{"class":263},[250,758,759],{"class":267}," optim\n",[250,761,762],{"class":252,"line":302},[250,763,299],{"emptyLinePlaceholder":298},[250,765,766,770,773,775],{"class":252,"line":316},[250,767,769],{"class":768},"stp6e","@",[250,771,772],{"class":309},"L",[250,774,282],{"class":768},[250,776,777],{"class":309},"params\n",[250,779,780,783,787],{"class":252,"line":337},[250,781,782],{"class":305},"class",[250,784,786],{"class":785},"sbgvK"," hps",[250,788,687],{"class":271},[250,790,791,794,797,800,803],{"class":252,"line":387},[250,792,793],{"class":267},"    lr",[250,795,796],{"class":271},":",[250,798,799],{"class":369}," float",[250,801,802],{"class":322}," =",[250,804,805],{"class":380}," 1e-3\n",[250,807,808,811,813,816,818],{"class":252,"line":425},[250,809,810],{"class":267},"    hidden",[250,812,796],{"class":271},[250,814,815],{"class":369}," int",[250,817,802],{"class":322},[250,819,820],{"class":380}," 256\n",[250,822,823,826,828,830,832],{"class":252,"line":462},[250,824,825],{"class":267},"    epochs",[250,827,796],{"class":271},[250,829,815],{"class":369},[250,831,802],{"class":322},[250,833,834],{"class":380}," 10\n",[250,836,837],{"class":252,"line":480},[250,838,299],{"emptyLinePlaceholder":298},[250,840,841,844,846,849,851,854,856,858,860,862],{"class":252,"line":485},[250,842,843],{"class":267},"model ",[250,845,323],{"class":322},[250,847,848],{"class":267}," L",[250,850,282],{"class":271},[250,852,853],{"class":330},"call",[250,855,348],{"class":271},[250,857,286],{"class":330},[250,859,282],{"class":271},[250,861,498],{"class":285},[250,863,864],{"class":271},")(\n",[250,866,867,870,872,874,876,878,880,882,885,888,890,892,894,897,899,902,904,906],{"class":252,"line":504},[250,868,869],{"class":330},"    L",[250,871,282],{"class":271},[250,873,853],{"class":330},[250,875,348],{"class":271},[250,877,286],{"class":330},[250,879,282],{"class":271},[250,881,512],{"class":285},[250,883,884],{"class":271},")(",[250,886,887],{"class":363},"in_features",[250,889,323],{"class":322},[250,891,517],{"class":380},[250,893,272],{"class":271},[250,895,896],{"class":363}," out_features",[250,898,323],{"class":322},[250,900,901],{"class":330},"hps",[250,903,282],{"class":271},[250,905,527],{"class":285},[250,907,530],{"class":271},[250,909,910,912,914,916,918,920,922,924],{"class":252,"line":533},[250,911,869],{"class":330},[250,913,282],{"class":271},[250,915,853],{"class":330},[250,917,348],{"class":271},[250,919,286],{"class":330},[250,921,282],{"class":271},[250,923,540],{"class":285},[250,925,926],{"class":271},")(),\n",[250,928,929,931,933,935,937,939,941,943,945,947,949,951,953,955,957,959,961,963],{"class":252,"line":546},[250,930,869],{"class":330},[250,932,282],{"class":271},[250,934,853],{"class":330},[250,936,348],{"class":271},[250,938,286],{"class":330},[250,940,282],{"class":271},[250,942,512],{"class":285},[250,944,884],{"class":271},[250,946,887],{"class":363},[250,948,323],{"class":322},[250,950,901],{"class":330},[250,952,282],{"class":271},[250,954,527],{"class":285},[250,956,272],{"class":271},[250,958,896],{"class":363},[250,960,323],{"class":322},[250,962,457],{"class":380},[250,964,530],{"class":271},[250,966,967],{"class":252,"line":571},[250,968,384],{"class":271},[250,970,971,974,976,978,980,983,985,987,989,991,993,995,997,999,1001,1003],{"class":252,"line":577},[250,972,973],{"class":267},"optimizer ",[250,975,323],{"class":322},[250,977,848],{"class":267},[250,979,282],{"class":271},[250,981,982],{"class":330},"partial",[250,984,348],{"class":271},[250,986,589],{"class":330},[250,988,282],{"class":271},[250,990,594],{"class":285},[250,992,884],{"class":271},[250,994,619],{"class":363},[250,996,323],{"class":322},[250,998,901],{"class":330},[250,1000,282],{"class":271},[250,1002,619],{"class":285},[250,1004,384],{"class":271},[235,1006,1008],{"id":1007},"step-2-load-and-instantiate","Step 2: Load and Instantiate",[240,1010,1012],{"className":242,"code":1011,"language":244,"meta":245,"style":245},"# train.py\nimport laco\n\ncfg = laco.load(\"configs\u002Ftrain.py\")\nmodel = laco.instantiate(cfg.model)\noptimizer_factory = laco.instantiate(cfg.optimizer)\noptimizer = optimizer_factory(params=model.parameters())\nepochs = cfg.hps.epochs\n",[247,1013,1014,1019,1026,1030,1055,1079,1103,1128],{"__ignoreMap":245},[250,1015,1016],{"class":252,"line":253},[250,1017,1018],{"class":256},"# train.py\n",[250,1020,1021,1023],{"class":252,"line":260},[250,1022,264],{"class":263},[250,1024,1025],{"class":267}," laco\n",[250,1027,1028],{"class":252,"line":295},[250,1029,299],{"emptyLinePlaceholder":298},[250,1031,1032,1035,1037,1039,1041,1044,1046,1048,1051,1053],{"class":252,"line":302},[250,1033,1034],{"class":267},"cfg ",[250,1036,323],{"class":322},[250,1038,723],{"class":267},[250,1040,282],{"class":271},[250,1042,1043],{"class":330},"load",[250,1045,348],{"class":271},[250,1047,352],{"class":351},[250,1049,1050],{"class":355},"configs\u002Ftrain.py",[250,1052,352],{"class":351},[250,1054,384],{"class":271},[250,1056,1057,1059,1061,1063,1065,1068,1070,1073,1075,1077],{"class":252,"line":316},[250,1058,843],{"class":267},[250,1060,323],{"class":322},[250,1062,723],{"class":267},[250,1064,282],{"class":271},[250,1066,1067],{"class":330},"instantiate",[250,1069,348],{"class":271},[250,1071,1072],{"class":330},"cfg",[250,1074,282],{"class":271},[250,1076,599],{"class":285},[250,1078,384],{"class":271},[250,1080,1081,1084,1086,1088,1090,1092,1094,1096,1098,1101],{"class":252,"line":337},[250,1082,1083],{"class":267},"optimizer_factory ",[250,1085,323],{"class":322},[250,1087,723],{"class":267},[250,1089,282],{"class":271},[250,1091,1067],{"class":330},[250,1093,348],{"class":271},[250,1095,1072],{"class":330},[250,1097,282],{"class":271},[250,1099,1100],{"class":285},"optimizer",[250,1102,384],{"class":271},[250,1104,1105,1107,1109,1112,1114,1117,1119,1121,1123,1125],{"class":252,"line":387},[250,1106,973],{"class":267},[250,1108,323],{"class":322},[250,1110,1111],{"class":330}," optimizer_factory",[250,1113,348],{"class":271},[250,1115,1116],{"class":363},"params",[250,1118,323],{"class":322},[250,1120,599],{"class":330},[250,1122,282],{"class":271},[250,1124,604],{"class":330},[250,1126,1127],{"class":271},"())\n",[250,1129,1130,1133,1135,1138,1140,1142,1144],{"class":252,"line":425},[250,1131,1132],{"class":267},"epochs ",[250,1134,323],{"class":322},[250,1136,1137],{"class":267}," cfg",[250,1139,282],{"class":271},[250,1141,901],{"class":285},[250,1143,282],{"class":271},[250,1145,1146],{"class":285},"epochs\n",[219,1148,1149],{},"Override from CLI:",[240,1151,1155],{"className":1152,"code":1153,"language":1154,"meta":245,"style":245},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","python train.py  # uses defaults\nlaco run configs\u002Ftrain.py hps.lr=5e-4 hps.hidden=512\n","bash",[247,1156,1157,1167],{"__ignoreMap":245},[250,1158,1159,1161,1164],{"class":252,"line":253},[250,1160,244],{"class":785},[250,1162,1163],{"class":355}," train.py",[250,1165,1166],{"class":256},"  # uses defaults\n",[250,1168,1169,1172,1175,1178,1181,1184],{"class":252,"line":260},[250,1170,1171],{"class":785},"laco",[250,1173,1174],{"class":355}," run",[250,1176,1177],{"class":355}," configs\u002Ftrain.py",[250,1179,1180],{"class":355}," hps.lr=5e-4",[250,1182,1183],{"class":355}," hps.hidden=",[250,1185,1186],{"class":380},"512\n",[235,1188,1190,1191],{"id":1189},"step-3-add-ltask","Step 3: Add ",[247,1192,1193],{},"@L.task",[240,1195,1197],{"className":242,"code":1196,"language":244,"meta":245,"style":245},"# configs\u002Ftrain.py (updated)\nimport laco.language as L\nimport torch.nn as nn, torch.optim as optim\n\n@L.params\nclass hps:\n    lr: float = 1e-3\n    hidden: int = 256\n    epochs: int = 10\n\nmodel = L.call(nn.Sequential)(\n    L.call(nn.Linear)(in_features=784, out_features=hps.hidden),\n    L.call(nn.ReLU)(),\n    L.call(nn.Linear)(in_features=hps.hidden, out_features=10),\n)\noptimizer = L.partial(optim.Adam)(lr=hps.lr)\n\n@L.task\ndef task(model, optimizer, hps):\n    opt = optimizer(params=model.parameters())\n    for epoch in range(hps.epochs):\n        ...   # training loop\n",[247,1198,1199,1204,1218,1244,1248,1258,1266,1278,1290,1302,1306,1328,1366,1384,1422,1426,1460,1464,1475,1498,1521,1541],{"__ignoreMap":245},[250,1200,1201],{"class":252,"line":253},[250,1202,1203],{"class":256},"# configs\u002Ftrain.py (updated)\n",[250,1205,1206,1208,1210,1212,1214,1216],{"class":252,"line":260},[250,1207,264],{"class":263},[250,1209,723],{"class":267},[250,1211,282],{"class":271},[250,1213,198],{"class":285},[250,1215,289],{"class":263},[250,1217,732],{"class":267},[250,1219,1220,1222,1224,1226,1228,1230,1232,1234,1236,1238,1240,1242],{"class":252,"line":295},[250,1221,264],{"class":263},[250,1223,275],{"class":267},[250,1225,282],{"class":271},[250,1227,286],{"class":285},[250,1229,289],{"class":263},[250,1231,493],{"class":267},[250,1233,272],{"class":271},[250,1235,275],{"class":267},[250,1237,282],{"class":271},[250,1239,589],{"class":285},[250,1241,289],{"class":263},[250,1243,759],{"class":267},[250,1245,1246],{"class":252,"line":302},[250,1247,299],{"emptyLinePlaceholder":298},[250,1249,1250,1252,1254,1256],{"class":252,"line":316},[250,1251,769],{"class":768},[250,1253,772],{"class":309},[250,1255,282],{"class":768},[250,1257,777],{"class":309},[250,1259,1260,1262,1264],{"class":252,"line":337},[250,1261,782],{"class":305},[250,1263,786],{"class":785},[250,1265,687],{"class":271},[250,1267,1268,1270,1272,1274,1276],{"class":252,"line":387},[250,1269,793],{"class":267},[250,1271,796],{"class":271},[250,1273,799],{"class":369},[250,1275,802],{"class":322},[250,1277,805],{"class":380},[250,1279,1280,1282,1284,1286,1288],{"class":252,"line":425},[250,1281,810],{"class":267},[250,1283,796],{"class":271},[250,1285,815],{"class":369},[250,1287,802],{"class":322},[250,1289,820],{"class":380},[250,1291,1292,1294,1296,1298,1300],{"class":252,"line":462},[250,1293,825],{"class":267},[250,1295,796],{"class":271},[250,1297,815],{"class":369},[250,1299,802],{"class":322},[250,1301,834],{"class":380},[250,1303,1304],{"class":252,"line":480},[250,1305,299],{"emptyLinePlaceholder":298},[250,1307,1308,1310,1312,1314,1316,1318,1320,1322,1324,1326],{"class":252,"line":485},[250,1309,843],{"class":267},[250,1311,323],{"class":322},[250,1313,848],{"class":267},[250,1315,282],{"class":271},[250,1317,853],{"class":330},[250,1319,348],{"class":271},[250,1321,286],{"class":330},[250,1323,282],{"class":271},[250,1325,498],{"class":285},[250,1327,864],{"class":271},[250,1329,1330,1332,1334,1336,1338,1340,1342,1344,1346,1348,1350,1352,1354,1356,1358,1360,1362,1364],{"class":252,"line":504},[250,1331,869],{"class":330},[250,1333,282],{"class":271},[250,1335,853],{"class":330},[250,1337,348],{"class":271},[250,1339,286],{"class":330},[250,1341,282],{"class":271},[250,1343,512],{"class":285},[250,1345,884],{"class":271},[250,1347,887],{"class":363},[250,1349,323],{"class":322},[250,1351,517],{"class":380},[250,1353,272],{"class":271},[250,1355,896],{"class":363},[250,1357,323],{"class":322},[250,1359,901],{"class":330},[250,1361,282],{"class":271},[250,1363,527],{"class":285},[250,1365,530],{"class":271},[250,1367,1368,1370,1372,1374,1376,1378,1380,1382],{"class":252,"line":533},[250,1369,869],{"class":330},[250,1371,282],{"class":271},[250,1373,853],{"class":330},[250,1375,348],{"class":271},[250,1377,286],{"class":330},[250,1379,282],{"class":271},[250,1381,540],{"class":285},[250,1383,926],{"class":271},[250,1385,1386,1388,1390,1392,1394,1396,1398,1400,1402,1404,1406,1408,1410,1412,1414,1416,1418,1420],{"class":252,"line":546},[250,1387,869],{"class":330},[250,1389,282],{"class":271},[250,1391,853],{"class":330},[250,1393,348],{"class":271},[250,1395,286],{"class":330},[250,1397,282],{"class":271},[250,1399,512],{"class":285},[250,1401,884],{"class":271},[250,1403,887],{"class":363},[250,1405,323],{"class":322},[250,1407,901],{"class":330},[250,1409,282],{"class":271},[250,1411,527],{"class":285},[250,1413,272],{"class":271},[250,1415,896],{"class":363},[250,1417,323],{"class":322},[250,1419,457],{"class":380},[250,1421,530],{"class":271},[250,1423,1424],{"class":252,"line":571},[250,1425,384],{"class":271},[250,1427,1428,1430,1432,1434,1436,1438,1440,1442,1444,1446,1448,1450,1452,1454,1456,1458],{"class":252,"line":577},[250,1429,973],{"class":267},[250,1431,323],{"class":322},[250,1433,848],{"class":267},[250,1435,282],{"class":271},[250,1437,982],{"class":330},[250,1439,348],{"class":271},[250,1441,589],{"class":330},[250,1443,282],{"class":271},[250,1445,594],{"class":285},[250,1447,884],{"class":271},[250,1449,619],{"class":363},[250,1451,323],{"class":322},[250,1453,901],{"class":330},[250,1455,282],{"class":271},[250,1457,619],{"class":285},[250,1459,384],{"class":271},[250,1461,1462],{"class":252,"line":624},[250,1463,299],{"emptyLinePlaceholder":298},[250,1465,1466,1468,1470,1472],{"class":252,"line":652},[250,1467,769],{"class":768},[250,1469,772],{"class":309},[250,1471,282],{"class":768},[250,1473,1474],{"class":309},"task\n",[250,1476,1477,1479,1482,1484,1487,1489,1492,1494,1496],{"class":252,"line":662},[250,1478,306],{"class":305},[250,1480,1481],{"class":309}," task",[250,1483,348],{"class":271},[250,1485,599],{"class":1486},"sFwrP",[250,1488,272],{"class":271},[250,1490,1491],{"class":1486}," optimizer",[250,1493,272],{"class":271},[250,1495,786],{"class":1486},[250,1497,649],{"class":271},[250,1499,1500,1503,1505,1507,1509,1511,1513,1515,1517,1519],{"class":252,"line":667},[250,1501,1502],{"class":267},"    opt ",[250,1504,323],{"class":322},[250,1506,1491],{"class":330},[250,1508,348],{"class":271},[250,1510,1116],{"class":363},[250,1512,323],{"class":322},[250,1514,599],{"class":330},[250,1516,282],{"class":271},[250,1518,604],{"class":330},[250,1520,1127],{"class":271},[250,1522,1523,1525,1527,1529,1531,1533,1535,1537,1539],{"class":252,"line":690},[250,1524,627],{"class":263},[250,1526,630],{"class":267},[250,1528,633],{"class":263},[250,1530,637],{"class":636},[250,1532,348],{"class":271},[250,1534,901],{"class":330},[250,1536,282],{"class":271},[250,1538,646],{"class":285},[250,1540,649],{"class":271},[250,1542,1544,1546],{"class":252,"line":1543},22,[250,1545,656],{"class":655},[250,1547,659],{"class":256},[240,1549,1551],{"className":1152,"code":1550,"language":1154,"meta":245,"style":245},"laco run configs\u002Ftrain.py hps.lr=5e-4\n",[247,1552,1553],{"__ignoreMap":245},[250,1554,1555,1557,1559,1561],{"class":252,"line":253},[250,1556,1171],{"class":785},[250,1558,1174],{"class":355},[250,1560,1177],{"class":355},[250,1562,1563],{"class":355}," hps.lr=5e-4\n",[235,1565,1567],{"id":1566},"step-4-full-hydra-app-optional","Step 4: Full Hydra App (Optional)",[240,1569,1571],{"className":242,"code":1570,"language":244,"meta":245,"style":245},"# train.py\nimport laco\n\ndef run(model, optimizer, hps): ...\n\nif __name__ == \"__main__\":\n    laco.main(\"train\", config_path=\"configs\")(run)()\n",[247,1572,1573,1577,1583,1587,1611,1615,1631],{"__ignoreMap":245},[250,1574,1575],{"class":252,"line":253},[250,1576,1018],{"class":256},[250,1578,1579,1581],{"class":252,"line":260},[250,1580,264],{"class":263},[250,1582,1025],{"class":267},[250,1584,1585],{"class":252,"line":295},[250,1586,299],{"emptyLinePlaceholder":298},[250,1588,1589,1591,1593,1595,1597,1599,1601,1603,1605,1608],{"class":252,"line":302},[250,1590,306],{"class":305},[250,1592,1174],{"class":309},[250,1594,348],{"class":271},[250,1596,599],{"class":1486},[250,1598,272],{"class":271},[250,1600,1491],{"class":1486},[250,1602,272],{"class":271},[250,1604,786],{"class":1486},[250,1606,1607],{"class":271},"):",[250,1609,1610],{"class":655}," ...\n",[250,1612,1613],{"class":252,"line":316},[250,1614,299],{"emptyLinePlaceholder":298},[250,1616,1617,1619,1621,1623,1625,1627,1629],{"class":252,"line":337},[250,1618,670],{"class":263},[250,1620,673],{"class":655},[250,1622,676],{"class":322},[250,1624,679],{"class":351},[250,1626,682],{"class":355},[250,1628,352],{"class":351},[250,1630,687],{"class":271},[250,1632,1633,1636,1638,1641,1643,1645,1648,1650,1652,1655,1657,1659,1662,1664,1666,1669],{"class":252,"line":387},[250,1634,1635],{"class":267},"    laco",[250,1637,282],{"class":271},[250,1639,1640],{"class":330},"main",[250,1642,348],{"class":271},[250,1644,352],{"class":351},[250,1646,1647],{"class":355},"train",[250,1649,352],{"class":351},[250,1651,272],{"class":271},[250,1653,1654],{"class":363}," config_path",[250,1656,323],{"class":322},[250,1658,352],{"class":351},[250,1660,1661],{"class":355},"configs",[250,1663,352],{"class":351},[250,1665,884],{"class":271},[250,1667,1668],{"class":330},"run",[250,1670,1671],{"class":271},")()\n",[240,1673,1675],{"className":1152,"code":1674,"language":1154,"meta":245,"style":245},"python train.py hps.lr=5e-4\npython train.py -m hps.lr=1e-3,1e-4   # sweep\n",[247,1676,1677,1685],{"__ignoreMap":245},[250,1678,1679,1681,1683],{"class":252,"line":253},[250,1680,244],{"class":785},[250,1682,1163],{"class":355},[250,1684,1563],{"class":355},[250,1686,1687,1689,1691,1695,1698],{"class":252,"line":260},[250,1688,244],{"class":785},[250,1690,1163],{"class":355},[250,1692,1694],{"class":1693},"stzsN"," -m",[250,1696,1697],{"class":355}," hps.lr=1e-3,1e-4",[250,1699,1700],{"class":256},"   # sweep\n",[235,1702,1704],{"id":1703},"common-pitfalls","Common Pitfalls",[1706,1707,1708,1722,1738],"ul",{},[1709,1710,1711,1714,1715,1718,1719,282],"li",{},[222,1712,1713],{},"Hard-coded class strings",": replace ",[247,1716,1717],{},"\"torch.nn.ReLU\""," magic strings with\nreal imports: ",[247,1720,1721],{},"L.call(nn.ReLU)()",[1709,1723,1724,1727,1728,1731,1732,1735,1736,282],{},[222,1725,1726],{},"Mutable defaults",": use ",[247,1729,1730],{},"L.call(list)()"," instead of ",[247,1733,1734],{},"default=[]"," in ",[247,1737,705],{},[1709,1739,1740,1743,1744,1746,1747,1750],{},[222,1741,1742],{},"Positional args",": ",[247,1745,1193],{}," skips ",[247,1748,1749],{},"*args","; use keyword-only params.",[1752,1753,1754],"style",{},"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 .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .slqww, html code.shiki .slqww{--shiki-light:#6182B8;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .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 .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .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 .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 .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 .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":245,"searchDepth":295,"depth":295,"links":1756},[1757,1758,1759,1760,1762,1763],{"id":237,"depth":260,"text":238},{"id":698,"depth":260,"text":699},{"id":1007,"depth":260,"text":1008},{"id":1189,"depth":260,"text":1761},"Step 3: Add @L.task",{"id":1566,"depth":260,"text":1567},{"id":1703,"depth":260,"text":1704},"md",{},{"title":130,"description":245},"CI9FOhdg7F0nxfGS74fOF4QLX60fN3W4TGqDW-b26m8",{},1785687303149]