TGCC-P / runtime_extensions /native_controller_policy.py
Songyuan666's picture
Release evaluated TGCC partial step5708 weights and complete 20-instance results
8d817db verified
Raw History Blame Contribute Delete
4.87 kB
"""Leave finite raw commands intact and retain native simulator limit handling.
This removes only TGCC's extra all-or-nothing chunk range veto. Actual
controller input clipping, joint target clipping and physics limits are not
changed. Callers must attest the live native controller configuration.
"""
import ast,functools,inspect,textwrap
import numpy as np
import torch
def range_diagnostics(native,spec):
values=torch.as_tensor(native).detach().float().cpu().numpy()
if values.shape!=(32,23) or not np.isfinite(values).all():raise ValueError('Finite native32x23 command required')
lo=np.asarray(spec.lower,np.float32);hi=np.asarray(spec.upper,np.float32)
excess=np.maximum(np.maximum(lo-values,values-hi),0);bad=excess>0
return dict(raw_commands_within_nominal_ranges=not bool(bad.any()),
violating_values=int(bad.sum()),max_excess=float(excess.max()),
dimensions=[dict(index=i,name=spec.names[i],count=int(bad[:,i].sum()),max_excess=float(excess[:,i].max()))
for i in range(23) if bad[:,i].any()],
enforcement='unchanged_simulator_native_controller_clipping_and_joint_limits',
application_chunk_range_veto=False,application_clipping=False)
def install(controller_class):
if getattr(controller_class,'_native_controller_policy_installed',False):return
def finite_native(self,actions):
native=self.normalizer.inverse(actions[...,:23])
if native.shape!=(1,32,23) or not bool(torch.isfinite(native).all()):
raise ValueError('Nonfinite or malformed native action chunk')
self.trace.setdefault('raw_command_range_diagnostics',[]).append(range_diagnostics(native[0],self.checker.spec))
return native,True
def commit(self,native_actions):
actions=np.asarray(native_actions,np.float32)
if self.previous is None or actions.shape!=(32,23) or not np.isfinite(actions).all():
raise ValueError('Official dispatched action chunk mismatch')
self.trace['dispatched_raw_command_ranges']=range_diagnostics(actions,self.checker.spec)
self.previous['native_actions']=actions.copy()
original_prepare=getattr(controller_class,'prepare',None)
if original_prepare is not None:
@functools.wraps(original_prepare)
def prepare(self,raw,conditions,*,enforce_assistance_budget=True):
# Distribution deviation is advisory. Keep per-request generation
# bounded, but do not turn repeated advice into a physical failure.
result=original_prepare(self,raw,conditions,enforce_assistance_budget=False)
self.trace['statistical_feedback_budget_exceeded']=self.consecutive_feedback>self.max_consecutive_feedback
self.trace['statistical_feedback_is_task_terminal']=False
return result
controller_class.prepare=prepare
original=controller_class.sample_actions
if controller_class.__name__=='DistributionController':
tree=ast.parse(textwrap.dedent(inspect.getsource(original)));replaced=[]
class AdvisoryPlanning(ast.NodeTransformer):
def visit_Raise(self,node):
if any(isinstance(n,ast.Constant) and n.value=='No legal demonstrated-order subtask remains' for n in ast.walk(node)):
replaced.append(1)
return ast.parse("legal=conditions.legal\nself.trace['planning_support_empty_fallback']='retain_original_legal_skills; density_OOD_is_not_physical_infeasibility'").body
return node
tree=AdvisoryPlanning().visit(tree)
if len(replaced)!=1:raise ValueError('Frozen planning advisory branch changed')
namespace=dict(inspect.unwrap(original).__globals__)
exec(compile(ast.fix_missing_locations(tree),__file__,'exec'),namespace)
original=namespace['sample_actions']
@functools.wraps(original)
def sample(self,*args,**kwargs):
def rename(value):
if isinstance(value,dict):
if 'native_constraints_satisfied' in value:value['finite_native_commands']=value.pop('native_constraints_satisfied')
if value.get('selection_scope')=='lowest_conditional_nll_among_safe_original_and_one_reference_draw':
value['selection_scope']='lowest_conditional_nll_among_finite_candidates; native_controller_limits_retained'
for v in value.values():rename(v)
elif isinstance(value,list):
for v in value:rename(v)
try:return original(self,*args,**kwargs)
finally:
rename(self.trace)
self.trace['native_control_policy']='simulator_native_limits; no_extra_chunk_range_veto'
controller_class._safe=finite_native;controller_class.commit_dispatched=commit
controller_class.sample_actions=sample;controller_class._native_controller_policy_installed=True