"""Master: masked IMU reconstruction and supervised local/global odometry.""" import math import torch from torch import nn from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence from .lab_bigru.model import WindowEncoder class TCNBlock(nn.Module): def __init__(self, hidden, dilation): super().__init__() self.norm=nn.LayerNorm(hidden) self.conv=nn.Conv1d(hidden,hidden,3,padding=dilation,dilation=dilation) self.proj=nn.Linear(hidden,hidden) nn.init.zeros_(self.proj.weight);nn.init.zeros_(self.proj.bias) def forward(self,x,valid): z=self.norm(x)*valid[:,:,None] z=self.conv(z.transpose(1,2)).transpose(1,2) return (x+self.proj(torch.nn.functional.gelu(z)))*valid[:,:,None] class Master(nn.Module): def __init__(self,mean,std,hidden=256): super().__init__() self.hidden=hidden self.encoder=WindowEncoder(mean,std) self.project=nn.Sequential(nn.Linear(384,hidden),nn.LayerNorm(hidden),nn.GELU(),nn.Dropout(.1)) self.tcn=nn.ModuleList([TCNBlock(hidden,d) for d in (1,2,4)]) self.temporal=nn.GRU(hidden,hidden,2,batch_first=True,bidirectional=True,dropout=.1) self.norm=nn.LayerNorm(hidden*2) layer=nn.TransformerEncoderLayer(hidden,4,hidden*4,.1,batch_first=True,norm_first=True,activation='gelu') self.global_net=nn.TransformerEncoder(layer,2,enable_nested_tensor=False) # Independent initial layer draws rather than cloned identical weights. for layer in self.global_net.layers: for module in layer.modules(): if isinstance(module,nn.Linear):module.reset_parameters() layer.self_attn._reset_parameters() self.fuse=nn.Linear(hidden,hidden*2) nn.init.zeros_(self.fuse.weight);nn.init.zeros_(self.fuse.bias) self.direction=nn.Sequential(nn.Linear(hidden*2,hidden),nn.GELU(),nn.Dropout(.1),nn.Linear(hidden,3)) self.speed=nn.Sequential(nn.Linear(hidden*2,hidden),nn.GELU(),nn.Dropout(.1),nn.Linear(hidden,1)) self.residual=nn.Sequential(nn.Linear(hidden*2,hidden//2),nn.GELU(),nn.Linear(hidden//2,3)) nn.init.zeros_(self.residual[-1].weight);nn.init.zeros_(self.residual[-1].bias) self.mask_embedding=nn.Parameter(torch.zeros(hidden)) self.reconstruct=nn.Sequential(nn.Linear(hidden*2,hidden),nn.GELU(),nn.Linear(hidden,240)) def forward(self,raw,lengths,starts,mask=None): b,t=raw.shape[:2];device=raw.device valid=torch.arange(t,device=device)[None]ni',rotation.float(),delta.float()) cumulative=torch.cat([world.new_zeros(1,3),world.cumsum(0)]) for k in disp: if count>=k:disp[k].append(torch.linalg.vector_norm(cumulative[k:]-cumulative[:-k],dim=-1).mean()/k) zero=pred.sum()*0 one=torch.stack(ones).mean() if ones else zero ds=[torch.stack(v).mean() for v in disp.values() if v] displacement=torch.stack(ds).mean() if ds else zero parts=dict(dense=dense,speed=mag,one_second=one,displacement=displacement) return dense+ramp*(.25*mag+.25*one+.1*displacement),parts def transfer(model,state): excluded=('direction.','speed.','residual.','reconstruct.','mask_embedding') own=model.state_dict(); keys={k for k in own if not k.startswith(excluded)} source={k for k in state if not k.startswith(excluded)} if keys!=source:raise ValueError('backbone key mismatch') for k in keys: if own[k].shape!=state[k].shape or own[k].dtype!=state[k].dtype:raise ValueError('backbone tensor mismatch '+k) own[k]=state[k] model.load_state_dict(own,strict=True) def window_starts(n,window=640,stride=320): if n<1:raise ValueError('empty trajectory') if n<=window:return [0] return sorted(set(list(range(0,n-window+1,stride))+[n-window])) def validate_parent(payload,seed,regime,inputs,steps,smoke): c=payload['contract'] if (c['seed']!=seed or c['regime']!=regime or c['phase']!='pretrain' or c['historical_weights'] is not False or c['inputs']!=inputs or (not smoke and (payload['step']!=steps or c['smoke']))): raise ValueError('pretraining parent identity/data/step mismatch') def load_f3_weights(model,state): """Strict mapping of every frozen F3 tensor; fresh residual paths stay zero.""" mapping={'encoder.':'encoder.','input_projection.':'project.','temporal.':'temporal.', 'output_norm.':'norm.','output.':'direction.','mag_head.':'speed.'} own=model.state_dict();translated={} for name,value in state.items(): prefix=next((p for p in mapping if name.startswith(p)),None) if prefix is None:raise ValueError('unexpected F3 parameter '+name) target=mapping[prefix]+name[len(prefix):] if target not in own or value.shape!=own[target].shape or value.dtype!=own[target].dtype: raise ValueError('F3 tensor mismatch '+name) translated[target]=value required={k for k in own if k.startswith(tuple(mapping.values()))} if set(translated)!=required:raise ValueError('incomplete F3 checkpoint') own.update(translated);model.load_state_dict(own,strict=True) def validate_continuation(payload,seed,regime,inputs): c=payload['contract'] if (c['seed']!=seed or c['regime']!=regime or c['phase']!='finetune' or c['smoke'] or c['inputs']!=inputs or c['config']['name']!='f3_sd_warm' or payload['step']!=18000 or c['config']['finetune_steps']!=18000): raise ValueError('continuation requires matching completed Warm Master')