data / debug /model_fields_cmp.py
songlinwei's picture
debug: compiled MuJoCo model field comparison (AMD reference hashes)
5b85ad4 verified
Raw History Blame Contribute Delete
18.9 kB
# Wraps mujoco.mj_step; on the first step of the replay, hashes every array field of the compiled model.
# With REF (a {field: hash} dict embedded below) it prints only fields that differ, with the entities and values.
import hashlib, json, os, runpy, sys, numpy as np, mujoco
REF = json.loads(r'''{"B_colind": "60d43e940802", "B_rowadr": "f8d5ed841dec", "B_rownnz": "51372917a75a", "D_colind": "32f229d8b82a", "D_diag": "38946956b3f5", "D_rowadr": "82749b9189f7", "D_rownnz": "ecb356140797", "M_colind": "0bc49bad4200", "M_rowadr": "ee7c69bc5422", "M_rownnz": "3b754db1d900", "actuator_acc0": "c6642529ba69", "actuator_actadr": "f66a719dd6a8", "actuator_actearly": "aea2fa668453", "actuator_actlimited": "aea2fa668453", "actuator_actnum": "5363c96604a0", "actuator_actrange": "189a804eaa46", "actuator_armature": "15120767b40b", "actuator_biasprm": "ec77a8e55d5d", "actuator_biastype": "5363c96604a0", "actuator_cranklength": "15120767b40b", "actuator_ctrladr": "6a73879635c2", "actuator_ctrllimited": "a316e883aecb", "actuator_ctrlnum": "5957342188f1", "actuator_ctrlrange": "4996033897b6", "actuator_ctrlspec": "5363c96604a0", "actuator_damping": "15120767b40b", "actuator_dampingpoly": "189a804eaa46", "actuator_delay": "15120767b40b", "actuator_dynprm": "492f5ba049ff", "actuator_dyntype": "5363c96604a0", "actuator_forcelimited": "aea2fa668453", "actuator_forcerange": "189a804eaa46", "actuator_gainprm": "492f5ba049ff", "actuator_gaintype": "5363c96604a0", "actuator_gear": "e18f66e44539", "actuator_group": "5363c96604a0", "actuator_history": "15120767b40b", "actuator_historyadr": "f66a719dd6a8", "actuator_length0": "15120767b40b", "actuator_lengthrange": "189a804eaa46", "actuator_outadr": "6a73879635c2", "actuator_outnum": "5957342188f1", "actuator_plugin": "f66a719dd6a8", "actuator_trnid": "0ad82fbcb20d", "actuator_trntype": "5363c96604a0", "actuator_user": "d41d8cd98f00", "body_bvhadr": "b147fcd9075a", "body_bvhnum": "2564a273d297", "body_conaffinity": "82fa013665e1", "body_contype": "82fa013665e1", "body_dofadr": "7d717ed9572a", "body_dofnum": "67ba94cbd703", "body_geomadr": "93b0f6c53350", "body_geomnum": "000f7c6f9af7", "body_gravcomp": "0fe8b6ff202a", "body_inertia": "6049f8dcb659", "body_invweight0": "2e6b95b40e91", "body_ipos": "e1de808d296c", "body_iquat": "6a55f0716739", "body_jntadr": "0e65142240fe", "body_jntnum": "9c6a7d3f70a8", "body_margin": "0fe8b6ff202a", "body_mass": "bebb0f6d6c76", "body_mocapid": "b73e984d4dd4", "body_parentid": "549b5c324122", "body_plugin": "b73e984d4dd4", "body_pos": "e33df67c645e", "body_quat": "eb3f10ce7718", "body_rootid": "938496d35ca0", "body_sameframe": "28ce13508320", "body_simple": "28ce13508320", "body_subtreemass": "2fd2167aff67", "body_treeid": "deb0839682cc", "body_user": "d41d8cd98f00", "body_weldid": "595a2b9f0fd2", "bvh_aabb": "cdafb8248d12", "bvh_child": "e998697c6dad", "bvh_depth": "0d3c521304a9", "bvh_nodeid": "0586cdfcf799", "cam_bodyid": "ea17163b5e0c", "cam_fovy": "6676855e8779", "cam_intrinsic": "41de9a098107", "cam_ipd": "f55cb33ef12b", "cam_mat0": "f2d8e8f9fb8c", "cam_mode": "7dea362b3fac", "cam_output": "39d997ae6b77", "cam_pos": "dc15de58b099", "cam_pos0": "4c98f65922bd", "cam_poscom0": "1010ab665231", "cam_projection": "7dea362b3fac", "cam_quat": "6bbc4463a6bf", "cam_resolution": "544fa2f2c66b", "cam_sensorsize": "4ae71336e44b", "cam_targetbodyid": "c2cb56f4c5bf", "cam_user": "d41d8cd98f00", "dof_M0": "9263fdd9300e", "dof_Madr": "ee7c69bc5422", "dof_armature": "1e3a1917c2dc", "dof_bodyid": "2884ba88e8f1", "dof_damping": "8406107fd2eb", "dof_dampingpoly": "de3c77e86c8f", "dof_frictionloss": "eaa0a9290533", "dof_invweight0": "071879daf583", "dof_jntid": "c7afce1e5b17", "dof_length": "ae7dcb3edf02", "dof_parentid": "d5521ae84ab7", "dof_simplenum": "2c02751412cd", "dof_solimp": "5c6142ae5061", "dof_solref": "f0eba60eae5c", "dof_treeid": "72491a2e1ccc", "efm0_L": "d41d8cd98f00", "efm0_L_colind": "d41d8cd98f00", "efm0_L_rowadr": "d41d8cd98f00", "efm0_L_rownnz": "d41d8cd98f00", "efm0_dofid": "d41d8cd98f00", "eq_active0": "d41d8cd98f00", "eq_data": "d41d8cd98f00", "eq_obj1id": "d41d8cd98f00", "eq_obj2id": "d41d8cd98f00", "eq_objtype": "d41d8cd98f00", "eq_solimp": "d41d8cd98f00", "eq_solref": "d41d8cd98f00", "eq_type": "d41d8cd98f00", "exclude_signature": "d41d8cd98f00", "flex_activelayers": "d41d8cd98f00", "flex_bending": "d41d8cd98f00", "flex_bendingadr": "d41d8cd98f00", "flex_bvhadr": "d41d8cd98f00", "flex_bvhnum": "d41d8cd98f00", "flex_cellnum": "d41d8cd98f00", "flex_centered": "d41d8cd98f00", "flex_conaffinity": "d41d8cd98f00", "flex_condim": "d41d8cd98f00", "flex_contype": "d41d8cd98f00", "flex_damping": "d41d8cd98f00", "flex_dim": "d41d8cd98f00", "flex_edge": "d41d8cd98f00", "flex_edgeadr": "d41d8cd98f00", "flex_edgedamping": "d41d8cd98f00", "flex_edgeequality": "d41d8cd98f00", "flex_edgeflap": "d41d8cd98f00", "flex_edgenum": "d41d8cd98f00", "flex_edgestiffness": "d41d8cd98f00", "flex_elem": "d41d8cd98f00", "flex_elemadr": "d41d8cd98f00", "flex_elemdataadr": "d41d8cd98f00", "flex_elemedge": "d41d8cd98f00", "flex_elemedgeadr": "d41d8cd98f00", "flex_elemlayer": "d41d8cd98f00", "flex_elemnum": "d41d8cd98f00", "flex_elemtexcoord": "d41d8cd98f00", "flex_evpair": "d41d8cd98f00", "flex_evpairadr": "d41d8cd98f00", "flex_evpairnum": "d41d8cd98f00", "flex_flatskin": "d41d8cd98f00", "flex_friction": "d41d8cd98f00", "flex_gap": "d41d8cd98f00", "flex_group": "d41d8cd98f00", "flex_internal": "d41d8cd98f00", "flex_interp": "d41d8cd98f00", "flex_margin": "d41d8cd98f00", "flex_matid": "d41d8cd98f00", "flex_node": "d41d8cd98f00", "flex_node0": "d41d8cd98f00", "flex_nodeadr": "d41d8cd98f00", "flex_nodebodyid": "d41d8cd98f00", "flex_nodenum": "d41d8cd98f00", "flex_passive": "d41d8cd98f00", "flex_priority": "d41d8cd98f00", "flex_radius": "d41d8cd98f00", "flex_rgba": "d41d8cd98f00", "flex_rigid": "d41d8cd98f00", "flex_selfcollide": "d41d8cd98f00", "flex_shell": "d41d8cd98f00", "flex_shelldataadr": "d41d8cd98f00", "flex_shellnum": "d41d8cd98f00", "flex_size": "d41d8cd98f00", "flex_solimp": "d41d8cd98f00", "flex_solmix": "d41d8cd98f00", "flex_solref": "d41d8cd98f00", "flex_stiffness": "d41d8cd98f00", "flex_stiffnessadr": "d41d8cd98f00", "flex_texcoord": "d41d8cd98f00", "flex_texcoordadr": "d41d8cd98f00", "flex_vert": "d41d8cd98f00", "flex_vert0": "d41d8cd98f00", "flex_vertadr": "d41d8cd98f00", "flex_vertbodyid": "d41d8cd98f00", "flex_vertedge": "d41d8cd98f00", "flex_vertedgeadr": "d41d8cd98f00", "flex_vertedgenum": "d41d8cd98f00", "flex_vertmetric": "d41d8cd98f00", "flex_vertnum": "d41d8cd98f00", "flexedge_J_colind": "d41d8cd98f00", "flexedge_J_rowadr": "d41d8cd98f00", "flexedge_J_rownnz": "d41d8cd98f00", "flexedge_invweight0": "d41d8cd98f00", "flexedge_length0": "d41d8cd98f00", "flexedge_rigid": "d41d8cd98f00", "flexvert_J_colind": "d41d8cd98f00", "flexvert_J_rowadr": "d41d8cd98f00", "flexvert_J_rownnz": "d41d8cd98f00", "geom_aabb": "46507722efc5", "geom_adhesion": "81ed540e1204", "geom_bodyid": "f99a3e59c848", "geom_conaffinity": "dec97fa6281e", "geom_condim": "7fbc9913b465", "geom_contype": "dec97fa6281e", "geom_dataid": "f12a2b424044", "geom_fluid": "52b3d1769245", "geom_friction": "28f644a0f474", "geom_gap": "81ed540e1204", "geom_group": "e98eeaf9e932", "geom_margin": "81ed540e1204", "geom_matid": "418b6ea91084", "geom_plugin": "56ead3b75d49", "geom_pos": "2f93890f422b", "geom_priority": "93bb0775019d", "geom_quat": "be99f992f8c2", "geom_rbound": "de7dd3d5bb76", "geom_rgba": "7d2b7cc924d7", "geom_sameframe": "063f1e081d0c", "geom_size": "bd1e7fa6ebea", "geom_solimp": "3d2da4d150d9", "geom_solmix": "cd5605fa8ce2", "geom_solref": "2fc9938b5b3c", "geom_surfacevel": "7685f0d216ca", "geom_type": "7adeba567b8e", "geom_user": "d41d8cd98f00", "hfield_adr": "d41d8cd98f00", "hfield_data": "d41d8cd98f00", "hfield_ncol": "d41d8cd98f00", "hfield_nrow": "d41d8cd98f00", "hfield_pathadr": "d41d8cd98f00", "hfield_size": "d41d8cd98f00", "jnt_actfrclimited": "0e60fd9e87b2", "jnt_actfrcrange": "df1382c1be28", "jnt_actgravcomp": "d898504a722b", "jnt_actuatorid": "b40308be5489", "jnt_axis": "8bcf5f619d79", "jnt_bodyid": "b9b5e961c61c", "jnt_dofadr": "b81cc0668e1c", "jnt_group": "0e2e640b11f6", "jnt_limited": "0e60fd9e87b2", "jnt_margin": "8722e1d435ed", "jnt_pos": "e70ff8c4ceb4", "jnt_qposadr": "a29141f5247b", "jnt_range": "b23467523a15", "jnt_solimp": "0da2fe166972", "jnt_solref": "7ed190217b1d", "jnt_stiffness": "8722e1d435ed", "jnt_stiffnesspoly": "a8d00da54c45", "jnt_type": "15f4230bd7fb", "jnt_user": "d41d8cd98f00", "key_act": "d41d8cd98f00", "key_ctrl": "d41d8cd98f00", "key_mpos": "d41d8cd98f00", "key_mquat": "d41d8cd98f00", "key_qpos": "d41d8cd98f00", "key_qvel": "d41d8cd98f00", "key_time": "d41d8cd98f00", "light_active": "249ba6277758", "light_ambient": "1681ffc6e046", "light_attenuation": "44d4b9c2b7f5", "light_bodyid": "7dea362b3fac", "light_bulbradius": "1818b5f942b9", "light_castshadow": "441077cc9e57", "light_cutoff": "4ba4c31c75a1", "light_diffuse": "7ac92204e348", "light_dir": "c458e62570c2", "light_dir0": "c458e62570c2", "light_exponent": "60e40674b1ef", "light_intensity": "7dea362b3fac", "light_mode": "7dea362b3fac", "light_pos": "e9b8e4de8cd2", "light_pos0": "e9b8e4de8cd2", "light_poscom0": "49224582802d", "light_range": "60e40674b1ef", "light_softness": "1ff1144fc0d2", "light_specular": "007f6e05e3c4", "light_targetbodyid": "c2cb56f4c5bf", "light_texid": "c2cb56f4c5bf", "light_type": "da35686b165e", "mapD2M": "12c14ffd5616", "mapM2D": "7b02e8ac9f47", "mapM2M": "a1c4af5a118e", "mat_emission": "f1d3ff844329", "mat_metallic": "530dbe5bcf6b", "mat_reflectance": "c3b76b5390fb", "mat_rgba": "cf47ecb9bc3f", "mat_roughness": "530dbe5bcf6b", "mat_shininess": "38fc9331271e", "mat_specular": "38fc9331271e", "mat_texid": "82cff12431ba", "mat_texrepeat": "5690589bc1ba", "mat_texuniform": "55a54008ad1b", "mesh_bvhadr": "56c138bb651c", "mesh_bvhnum": "20ba141608d9", "mesh_extrema": "6c1c8831e815", "mesh_face": "6b4e3c623c17", "mesh_faceadr": "82fe3d0058f0", "mesh_facenormal": "6b4e3c623c17", "mesh_facenum": "ae5b54aa50b7", "mesh_facetexcoord": "b3f9fbfb7fe3", "mesh_graph": "4a5b283f8569", "mesh_graphadr": "65698f2370c2", "mesh_normal": "648783a7d915", "mesh_normaladr": "a5e4d0796914", "mesh_normalnum": "1bd401fe80bc", "mesh_octadr": "1bd7fcea4768", "mesh_octnum": "4aa09c46db22", "mesh_pathadr": "5079bb7cd286", "mesh_polyadr": "55cc187d7ec7", "mesh_polymap": "7fc2eb8a6458", "mesh_polymapadr": "45cd7e33e18c", "mesh_polymapnum": "3fa98eb20c7c", "mesh_polynormal": "075cddaf98b8", "mesh_polynum": "0a89d2059e4f", "mesh_polyvert": "5273df2e568b", "mesh_polyvertadr": "a579b81c6276", "mesh_polyvertnum": "bd3c95d9e5b1", "mesh_pos": "3db8c3454f24", "mesh_quat": "63037e397767", "mesh_scale": "2efb19d8ed8e", "mesh_texcoord": "d41d8cd98f00", "mesh_texcoordadr": "1bd7fcea4768", "mesh_texcoordnum": "4aa09c46db22", "mesh_vert": "bb65dadfc40c", "mesh_vertadr": "a5e4d0796914", "mesh_vertnum": "1bd401fe80bc", "name_actuatoradr": "f3d966f0e1c6", "name_bodyadr": "9dc079aaa774", "name_camadr": "6bffe8a9b1d9", "name_eqadr": "d41d8cd98f00", "name_excludeadr": "d41d8cd98f00", "name_flexadr": "d41d8cd98f00", "name_geomadr": "8f613dca2918", "name_hfieldadr": "d41d8cd98f00", "name_jntadr": "4a9d88359d7c", "name_keyadr": "d41d8cd98f00", "name_lightadr": "0c406fe71f15", "name_matadr": "af92a4fdef87", "name_meshadr": "e261591c16c5", "name_numericadr": "d41d8cd98f00", "name_pairadr": "d41d8cd98f00", "name_pluginadr": "d41d8cd98f00", "name_sensoradr": "cfa3be9bae6e", "name_siteadr": "1b3a14826eee", "name_skinadr": "d41d8cd98f00", "name_tendonadr": "d41d8cd98f00", "name_texadr": "eca814076901", "name_textadr": "d41d8cd98f00", "name_tupleadr": "d41d8cd98f00", "names_map": "add8893eb53f", "numeric_adr": "d41d8cd98f00", "numeric_data": "d41d8cd98f00", "numeric_size": "d41d8cd98f00", "oct_aabb": "d41d8cd98f00", "oct_child": "d41d8cd98f00", "oct_coeff": "d41d8cd98f00", "oct_depth": "d41d8cd98f00", "pair_adhesion": "d41d8cd98f00", "pair_dim": "d41d8cd98f00", "pair_friction": "d41d8cd98f00", "pair_gap": "d41d8cd98f00", "pair_geom1": "d41d8cd98f00", "pair_geom2": "d41d8cd98f00", "pair_margin": "d41d8cd98f00", "pair_signature": "d41d8cd98f00", "pair_solimp": "d41d8cd98f00", "pair_solref": "d41d8cd98f00", "pair_solreffriction": "d41d8cd98f00", "plugin": "d41d8cd98f00", "plugin_attr": "d41d8cd98f00", "plugin_attradr": "d41d8cd98f00", "plugin_stateadr": "d41d8cd98f00", "plugin_statenum": "d41d8cd98f00", "qpos0": "7d2a8bf65cc1", "qpos_spring": "7d2a8bf65cc1", "sensor_adr": "c3d64e10be72", "sensor_cutoff": "861f738bd62d", "sensor_datatype": "a8fc4665d96d", "sensor_delay": "861f738bd62d", "sensor_dim": "2feee0a8c6be", "sensor_history": "861f738bd62d", "sensor_historyadr": "608c4b5c76b6", "sensor_interval": "bc196e74e339", "sensor_intprm": "240c101021f4", "sensor_needstage": "fafb27625d29", "sensor_noise": "861f738bd62d", "sensor_objid": "1972395225e1", "sensor_objtype": "600935b3a7db", "sensor_plugin": "608c4b5c76b6", "sensor_refid": "608c4b5c76b6", "sensor_reftype": "fa5df715f61c", "sensor_type": "a8cdaaa74cc3", "sensor_user": "d41d8cd98f00", "site_bodyid": "85d7167055d7", "site_group": "7dea362b3fac", "site_matid": "c2cb56f4c5bf", "site_pos": "1a2e9df441d7", "site_quat": "f686a2c56683", "site_rgba": "1c636c630267", "site_sameframe": "d5bf2872904c", "site_size": "9cb1f5e9e70a", "site_type": "b40978209126", "site_user": "d41d8cd98f00", "skin_boneadr": "d41d8cd98f00", "skin_bonebindpos": "d41d8cd98f00", "skin_bonebindquat": "d41d8cd98f00", "skin_bonebodyid": "d41d8cd98f00", "skin_bonenum": "d41d8cd98f00", "skin_bonevertadr": "d41d8cd98f00", "skin_bonevertid": "d41d8cd98f00", "skin_bonevertnum": "d41d8cd98f00", "skin_bonevertweight": "d41d8cd98f00", "skin_face": "d41d8cd98f00", "skin_faceadr": "d41d8cd98f00", "skin_facenum": "d41d8cd98f00", "skin_group": "d41d8cd98f00", "skin_inflate": "d41d8cd98f00", "skin_matid": "d41d8cd98f00", "skin_pathadr": "d41d8cd98f00", "skin_rgba": "d41d8cd98f00", "skin_texcoord": "d41d8cd98f00", "skin_texcoordadr": "d41d8cd98f00", "skin_vert": "d41d8cd98f00", "skin_vertadr": "d41d8cd98f00", "skin_vertnum": "d41d8cd98f00", "ten_J_colind": "d41d8cd98f00", "ten_J_rowadr": "d41d8cd98f00", "ten_J_rownnz": "d41d8cd98f00", "tendon_actfrclimited": "d41d8cd98f00", "tendon_actfrcrange": "d41d8cd98f00", "tendon_actuatorid": "d41d8cd98f00", "tendon_adr": "d41d8cd98f00", "tendon_armature": "d41d8cd98f00", "tendon_damping": "d41d8cd98f00", "tendon_dampingpoly": "d41d8cd98f00", "tendon_frictionloss": "d41d8cd98f00", "tendon_group": "d41d8cd98f00", "tendon_invweight0": "d41d8cd98f00", "tendon_length0": "d41d8cd98f00", "tendon_lengthspring": "d41d8cd98f00", "tendon_limited": "d41d8cd98f00", "tendon_margin": "d41d8cd98f00", "tendon_matid": "d41d8cd98f00", "tendon_num": "d41d8cd98f00", "tendon_range": "d41d8cd98f00", "tendon_rgba": "d41d8cd98f00", "tendon_solimp_fri": "d41d8cd98f00", "tendon_solimp_lim": "d41d8cd98f00", "tendon_solref_fri": "d41d8cd98f00", "tendon_solref_lim": "d41d8cd98f00", "tendon_stiffness": "d41d8cd98f00", "tendon_stiffnesspoly": "d41d8cd98f00", "tendon_treeid": "d41d8cd98f00", "tendon_treenum": "d41d8cd98f00", "tendon_user": "d41d8cd98f00", "tendon_width": "d41d8cd98f00", "tex_adr": "7dea362b3fac", "tex_colorspace": "f1d3ff844329", "tex_data": "f77c3a173584", "tex_height": "65318f3b6184", "tex_nchannel": "edcfae989540", "tex_pathadr": "a54f0041a9e1", "tex_type": "f1d3ff844329", "tex_width": "65318f3b6184", "text_adr": "d41d8cd98f00", "text_size": "d41d8cd98f00", "tree_bodyadr": "fda9cd858f6a", "tree_bodynum": "0057024aeb5f", "tree_dofadr": "b2e1abc10333", "tree_dofnum": "b02b13b5cb68", "tree_sleep_policy": "dd89302686fd", "tuple_adr": "d41d8cd98f00", "tuple_objid": "d41d8cd98f00", "tuple_objprm": "d41d8cd98f00", "tuple_objtype": "d41d8cd98f00", "tuple_size": "d41d8cd98f00", "wrap_objid": "d41d8cd98f00", "wrap_prm": "d41d8cd98f00", "wrap_type": "d41d8cd98f00", "opt.ccd_iterations": "bc0237ec72b2", "opt.ccd_tolerance": "a4ebd4d771f8", "opt.cone": "33cdeccccebe", "opt.density": "7dea362b3fac", "opt.disableactuator": "7dea362b3fac", "opt.disableflags": "13f0b6476e7f", "opt.enableflags": "7dea362b3fac", "opt.gravity": "740e3e6a2f27", "opt.impratio": "43940a284b79", "opt.integrator": "7d2d5fca8036", "opt.iterations": "bc72239e4527", "opt.jacobian": "69c1753bd5f8", "opt.ls_iterations": "bc0237ec72b2", "opt.ls_tolerance": "815d609ae70b", "opt.magnetic": "024c8415862e", "opt.noslip_iterations": "69c1753bd5f8", "opt.noslip_tolerance": "a4ebd4d771f8", "opt.o_friction": "f06bbe8b87d6", "opt.o_margin": "7dea362b3fac", "opt.o_solimp": "4e99aaeb9ad9", "opt.o_solref": "ce317ae246db", "opt.sdf_initpoints": "b950c875d2e2", "opt.sdf_iterations": "7be4bbacbfdb", "opt.sleep_tolerance": "0a1d0d349b41", "opt.solver": "69c1753bd5f8", "opt.timestep": "3d0cf660b6b6", "opt.tolerance": "e86ce560d3cc", "opt.viscosity": "7dea362b3fac", "opt.wind": "1681ffc6e046"}''') # field hashes on the AMD machine
_step, done = mujoco.mj_step, [False]
H = lambda a: hashlib.md5(np.ascontiguousarray(a).tobytes()).hexdigest()[:12]
OBJ = {"body": mujoco.mjtObj.mjOBJ_BODY, "geom": mujoco.mjtObj.mjOBJ_GEOM, "mesh": mujoco.mjtObj.mjOBJ_MESH,
"jnt": mujoco.mjtObj.mjOBJ_JOINT, "dof": mujoco.mjtObj.mjOBJ_JOINT, "actuator": mujoco.mjtObj.mjOBJ_ACTUATOR}
def report(m):
fields = {}
for k in dir(m):
if k.startswith("_"): continue
try: v = getattr(m, k)
except Exception: continue
if isinstance(v, np.ndarray): fields[k] = v
for k in ("opt",):
o = m.opt; fields.update({f"opt.{a}": np.asarray(getattr(o, a)) for a in dir(o) if not a.startswith("_") and isinstance(getattr(o, a), (int, float, np.ndarray))})
hashes = {k: H(v) for k, v in fields.items()}
if not REF:
print("[fields] " + json.dumps(hashes), flush=True); return
diff = [k for k in hashes if REF.get(k) != hashes[k]]
print(f"[fields] {len(diff)} of {len(hashes)} fields differ: {diff}", flush=True)
for k in diff:
v = fields[k]; prefix = k.split("_")[0]
rows = v.reshape(v.shape[0], -1) if v.ndim else v.reshape(1, -1)
print(f"[fields] {k} shape={v.shape} dtype={v.dtype}", flush=True)
if prefix in OBJ and v.ndim and v.shape[0] in (m.nbody, m.ngeom, m.nmesh, m.njnt, m.nv, m.nu):
for i in range(min(rows.shape[0], 400)):
name = mujoco.mj_id2name(m, OBJ[prefix], i) if prefix != "dof" else f"dof{i}"
print(f"[fields] {i} {name}: {np.array2string(rows[i][:8], precision=9)}", flush=True)
else:
print(f"[fields] size={v.size} sum={float(np.sum(v.astype(np.float64))):.12g} first={np.array2string(v.reshape(-1)[:8], precision=9)}", flush=True)
def step(m, d, nstep=1):
if not done[0]:
done[0] = True; report(m)
_step(m, d, nstep=nstep)
mujoco.mj_step = step
sys.argv = ["replay_decoupled_wbc"] + sys.argv[1:]
runpy.run_module("simple.cli.replay_decoupled_wbc", run_name="__main__")