diff --git a/Database/Submit_Full_Regional_Model_SOLA.bat b/Database/Submit_Full_Regional_Model_SOLA.bat index 370a534..6c51a2d 100644 --- a/Database/Submit_Full_Regional_Model_SOLA.bat +++ b/Database/Submit_Full_Regional_Model_SOLA.bat @@ -309,7 +309,7 @@ if %ERRORLEVEL% NEQ 0 (goto issue) @ECHO --- End assignment Period %tod_cntr%: %date% %time% --- @ECHO --- Begin balance5I_7c.mac Period %tod_cntr%: %date% %time% >> model_run_timestamp.txt @ECHO --- Balance time period volumes --- -call emme -ng 000 -m macros\balance5I_7c.mac %val% >> blog.txt +uv run macros/balance5I_7c.py %counter% >> blog.txt @ECHO --- End balance5I_7c.mac Period %tod_cntr%: %date% %time% >> model_run_timestamp.txt @ECHO --- Begin time-of-day skim Period %tod_cntr%: %date% %time% >> model_run_timestamp.txt @ECHO --- Complete time of day skims --- diff --git a/Database/macros/balance5I_7c.mac b/Database/macros/balance5I_7c.mac deleted file mode 100644 index a245c52..0000000 --- a/Database/macros/balance5I_7c.mac +++ /dev/null @@ -1,447 +0,0 @@ -~# -~/********************************************************************** -~/********************************************************************** -~# -~/ Macro balance5I_7c.mac %1% -~/ Where %1% = three digit alternative ID number. -~# -~/********************************************************************** -~/ Macro for MSA balance of link volumes and turns in full model -~/ iteration run. -~/********************************************************************** -~# -~/ Written by Englund -~# -~/ 22May2004 (for EMME/2 Release 9.5) -~/ Revised 1OCT2004 by DBE for five vehicle classes as part of -~/ fulliter -~/ Revised 30DEP2009 by DBE for I-290 HOV -~# -~# Revised: Heither, 10-30-2014: more compact code -~# Revised 02/10/2015 by NRF to change from 6 classes to 7 classes by dividing HOV into HOV2 and HOV3+ -~# Revised 07/07/2021 by JLemp move to new vehicle class framework (3 SOV classes, combined b-plate + light trucks) -~# Revised 09/26/2021 by Heither: update @avauv - replace @vauto with @vsov1+@vsov2+@vsov3 -~# -~/ 7-class version: S is primary class -~# -~/********************************************************************** -~/ Set reports -~/********************************************************************** -reports=report\iter_%ms98%\bal_%s%.sim_%ms98%.rxt -~o|39 -~# -~/********************************************************************** -~# -~/ Check for zero iteration - no loads to balance. -~/ Initialize averaging extra attribs as run_0 volumes. -~# -~/********************************************************************** -~z=%ms98% -~?z=0 -~$>iterzero -~/********************************************************************** -~/ Balance link and turn volumes. -~/********************************************************************** -~# -2.41 -~# # -- SOV Total -- # -~+;1;yes;@avauv;yes;SOV veh MSA average volume iter_%ms98% -((@vsov1+@vsov2+@vsov3)/(%ms98%+1))+(@avauv*(1-1/(%ms98%+1))) -~+; ;all;2;2 -~# -~+;1;yes;@avaut;yes;SOV veh MSA average turns iter_%ms98% -(@tauto/(%ms98%+1))+(@avaut*(1-1/(%ms98%+1))) -~+; ;all;all;2;2 -~# -~# # -- SOV VOT1 -- # -~+;1;yes;@avs1v;yes;SOV1 veh MSA average volume iter_%ms98% -(@vsov1/(%ms98%+1))+(@avs1v*(1-1/(%ms98%+1))) -~+; ;all;2;2 -~# -~+;1;yes;@avs1t;yes;SOV1 veh MSA average turns iter_%ms98% -(@tsov1/(%ms98%+1))+(@avs1t*(1-1/(%ms98%+1))) -~+; ;all;all;2;2 -~# -~# # -- SOV VOT2 -- # -~+;1;yes;@avs2v;yes;SOV2 veh MSA average volume iter_%ms98% -(@vsov2/(%ms98%+1))+(@avs2v*(1-1/(%ms98%+1))) -~+; ;all;2;2 -~# -~+;1;yes;@avs2t;yes;SOV2 veh MSA average turns iter_%ms98% -(@tsov2/(%ms98%+1))+(@avs2t*(1-1/(%ms98%+1))) -~+; ;all;all;2;2 -~# -~# # -- SOV VOT3 -- # -~+;1;yes;@avs3v;yes;SOV3 veh MSA average volume iter_%ms98% -(@vsov3/(%ms98%+1))+(@avs3v*(1-1/(%ms98%+1))) -~+; ;all;2;2 -~# -~+;1;yes;@avs3t;yes;SOV3 veh MSA average turns iter_%ms98% -(@tsov3/(%ms98%+1))+(@avs3t*(1-1/(%ms98%+1))) -~+; ;all;all;2;2 -~# -~# # -- HOV2 -- # -~+;1;yes;@avh2v;yes;HOV2 veh MSA average volume iter_%ms98% -(@vhov2/(%ms98%+1))+(@avh2v*(1-1/(%ms98%+1))) -~+; ;all;2;2 -~# -~+;1;yes;@avh2t;yes;HOV2 veh MSA average turns iter_%ms98% -(@thov2/(%ms98%+1))+(@avh2t*(1-1/(%ms98%+1))) -~+; ;all;all;2;2 -~# -~# # -- HOV3+ -- # -~+;1;yes;@avh3v;yes;HOV3+ veh MSA average volume iter_%ms98% -(@vhov3/(%ms98%+1))+(@avh3v*(1-1/(%ms98%+1))) -~+; ;all;2;2 -~# -~+;1;yes;@avh3t;yes;HOV3+ veh MSA average turns iter_%ms98% -(@thov3/(%ms98%+1))+(@avh3t*(1-1/(%ms98%+1))) -~+; ;all;all;2;2 -~# -~# # -- B-Plate -- # -~+;1;yes;@avbqv;yes;b-truck veq MSA average volume iter_%ms98% -(@vbplt/(%ms98%+1))+(@avbqv*(1-1/(%ms98%+1))) -~+; ;all;2;2 -~# -~+;1;yes;@avbqt;yes;b-truck veq MSA average turns iter_%ms98% -(@tbplt/(%ms98%+1))+(@avbqt*(1-1/(%ms98%+1))) -~+; ;all;all;2;2 -~# -~# # -- Light Duty -- # -~+;1;yes;@avlqv;yes;light trk veq MSA average volume iter_%ms98% -(@vlght/(%ms98%+1))+(@avlqv*(1-1/(%ms98%+1))) -~+; ;all;2;2 -~# -~+;1;yes;@avlqt;yes;light trk veq MSA average turns iter_%ms98% -(@tlght/(%ms98%+1))+(@avlqt*(1-1/(%ms98%+1))) -~+; ;all;all;2;2 -~# -~# # -- Medium Duty -- # -~+;1;yes;@avmqv;yes;medium trk veq MSA average volume iter_%ms98% -(@vmed/(%ms98%+1))+(@avmqv*(1-1/(%ms98%+1))) -~+; ;all;2;2 -~# -~+;1;yes;@avmqt;yes;medium trk veq MSA average turns iter_%ms98% -(@tmed/(%ms98%+1))+(@avmqt*(1-1/(%ms98%+1))) -~+; ;all;all;2;2 -~# -~# # -- Heavy Duty -- # -~+;1;yes;@avhqv;yes;heavy trk veq MSA average volume iter_%ms98% -(@vhevy/(%ms98%+1))+(@avhqv*(1-1/(%ms98%+1))) -~+; ;all;2;2 -~# -~+;1;yes;@avhqt;yes;heavy trk veq MSA average turns iter_%ms98% -(@thevy/(%ms98%+1))+(@avhqt*(1-1/(%ms98%+1))) -~+; ;all;all;2;2;q -~# -~# -~/********************************************************************** -~/ Skip initialization section after zero iteration. -~/********************************************************************** -~$>archive -~# -~/********************************************************************** -~:iterzero -~# -~/********************************************************************** -~# -~/ Delete old extra attributes, if necessary -~# -~/********************************************************************** -2.42 -~+;3;@vauto;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avauv;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avaut;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avs1v;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avs1t;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avs2v;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avs2t;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avs3v;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avs3t;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avh2v;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avh2t;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avh3v;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avh3t;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avbqv;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avbqt;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avlqv;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avlqt;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avmqv;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avmqt;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avhqv;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -2.42 -~+;3;@avhqt;~?e -~$>err -~+;yes;q;~$>end -~:err -~+; ;q -~:end -~# ---------------- -~# -~/********************************************************************** -~/ Initialize @avauv = period averaged auto volume (mode = S) -~/ @avaut = period averaged auto turn volume (mode = S) -~/ @avs1v = period averaged SOV VOT1 volume (mode = S) -~/ @avs1t = period averaged SOV VOT1 turn volume (mode = S) -~/ @avs2v = period averaged SOV VOT2 volume (mode = S) -~/ @avs2t = period averaged SOV VOT2 turn volume (mode = S) -~/ @avs3v = period averaged SOV VOT3 volume (mode = S) -~/ @avs3t = period averaged SOV VOT3 turn volume (mode = S) -~/ @avh2v = period averaged HOV2 volume (mode = H) -~/ @avh2t = period averaged HOV2 turn volume (mode = H) -~/ @avh3v = period averaged HOV3+ volume (mode = H) -~/ @avh3t = period averaged HOV3+ turn volume (mode = H) -~/ @avbqv = period averaged b-truck volume in veq -~/ @avbqt = period averaged b-truck turn volume in veq -~/ @avlqv = period averaged light truck volume in veq -~/ @avlqt = period averaged light truck turn volume in veq -~/ @avmqv = period averaged medium truck volume in veq -~/ @avmqt = period averaged medium truck turn volume in veq -~/ @avhqv = period averaged heavy truck volume in veq -~/ @avhqt = period averaged heavy truck turn volume in veq -~# -~/********************************************************************** -2.42 -~+;2;2;@avauv;SOV veh MSA average volume iter_%ms98%;0.0 -~+;2;5;@avaut;SOV veh MSA average turns iter_%ms98%;0.0 -~# -~+;2;2;@avs1v;SOV1 veh MSA average volume iter_%ms98%;0.0 -~+;2;5;@avs1t;SOV1 veh MSA average turns iter_%ms98%;0.0 -~# -~+;2;2;@avs2v;SOV2 veh MSA average volume iter_%ms98%;0.0 -~+;2;5;@avs2t;SOV2 veh MSA average turns iter_%ms98%;0.0 -~# -~+;2;2;@avs3v;SOV3 veh MSA average volume iter_%ms98%;0.0 -~+;2;5;@avs3t;SOV3 veh MSA average turns iter_%ms98%;0.0 -~# -~+;2;2;@avh2v;HOV2 veh MSA average volume iter_%ms98%;0.0 -~+;2;5;@avh2t;HOV2 veh MSA average turns iter_%ms98%;0.0 -~# -~+;2;2;@avh3v;HOV3+ veh MSA average volume iter_%ms98%;0.0 -~+;2;5;@avh3t;HOV3+ veh MSA average turns iter_%ms98%;0.0 -~# -~+;2;2;@avbqv;b-truck veq MSA average volume iter_%ms98%;0.0 -~+;2;5;@avbqt;b-truck veq MSA average turns iter_%ms98%;0.0 -~# -~+;2;2;@avlqv;light trk veq MSA average volume iter_%ms98%;0.0 -~+;2;5;@avlqt;light trk veq MSA average turns iter_%ms98%;0.0 -~# -~+;2;2;@avmqv;medium trk veq MSA average volume iter_%ms98%;0.0 -~+;2;5;@avmqt;medium trk veq MSA average turns iter_%ms98%;0.0 -~# -~+;2;2;@avhqv;heavy trk veq MSA average volume iter_%ms98%;0.0 -~+;2;5;@avhqt;heavy trk veq MSA average turns iter_%ms98%;0.0;q -~# -~# -~/********************************************************************** -~# -~/ Store zero iteration volumes and turns -~# -~/********************************************************************** -~# -2.41 -~+;1;yes;@avauv;no;@vsov1+@vsov2+@vsov3; ;all;2;2 -~+;1;yes;@avaut;no;@tauto; ;all;all;2;2 -~# -~+;1;yes;@avs1v;no;@vsov1; ;all;2;2 -~+;1;yes;@avs1t;no;@tsov1; ;all;all;2;2 -~# -~+;1;yes;@avs2v;no;@vsov2; ;all;2;2 -~+;1;yes;@avs2t;no;@tsov2; ;all;all;2;2 -~# -~+;1;yes;@avs3v;no;@vsov3; ;all;2;2 -~+;1;yes;@avs3t;no;@tsov3; ;all;all;2;2 -~# -~+;1;yes;@avh2v;no;@vhov2; ;all;2;2 -~+;1;yes;@avh2t;no;@thov2; ;all;all;2;2 -~# -~+;1;yes;@avh3v;no;@vhov3; ;all;2;2 -~+;1;yes;@avh3t;no;@thov3; ;all;all;2;2 -~# -~+;1;yes;@avbqv;no;@vbplt; ;all;2;2 -~+;1;yes;@avbqt;no;@tbplt; ;all;all;2;2 -~# -~+;1;yes;@avlqv;no;@vlght; ;all;2;2 -~+;1;yes;@avlqt;no;@tlght; ;all;all;2;2 -~# -~+;1;yes;@avmqv;no;@vmed; ;all;2;2 -~+;1;yes;@avmqt;no;@tmed; ;all;all;2;2 -~# -~+;1;yes;@avhqv;no;@vhevy; ;all;2;2 -~+;1;yes;@avhqt;no;@thevy; ;all;all;2;2;q -~# -~# -~/********************************************************************** -~# -~/ Copy scenario w/ links averaged for next full iteration. -~/ x as next fulliter scenario = current scenario -~/ +(itercounter + 1) * 10 -~/ z is temp next value for next full iteration -~/ Current scenario thus archived. -~# -~/********************************************************************** -~# -~:archive -~x=%s% -~x+10 -~z=%ms98% -~z+1 -~t9=%ts% -~?z=3 -~$>nocopy -1.22 -3 -%s% -%x% -%t9.45% run_%z% -no -q -~:nocopy -~/********************************************************************** -~# -~/ End of macro -~# -~/********************************************************************** -reports= -~# -~/********************************************************************** -q diff --git a/Database/macros/balance5I_7c.py b/Database/macros/balance5I_7c.py new file mode 100644 index 0000000..fa37e1b --- /dev/null +++ b/Database/macros/balance5I_7c.py @@ -0,0 +1,193 @@ +""" +********************************************************************** +********************************************************************** + + Macro balance5I_7c.py %counter% + Where %counter% = current global iteration number. + +********************************************************************** + Macro for MSA balance of link volumes and turns in full model + iteration run. +********************************************************************** + + Written by Englund + + 22May2004 (for EMME/2 Release 9.5) + Revised 1OCT2004 by DBE for five vehicle classes as part of + fulliter + Revised 30DEP2009 by DBE for I-290 HOV + + Revised: Heither, 10-30-2014: more compact code + Revised 02/10/2015 by NRF to change from 6 classes to 7 classes by dividing HOV into HOV2 and HOV3+ + Revised 07/07/2021 by JLemp move to new vehicle class framework (3 SOV classes, combined b-plate + light trucks) + Revised 09/26/2021 by Heither: update @avauv - replace @vauto with @vsov1+@vsov2+@vsov3 + Revised 08/13/2026 by DWells: convert to python + + 7-class version: S is primary class + +""" + +import os +import sys +from pathlib import Path +import inro.modeller as _m +sys.path.append(str(Path(__file__).resolve().parents[2].joinpath('Scripts'))) +from tbmtools import project as tbm + +globalIter = int(sys.argv[1]) + +proj_dir = Path(__file__).resolve().parents[2] +my_modeller = tbm.connect(proj_dir) + + +netcalc = my_modeller.tool("inro.emme.network_calculation.network_calculator") +delete_ea = my_modeller.tool("inro.emme.data.extra_attribute.delete_extra_attribute") +create_ea = my_modeller.tool("inro.emme.data.extra_attribute.create_extra_attribute") +copy_scenario = my_modeller.tool("inro.emme.data.scenario.copy_scenario") + + +# each step of this macro does the same thing for each vehicle type +# structuring all the specifications in one dictionary allows for easy iteration +vehtype_dict = { + "SOV Total": { + "vol_ea": "@avauv", + "vol_label": f"SOV veh MSA average volume iter_{globalIter}", + "vol_calc": "(@vsov1+@vsov2+@vsov3)", + "turns_ea": "@avaut", + "turns_label": f"SOV veh MSA average turns iter_{globalIter}", + "turns_calc": "@tauto", + }, + "SOV VOT1": { + "vol_ea": "@avs1v", + "vol_label": f"SOV1 veh MSA average volume iter_{globalIter}", + "vol_calc": "@vsov1", + "turns_ea": "@avs1t", + "turns_label": f"SOV1 veh MSA average turns iter_{globalIter}", + "turns_calc": "@tsov1", + }, + "SOV VOT2": { + "vol_ea": "@avs2v", + "vol_label": f"SOV2 veh MSA average volume iter_{globalIter}", + "vol_calc": "@vsov2", + "turns_ea": "@avs2t", + "turns_label": f"SOV2 veh MSA average turns iter_{globalIter}", + "turns_calc": "@tsov2", + }, + "SOV VOT3": { + "vol_ea": "@avs3v", + "vol_label": f"SOV3 veh MSA average volume iter_{globalIter}", + "vol_calc": "@vsov3", + "turns_ea": "@avs3t", + "turns_label": f"SOV3 veh MSA average turns iter_{globalIter}", + "turns_calc": "@tsov3", + }, + "HOV2": { + "vol_ea": "@avh2v", + "vol_label": f"HOV2 veh MSA average volume iter_{globalIter}", + "vol_calc": "@vhov2", + "turns_ea": "@avh2t", + "turns_label": f"HOV2 veh MSA average turns iter_{globalIter}", + "turns_calc": "@thov2", + }, + "HOV3": { + "vol_ea": "@avh3v", + "vol_label": f"HOV3 veh MSA average volume iter_{globalIter}", + "vol_calc": "@vhov3", + "turns_ea": "@avh3t", + "turns_label": f"HOV3 veh MSA average turns iter_{globalIter}", + "turns_calc": "@thov3", + }, + "B-Plate": { + "vol_ea": "@avbqv", + "vol_label": f"b-truck veq MSA average volume iter_{globalIter}", + "vol_calc": "@vbplt", + "turns_ea": "@avbqt", + "turns_label": f"b-truck veq MSA average turns iter_{globalIter}", + "turns_calc": "@tbplt", + }, + "Light Duty": { + "vol_ea": "@avlqv", + "vol_label": f"light trk veq MSA average volume iter_{globalIter}", + "vol_calc": "@vlght", + "turns_ea": "@avlqt", + "turns_label": f"light trk veq MSA average turns iter_{globalIter}", + "turns_calc": "@tlght", + }, + "Meduim Duty": { + "vol_ea": "@avmqv", + "vol_label": f"medium trk veq MSA average volume iter_{globalIter}", + "vol_calc": "@vmed", + "turns_ea": "@avmqt", + "turns_label": f"medium trk veq MSA average turns iter_{globalIter}", + "turns_calc": "@tmed", + }, + "Heavy Duty": { + "vol_ea": "@avhqv", + "vol_label": f"heavy trk veq MSA average volume iter_{globalIter}", + "vol_calc": "@vhevy", + "turns_ea": "@avhqt", + "turns_label": f"heavy trk veq MSA average turns iter_{globalIter}", + "turns_calc": "@thevy", + } +} + +# check for iteration zero - no loads to balance +# initialize average extra attributes as run_0 volume +if globalIter == 0: + # delete old extra attributes, if necessary + delete_ea(my_modeller.scenario.extra_attribute("@vauto")) + for vehtype in vehtype_dict.values(): + delete_ea(my_modeller.scenario.extra_attribute(vehtype["vol_ea"])) + delete_ea(my_modeller.scenario.extra_attribute(vehtype["turns_ea"])) + + # initialize extra attributes + for vehtype in vehtype_dict.values(): + create_ea("LINK", vehtype["vol_ea"], vehtype["vol_label"], 0.0, overwrite = True) + create_ea("TURN", vehtype["turns_ea"], vehtype["turns_label"], 0.0, overwrite = True) + + # store run_0 volumes and turns + for vehtype in vehtype_dict.values(): + vol_calc_spec = { + "type": "NETWORK_CALCULATION", + "result": vehtype["vol_ea"], + "expression": vehtype["vol_calc"], + "aggregation": None, + "selections": {"link": "all"} + } + netcalc(vol_calc_spec, full_report = False) + turns_calc_spec = { + "type": "NETWORK_CALCULATION", + "result": vehtype["turns_ea"], + "expression": vehtype["turns_calc"], + "aggregation": None, + "selections": {"incoming_link": "all", "outgoing_link": "all"} + } + netcalc(turns_calc_spec, full_report = False) +else: + # do MSA averaging on volumes and turns + for vehtype in vehtype_dict.values(): + vol_calc_spec = { + "type": "NETWORK_CALCULATION", + "result": vehtype["vol_ea"], + "expression": f"({vehtype['vol_calc']}/({globalIter}+1))+({vehtype['vol_ea']}*(1-1/({globalIter}+1)))", + "aggregation": None, + "selections": {"link": "all"} + } + netcalc(vol_calc_spec, full_report = False) + turns_calc_spec = { + "type": "NETWORK_CALCULATION", + "result": vehtype["turns_ea"], + "expression": f"({vehtype['turns_calc']}/({globalIter}+1))+({vehtype['turns_ea']}*(1-1/({globalIter}+1)))", + "aggregation": None, + "selections": {"incoming_link": "all", "outgoing_link": "all"} + } + netcalc(turns_calc_spec, full_report = False) + +# copy scenario w/ links averaged for next full iteration +if globalIter < 2: + copy_scenario( + from_scenario=int(my_modeller.scenario.id), + scenario_id=int(my_modeller.scenario.id)+10, + scenario_title=f"{my_modeller.scenario.title[:45]:<45} run_{globalIter+1}" + ) +