From 3deb672685510992fda376cdf12ac5f3407c2d50 Mon Sep 17 00:00:00 2001 From: Savio Cardoso Date: Sat, 15 Aug 2026 13:02:47 +0200 Subject: [PATCH] feat: evaluate surrogate cost accuracy tradeoff --- data/surrogate/fea_surrogate_holdout.csv | 201 ++++++ docs/figures/ml_accuracy_vs_training_size.png | Bin 0 -> 98127 bytes .../ml_break_even_vs_training_size.png | Bin 0 -> 88966 bytes docs/figures/ml_runtime_comparison.png | Bin 0 -> 48197 bytes docs/validation/ml_break_even.csv | 5 + docs/validation/ml_runtime_benchmark.csv | 11 + docs/validation/ml_sample_efficiency.csv | 13 + scripts/benchmark_surrogate_runtime.py | 661 ++++++++++++++++++ scripts/generate_surrogate_holdout.py | 56 ++ scripts/run_ml_tradeoff_experiment.py | 226 ++++++ src/bodysimpy/ml/experiment.py | 127 ++++ src/bodysimpy/ml/model.py | 2 +- src/bodysimpy/ml/training.py | 165 +++++ tests/unit/test_ml_experiment.py | 70 ++ 14 files changed, 1536 insertions(+), 1 deletion(-) create mode 100644 data/surrogate/fea_surrogate_holdout.csv create mode 100644 docs/figures/ml_accuracy_vs_training_size.png create mode 100644 docs/figures/ml_break_even_vs_training_size.png create mode 100644 docs/figures/ml_runtime_comparison.png create mode 100644 docs/validation/ml_break_even.csv create mode 100644 docs/validation/ml_runtime_benchmark.csv create mode 100644 docs/validation/ml_sample_efficiency.csv create mode 100644 scripts/benchmark_surrogate_runtime.py create mode 100644 scripts/generate_surrogate_holdout.py create mode 100644 scripts/run_ml_tradeoff_experiment.py create mode 100644 src/bodysimpy/ml/experiment.py create mode 100644 tests/unit/test_ml_experiment.py diff --git a/data/surrogate/fea_surrogate_holdout.csv b/data/surrogate/fea_surrogate_holdout.csv new file mode 100644 index 0000000..acf16f9 --- /dev/null +++ b/data/surrogate/fea_surrogate_holdout.csv @@ -0,0 +1,201 @@ +sample,thickness_m,height_m,width_m,youngs_modulus_pa,density_kg_m3,tip_force_n,max_stress_pa,tip_deflection_m,mode_1_frequency_hz +1,0.0015673661079655607,0.04841099674629158,0.07852426675757909,197739429524.0499,8047.462134980211,808.0558923186421,110832000.0,0.008515325,56.28995 +2,0.001039199973926956,0.035477670011132674,0.08876809267456234,218031511424.30328,7968.190184923785,995.9491348513075,261662000.0,0.02469732,45.64068 +3,0.0012323572885739886,0.03672328918190327,0.07038402948587634,217994905341.84094,7620.661449593422,1243.9372998437982,327816000.0,0.03006282,46.89249 +4,0.0019751856295698762,0.03816195914701505,0.097842341697464,209492851972.2291,7691.704572169437,762.6824045406236,94556000.0,0.008619294,48.00584 +5,0.0013311309113572594,0.04752311009445264,0.09996699898696126,215188692211.80255,8026.035041284622,1299.1576003411121,172492000.0,0.01234711,59.55903 +6,0.0014437762569660816,0.044855514316994693,0.0609249744065813,198747500635.71484,8051.029257384443,1192.717245314734,239596000.0,0.01979418,51.26112 +7,0.001188200117606723,0.045047116274764536,0.09472976887840008,217551219689.42175,8020.003309830518,1124.139755269309,185257000.0,0.01384259,56.8891 +8,0.0015856986712866634,0.04378676832443886,0.09724598833583326,196604955408.89792,7982.483799812365,710.8808512232648,90921900.0,0.007723549,52.47048 +9,0.0016782206057048572,0.03927392133320407,0.07954518134759588,224840797559.7173,7822.929309307037,1024.392989993321,169412000.0,0.01406843,50.08283 +10,0.001739238181219579,0.0334400409983221,0.09101531975938702,195980793828.49066,7603.265872271703,803.7618602411698,139677000.0,0.01552385,41.13423 +11,0.0012114953072574599,0.041369402425203664,0.09609392493539576,196277758456.21185,8075.373956459915,1284.416315177556,227452000.0,0.02046817,49.80088 +12,0.0016889600105813264,0.049464936399504694,0.09816731357528284,205574519845.76608,7859.504567247029,904.7656979336423,93391000.0,0.006731061,60.50222 +13,0.0017616333466639916,0.04935738626766732,0.06416444308796024,218998000182.25275,8033.147205953683,1053.2592254806866,150001000.0,0.01022522,58.73076 +14,0.0011158906325899345,0.04819177746988225,0.06751990795967047,223105345139.5546,7626.146318351904,889.6435542631685,190356000.0,0.0130391,60.68956 +15,0.0017539792048929942,0.047920984049290585,0.07621517485660353,210024874093.76862,7677.030032970093,1039.0646319697055,133694000.0,0.009771794,58.42578 +16,0.0017478980794603147,0.03821519000331284,0.06666693233471288,200542339973.5879,7657.801672694839,1013.9662450946366,195002000.0,0.01869998,45.67526 +17,0.0016113559013571166,0.04118723061806716,0.08534868407155294,209655863978.86575,8094.728706374595,1191.8164676735798,181303000.0,0.01538619,50.1423 +18,0.001904378045795319,0.04530012576426517,0.09416551179524907,224009123610.90994,8072.299946375574,700.73977316053,74995600.0,0.005412578,56.91761 +19,0.0011841517017579326,0.043422209849552335,0.0814301379355353,216109335024.6959,7890.419653654939,1118.3160396393848,219975000.0,0.0172086,54.4346 +20,0.0012366465205376053,0.04191624326559128,0.09877328898445728,211478598183.6125,7752.652442256228,1217.9417700235506,203417000.0,0.01675835,53.51325 +21,0.001477650295242563,0.040380761596888956,0.06351935154951731,192871672342.10504,7632.463890251571,1233.908647151695,267714000.0,0.02528744,47.29688 +22,0.0011391530594900873,0.038901055584905836,0.08580041741818421,199904383779.8479,7764.221080588196,972.6192034882511,216524000.0,0.02038321,47.97305 +23,0.0013414587649204384,0.03995590933994123,0.09577433914426714,193966848738.52783,7991.053241140136,1031.8440115950982,173990000.0,0.01639287,48.0107 +24,0.001997740019058419,0.03646652298294407,0.08372509227731485,214305759579.95157,7665.057176008142,1166.1957995801354,173796000.0,0.01626863,45.87965 +25,0.0019504453652020443,0.04560888816184532,0.07319179396066991,221244298995.16376,7870.889131527212,757.0604766942041,97619200.0,0.007115635,56.0919 +26,0.0015847308468650116,0.034796497550405966,0.08430648553844938,198256539475.62366,7961.843150536535,1065.866762455843,204667000.0,0.02168197,41.90765 +27,0.001518114450704905,0.03697332361538613,0.07247611821031821,193223800946.8755,7644.632165625088,1209.1286407867012,255355000.0,0.02623102,44.15172 +28,0.0015510953869590418,0.04310173723064328,0.07616673214705878,216339577782.8144,7674.324813157276,1000.6865913059719,164247000.0,0.0129419,54.01726 +29,0.0013078829044340231,0.043954024247456105,0.08551666682344689,207507947311.71948,7919.368947595397,1062.5481507869151,180168000.0,0.014491,53.96372 +30,0.0016323039296096402,0.042619050299318006,0.07131088774139138,218378896276.89667,8098.492357739378,1074.3483388289787,180670000.0,0.01427215,51.81826 +31,0.0012662323829857342,0.04385812961415239,0.09854084867248417,222105022483.6572,7682.097878035567,1010.85914020214,156758000.0,0.0117647,57.41422 +32,0.001374640585217261,0.043181530306182145,0.09580879207185156,220954722750.09012,7684.425757461321,1265.1243469452004,189879000.0,0.01455575,56.1474 +33,0.0014128711118088686,0.04263144851191791,0.08011786891390649,190963685053.19946,7998.972792548506,930.534945985672,161359000.0,0.01455005,49.62517 +34,0.0018858236858815785,0.04877159536894916,0.08720150114022818,198858451981.69485,7940.143970615229,1272.448790067444,133893000.0,0.01013934,57.4968 +35,0.0013832913378363483,0.034925805266897515,0.08337035174255128,222443673680.8548,7911.087249652723,773.1293081558031,168432000.0,0.01585089,44.89963 +36,0.0016544027090606463,0.04006633413262866,0.060060916218754624,203396588836.3152,7808.437072263594,831.4654067035273,172699000.0,0.01559527,47.16835 +37,0.001795180350446238,0.03377573964731196,0.07936196498458331,201336068539.94766,7829.097868014607,1057.173808044511,199264000.0,0.02143598,40.91513 +38,0.0015327314507462338,0.03321412585666836,0.06964305509662681,211009248463.319,7651.8507684434435,1257.0752121824682,311323000.0,0.0325757,41.50712 +39,0.0012851372219377804,0.049977842602725045,0.08906809082449113,194258965995.7093,7994.663533900413,1085.5063166736395,154567000.0,0.01169386,58.74703 +40,0.0012515389727767862,0.03360113465467106,0.06890033298431736,207171094571.78906,7701.593906230043,849.3436819276468,250670000.0,0.0264168,41.74667 +41,0.00146737933046142,0.03244496881560363,0.07063363466196532,216880640817.15012,7784.928609510936,866.9898568427363,226854000.0,0.02362911,40.94043 +42,0.0019317641146437796,0.04691486795822283,0.0805946602656955,215627287884.17334,7989.7678345730255,748.9988217827794,86605800.0,0.006291821,57.03955 +43,0.0010510299497451068,0.04058826160088657,0.08629979956492509,221031431910.03152,7712.680955471077,921.6938861921277,209075000.0,0.01707135,52.78867 +44,0.0014957825984989325,0.04469300480395855,0.07995508874303417,213257780385.62943,7886.798738401926,834.1548477158365,129804000.0,0.01000414,55.05547 +45,0.001030131533893984,0.040828342194672115,0.061764468126851255,207888117727.47424,7964.369501325811,992.602685753483,302489000.0,0.02622681,48.93406 +46,0.00199469752182398,0.042865168459457134,0.06528878027083283,218729860792.63193,7862.052252307182,1184.697544754751,178596000.0,0.01401675,51.95893 +47,0.001507153280264632,0.040219111283724525,0.0775343224794501,191898625713.53555,8067.006047426973,743.7736729932545,134414000.0,0.01278127,46.66653 +48,0.0015900603540070963,0.03312244033038402,0.06061895643975591,191260121692.74353,7792.664770222287,1277.9252000666083,347056000.0,0.04024837,38.44766 +49,0.0017076061656356163,0.032616518968907916,0.09941516638771641,203883311554.99374,8069.08078964587,862.0177904348878,145178000.0,0.01583295,40.08426 +50,0.001806579334110566,0.035273622519560094,0.07797647280460752,211194660994.50092,7788.316732081006,1223.842636527906,220706000.0,0.02169762,43.70841 +51,0.001579029569964946,0.04398613108884024,0.06795342867111619,196791208367.51953,7974.191898954633,858.7361521025568,148938000.0,0.01266037,50.82732 +52,0.001558451723046742,0.03802386592697958,0.0821478863926264,204618662131.3446,8007.1499358816745,953.9630895256298,170529000.0,0.01605396,46.09497 +53,0.0012799261491605153,0.035058890999861404,0.09043099252087915,206390137981.1957,7889.897804677218,1077.0412211649505,233306000.0,0.02351938,43.9079 +54,0.0015202366326704138,0.038355329618242,0.07237437902214361,196932314451.581,7896.084641247488,753.0812510509969,151963000.0,0.01477142,45.38002 +55,0.0017799788807599734,0.04550854373079786,0.0796164081657828,218585220403.97324,8013.834713066852,785.2507999932986,102512000.0,0.007572096,55.85514 +56,0.0016190241472997676,0.047366695023209796,0.08358216228946458,224193692092.90384,7883.402579366172,737.0700617745523,95664800.0,0.006618217,59.69359 +57,0.0016469864212547156,0.034442699423933486,0.08309069025902543,221469190787.17325,7715.470373130519,1043.7308290238204,198721000.0,0.01904274,44.42043 +58,0.0014370235324109922,0.036202274868402634,0.06546534947359599,191715493809.70163,7832.838294034669,723.6432632452329,179854000.0,0.01903864,42.24999 +59,0.0019730996188538504,0.03659563090903129,0.07368909749537282,222995539275.62463,7770.404683855752,1081.7221158305806,181430000.0,0.01630817,46.09898 +60,0.0019217118843284202,0.04913120934721562,0.0878388544841741,193486654441.72858,7767.312356378798,916.0223419328465,93331600.0,0.00721068,57.73699 +61,0.001259594373757634,0.03582213545210425,0.07384445473260236,202784567053.59656,7777.11742195665,1248.3105117033401,318947000.0,0.0322,43.92393 +62,0.0012991475453806175,0.039142486119581286,0.08165625727179554,209091978811.18076,7747.052142460571,898.9506085660657,183746000.0,0.01645481,48.96949 +63,0.0017137672044462602,0.03626066004377332,0.06332886337594967,192010313550.67264,7727.931079564343,1141.502896828589,249450000.0,0.02633195,42.16212 +64,0.0011333011834980611,0.04982951645483909,0.09968761146998545,206939665433.344,7655.420862052629,1250.6519434908657,182717000.0,0.01298464,62.69824 +65,0.0015475662398414874,0.04707359279255719,0.06437705291739869,210405336797.78888,7709.00192608509,988.9888710189803,167698000.0,0.01247068,56.55851 +66,0.0010474933955920208,0.048522813537894435,0.09620221015576977,206582427168.56354,7727.463533898324,1079.3164680581353,180708000.0,0.01321505,60.73835 +67,0.0011798709190928602,0.048257553287084164,0.07471784790959508,206092816593.9507,7768.00310834795,927.0769009969251,172906000.0,0.01279333,58.46033 +68,0.001156851594157868,0.043430099439163254,0.0618230944464977,214430990851.74573,8061.82215859459,812.5401856300873,205771000.0,0.01626832,52.0954 +69,0.001769035396574269,0.04833523492055179,0.09930878945601779,224587860523.1023,7645.593437699972,783.8534405590175,79026000.0,0.00533134,62.72668 +70,0.0013773824137598475,0.03215374300069462,0.0828228278129575,208549761578.80975,7904.332843901159,1238.2313214303165,301226000.0,0.03279691,40.19211 +71,0.0012220607885406569,0.043648348134545135,0.07000627631562129,208262504446.17737,7830.710306588638,1071.5188828756816,231171000.0,0.01870594,52.99113 +72,0.0014053063997419468,0.04167665282673068,0.0881943479029065,217397929843.15857,7984.405079456771,871.2698126358365,143708000.0,0.01161749,52.40394 +73,0.001560459985306737,0.03399176352148401,0.0764296614188569,190090344269.99475,7847.4729515267,1101.7774455338197,240588000.0,0.02726604,40.08737 +74,0.0017431545005335935,0.041831255265977405,0.09827362038895882,199396351271.67993,7795.059549956641,877.7438444730954,108039000.0,0.009459272,51.08947 +75,0.0011632445157521514,0.038601654958560515,0.09181548183149575,211709981205.5263,7749.754376167714,1158.0596560699196,240669000.0,0.02151633,49.34219 +76,0.0014238026349586122,0.032084431640931534,0.07284631653308135,222730630715.75995,7929.062753435994,1285.773292600422,340944000.0,0.03494258,40.85015 +77,0.001452220127032031,0.046141026630263496,0.08100054687201927,201379077775.92865,7733.082960633141,768.3186022431049,116795000.0,0.009235516,55.76896 +78,0.0010050381508334568,0.039039196870009896,0.09225465000371905,216601934671.5639,7633.1146370658225,708.5098906492628,165711000.0,0.01431988,51.04413 +79,0.00167091847866873,0.04723190232881108,0.09316497133617607,210977220416.02084,7907.138892116954,807.1492130417147,93118800.0,0.006851083,58.25655 +80,0.0017249448132301603,0.0397537920685873,0.06055895817273243,209409954107.4152,7804.036407713038,1199.45692738683,240873000.0,0.02129047,47.48905 +81,0.0018552614678984415,0.049050773814640125,0.08419636524751185,213670125695.8628,8059.228118488878,859.8379219628283,93920100.0,0.006585763,59.2857 +82,0.0010045815546937072,0.04417800350826916,0.06303700055571566,201057047704.15128,7930.034693792971,933.2007950944312,259641000.0,0.02152253,51.94702 +83,0.0015957388207584729,0.037841896723912034,0.08756266775107506,217653798800.5499,7937.26866146517,1028.372539697004,171259000.0,0.01520478,47.77529 +84,0.0013170761011523147,0.037680286766674155,0.08607740941804368,203693561432.2554,8031.645753847682,747.0211108094937,150869000.0,0.01438005,46.02009 +85,0.0012458249668523226,0.04225966234035547,0.07912146538698878,194689486156.2207,7849.429299667002,1106.7723889702525,220033000.0,0.01963419,50.3032 +86,0.0010985291536961942,0.03687269824749808,0.0935577567641524,210541985003.80002,7756.874759832197,1033.280135777542,235266000.0,0.02210673,47.27606 +87,0.0010226119363994104,0.032290222037732706,0.08245157711978324,193797786197.0026,8038.941679769356,801.4795562110792,255056000.0,0.02976665,38.97707 +88,0.001758685706024517,0.04101987047984067,0.09748150103620733,221943527069.08676,7942.550413057737,1228.5185128442276,154763000.0,0.01241199,52.35887 +89,0.0018451945017654008,0.04944734829642077,0.09173963765114318,202447909782.15817,7800.015763122335,923.6970178296677,93303400.0,0.006840789,59.64812 +90,0.0010849620627911612,0.049730735320534375,0.06449949436476743,191462249167.85602,8041.171885594976,1132.2369388357652,274908000.0,0.01921077,56.05293 +91,0.0010421804361146166,0.041106874727668295,0.06395337958369562,219408913622.9559,8043.039854671228,957.6670349708677,278106000.0,0.02268699,50.51724 +92,0.0016205210041619186,0.0336734866208742,0.0751510484112767,199129851657.2115,8036.517723219117,846.4032976835842,183602000.0,0.02005491,40.04865 +93,0.0016015890584605197,0.03552789761231871,0.08963224011892446,199692174977.9141,8053.672930010988,1135.6971819028868,199565000.0,0.02052846,42.8709 +94,0.001867825158171037,0.03264977456976684,0.06375612414193613,201894733035.5186,8086.14286467085,1220.1560538000003,281343000.0,0.03133239,38.12856 +95,0.001833833893776132,0.047997767039807585,0.07838595619617467,217299791106.24197,7757.80436871158,1004.6630921147075,121060000.0,0.008535809,59.29219 +96,0.0015021101149215199,0.03272137577534843,0.06507743708324591,200028754477.94748,7613.913122485475,791.1076712685681,215557000.0,0.02417201,39.71535 +97,0.00110960948597827,0.04637425852318981,0.08068697166775098,192635591013.00272,7880.214899972686,1260.5005314386651,245088000.0,0.02016124,54.65483 +98,0.0010864342163111665,0.04588535358151211,0.07054521754090677,214642055712.81595,7867.212944771455,1162.8207458900522,261432000.0,0.01953364,56.38272 +99,0.0012712314914494344,0.03407915078546634,0.08495219875716017,193035064059.60336,7908.070759851666,1088.3901143260036,259298000.0,0.02879037,41.07504 +100,0.0012077575997844637,0.036071312185907485,0.062457398565266754,219983167837.66458,7641.648439343085,824.5948930351431,250637000.0,0.02321734,45.72593 +101,0.0018142783013398948,0.03754269336086639,0.0733429778915637,204269860813.3154,7669.492686482894,1236.2910289079055,216732000.0,0.02073963,45.67229 +102,0.0018000723311684549,0.044115392038015094,0.08688316999779941,202095964427.29813,7957.127344479432,735.7660205465351,91711800.0,0.007543856,52.81337 +103,0.0011223383950565336,0.04506257244447126,0.07891431092604256,210818100043.21133,7840.231395065621,1020.3783712956795,207118000.0,0.01602046,55.69354 +104,0.0014016621176678084,0.034426809003095894,0.09647405130775297,207786728735.9325,7952.5493647100275,780.6242127969855,150465000.0,0.01529923,43.22142 +105,0.0017704757962709076,0.033421246281669446,0.06472115714929726,223602413896.8454,7843.669182139326,1140.1572235774954,263601000.0,0.02589641,41.84434 +106,0.0013886949749571434,0.03810924648879894,0.06495911775546595,208814004720.71442,7711.499828792607,880.9726732717877,213204000.0,0.01969562,46.63038 +107,0.0013261576239301915,0.04296036438925564,0.09027702569151325,203199911388.25662,7959.615849747899,938.745782440838,154236000.0,0.0129413,52.40961 +108,0.0016363061878319138,0.03425659418774961,0.0683850112635012,213823827522.47827,7791.355904209917,712.5010549793875,162919000.0,0.01632158,42.42912 +109,0.0018181091378455696,0.04770865096845556,0.06652516950301474,203020338114.57333,7721.80895249033,1121.0657229338208,157375000.0,0.01196586,56.09059 +110,0.0013109984066376856,0.040534700617946895,0.07566686478430668,196348698524.18353,7688.311340695252,978.5933232571515,202965000.0,0.01872485,48.81621 +111,0.0011436771085663927,0.035196091833916275,0.060331439712804996,214976831125.78976,7922.745011584477,876.3594389075542,297178000.0,0.02887356,43.31506 +112,0.0016264371980254555,0.03474558856884679,0.08456029857172596,216986285886.1201,7925.728932515355,948.6741420048995,177896000.0,0.01724232,43.84085 +113,0.0015136803230920435,0.0424901365447439,0.07663019763927897,204716580642.82938,7618.907991734484,1252.00327988962,212725000.0,0.01796375,52.12199 +114,0.0017805768073767179,0.0454707071228888,0.09882145058770608,194156254625.91394,8023.235531865769,1115.8495865597542,121064000.0,0.01003115,53.73454 +115,0.001016472325554434,0.04468605733248764,0.0745395563739293,195670729396.858,7628.528337510765,827.2142779425922,195267000.0,0.01642038,53.77557 +116,0.001915427308132725,0.0351236747504744,0.06602565887301658,194450906151.75076,8063.723293756274,719.3564956965558,143477000.0,0.0154269,40.25507 +117,0.0016093089703608106,0.03899192063381924,0.07712151301306412,200745660197.41342,8008.155290062704,1188.7779451012427,211478000.0,0.01982106,46.39475 +118,0.001101714304955322,0.04300330601737026,0.07814752871902858,197012207748.7253,7854.764893128109,754.1545155548057,166230000.0,0.01441112,51.50641 +119,0.0011267730766770275,0.034597779548291345,0.09505068678757259,206782448973.52103,7605.941738359689,1155.6780081692723,273529000.0,0.02783163,44.58752 +120,0.0017004362529490467,0.03681254847138026,0.09382132677645749,215224424890.18192,7704.921338588467,897.3035204828801,137546000.0,0.01266027,47.13577 +121,0.0014346785599403619,0.03961867921442355,0.07262881053022027,190556446077.9698,7780.693109653845,770.3809137117389,156837000.0,0.01525809,46.46342 +122,0.0010645569553994537,0.03461335386673619,0.09156416864312814,212334033769.95935,7615.640569400991,814.3570224012201,209724000.0,0.02080112,45.1069 +123,0.0010698832643761139,0.03720265823742174,0.06151234479735368,205715782197.1977,7653.8112019748005,1292.2463222402646,427943000.0,0.04111955,45.55023 +124,0.001854665400976728,0.0444714803186271,0.0944990999885327,195362792209.40564,7744.512326450841,764.9880095866127,85493600.0,0.007203641,53.41113 +125,0.0014911140369107145,0.045773279079021706,0.08673103282827536,213606809145.14417,8081.499293946279,822.4006908809966,116268000.0,0.008726384,56.12505 +126,0.0015394956552635159,0.04657196105972297,0.062355285149266616,212798779022.04382,7900.620029026496,1275.7912487676494,226186000.0,0.01681181,55.44077 +127,0.0013356540204718737,0.04675096514603997,0.08925402175779344,198102860902.35635,7873.545289035963,793.6455826528144,118055000.0,0.009352423,56.18534 +128,0.0019395142773716277,0.03564282038280661,0.08950462319711852,200248189385.00027,7623.094173822272,1267.3181373603966,187950000.0,0.0192185,43.84175 +129,0.0018947731168686595,0.048970634776547284,0.06280531851964724,197284801209.54675,7718.531888356908,980.6045883096324,134540000.0,0.01026151,56.16346 +130,0.0018801506383905988,0.04778473910878073,0.075836750283087,221797474435.14355,7894.492121077844,1146.9686541833464,139774000.0,0.009701587,58.86648 +131,0.0017291431567619188,0.04439667731413467,0.087624752090802,204446200088.15973,8096.636522840804,883.3771017697487,112417000.0,0.009082237,53.10276 +132,0.0015743556274395235,0.04162955363116832,0.0906345559748095,220351248872.5613,7696.4040722577965,959.5045353450957,139640000.0,0.01114202,53.6082 +133,0.0017856398526993147,0.03746698051689425,0.09778055307018077,195901511747.9943,7611.616109621621,1126.3026422364273,156070000.0,0.01548987,46.07681 +134,0.0010259016107971182,0.044880761291556624,0.06705644934174185,194970505839.49564,8083.656081071819,907.3627067488897,230689000.0,0.01940475,51.73302 +135,0.001860082355902441,0.03854848144068639,0.08882994030522845,190304186730.0698,8027.721594459935,1280.479653229362,179798000.0,0.01792092,44.95892 +136,0.001542604286776804,0.04712174122173453,0.06946435429203932,211621156319.32574,7742.179922842699,1130.2153666844827,180251000.0,0.0133065,57.16057 +137,0.0019447376191786942,0.0422851148591643,0.07542812291255657,205298266274.5523,7857.376779458624,1008.9878235583678,139903000.0,0.0118392,50.57019 +138,0.0012647021238459378,0.035709830364575895,0.07084535437356718,205916444480.02826,7761.976728256548,1047.780579380404,277540000.0,0.02769773,43.98809 +139,0.001346410547180829,0.04866970272097498,0.0741878147172175,190710370487.26245,7664.975924986586,788.8564370438124,129569000.0,0.01027382,56.8145 +140,0.0019109316502197373,0.03302525156876573,0.06574641204496581,206105154795.34467,7975.324757886759,870.9361560519158,188977000.0,0.02037559,39.28643 +141,0.0011148857469977088,0.0464680233751421,0.07496367498340413,201908150953.0058,7879.964310885254,1150.2849743610118,236283000.0,0.01852402,55.60907 +142,0.001464740911934044,0.049711859736627784,0.08570023348301076,214018409316.24356,7897.60834917751,717.947018940474,94184600.0,0.006505656,61.27031 +143,0.0010579979117090685,0.0470124570663052,0.0839531746612341,212486848097.1356,8004.897754203495,1023.4701695805461,197925000.0,0.01455433,57.97167 +144,0.0014800732808251515,0.04012106048632336,0.07527756124140332,201020267934.16144,7638.26756945313,1242.838391783298,234882000.0,0.0213825,48.8582 +145,0.0017912352056033884,0.04325027170806647,0.09421868947751355,202376141880.8521,7678.675861569514,1092.5190360774088,130678000.0,0.01092428,53.24379 +146,0.00165790347241636,0.03951530093860501,0.06929134720330497,197614344801.13553,7826.261439274482,1037.8916718429637,193947000.0,0.01825191,46.57088 +147,0.0012949279288387442,0.04520876209150625,0.08191274123615717,223267172060.27637,7934.115768484856,704.2296231172097,120804000.0,0.008790025,57.15468 +148,0.0014279348485995121,0.03380688728234241,0.08708253689029355,198414717657.72092,7806.5997873960105,940.9015676920483,199523000.0,0.02170553,41.49771 +149,0.0012033565547046893,0.039300725712802624,0.06844237979174157,212631422261.5503,7836.766650910136,739.1036313470431,187598000.0,0.01649932,48.51903 +150,0.0018205626223580078,0.04151748853300725,0.07862703777005536,221655632133.8367,7817.348677921927,729.1531923435158,105772000.0,0.00843653,52.16255 +151,0.0012261832963326308,0.032477073313271404,0.06802175387401485,224803137571.3637,7609.569138392722,1262.054162715256,399987000.0,0.04018244,42.35512 +152,0.0019061186545965573,0.04746940533500796,0.0929129107625721,205199519139.2358,7996.322012441318,982.6512261583089,100317000.0,0.007551378,57.10437 +153,0.0011519650657749714,0.04096400873897511,0.06916738581374614,219798470393.9508,7864.459897792613,1289.1528305942006,320826000.0,0.02619655,51.27512 +154,0.0018794322203857946,0.04864858463337651,0.09666200816022084,207030205384.4084,7698.986723451884,1294.8602703368176,125523000.0,0.00913422,60.08103 +155,0.0016446116014318438,0.04130567961813221,0.09906111012782726,199086099123.769,7774.421096056694,1226.1355442961103,160346000.0,0.0142322,50.66562 +156,0.0019569297695237126,0.040768995044271984,0.09493443194509107,210245696381.0047,7820.20101814875,936.4480199158262,110711000.0,0.009436892,50.69072 +157,0.00147092886469247,0.03968772833832893,0.0884026502650962,191088401872.02737,7817.773839424196,1148.0579915835758,192434000.0,0.0185675,47.36791 +158,0.0016937293980628112,0.037105961117207896,0.06871887695375847,208963657552.7331,8016.631308711516,1174.1953279389306,234688000.0,0.02222964,44.53362 +159,0.001962878250270023,0.03882170500817191,0.09338947801542177,218278172058.9604,7970.9822531522605,855.2666991715206,108720000.0,0.009368498,48.74445 +160,0.0011749996830923153,0.048066486042962375,0.0673468123643724,220627336650.59006,7851.973974489205,1096.4628537414767,224781000.0,0.01561048,59.24859 +161,0.0014165844228562787,0.04759728245773061,0.07201220882125688,224467156763.09308,8079.125049693023,798.9506839471545,131984000.0,0.009092194,58.55143 +162,0.0010135904546021955,0.04239470027244893,0.08647039605624748,207393766727.6782,7787.31021289188,965.2505899874918,214627000.0,0.01789362,53.03119 +163,0.0014574265039940374,0.042763641373258734,0.07761695134610702,219100347378.9571,7916.768848718892,967.3140678898401,166912000.0,0.01308424,53.35344 +164,0.0018272563447773327,0.04207790623804254,0.06681187029713344,208660995580.10422,7723.703316520129,1171.4372107187214,191443000.0,0.01603914,50.65791 +165,0.001241425230609511,0.049605850928105266,0.08462589575517705,223879890303.69653,7985.77424750156,888.9857569858998,137743000.0,0.009116388,62.38694 +166,0.0010938029420502551,0.03416903341659582,0.09680088029212675,197514800249.02713,7705.6472658984185,1179.3099366855215,286527000.0,0.03087322,42.89242 +167,0.0016664810230683086,0.04679942361260607,0.09082859902162574,220478342667.78046,8074.04006396437,836.9563686993101,100047000.0,0.007111387,58.28917 +168,0.0013913526100700338,0.04885617119291578,0.06770376269539231,216020010817.63977,7977.670058847445,903.8389266997189,154605000.0,0.01078968,58.80261 +169,0.0011468392474162526,0.04174615457688004,0.07198845798306255,219283297849.10898,8049.730597192357,1054.3666726831339,248882000.0,0.0199833,51.7342 +170,0.0013237017257300607,0.03594717081009375,0.0808545750173205,193658192786.83762,7671.8566633743785,850.3616812290466,191159000.0,0.02010231,43.66194 +171,0.001715146630955862,0.03289558588495469,0.08024179588399599,213326751314.4753,8000.622575313186,1196.5646053587998,240085000.0,0.02500946,40.75781 +172,0.0010751701596541398,0.03222635227988049,0.09136065104630277,220111630155.42178,7920.162621156419,1104.3435439344362,307461000.0,0.03154529,42.07259 +173,0.0014860476026900197,0.03327125312102871,0.06126001078571163,212996033240.05478,7692.95952653101,910.0497337011886,258359000.0,0.02678262,41.18135 +174,0.0011696735604229606,0.03983066641241566,0.06118457817090618,216437546294.57846,7635.073948270479,963.8923544603529,271466000.0,0.02317023,49.63737 +175,0.0016616455346265724,0.04067764393333946,0.09363816618115932,200355483220.07404,7949.845473224718,975.3968734801692,135244000.0,0.01212933,49.26358 +176,0.0019452658401220404,0.03602861330880891,0.09262781187486727,197890942036.70685,7945.354362549695,1067.1843259899786,151121000.0,0.01545533,43.25951 +177,0.0016829828369754433,0.04666361052301451,0.08984925797336436,194769721270.16266,7779.232119879119,1159.1806083015954,139114000.0,0.01122803,55.58289 +178,0.0013608239529378937,0.03846044616197594,0.09530994736223242,214710511643.2613,7877.172679303085,894.0282726904414,156464000.0,0.01382539,49.03872 +179,0.0019883818841470438,0.04919270910657715,0.0743374524499838,190504984651.28082,7837.810840205586,730.2307881124138,82998300.0,0.006518456,55.98759 +180,0.0012838808027105303,0.033904954904771016,0.07345190558874638,215507655930.34308,7648.553830783976,944.4092689551005,254822000.0,0.02555906,43.31527 +181,0.001398048783856736,0.037626899655335305,0.06994993611148863,202678316135.34772,7735.159326596529,1109.5745446238036,254520000.0,0.02451061,45.6748 +182,0.0019821681539476366,0.03724049568996849,0.09015897857920538,219616201751.56573,7939.995776537255,1204.1711657458736,164877000.0,0.0147233,46.90096 +183,0.0015294408446765045,0.03632673800112669,0.09202514094317588,195572915406.13754,7750.423273345416,1212.7513375573612,211114000.0,0.0216788,44.36539 +184,0.00173248462564456,0.032968934873695184,0.08238643654872985,222360873419.20856,7967.062463769673,1213.7876866588938,235220000.0,0.02343884,41.86569 +185,0.0011949982130658285,0.046073062032126924,0.07739841983767326,192206868421.1705,7814.47814331933,913.9546527966384,173127000.0,0.01437321,54.15843 +186,0.0016957750689699561,0.04627728790025447,0.07104079893183664,195123331817.1899,7867.585511649465,1168.6288802010977,171805000.0,0.01400099,53.51619 +187,0.0019266655315298609,0.03788821823851027,0.08277047972092491,204936764621.52954,7739.356825822281,775.6886648734088,114826000.0,0.01082862,46.34981 +188,0.0012174548641305184,0.04451159303000278,0.08515693502630645,211978413881.79114,7952.080206875343,840.6208568879327,150523000.0,0.01170616,55.15195 +189,0.001195557258039558,0.03868901353122211,0.09707050578181561,201660713347.5619,8090.481374352285,817.0372716725276,157317000.0,0.0147064,47.43178 +190,0.0013532584003990154,0.044314274401153764,0.0768094690842071,222622456296.70026,8011.3512350648025,985.5331678826299,175707000.0,0.01308924,55.31521 +191,0.0014462347749105487,0.03541856060902097,0.09248641605455668,212211853356.54623,8088.607467847734,949.6016343880086,178437000.0,0.01730696,44.28207 +192,0.0018408117604271513,0.0394543148773705,0.066286296087238,192549760882.28403,7811.373122958586,842.6441763458685,149490000.0,0.014467,45.51884 +193,0.0013679864251037004,0.042163633761963304,0.06276441058466486,223490037364.635,7799.695443911549,1093.2096523145299,243296000.0,0.01900282,52.46834 +194,0.0019696935672332333,0.045748633662070264,0.0620769578081231,208043612537.48062,7660.523391733803,1049.9890585313217,153501000.0,0.01187838,54.23168 +195,0.0013560978803749569,0.03736524055361199,0.07173424234388633,199582073076.28568,7602.293351519349,1203.8900777588865,280157000.0,0.02757811,45.5906 +196,0.0010707216216999163,0.036553803162769086,0.08839499701041932,209898537469.9625,8055.227835959226,998.8772201271333,247239000.0,0.02354378,45.74624 +197,0.0018980188368081274,0.04030403788039735,0.07153749572593633,192366718488.7468,7912.677157871229,724.8186642061315,114153000.0,0.01081771,46.42789 +198,0.001873275543240377,0.045320024080245824,0.0813190749723127,204028024128.5546,7732.185338139463,1180.33023927621,145353000.0,0.01154611,54.73734 +199,0.0013043661468336654,0.04352988547097253,0.06595787031753336,203636512916.76678,8018.050736604178,1112.7347490132402,238452000.0,0.01979678,51.21833 +200,0.0018383616248104525,0.0460352514020682,0.09556671687880627,215733806541.34338,7687.098211973478,1015.319046462962,108532000.0,0.008003181,58.27658 diff --git a/docs/figures/ml_accuracy_vs_training_size.png b/docs/figures/ml_accuracy_vs_training_size.png new file mode 100644 index 0000000000000000000000000000000000000000..bc61f7a29b3d683e7777cdb8b8d2c79be997ba65 GIT binary patch literal 98127 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 CCCA+W literal 0 HcmV?d00001 diff --git a/docs/figures/ml_runtime_comparison.png b/docs/figures/ml_runtime_comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..4edba298303c49b86943190f2142590a38238e0b GIT binary patch literal 48197 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 literal 0 HcmV?d00001 diff --git a/docs/validation/ml_break_even.csv b/docs/validation/ml_break_even.csv new file mode 100644 index 0000000..f0a8394 --- /dev/null +++ b/docs/validation/ml_break_even.csv @@ -0,0 +1,5 @@ +training_samples,median_model_training_seconds,median_fea_seconds_per_design,median_surrogate_seconds_per_design,speedup,sequential_equivalent_break_even_queries,incremental_break_even_queries_if_fea_data_is_sunk +50,2.3846008330001496,0.06928459049959201,2.4136844996974106e-05,2870.49075835213,84.44689645187897,34.42947175732142 +100,1.1080441569938555,0.06928459049959201,2.4136844996974106e-05,2870.49075835213,116.03307201872305,15.998222629607955 +250,1.3011211090051802,0.06928459049959201,2.4136844996974106e-05,2870.49075835213,268.87304011569523,18.785916642907495 +500,3.0629117009957554,0.06928459049959201,2.4136844996974106e-05,2870.49075835213,544.3973430903196,44.22309614474418 diff --git a/docs/validation/ml_runtime_benchmark.csv b/docs/validation/ml_runtime_benchmark.csv new file mode 100644 index 0000000..bb6e519 --- /dev/null +++ b/docs/validation/ml_runtime_benchmark.csv @@ -0,0 +1,11 @@ +design,fea_seconds,surrogate_seconds,surrogate_microseconds,speedup +1,0.1308434840029804,2.4605792001239025e-05,24.605792001239024,5317.588801709442 +2,0.05166892499255482,2.463494949915912e-05,24.63494949915912,2097.383028705558 +3,0.06922784099879209,2.4324389996763785e-05,24.324389996763784,2846.025779392718 +4,0.06427983500179835,2.4318238502019085e-05,24.318238502019085,2643.2767733757255 +5,0.0643696709885262,2.4068134996923617e-05,24.068134996923618,2674.4768963924257 +6,0.07119906300795265,2.404276149900397e-05,24.042761499003973,2961.3512994712455 +7,0.06934134000039194,2.420555499702459e-05,24.205554997024592,2864.687052575971 +8,0.07262198999524117,2.4027854000451043e-05,24.027854000451043,3022.40849282162 +9,0.06555216800188646,2.3994212999241428e-05,23.994212999241427,2731.9990867780857 +10,0.07112148200394586,2.39602619985817e-05,23.9602619985817,2968.3098627283716 diff --git a/docs/validation/ml_sample_efficiency.csv b/docs/validation/ml_sample_efficiency.csv new file mode 100644 index 0000000..a24e089 --- /dev/null +++ b/docs/validation/ml_sample_efficiency.csv @@ -0,0 +1,13 @@ +training_samples,training_seed,best_epoch,training_seconds,stress_mae_mpa,stress_mape_percent,deflection_mae_mm,deflection_mape_percent,frequency_mae_hz,frequency_mape_percent +50,11,997,3.4642961810022825,6.866049174085978,3.4474224405541487,0.7498572583446255,4.16635850829526,0.5034619353940796,0.9997557665489964 +50,22,853,2.3846008330001496,6.094562400789273,3.3270179258758508,0.7925686314606283,4.536706605059106,0.5505339110088674,1.105739782763316 +50,33,312,0.9896144550002646,6.125175256295271,3.4069044767291956,0.7332625301228618,4.731202795699453,0.4581106917814379,0.9390807228557378 +100,11,218,1.1080441569938557,4.351308041553677,2.3161539755271727,0.44613879500113873,2.6868529845017135,0.32136209147216155,0.6553676785429958 +100,22,424,1.6328563980059698,3.848124641176021,1.9775999021909814,0.46894848230469455,2.722674610630376,0.3706394474622282,0.7379393394766395 +100,33,196,0.6949700510012917,4.145067825131325,2.2909306535623988,0.49258496094957677,3.0646649134609185,0.26235689897040765,0.5448309486457028 +250,11,280,1.5792550449987175,3.6717981375085804,1.953591187415173,0.3369824003256247,1.9725709129716034,0.18214313826487896,0.3696252886072582 +250,22,186,1.3011211090051802,3.0708207934280036,1.5698838493673906,0.3452453334307398,2.0289620364843013,0.21551091608795475,0.4325561028307659 +250,33,188,1.2517717239970807,3.2632325247831617,1.7428773009875393,0.3359198731630988,2.021027251202072,0.19179065506606421,0.3909628170140283 +500,11,307,3.782049052999355,2.411647806960748,1.2421835441042974,0.20752295927102588,1.1687077888042159,0.11618084285121405,0.24237984274190452 +500,22,206,3.0629117009957554,2.5937687257548916,1.2622236702097585,0.25053278539598955,1.4290929190361925,0.1497163155806846,0.301327590975663 +500,33,170,2.3323324599914486,2.3838750738071783,1.2680807057387091,0.2659226072635731,1.609994265582561,0.14517910115881505,0.29390010263258365 diff --git a/scripts/benchmark_surrogate_runtime.py b/scripts/benchmark_surrogate_runtime.py new file mode 100644 index 0000000..e2e2c24 --- /dev/null +++ b/scripts/benchmark_surrogate_runtime.py @@ -0,0 +1,661 @@ +import csv +from dataclasses import replace +from pathlib import Path +from statistics import median +from time import perf_counter + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import torch + +from bodysimpy.config.loader import load_config +from bodysimpy.ml.dataset import Standardization +from bodysimpy.ml.dataset_generation import evaluate_design_point +from bodysimpy.ml.design_space import ( + SurrogateDesignPoint, + generate_design_points, +) +from bodysimpy.ml.experiment import calculate_runtime_tradeoff +from bodysimpy.ml.model import StructuralSurrogate +from bodysimpy.modeling.crossmember import build_crossmember_model + +BENCHMARK_DESIGNS = 10 +BENCHMARK_SEED = 20260816 + +WARMUP_CALLS = 100 +INFERENCE_REPETITIONS_PER_DESIGN = 2_000 + +CHECKPOINT_PATH = Path("models/checkpoints/structural_surrogate.pt") + +SAMPLE_EFFICIENCY_PATH = Path("docs/validation/ml_sample_efficiency.csv") + +RUNTIME_CSV_PATH = Path("docs/validation/ml_runtime_benchmark.csv") + +BREAK_EVEN_CSV_PATH = Path("docs/validation/ml_break_even.csv") + +RUNTIME_FIGURE_PATH = Path("docs/figures/ml_runtime_comparison.png") + +BREAK_EVEN_FIGURE_PATH = Path("docs/figures/ml_break_even_vs_training_size.png") + + +def _as_float64_array( + value: object, + *, + name: str, +) -> np.ndarray: + """Convert checkpoint preprocessing data to a 1D float array.""" + + array = np.asarray( + value, + dtype=np.float64, + ) + + if array.ndim != 1: + raise ValueError(f"{name} must be a one-dimensional array.") + + return array + + +def load_surrogate_checkpoint() -> tuple[ + StructuralSurrogate, + Standardization, + Standardization, +]: + """Load the trained surrogate and preprocessing statistics.""" + + if not CHECKPOINT_PATH.exists(): + raise FileNotFoundError( + "Surrogate checkpoint was not found at " + f"{CHECKPOINT_PATH}. " + "Run scripts/train_surrogate.py first." + ) + + checkpoint = torch.load( + CHECKPOINT_PATH, + map_location="cpu", + weights_only=False, + ) + + if not isinstance(checkpoint, dict): + raise TypeError("Surrogate checkpoint must contain a dictionary.") + + required_keys = { + "model_state_dict", + "feature_mean", + "feature_standard_deviation", + "target_mean", + "target_standard_deviation", + } + + missing_keys = required_keys - checkpoint.keys() + + if missing_keys: + missing = ", ".join(sorted(missing_keys)) + + raise KeyError(f"Surrogate checkpoint is missing: {missing}") + + model = StructuralSurrogate() + + model.load_state_dict(checkpoint["model_state_dict"]) + + model.eval() + + feature_standardization = Standardization( + mean=_as_float64_array( + checkpoint["feature_mean"], + name="feature_mean", + ), + standard_deviation=_as_float64_array( + checkpoint["feature_standard_deviation"], + name="feature_standard_deviation", + ), + ) + + target_standardization = Standardization( + mean=_as_float64_array( + checkpoint["target_mean"], + name="target_mean", + ), + standard_deviation=_as_float64_array( + checkpoint["target_standard_deviation"], + name="target_standard_deviation", + ), + ) + + return ( + model, + feature_standardization, + target_standardization, + ) + + +def design_to_feature_array( + design: SurrogateDesignPoint, +) -> np.ndarray: + """Convert one structural design into the six ML inputs.""" + + return np.array( + [ + [ + design.thickness_m, + design.height_m, + design.width_m, + design.youngs_modulus_pa, + design.density_kg_m3, + design.tip_force_n, + ] + ], + dtype=np.float64, + ) + + +def predict_single_design( + model: StructuralSurrogate, + design: SurrogateDesignPoint, + *, + feature_standardization: Standardization, + target_standardization: Standardization, +) -> np.ndarray: + """Run complete end-to-end inference for one structural design.""" + + features = design_to_feature_array(design) + + normalized_features = ( + features - feature_standardization.mean + ) / feature_standardization.standard_deviation + + feature_tensor = torch.tensor( + normalized_features, + dtype=torch.float32, + ) + + with torch.inference_mode(): + normalized_prediction = model(feature_tensor).cpu().numpy().astype(np.float64) + + prediction = ( + normalized_prediction * target_standardization.standard_deviation + + target_standardization.mean + ) + + return prediction[0] + + +def warm_up_surrogate( + model: StructuralSurrogate, + designs: tuple[SurrogateDesignPoint, ...], + *, + feature_standardization: Standardization, + target_standardization: Standardization, +) -> None: + """Warm up PyTorch before latency measurements.""" + + for call_index in range(WARMUP_CALLS): + design = designs[call_index % len(designs)] + + predict_single_design( + model, + design, + feature_standardization=(feature_standardization), + target_standardization=(target_standardization), + ) + + +def benchmark_fea( + designs: tuple[SurrogateDesignPoint, ...], +) -> tuple[float, ...]: + """Measure sequential static-plus-modal FEA runtime.""" + + config = load_config("configs/baseline_crossmember.yaml") + + base_model = build_crossmember_model(config) + + benchmark_model = replace( + base_model, + name=(f"{base_model.name}_runtime_benchmark"), + ) + + durations: list[float] = [] + + print() + print("Benchmarking CalculiX FEA") + print("-" * 70) + + for design in designs: + start = perf_counter() + + sample = evaluate_design_point( + benchmark_model, + design, + ) + + elapsed = perf_counter() - start + + durations.append(elapsed) + + print( + f"Design {design.sample_index:>2}: " + f"{elapsed:.6f} s | " + f"stress=" + f"{sample.max_stress_pa / 1e6:.3f} MPa | " + f"deflection=" + f"{sample.tip_deflection_m * 1000.0:.4f} mm | " + f"mode1=" + f"{sample.mode_1_frequency_hz:.4f} Hz" + ) + + return tuple(durations) + + +def benchmark_surrogate( + model: StructuralSurrogate, + designs: tuple[SurrogateDesignPoint, ...], + *, + feature_standardization: Standardization, + target_standardization: Standardization, +) -> tuple[float, ...]: + """Measure end-to-end single-design surrogate inference.""" + + print() + print("Warming up PyTorch surrogate") + print("-" * 70) + + warm_up_surrogate( + model, + designs, + feature_standardization=(feature_standardization), + target_standardization=(target_standardization), + ) + + print(f"Completed {WARMUP_CALLS} warm-up calls.") + + durations: list[float] = [] + + print() + print("Benchmarking PyTorch inference") + print("-" * 70) + + for design in designs: + start = perf_counter() + + for _ in range(INFERENCE_REPETITIONS_PER_DESIGN): + predict_single_design( + model, + design, + feature_standardization=(feature_standardization), + target_standardization=(target_standardization), + ) + + elapsed = perf_counter() - start + + seconds_per_design = elapsed / INFERENCE_REPETITIONS_PER_DESIGN + + durations.append(seconds_per_design) + + print(f"Design {design.sample_index:>2}: {seconds_per_design * 1e6:.3f} microseconds/query") + + return tuple(durations) + + +def write_runtime_csv( + fea_durations: tuple[float, ...], + inference_durations: tuple[float, ...], +) -> None: + """Write individual runtime measurements to CSV.""" + + RUNTIME_CSV_PATH.parent.mkdir( + parents=True, + exist_ok=True, + ) + + with RUNTIME_CSV_PATH.open( + "w", + encoding="utf-8", + newline="", + ) as stream: + writer = csv.writer(stream) + + writer.writerow( + [ + "design", + "fea_seconds", + "surrogate_seconds", + "surrogate_microseconds", + "speedup", + ] + ) + + for index, ( + fea_seconds, + inference_seconds, + ) in enumerate( + zip( + fea_durations, + inference_durations, + strict=True, + ), + start=1, + ): + writer.writerow( + [ + index, + fea_seconds, + inference_seconds, + inference_seconds * 1e6, + fea_seconds / inference_seconds, + ] + ) + + +def write_runtime_plot( + *, + median_fea_seconds: float, + median_inference_seconds: float, +) -> None: + """Plot median FEA and surrogate runtimes.""" + + RUNTIME_FIGURE_PATH.parent.mkdir( + parents=True, + exist_ok=True, + ) + + labels = [ + "CalculiX\nstatic + modal", + "PyTorch\nsurrogate", + ] + + values = [ + median_fea_seconds, + median_inference_seconds, + ] + + plt.figure(figsize=(7, 5)) + + plt.bar( + labels, + values, + ) + + plt.yscale("log") + + plt.ylabel("Median runtime per design [s, log scale]") + + plt.title("FEA vs Surrogate Runtime") + + plt.tight_layout() + + plt.savefig( + RUNTIME_FIGURE_PATH, + dpi=200, + ) + + plt.close() + + +def load_training_runtime_summary() -> dict[int, float]: + """Read median ML training time for each dataset size.""" + + if not SAMPLE_EFFICIENCY_PATH.exists(): + raise FileNotFoundError( + "Sample-efficiency results were not found at " + f"{SAMPLE_EFFICIENCY_PATH}. " + "Run scripts/run_ml_tradeoff_experiment.py first." + ) + + dataframe = pd.read_csv(SAMPLE_EFFICIENCY_PATH) + + required_columns = { + "training_samples", + "training_seconds", + } + + missing_columns = required_columns - set(dataframe.columns) + + if missing_columns: + missing = ", ".join(sorted(missing_columns)) + + raise ValueError(f"Sample-efficiency CSV is missing: {missing}") + + grouped = dataframe.groupby( + "training_samples", + sort=True, + )["training_seconds"].median() + + return { + int(sample_count): float(training_seconds) + for ( + sample_count, + training_seconds, + ) in grouped.items() + } + + +def write_break_even_outputs( + *, + median_fea_seconds: float, + median_inference_seconds: float, +) -> None: + """Calculate full-cost and sunk-data break-even estimates.""" + + training_runtime_by_size = load_training_runtime_summary() + + rows: list[ + tuple[ + int, + float, + float, + float, + float, + float, + float, + ] + ] = [] + + runtime_saving_per_query = median_fea_seconds - median_inference_seconds + + if runtime_saving_per_query <= 0.0: + raise ValueError("Measured surrogate inference is not faster than FEA.") + + for ( + training_samples, + training_seconds, + ) in sorted(training_runtime_by_size.items()): + tradeoff = calculate_runtime_tradeoff( + fea_seconds_per_design=(median_fea_seconds), + inference_seconds_per_design=(median_inference_seconds), + training_samples=(training_samples), + model_training_seconds=(training_seconds), + ) + + incremental_break_even_queries = training_seconds / runtime_saving_per_query + + rows.append( + ( + training_samples, + training_seconds, + tradeoff.fea_seconds_per_design, + tradeoff.inference_seconds_per_design, + tradeoff.speedup, + tradeoff.break_even_queries, + incremental_break_even_queries, + ) + ) + + BREAK_EVEN_CSV_PATH.parent.mkdir( + parents=True, + exist_ok=True, + ) + + with BREAK_EVEN_CSV_PATH.open( + "w", + encoding="utf-8", + newline="", + ) as stream: + writer = csv.writer(stream) + + writer.writerow( + [ + "training_samples", + "median_model_training_seconds", + "median_fea_seconds_per_design", + "median_surrogate_seconds_per_design", + "speedup", + ("sequential_equivalent_break_even_queries"), + ("incremental_break_even_queries_if_fea_data_is_sunk"), + ] + ) + + writer.writerows(rows) + + write_break_even_plot(rows) + + +def write_break_even_plot( + rows: list[ + tuple[ + int, + float, + float, + float, + float, + float, + float, + ] + ], +) -> None: + """Plot break-even query count versus training-set size.""" + + BREAK_EVEN_FIGURE_PATH.parent.mkdir( + parents=True, + exist_ok=True, + ) + + training_sizes = [row[0] for row in rows] + + full_break_even = [row[5] for row in rows] + + incremental_break_even = [row[6] for row in rows] + + plt.figure(figsize=(8, 5)) + + plt.plot( + training_sizes, + full_break_even, + marker="o", + label=("Full FEA-data + training cost"), + ) + + plt.plot( + training_sizes, + incremental_break_even, + marker="o", + label=("Training-only cost (FEA data already available)"), + ) + + plt.xlabel("Training samples") + + plt.ylabel("Break-even future queries") + + plt.title("Surrogate Computational Break-Even") + + plt.grid(True) + + plt.legend() + + plt.tight_layout() + + plt.savefig( + BREAK_EVEN_FIGURE_PATH, + dpi=200, + ) + + plt.close() + + +def main() -> None: + print() + print("BodySimPy Surrogate Runtime Benchmark") + print("=" * 70) + + ( + model, + feature_standardization, + target_standardization, + ) = load_surrogate_checkpoint() + + designs = generate_design_points( + sample_count=BENCHMARK_DESIGNS, + seed=BENCHMARK_SEED, + ) + + print() + print(f"Generated {len(designs)} fresh benchmark designs.") + + fea_durations = benchmark_fea(designs) + + inference_durations = benchmark_surrogate( + model, + designs, + feature_standardization=(feature_standardization), + target_standardization=(target_standardization), + ) + + write_runtime_csv( + fea_durations, + inference_durations, + ) + + median_fea_seconds = float(median(fea_durations)) + + median_inference_seconds = float(median(inference_durations)) + + speedup = median_fea_seconds / median_inference_seconds + + write_runtime_plot( + median_fea_seconds=(median_fea_seconds), + median_inference_seconds=(median_inference_seconds), + ) + + write_break_even_outputs( + median_fea_seconds=(median_fea_seconds), + median_inference_seconds=(median_inference_seconds), + ) + + print() + print("Runtime summary") + print("-" * 70) + + print(f"Median FEA/design: {median_fea_seconds:.6f} s") + + print( + f"Median surrogate/design: " + f"{median_inference_seconds:.9f} s " + f"(" + f"{median_inference_seconds * 1e6:.3f} " + f"microseconds)" + ) + + print(f"Measured speedup: {speedup:,.1f}x") + + print() + print("Generated artifacts") + print("-" * 70) + + print(RUNTIME_CSV_PATH) + + print(BREAK_EVEN_CSV_PATH) + + print(RUNTIME_FIGURE_PATH) + + print(BREAK_EVEN_FIGURE_PATH) + + print() + print("Break-even values are sequential-equivalent estimates.") + + print("Full-cost break-even includes FEA training-data generation.") + + print("Incremental break-even treats the FEA dataset as already available.") + + +if __name__ == "__main__": + main() diff --git a/scripts/generate_surrogate_holdout.py b/scripts/generate_surrogate_holdout.py new file mode 100644 index 0000000..3a38801 --- /dev/null +++ b/scripts/generate_surrogate_holdout.py @@ -0,0 +1,56 @@ +from dataclasses import replace +from pathlib import Path + +from bodysimpy.config.loader import load_config +from bodysimpy.ml.dataset_generation import ( + generate_fea_dataset, + write_fea_dataset, +) +from bodysimpy.ml.design_space import ( + generate_design_points, +) +from bodysimpy.modeling.crossmember import ( + build_crossmember_model, +) + +SAMPLE_COUNT = 200 +RANDOM_SEED = 20260815 +MAX_WORKERS = 4 + + +def main() -> None: + config = load_config("configs/baseline_crossmember.yaml") + + base_model = build_crossmember_model(config) + + holdout_model = replace( + base_model, + name=(f"{base_model.name}_ml_holdout"), + ) + + designs = generate_design_points( + sample_count=SAMPLE_COUNT, + seed=RANDOM_SEED, + ) + + samples = generate_fea_dataset( + holdout_model, + designs, + max_workers=MAX_WORKERS, + ) + + output_path = Path("data/surrogate/fea_surrogate_holdout.csv") + + write_fea_dataset( + samples, + output_path, + ) + + print() + print(f"Generated {len(samples)} independent holdout samples.") + + print(output_path) + + +if __name__ == "__main__": + main() diff --git a/scripts/run_ml_tradeoff_experiment.py b/scripts/run_ml_tradeoff_experiment.py new file mode 100644 index 0000000..9cd4e6f --- /dev/null +++ b/scripts/run_ml_tradeoff_experiment.py @@ -0,0 +1,226 @@ +import csv +from pathlib import Path +from time import perf_counter + +import matplotlib.pyplot as plt +import numpy as np + +from bodysimpy.ml.dataset import ( + load_surrogate_arrays, +) +from bodysimpy.ml.evaluation import ( + calculate_metrics, + predict, +) +from bodysimpy.ml.experiment import ( + build_nested_training_subsets, + split_holdout_indices, +) +from bodysimpy.ml.training import ( + train_surrogate_fixed_validation, +) + +TRAINING_SIZES = ( + 50, + 100, + 250, + 500, +) + +TRAINING_SEEDS = ( + 11, + 22, + 33, +) + + +def main() -> None: + training_features, training_targets = load_surrogate_arrays( + "data/surrogate/fea_surrogate_dataset.csv" + ) + + holdout_features, holdout_targets = load_surrogate_arrays( + "data/surrogate/fea_surrogate_holdout.csv" + ) + + subsets = build_nested_training_subsets( + pool_size=training_features.shape[0], + sample_counts=TRAINING_SIZES, + seed=42, + ) + + holdout_split = split_holdout_indices( + sample_count=holdout_features.shape[0], + validation_count=100, + seed=42, + ) + + validation_features = holdout_features[holdout_split.validation_indices] + + validation_targets = holdout_targets[holdout_split.validation_indices] + + test_features = holdout_features[holdout_split.test_indices] + + test_targets = holdout_targets[holdout_split.test_indices] + + rows: list[dict[str, float | int]] = [] + + for subset in subsets: + for training_seed in TRAINING_SEEDS: + print(f"Training size={subset.sample_count}, seed={training_seed}") + + train_features = training_features[subset.indices] + + train_targets = training_targets[subset.indices] + + start = perf_counter() + + result = train_surrogate_fixed_validation( + train_features, + train_targets, + validation_features, + validation_targets, + seed=training_seed, + ) + + training_seconds = perf_counter() - start + + predictions = predict( + result.model, + test_features, + feature_standardization=(result.feature_standardization), + target_standardization=(result.target_standardization), + ) + + stress_metrics = calculate_metrics( + test_targets[:, 0], + predictions[:, 0], + ) + + displacement_metrics = calculate_metrics( + test_targets[:, 1], + predictions[:, 1], + ) + + frequency_metrics = calculate_metrics( + test_targets[:, 2], + predictions[:, 2], + ) + + rows.append( + { + "training_samples": (subset.sample_count), + "training_seed": (training_seed), + "best_epoch": (result.best_epoch), + "training_seconds": (training_seconds), + "stress_mae_mpa": (stress_metrics.mae / 1e6), + "stress_mape_percent": (stress_metrics.mean_absolute_percentage_error), + "deflection_mae_mm": (displacement_metrics.mae * 1000.0), + "deflection_mape_percent": ( + displacement_metrics.mean_absolute_percentage_error + ), + "frequency_mae_hz": (frequency_metrics.mae), + "frequency_mape_percent": (frequency_metrics.mean_absolute_percentage_error), + } + ) + + output_path = Path("docs/validation/ml_sample_efficiency.csv") + + output_path.parent.mkdir( + parents=True, + exist_ok=True, + ) + + with output_path.open( + "w", + encoding="utf-8", + newline="", + ) as stream: + writer = csv.DictWriter( + stream, + fieldnames=list(rows[0].keys()), + ) + + writer.writeheader() + writer.writerows(rows) + + plot_accuracy(rows) + + +def plot_accuracy( + rows: list[dict[str, float | int]], +) -> None: + figure_path = Path("docs/figures/ml_accuracy_vs_training_size.png") + + figure_path.parent.mkdir( + parents=True, + exist_ok=True, + ) + + metric_fields = ( + ( + "Stress", + "stress_mape_percent", + ), + ( + "Deflection", + "deflection_mape_percent", + ), + ( + "Mode-1 frequency", + "frequency_mape_percent", + ), + ) + + plt.figure(figsize=(8, 5)) + + for label, field in metric_fields: + means: list[float] = [] + deviations: list[float] = [] + + for sample_count in TRAINING_SIZES: + values = np.array( + [float(row[field]) for row in rows if int(row["training_samples"]) == sample_count], + dtype=float, + ) + + means.append(float(np.mean(values))) + + deviations.append( + float( + np.std( + values, + ddof=1, + ) + ) + ) + + plt.errorbar( + TRAINING_SIZES, + means, + yerr=deviations, + marker="o", + capsize=4, + label=label, + ) + + plt.xlabel("Number of FEA training samples") + + plt.ylabel("Held-out test MAPE [%]") + + plt.title("Surrogate Accuracy vs Training-Data Size") + + plt.legend() + plt.grid(True) + plt.tight_layout() + + plt.savefig( + figure_path, + dpi=200, + ) + + plt.close() + + +if __name__ == "__main__": + main() diff --git a/src/bodysimpy/ml/experiment.py b/src/bodysimpy/ml/experiment.py new file mode 100644 index 0000000..3972017 --- /dev/null +++ b/src/bodysimpy/ml/experiment.py @@ -0,0 +1,127 @@ +from dataclasses import dataclass + +import numpy as np +from numpy.typing import NDArray + + +@dataclass(frozen=True, slots=True) +class TrainingSubset: + sample_count: int + indices: NDArray[np.int64] + + +@dataclass(frozen=True, slots=True) +class HoldoutSplit: + validation_indices: NDArray[np.int64] + test_indices: NDArray[np.int64] + + +@dataclass(frozen=True, slots=True) +class RuntimeTradeoff: + fea_seconds_per_design: float + inference_seconds_per_design: float + speedup: float + break_even_queries: float + + +def build_nested_training_subsets( + *, + pool_size: int, + sample_counts: tuple[int, ...], + seed: int, +) -> tuple[TrainingSubset, ...]: + """Create deterministic nested subsets from one training pool.""" + + if pool_size <= 0: + raise ValueError("Training pool size must be positive.") + + if not sample_counts: + raise ValueError("At least one training sample count is required.") + + if any(count <= 0 for count in sample_counts): + raise ValueError("Training sample counts must be positive.") + + if any(count > pool_size for count in sample_counts): + raise ValueError("Training sample count exceeds the available pool.") + + if tuple(sorted(sample_counts)) != sample_counts: + raise ValueError("Training sample counts must be increasing.") + + rng = np.random.default_rng(seed) + + order = rng.permutation(pool_size).astype(np.int64) + + return tuple( + TrainingSubset( + sample_count=count, + indices=order[:count].copy(), + ) + for count in sample_counts + ) + + +def split_holdout_indices( + *, + sample_count: int, + validation_count: int, + seed: int, +) -> HoldoutSplit: + """Split an independent holdout dataset into validation and test sets.""" + + if sample_count <= 1: + raise ValueError("Holdout dataset must contain at least two samples.") + + if validation_count <= 0 or validation_count >= sample_count: + raise ValueError("Validation count must lie inside the holdout sample range.") + + rng = np.random.default_rng(seed) + + order = rng.permutation(sample_count).astype(np.int64) + + return HoldoutSplit( + validation_indices=(order[:validation_count].copy()), + test_indices=(order[validation_count:].copy()), + ) + + +def calculate_runtime_tradeoff( + *, + fea_seconds_per_design: float, + inference_seconds_per_design: float, + training_samples: int, + model_training_seconds: float, +) -> RuntimeTradeoff: + """Calculate surrogate speedup and sequential break-even point.""" + + if fea_seconds_per_design <= 0.0: + raise ValueError("FEA runtime must be positive.") + + if inference_seconds_per_design <= 0.0: + raise ValueError("Inference runtime must be positive.") + + if training_samples <= 0: + raise ValueError("Training sample count must be positive.") + + if model_training_seconds < 0.0: + raise ValueError("Model training runtime cannot be negative.") + + runtime_saving = fea_seconds_per_design - inference_seconds_per_design + + if runtime_saving <= 0.0: + raise ValueError( + "Surrogate inference must be faster than FEA " + "for a positive computational break-even point." + ) + + speedup = fea_seconds_per_design / inference_seconds_per_design + + estimated_upfront_seconds = training_samples * fea_seconds_per_design + model_training_seconds + + break_even_queries = estimated_upfront_seconds / runtime_saving + + return RuntimeTradeoff( + fea_seconds_per_design=(fea_seconds_per_design), + inference_seconds_per_design=(inference_seconds_per_design), + speedup=speedup, + break_even_queries=break_even_queries, + ) diff --git a/src/bodysimpy/ml/model.py b/src/bodysimpy/ml/model.py index 8e8dba6..2b61af9 100644 --- a/src/bodysimpy/ml/model.py +++ b/src/bodysimpy/ml/model.py @@ -26,4 +26,4 @@ def forward( return cast( Tensor, self.network(features), - ) \ No newline at end of file + ) diff --git a/src/bodysimpy/ml/training.py b/src/bodysimpy/ml/training.py index 818322c..905a02a 100644 --- a/src/bodysimpy/ml/training.py +++ b/src/bodysimpy/ml/training.py @@ -36,6 +36,16 @@ class TrainingResult: split: DataSplit +@dataclass(frozen=True, slots=True) +class FixedValidationTrainingResult: + model: StructuralSurrogate + feature_standardization: Standardization + target_standardization: Standardization + train_losses: tuple[float, ...] + validation_losses: tuple[float, ...] + best_epoch: int + + def create_data_split( sample_count: int, *, @@ -259,3 +269,158 @@ def save_training_checkpoint( }, checkpoint_path, ) + + +def train_surrogate_fixed_validation( + train_features: NDArray[np.float64], + train_targets: NDArray[np.float64], + validation_features: NDArray[np.float64], + validation_targets: NDArray[np.float64], + *, + seed: int, + batch_size: int = 32, + learning_rate: float = 1e-3, + maximum_epochs: int = 1000, + patience: int = 50, +) -> FixedValidationTrainingResult: + """Train using an explicitly fixed validation dataset.""" + + torch.manual_seed(seed) + + feature_statistics = fit_standardization(train_features) + + target_statistics = fit_standardization(train_targets) + + normalized_train_features = standardize( + train_features, + feature_statistics, + ) + + normalized_train_targets = standardize( + train_targets, + target_statistics, + ) + + normalized_validation_features = standardize( + validation_features, + feature_statistics, + ) + + normalized_validation_targets = standardize( + validation_targets, + target_statistics, + ) + + train_dataset = StructuralSurrogateDataset( + normalized_train_features, + normalized_train_targets, + ) + + validation_dataset = StructuralSurrogateDataset( + normalized_validation_features, + normalized_validation_targets, + ) + + training_loader: DataLoader[tuple[Tensor, Tensor]] = DataLoader( + train_dataset, + batch_size=batch_size, + shuffle=True, + ) + + validation_loader: DataLoader[tuple[Tensor, Tensor]] = DataLoader( + validation_dataset, + batch_size=batch_size, + shuffle=False, + ) + + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + model = StructuralSurrogate().to(device) + + optimizer = Adam( + model.parameters(), + lr=learning_rate, + ) + + loss_function = nn.MSELoss() + + train_losses: list[float] = [] + validation_losses: list[float] = [] + + best_validation_loss = float("inf") + best_model_state = deepcopy(model.state_dict()) + + best_epoch = 0 + epochs_without_improvement = 0 + + for epoch in range( + 1, + maximum_epochs + 1, + ): + model.train() + + batch_losses: list[float] = [] + + for ( + features_batch, + targets_batch, + ) in training_loader: + features_batch = features_batch.to(device) + + targets_batch = targets_batch.to(device) + + optimizer.zero_grad() + + predictions = model(features_batch) + + loss = loss_function( + predictions, + targets_batch, + ) + + loss.backward() + optimizer.step() + + batch_losses.append(float(loss.item())) + + train_loss = float(np.mean(batch_losses)) + + validation_loss = _mean_loss( + model, + validation_loader, + loss_function, + device, + ) + + train_losses.append(train_loss) + + validation_losses.append(validation_loss) + + if validation_loss < best_validation_loss: + best_validation_loss = validation_loss + + best_model_state = deepcopy(model.state_dict()) + + best_epoch = epoch + + epochs_without_improvement = 0 + + else: + epochs_without_improvement += 1 + + if epochs_without_improvement >= patience: + break + + model.load_state_dict(best_model_state) + + model.to("cpu") + model.eval() + + return FixedValidationTrainingResult( + model=model, + feature_standardization=(feature_statistics), + target_standardization=(target_statistics), + train_losses=tuple(train_losses), + validation_losses=tuple(validation_losses), + best_epoch=best_epoch, + ) diff --git a/tests/unit/test_ml_experiment.py b/tests/unit/test_ml_experiment.py new file mode 100644 index 0000000..2ad3c42 --- /dev/null +++ b/tests/unit/test_ml_experiment.py @@ -0,0 +1,70 @@ +import pytest + +from bodysimpy.ml.experiment import ( + build_nested_training_subsets, + calculate_runtime_tradeoff, + split_holdout_indices, +) + + +def test_training_subsets_are_nested() -> None: + subsets = build_nested_training_subsets( + pool_size=500, + sample_counts=(50, 100, 250, 500), + seed=42, + ) + + assert tuple(subset.sample_count for subset in subsets) == ( + 50, + 100, + 250, + 500, + ) + + first = set(subsets[0].indices.tolist()) + second = set(subsets[1].indices.tolist()) + third = set(subsets[2].indices.tolist()) + fourth = set(subsets[3].indices.tolist()) + + assert first < second + assert second < third + assert third < fourth + + +def test_holdout_validation_and_test_are_disjoint() -> None: + split = split_holdout_indices( + sample_count=200, + validation_count=100, + seed=42, + ) + + validation = set(split.validation_indices.tolist()) + + test = set(split.test_indices.tolist()) + + assert len(validation) == 100 + assert len(test) == 100 + assert validation.isdisjoint(test) + + +def test_runtime_tradeoff() -> None: + result = calculate_runtime_tradeoff( + fea_seconds_per_design=10.0, + inference_seconds_per_design=0.01, + training_samples=100, + model_training_seconds=5.0, + ) + + assert result.speedup == pytest.approx(1000.0) + + assert result.break_even_queries > 100.0 + + +def test_runtime_tradeoff_rejects_slower_surrogate() -> None: + with pytest.raises(ValueError): + calculate_runtime_tradeoff( + fea_seconds_per_design=1.0, + inference_seconds_per_design=2.0, + training_samples=100, + model_training_seconds=5.0, + )