"""Actual upstream SPIDER, with L20 passive-joint reward indexing corrected locally.""" import os,sys,json,importlib.util,argparse from pathlib import Path ROOT=Path(__file__).resolve().parents[1];OUT=Path(os.environ.get('SPIDER_TASK_OUT',str(ROOT/'output/foundationpose_spider_20260915'))) os.environ['WARP_CACHE_PATH']=str(ROOT/'.spider_cache/warp');os.environ['TORCHINDUCTOR_CACHE_DIR']=str(ROOT/'.spider_cache/torchinductor');os.environ.setdefault('MUJOCO_GL','osmesa');os.environ['OMP_NUM_THREADS']='4' sys.path.insert(0,str(ROOT/'third_party/spider')) import torch torch.set_num_threads(4) from spider.config import Config import spider.simulators.mjwp as sim original=sim._weight_diff_qpos def weights(config): if config.embodiment_type!='bimanual':return original(config) # 27 state DOFs per L20 (6 wrist+21 finger), versus 22 actuator channels. half=(config.nv-12)//2;w=torch.full((config.nv,),config.joint_rew_scale,device=config.device) for start in [0,half]:w[start:start+3]=config.base_pos_rew_scale;w[start+3:start+6]=config.base_rot_rew_scale for start in [config.nv-12,config.nv-6]:w[start:start+3]=config.pos_rew_scale;w[start+3:start+6]=config.rot_rew_scale return w sim._weight_diff_qpos=weights spec=importlib.util.spec_from_file_location('spider_original_runner',ROOT/'third_party/spider/examples/run_mjwp.py');module=importlib.util.module_from_spec(spec);sys.modules[spec.name]=module;spec.loader.exec_module(module) # Cross-object regrasp invalidates upstream one-object-per-hand delta heuristic. # Retain reference object assistance schedule and per-finger contact reward. module.compute_contact_point_delta=lambda *args,**kwargs: None get_qpos_original=module.get_qpos def checked_qpos(config,env): q=get_qpos_original(config,env) if not torch.isfinite(q[0]).all():raise RuntimeError('Nonfinite executed state: stop instead of saving invalid trajectory') return q module.get_qpos=checked_qpos p=argparse.ArgumentParser();p.add_argument('--pilot',action='store_true');p.add_argument('--steps',type=int);args=p.parse_args();c=json.loads((OUT/'config.json').read_text()) if args.pilot:c.update(max_sim_steps=80,num_samples=32,max_num_iterations=2) if args.steps:c['max_sim_steps']=args.steps if (OUT/'physics_parameters.json').exists(): settings=json.loads((OUT/'physics_parameters.json').read_text());setup_original=sim.setup_mj_model def configured_model(config): m=setup_original(config);m.opt.iterations=settings['solver_iterations'];m.opt.ls_iterations=settings['ls_iterations'];return m sim.setup_mj_model=configured_model;module.setup_mj_model=configured_model module.main(Config(**c));print('SPIDER_RUN_COMPLETE',flush=True)