@ -16,8 +16,8 @@ constexpr float FCW_THRESHOLD_5MS2_HIGH = 0.15; 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					constexpr  float  FCW_THRESHOLD_5MS2_LOW  =  0.05 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					constexpr  float  FCW_THRESHOLD_3MS2  =  0.7 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					float  prev_brake_5ms2_probs [ 5 ]   =  { 0 , 0 , 0 , 0 , 0 } ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					float  prev_brake_3ms2_probs [ 3 ]   =  { 0 , 0 , 0 } ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					std : : array < float ,  5 >  prev_brake_5ms2_probs   =  { 0 , 0 , 0 , 0 , 0 } ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					std : : array < float ,  3 >  prev_brake_3ms2_probs   =  { 0 , 0 , 0 } ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					// #define DUMP_YUV
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -52,7 +52,7 @@ void model_init(ModelState* s, cl_device_id device_id, cl_context context) { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					# endif  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					ModelDataRaw   model_eval_frame ( ModelState *  s ,  cl_mem  yuv_cl ,  int  width ,  int  height ,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					ModelOutput *   model_eval_frame ( ModelState *  s ,  cl_mem  yuv_cl ,  int  width ,  int  height ,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                           const  mat3  & transform ,  float  * desire_in )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					# ifdef DESIRE  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  if  ( desire_in  ! =  NULL )  {   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -69,35 +69,18 @@ ModelDataRaw model_eval_frame(ModelState* s, cl_mem yuv_cl, int width, int heigh 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					# endif  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  //for (int i = 0; i < NET_OUTPUT_SIZE; i++) { printf("%f ", s->output[i]); } printf("\n");
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  // if getInputBuf is not NULL, net_input_buf will be
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  auto  net_input_buf  =  s - > frame - > prepare ( yuv_cl ,  width ,  height ,  transform ,  static_cast < cl_mem * > ( s - > m - > getInputBuf ( ) ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  s - > m - > execute ( net_input_buf ,  s - > frame - > buf_size ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  // net outputs
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  ModelDataRaw  net_outputs  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    . plans  =  ( ModelDataRawPlans * ) & s - > output [ PLAN_IDX ] ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    . lane_lines  =  ( ModelDataRawLaneLines * ) & s - > output [ LL_IDX ] ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    . road_edges  =  ( ModelDataRawRoadEdges * ) & s - > output [ RE_IDX ] ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    . leads  =  ( ModelDataRawLeads * ) & s - > output [ LEAD_IDX ] ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    . meta  =  & s - > output [ DESIRE_STATE_IDX ] ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    . pose  =  ( ModelDataRawPose * ) & s - > output [ POSE_IDX ] ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  } ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  return  net_outputs ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  return  ( ModelOutput * ) & s - > output ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  model_free ( ModelState *  s )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  delete  s - > frame ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  fill_sigmoid ( const  float  * input ,  float  * output ,  int  len ,  int  stride )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  for  ( int  i = 0 ;  i < len ;  i + + )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    output [ i ]  =  sigmoid ( input [ i * stride ] ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  fill_lead ( cereal : : ModelDataV2 : : LeadDataV3 : : Builder  lead ,  const  ModelDataRawLeads  & leads ,  int  t_idx ,  float  prob_t )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  fill_lead ( cereal : : ModelDataV2 : : LeadDataV3 : : Builder  lead ,  const  ModelOutputLeads  & leads ,  int  t_idx ,  float  prob_t )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  LEAD_TRAJ_LEN >  lead_t  =  { 0.0 ,  2.0 ,  4.0 ,  6.0 ,  8.0 ,  10.0 } ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  const  auto  & best_prediction  =  leads . get_best_prediction ( t_idx ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  lead . setProb ( sigmoid ( leads . prob [ t_idx ] ) ) ;   
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -125,56 +108,54 @@ void fill_lead(cereal::ModelDataV2::LeadDataV3::Builder lead, const ModelDataRaw 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  lead . setAStd ( to_kj_array_ptr ( lead_a_std ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  fill_meta ( cereal : : ModelDataV2 : : MetaData : : Builder  meta ,  const  float  * meta_data )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  float  desire_state_softmax [ DESIRE_LEN ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  float  desire_pred_softmax [ 4 * DESIRE_LEN ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  softmax ( & meta_data [ 0 ] ,  desire_state_softmax ,  DESIRE_LEN ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  for  ( int  i = 0 ;  i < 4 ;  i + + )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    softmax ( & meta_data [ DESIRE_LEN  +  OTHER_META_SIZE  +  i * DESIRE_LEN ] ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            & desire_pred_softmax [ i * DESIRE_LEN ] ,  DESIRE_LEN ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  fill_meta ( cereal : : ModelDataV2 : : MetaData : : Builder  meta ,  const  ModelOutputMeta  & meta_data )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  DESIRE_LEN >  desire_state_softmax ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  softmax ( meta_data . desire_state_prob . array . data ( ) ,  desire_state_softmax . data ( ) ,  DESIRE_LEN ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  DESIRE_PRED_LEN  *  DESIRE_LEN >  desire_pred_softmax ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  for  ( int  i = 0 ;  i < DESIRE_PRED_LEN ;  i + + )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    softmax ( meta_data . desire_pred_prob [ i ] . array . data ( ) ,  desire_pred_softmax . data ( )  +  ( i  *  DESIRE_LEN ) ,  DESIRE_LEN ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  DISENGAGE_LEN >  lat_long_t  =  { 2 , 4 , 6 , 8 , 10 } ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  DISENGAGE_LEN >  gas_disengage_sigmoid ,  brake_disengage_sigmoid ,  steer_override_sigmoid ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                                   brake_3ms2_sigmoid ,  brake_4ms2_sigmoid ,  brake_5ms2_sigmoid ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  for  ( int  i = 0 ;  i < DISENGAGE_LEN ;  i + + )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    gas_disengage_sigmoid [ i ]  =  sigmoid ( meta_data . disengage_prob [ i ] . gas_disengage ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    brake_disengage_sigmoid [ i ]  =  sigmoid ( meta_data . disengage_prob [ i ] . brake_disengage ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    steer_override_sigmoid [ i ]  =  sigmoid ( meta_data . disengage_prob [ i ] . steer_override ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    brake_3ms2_sigmoid [ i ]  =  sigmoid ( meta_data . disengage_prob [ i ] . brake_3ms2 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    brake_4ms2_sigmoid [ i ]  =  sigmoid ( meta_data . disengage_prob [ i ] . brake_4ms2 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    brake_5ms2_sigmoid [ i ]  =  sigmoid ( meta_data . disengage_prob [ i ] . brake_5ms2 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    //gas_pressed_sigmoid[i] = sigmoid(meta_data.disengage_prob[i].gas_pressed);
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  float  gas_disengage_sigmoid [ NUM_META_INTERVALS ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  float  brake_disengage_sigmoid [ NUM_META_INTERVALS ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  float  steer_override_sigmoid [ NUM_META_INTERVALS ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  float  brake_3ms2_sigmoid [ NUM_META_INTERVALS ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  float  brake_4ms2_sigmoid [ NUM_META_INTERVALS ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  float  brake_5ms2_sigmoid [ NUM_META_INTERVALS ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  fill_sigmoid ( & meta_data [ DESIRE_LEN + 1 ] ,  gas_disengage_sigmoid ,  NUM_META_INTERVALS ,  META_STRIDE ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  fill_sigmoid ( & meta_data [ DESIRE_LEN + 2 ] ,  brake_disengage_sigmoid ,  NUM_META_INTERVALS ,  META_STRIDE ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  fill_sigmoid ( & meta_data [ DESIRE_LEN + 3 ] ,  steer_override_sigmoid ,  NUM_META_INTERVALS ,  META_STRIDE ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  fill_sigmoid ( & meta_data [ DESIRE_LEN + 4 ] ,  brake_3ms2_sigmoid ,  NUM_META_INTERVALS ,  META_STRIDE ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  fill_sigmoid ( & meta_data [ DESIRE_LEN + 5 ] ,  brake_4ms2_sigmoid ,  NUM_META_INTERVALS ,  META_STRIDE ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  fill_sigmoid ( & meta_data [ DESIRE_LEN + 6 ] ,  brake_5ms2_sigmoid ,  NUM_META_INTERVALS ,  META_STRIDE ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  //fill_sigmoid(&meta_data[DESIRE_LEN+7], GAS PRESSED, NUM_META_INTERVALS, META_STRIDE);
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : memmove ( prev_brake_5ms2_probs ,  & prev_brake_5ms2_probs [ 1 ] ,  4 * sizeof ( float ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : memmove ( prev_brake_3ms2_probs ,  & prev_brake_3ms2_probs [ 1 ] ,  2 * sizeof ( float ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : memmove ( prev_brake_5ms2_probs . data ( ) ,  & prev_brake_5ms2_probs [ 1 ] ,  4 * sizeof ( float ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : memmove ( prev_brake_3ms2_probs . data ( ) ,  & prev_brake_3ms2_probs [ 1 ] ,  2 * sizeof ( float ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  prev_brake_5ms2_probs [ 4 ]  =  brake_5ms2_sigmoid [ 0 ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  prev_brake_3ms2_probs [ 2 ]  =  brake_3ms2_sigmoid [ 0 ] ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  bool  above_fcw_threshold  =  true ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  for  ( int  i = 0 ;  i < 5 ;  i + + )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  for  ( int  i = 0 ;  i < prev_brake_5ms2_probs . size ( ) ;  i + + )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    float  threshold  =  i  <  2  ?  FCW_THRESHOLD_5MS2_LOW  :  FCW_THRESHOLD_5MS2_HIGH ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    above_fcw_threshold  =  above_fcw_threshold  & &  prev_brake_5ms2_probs [ i ]  >  threshold ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  for  ( int  i = 0 ;  i < 3 ;  i + + )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  for  ( int  i = 0 ;  i < prev_brake_3ms2_probs . size ( ) ;  i + + )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    above_fcw_threshold  =  above_fcw_threshold  & &  prev_brake_3ms2_probs [ i ]  >  FCW_THRESHOLD_3MS2 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  auto  disengage  =  meta . initDisengagePredictions ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setT ( { 2 , 4 , 6 , 8 , 10 } ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setGasDisengageProbs ( gas_disengage_sigmoid ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setBrakeDisengageProbs ( brake_disengage_sigmoid ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setSteerOverrideProbs ( steer_override_sigmoid ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setBrake3MetersPerSecondSquaredProbs ( brake_3ms2_sigmoid ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setBrake4MetersPerSecondSquaredProbs ( brake_4ms2_sigmoid ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setBrake5MetersPerSecondSquaredProbs ( brake_5ms2_sigmoid ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  meta . setEngagedProb ( sigmoid ( meta_data [ DESIRE_LEN ] ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  meta . setDesirePrediction ( desire_pred_softmax ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  meta . setDesireState ( desire_state_softmax ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setT ( to_kj_array_ptr ( lat_long_t ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setGasDisengageProbs ( to_kj_array_ptr ( gas_disengage_sigmoid ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setBrakeDisengageProbs ( to_kj_array_ptr ( brake_disengage_sigmoid ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setSteerOverrideProbs ( to_kj_array_ptr ( steer_override_sigmoid ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setBrake3MetersPerSecondSquaredProbs ( to_kj_array_ptr ( brake_3ms2_sigmoid ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setBrake4MetersPerSecondSquaredProbs ( to_kj_array_ptr ( brake_4ms2_sigmoid ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  disengage . setBrake5MetersPerSecondSquaredProbs ( to_kj_array_ptr ( brake_5ms2_sigmoid ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  meta . setEngagedProb ( sigmoid ( meta_data . engaged_prob ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  meta . setDesirePrediction ( to_kj_array_ptr ( desire_pred_softmax ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  meta . setDesireState ( to_kj_array_ptr ( desire_state_softmax ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  meta . setHardBrakePredicted ( above_fcw_threshold ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -197,7 +178,7 @@ void fill_xyzt(cereal::ModelDataV2::XYZTData::Builder xyzt, const std::array<flo 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  xyzt . setZStd ( to_kj_array_ptr ( z_std ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  fill_plan ( cereal : : ModelDataV2 : : Builder  & framed ,  const  ModelDataRaw PlanPrediction  & plan )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  fill_plan ( cereal : : ModelDataV2 : : Builder  & framed ,  const  ModelOutput PlanPrediction  & plan )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  TRAJECTORY_SIZE >  pos_x ,  pos_y ,  pos_z ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  TRAJECTORY_SIZE >  pos_x_std ,  pos_y_std ,  pos_z_std ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  TRAJECTORY_SIZE >  vel_x ,  vel_y ,  vel_z ;   
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -229,7 +210,7 @@ void fill_plan(cereal::ModelDataV2::Builder &framed, const ModelDataRawPlanPredi 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  fill_lane_lines ( cereal : : ModelDataV2 : : Builder  & framed ,  const  std : : array < float ,  TRAJECTORY_SIZE >  & plan_t ,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                     const  ModelDataRaw LaneLines  & lanes )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                     const  ModelOutput LaneLines  & lanes )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  TRAJECTORY_SIZE >  left_far_y ,  left_far_z ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  TRAJECTORY_SIZE >  left_near_y ,  left_near_z ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  TRAJECTORY_SIZE >  right_near_y ,  right_near_z ;   
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -267,7 +248,7 @@ void fill_lane_lines(cereal::ModelDataV2::Builder &framed, const std::array<floa 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  fill_road_edges ( cereal : : ModelDataV2 : : Builder  & framed ,  const  std : : array < float ,  TRAJECTORY_SIZE >  & plan_t ,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                     const  ModelDataRaw RoadEdges  & edges )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                     const  ModelOutput RoadEdges  & edges )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  TRAJECTORY_SIZE >  left_y ,  left_z ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  TRAJECTORY_SIZE >  right_y ,  right_z ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  for  ( int  j = 0 ;  j < TRAJECTORY_SIZE ;  j + + )  {   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -287,8 +268,8 @@ void fill_road_edges(cereal::ModelDataV2::Builder &framed, const std::array<floa 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  } ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  fill_model ( cereal : : ModelDataV2 : : Builder  & framed ,  const  ModelDataRaw   & net_outputs )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  const  auto  & best_plan  =  net_outputs . plans - > get_best_prediction ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  fill_model ( cereal : : ModelDataV2 : : Builder  & framed ,  const  ModelOutput   & net_outputs )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  const  auto  & best_plan  =  net_outputs . plans . get_best_prediction ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  TRAJECTORY_SIZE >  plan_t ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : fill_n ( plan_t . data ( ) ,  plan_t . size ( ) ,  NAN ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  plan_t [ 0 ]  =  0.0 ;   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -311,8 +292,8 @@ void fill_model(cereal::ModelDataV2::Builder &framed, const ModelDataRaw &net_ou 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  fill_plan ( framed ,  best_plan ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  fill_lane_lines ( framed ,  plan_t ,  * net_outputs . lane_lines ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  fill_road_edges ( framed ,  plan_t ,  * net_outputs . road_edges ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  fill_lane_lines ( framed ,  plan_t ,  net_outputs . lane_lines ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  fill_road_edges ( framed ,  plan_t ,  net_outputs . road_edges ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  // meta
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  fill_meta ( framed . initMeta ( ) ,  net_outputs . meta ) ;   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -321,12 +302,12 @@ void fill_model(cereal::ModelDataV2::Builder &framed, const ModelDataRaw &net_ou 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  auto  leads  =  framed . initLeadsV3 ( LEAD_MHP_SELECTION ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  std : : array < float ,  LEAD_MHP_SELECTION >  t_offsets  =  { 0.0 ,  2.0 ,  4.0 } ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  for  ( int  i = 0 ;  i < LEAD_MHP_SELECTION ;  i + + )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    fill_lead ( leads [ i ] ,  * net_outputs . leads ,  i ,  t_offsets [ i ] ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    fill_lead ( leads [ i ] ,  net_outputs . leads ,  i ,  t_offsets [ i ] ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  model_publish ( PubMaster  & pm ,  uint32_t  vipc_frame_id ,  uint32_t  frame_id ,  float  frame_drop ,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                   const  ModelDataRaw   & net_outputs ,  uint64_t  timestamp_eof ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                   const  ModelOutput   & net_outputs ,  uint64_t  timestamp_eof ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                   float  model_execution_time ,  kj : : ArrayPtr < const  float >  raw_pred )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  const  uint32_t  frame_age  =  ( frame_id  >  vipc_frame_id )  ?  ( frame_id  -  vipc_frame_id )  :  0 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  MessageBuilder  msg ;   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -344,12 +325,12 @@ void model_publish(PubMaster &pm, uint32_t vipc_frame_id, uint32_t frame_id, flo 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  posenet_publish ( PubMaster  & pm ,  uint32_t  vipc_frame_id ,  uint32_t  vipc_dropped_frames ,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                     const  ModelDataRaw   & net_outputs ,  uint64_t  timestamp_eof )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                     const  ModelOutput   & net_outputs ,  uint64_t  timestamp_eof )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  MessageBuilder  msg ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  auto  v_mean  =  net_outputs . pose - > velocity_mean ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  auto  r_mean  =  net_outputs . pose - > rotation_mean ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  auto  v_std  =  net_outputs . pose - > velocity_std ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  auto  r_std  =  net_outputs . pose - > rotation_std ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  auto  v_mean  =  net_outputs . pose . velocity_mean ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  auto  r_mean  =  net_outputs . pose . rotation_mean ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  auto  v_std  =  net_outputs . pose . velocity_std ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  auto  r_std  =  net_outputs . pose . rotation_std ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  auto  posenetd  =  msg . initEvent ( vipc_dropped_frames  <  1 ) . initCameraOdometry ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  posenetd . setTrans ( { v_mean . x ,  v_mean . y ,  v_mean . z } ) ;