@ -12,40 +12,6 @@ 
			
		
	
		
			
				
					# include  "selfdrive/common/params.h"  
			
		
	
		
			
				
					# include  "selfdrive/common/timing.h"  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					constexpr  int  DESIRE_PRED_SIZE  =  32 ;  
			
		
	
		
			
				
					constexpr  int  OTHER_META_SIZE  =  48 ;  
			
		
	
		
			
				
					constexpr  int  NUM_META_INTERVALS  =  5 ;  
			
		
	
		
			
				
					constexpr  int  META_STRIDE  =  7 ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					constexpr  int  PLAN_MHP_VALS  =  15 * 33 ;  
			
		
	
		
			
				
					constexpr  int  PLAN_MHP_SELECTION  =  1 ;  
			
		
	
		
			
				
					constexpr  int  PLAN_MHP_GROUP_SIZE  =   ( 2 * PLAN_MHP_VALS  +  PLAN_MHP_SELECTION ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					constexpr  int  LEAD_MHP_N  =  2 ;  
			
		
	
		
			
				
					constexpr  int  LEAD_TRAJ_LEN  =  6 ;  
			
		
	
		
			
				
					constexpr  int  LEAD_PRED_DIM  =  4 ;  
			
		
	
		
			
				
					constexpr  int  LEAD_MHP_VALS  =  LEAD_PRED_DIM * LEAD_TRAJ_LEN ;  
			
		
	
		
			
				
					constexpr  int  LEAD_MHP_SELECTION  =  3 ;  
			
		
	
		
			
				
					constexpr  int  LEAD_MHP_GROUP_SIZE  =  ( 2 * LEAD_MHP_VALS  +  LEAD_MHP_SELECTION ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					constexpr  int  POSE_SIZE  =  12 ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					constexpr  int  PLAN_IDX  =  0 ;  
			
		
	
		
			
				
					constexpr  int  LL_IDX  =  PLAN_IDX  +  PLAN_MHP_N * PLAN_MHP_GROUP_SIZE ;  
			
		
	
		
			
				
					constexpr  int  LL_PROB_IDX  =  LL_IDX  +  4 * 2 * 2 * 33 ;  
			
		
	
		
			
				
					constexpr  int  RE_IDX  =  LL_PROB_IDX  +  8 ;  
			
		
	
		
			
				
					constexpr  int  LEAD_IDX  =  RE_IDX  +  2 * 2 * 2 * 33 ;  
			
		
	
		
			
				
					constexpr  int  LEAD_PROB_IDX  =  LEAD_IDX  +  LEAD_MHP_N * ( LEAD_MHP_GROUP_SIZE ) ;  
			
		
	
		
			
				
					constexpr  int  DESIRE_STATE_IDX  =  LEAD_PROB_IDX  +  3 ;  
			
		
	
		
			
				
					constexpr  int  META_IDX  =  DESIRE_STATE_IDX  +  DESIRE_LEN ;  
			
		
	
		
			
				
					constexpr  int  POSE_IDX  =  META_IDX  +  OTHER_META_SIZE  +  DESIRE_PRED_SIZE ;  
			
		
	
		
			
				
					constexpr  int  OUTPUT_SIZE  =   POSE_IDX  +  POSE_SIZE ;  
			
		
	
		
			
				
					# ifdef TEMPORAL  
			
		
	
		
			
				
					  constexpr  int  TEMPORAL_SIZE  =  512 ;   
			
		
	
		
			
				
					# else  
			
		
	
		
			
				
					  constexpr  int  TEMPORAL_SIZE  =  0 ;   
			
		
	
		
			
				
					# endif  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					constexpr  float  FCW_THRESHOLD_5MS2_HIGH  =  0.15 ;  
			
		
	
		
			
				
					constexpr  float  FCW_THRESHOLD_5MS2_LOW  =  0.05 ;  
			
		
	
		
			
				
					constexpr  float  FCW_THRESHOLD_3MS2  =  0.7 ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -63,15 +29,12 @@ constexpr const kj::ArrayPtr<const T> to_kj_array_ptr(const std::array<T, size> 
			
		
	
		
			
				
					void  model_init ( ModelState *  s ,  cl_device_id  device_id ,  cl_context  context )  {  
			
		
	
		
			
				
					  s - > frame  =  new  ModelFrame ( device_id ,  context ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  constexpr  int  output_size  =  OUTPUT_SIZE  +  TEMPORAL_SIZE ;   
			
		
	
		
			
				
					  s - > output . resize ( output_size ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# ifdef USE_THNEED  
			
		
	
		
			
				
					  s - > m  =  std : : make_unique < ThneedModel > ( " ../../models/supercombo.thneed " ,  & s - > output [ 0 ] ,  output_size ,  USE_GPU_RUNTIME ) ;   
			
		
	
		
			
				
					  s - > m  =  std : : make_unique < ThneedModel > ( " ../../models/supercombo.thneed " ,  & s - > output [ 0 ] ,  NET_OUTPUT_SIZE ,  USE_GPU_RUNTIME ) ;   
			
		
	
		
			
				
					# elif USE_ONNX_MODEL  
			
		
	
		
			
				
					  s - > m  =  std : : make_unique < ONNXModel > ( " ../../models/supercombo.onnx " ,  & s - > output [ 0 ] ,  output_size ,  USE_GPU_RUNTIME ) ;   
			
		
	
		
			
				
					  s - > m  =  std : : make_unique < ONNXModel > ( " ../../models/supercombo.onnx " ,  & s - > output [ 0 ] ,  NET_OUTPUT_SIZE ,  USE_GPU_RUNTIME ) ;   
			
		
	
		
			
				
					# else  
			
		
	
		
			
				
					  s - > m  =  std : : make_unique < SNPEModel > ( " ../../models/supercombo.dlc " ,  & s - > output [ 0 ] ,  output_size ,  USE_GPU_RUNTIME ) ;   
			
		
	
		
			
				
					  s - > m  =  std : : make_unique < SNPEModel > ( " ../../models/supercombo.dlc " ,  & s - > output [ 0 ] ,  NET_OUTPUT_SIZE ,  USE_GPU_RUNTIME ) ;   
			
		
	
		
			
				
					# endif  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# ifdef TEMPORAL  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -106,22 +69,22 @@ ModelDataRaw model_eval_frame(ModelState* s, cl_mem yuv_cl, int width, int heigh 
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					# endif  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  //for (int i = 0; i < OUTPUT_SIZE + TEMPORAL _SIZE; i++) { printf("%f ", s->output[i]); } printf("\n");
   
			
		
	
		
			
				
					  //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 ;   
			
		
	
		
			
				
					  net_outputs . plan  =  ( ModelDataRawPlan * ) & s - > output [ PLAN_IDX ] ;   
			
		
	
		
			
				
					  net_outputs . lane_lines  =  & s - > output [ LL_IDX ] ;   
			
		
	
		
			
				
					  net_outputs . lane_lines_prob  =  & s - > output [ LL_PROB_IDX ] ;   
			
		
	
		
			
				
					  net_outputs . road_edges =  & s - > output [ RE_IDX ] ;   
			
		
	
		
			
				
					  net_outputs . lead =  & s - > output [ LEAD_IDX ] ;   
			
		
	
		
			
				
					  net_outputs . lead_prob =  & s - > output [ LEAD_PROB_IDX ] ;   
			
		
	
		
			
				
					  net_outputs . meta  =  & s - > output [ DESIRE_STATE_IDX ] ;   
			
		
	
		
			
				
					  net_outputs . pose  =  ( ModelDataRawPose * ) & s - > output [ POSE_IDX ] ;   
			
		
	
		
			
				
					  ModelDataRaw  net_outputs  {    
			
		
	
		
			
				
					     . plan  =  ( ModelDataRawPlans  * ) & s - > output [ PLAN_IDX ] ,   
			
		
	
		
			
				
					    . lane_lines  =  ( ModelDataRawLaneLines * )  & s - > output [ LL_IDX ] ,   
			
		
	
		
			
				
					    . road_edges  =  ( ModelDataRawRoadEdges * )  & s - > output [ RE_IDX ] ,   
			
		
	
		
			
				
					    . lead   =  & s - > output [ LEAD_IDX ] ,   
			
		
	
		
			
				
					    . lead_prob   =  & s - > output [ LEAD_PROB_ IDX ] ,   
			
		
	
		
			
				
					    . meta   =  & s - > output [ DESIRE_STATE_IDX ] ,   
			
		
	
		
			
				
					    . pose  =  ( ModelDataRawPose * )  & s - > output [ POSE_IDX ] ,   
			
		
	
		
			
				
					  } ;   
			
		
	
		
			
				
					  return  net_outputs ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -144,7 +107,6 @@ static const float *get_lead_data(const float *lead, int t_offset) { 
			
		
	
		
			
				
					  return  get_best_data ( lead ,  LEAD_MHP_N ,  LEAD_MHP_GROUP_SIZE ,  LEAD_MHP_GROUP_SIZE  -  LEAD_MHP_SELECTION  +  t_offset ) ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					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 ] ) ;   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -257,42 +219,6 @@ void fill_xyzt(cereal::ModelDataV2::XYZTData::Builder xyzt, const std::array<flo 
			
		
	
		
			
				
					  xyzt . setZStd ( to_kj_array_ptr ( z_std ) ) ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  fill_xyzt ( cereal : : ModelDataV2 : : XYZTData : : Builder  xyzt ,  const  float  * data ,  int  columns ,  
			
		
	
		
			
				
					               float  * plan_t_arr  =  nullptr ,  bool  fill_std  =  false )  {   
			
		
	
		
			
				
					  float  x_arr [ TRAJECTORY_SIZE ]  =  { } ;   
			
		
	
		
			
				
					  float  y_arr [ TRAJECTORY_SIZE ]  =  { } ;   
			
		
	
		
			
				
					  float  z_arr [ TRAJECTORY_SIZE ]  =  { } ;   
			
		
	
		
			
				
					  float  x_std_arr [ TRAJECTORY_SIZE ] ;   
			
		
	
		
			
				
					  float  y_std_arr [ TRAJECTORY_SIZE ] ;   
			
		
	
		
			
				
					  float  z_std_arr [ TRAJECTORY_SIZE ] ;   
			
		
	
		
			
				
					  float  t_arr [ TRAJECTORY_SIZE ] ;   
			
		
	
		
			
				
					  for  ( int  i = 0 ;  i < TRAJECTORY_SIZE ;  i + + )  {   
			
		
	
		
			
				
					    // plan_t_arr != nullptr means this data is X indexed not T indexed
   
			
		
	
		
			
				
					    if  ( plan_t_arr  = =  nullptr )  {   
			
		
	
		
			
				
					      t_arr [ i ]  =  T_IDXS [ i ] ;   
			
		
	
		
			
				
					      x_arr [ i ]  =  data [ i * columns  +  0 ] ;   
			
		
	
		
			
				
					      x_std_arr [ i ]  =  exp ( data [ columns * ( TRAJECTORY_SIZE  +  i )  +  0 ] ) ;   
			
		
	
		
			
				
					    }  else  {   
			
		
	
		
			
				
					      t_arr [ i ]  =  plan_t_arr [ i ] ;   
			
		
	
		
			
				
					      x_arr [ i ]  =  X_IDXS [ i ] ;   
			
		
	
		
			
				
					      x_std_arr [ i ]  =  NAN ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    y_arr [ i ]  =  data [ i * columns  +  1 ] ;   
			
		
	
		
			
				
					    y_std_arr [ i ]  =  exp ( data [ columns * ( TRAJECTORY_SIZE  +  i )  +  1 ] ) ;   
			
		
	
		
			
				
					    z_arr [ i ]  =  data [ i * columns  +  2 ] ;   
			
		
	
		
			
				
					    z_std_arr [ i ]  =  exp ( data [ columns * ( TRAJECTORY_SIZE  +  i )  +  2 ] ) ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					  xyzt . setX ( x_arr ) ;   
			
		
	
		
			
				
					  xyzt . setY ( y_arr ) ;   
			
		
	
		
			
				
					  xyzt . setZ ( z_arr ) ;   
			
		
	
		
			
				
					  xyzt . setT ( t_arr ) ;   
			
		
	
		
			
				
					  if  ( fill_std )  {   
			
		
	
		
			
				
					    xyzt . setXStd ( x_std_arr ) ;   
			
		
	
		
			
				
					    xyzt . setYStd ( y_std_arr ) ;   
			
		
	
		
			
				
					    xyzt . setZStd ( z_std_arr ) ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  fill_plan ( cereal : : ModelDataV2 : : Builder  & framed ,  const  ModelDataRawPlanPath  & 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 ;   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -324,10 +250,69 @@ void fill_plan(cereal::ModelDataV2::Builder &framed, const ModelDataRawPlanPath 
			
		
	
		
			
				
					  fill_xyzt ( framed . initOrientationRate ( ) ,  T_IDXS_FLOAT ,  rot_rate_x ,  rot_rate_y ,  rot_rate_z ) ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  fill_lane_lines ( cereal : : ModelDataV2 : : Builder  & framed ,  const  std : : array < float ,  TRAJECTORY_SIZE >  & plan_t_arr ,  
			
		
	
		
			
				
					                     const  ModelDataRawLaneLines  & 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 ;   
			
		
	
		
			
				
					  std : : array < float ,  TRAJECTORY_SIZE >  right_far_y ,  right_far_z ;   
			
		
	
		
			
				
					  for  ( int  j = 0 ;  j < TRAJECTORY_SIZE ;  j + + )  {   
			
		
	
		
			
				
					    left_far_y [ j ]  =  lanes . mean . left_far [ j ] . y ;   
			
		
	
		
			
				
					    left_far_z [ j ]  =  lanes . mean . left_far [ j ] . z ;   
			
		
	
		
			
				
					    left_near_y [ j ]  =  lanes . mean . left_near [ j ] . y ;   
			
		
	
		
			
				
					    left_near_z [ j ]  =  lanes . mean . left_near [ j ] . z ;   
			
		
	
		
			
				
					    right_near_y [ j ]  =  lanes . mean . right_near [ j ] . y ;   
			
		
	
		
			
				
					    right_near_z [ j ]  =  lanes . mean . right_near [ j ] . z ;   
			
		
	
		
			
				
					    right_far_y [ j ]  =  lanes . mean . right_far [ j ] . y ;   
			
		
	
		
			
				
					    right_far_z [ j ]  =  lanes . mean . right_far [ j ] . z ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  auto  lane_lines  =  framed . initLaneLines ( 4 ) ;   
			
		
	
		
			
				
					  fill_xyzt ( lane_lines [ 0 ] ,  plan_t_arr ,  X_IDXS_FLOAT ,  left_far_y ,  left_far_z ) ;   
			
		
	
		
			
				
					  fill_xyzt ( lane_lines [ 1 ] ,  plan_t_arr ,  X_IDXS_FLOAT ,  left_near_y ,  left_near_z ) ;   
			
		
	
		
			
				
					  fill_xyzt ( lane_lines [ 2 ] ,  plan_t_arr ,  X_IDXS_FLOAT ,  right_near_y ,  right_near_z ) ;   
			
		
	
		
			
				
					  fill_xyzt ( lane_lines [ 3 ] ,  plan_t_arr ,  X_IDXS_FLOAT ,  right_far_y ,  right_far_z ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  framed . setLaneLineStds ( {   
			
		
	
		
			
				
					    exp ( lanes . std . left_far [ 0 ] . y ) ,   
			
		
	
		
			
				
					    exp ( lanes . std . left_near [ 0 ] . y ) ,   
			
		
	
		
			
				
					    exp ( lanes . std . right_near [ 0 ] . y ) ,   
			
		
	
		
			
				
					    exp ( lanes . std . right_far [ 0 ] . y ) ,   
			
		
	
		
			
				
					  } ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  framed . setLaneLineProbs ( {   
			
		
	
		
			
				
					    sigmoid ( lanes . prob . left_far . val ) ,   
			
		
	
		
			
				
					    sigmoid ( lanes . prob . left_near . val ) ,   
			
		
	
		
			
				
					    sigmoid ( lanes . prob . right_near . val ) ,   
			
		
	
		
			
				
					    sigmoid ( lanes . prob . right_far . val ) ,   
			
		
	
		
			
				
					  } ) ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  fill_road_edges ( cereal : : ModelDataV2 : : Builder  & framed ,  const  std : : array < float ,  TRAJECTORY_SIZE >  & plan_t_arr ,  
			
		
	
		
			
				
					                     const  ModelDataRawRoadEdges  & 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 + + )  {   
			
		
	
		
			
				
					    left_y [ j ]  =  edges . mean . left [ j ] . y ;   
			
		
	
		
			
				
					    left_z [ j ]  =  edges . mean . left [ j ] . z ;   
			
		
	
		
			
				
					    right_y [ j ]  =  edges . mean . right [ j ] . y ;   
			
		
	
		
			
				
					    right_z [ j ]  =  edges . mean . right [ j ] . z ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  auto  road_edges  =  framed . initRoadEdges ( 2 ) ;   
			
		
	
		
			
				
					  fill_xyzt ( road_edges [ 0 ] ,  plan_t_arr ,  X_IDXS_FLOAT ,  left_y ,  left_z ) ;   
			
		
	
		
			
				
					  fill_xyzt ( road_edges [ 1 ] ,  plan_t_arr ,  X_IDXS_FLOAT ,  right_y ,  right_z ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  framed . setRoadEdgeStds ( {   
			
		
	
		
			
				
					    exp ( edges . std . left [ 0 ] . y ) ,   
			
		
	
		
			
				
					    exp ( edges . std . right [ 0 ] . y ) ,   
			
		
	
		
			
				
					  } ) ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  fill_model ( cereal : : ModelDataV2 : : Builder  & framed ,  const  ModelDataRaw  & net_outputs )  {  
			
		
	
		
			
				
					  auto  best_plan  =  net_outputs . plan - > best_plan ( ) ;   
			
		
	
		
			
				
					  float  plan_t_arr [ TRAJECTORY_SIZE ] ;   
			
		
	
		
			
				
					  std : : fill_n ( plan_t_arr ,  TRAJECTORY_SIZE ,  NAN ) ;   
			
		
	
		
			
				
					  auto  best_plan  =  net_outputs . plan - > get_ best_plan( ) ;   
			
		
	
		
			
				
					  std : : array < float ,  TRAJECTORY_SIZE >  plan_t_arr ;   
			
		
	
		
			
				
					  std : : fill_n ( plan_t_arr . data ( ) ,  plan_t_arr . size ( ) ,  NAN ) ;   
			
		
	
		
			
				
					  plan_t_arr [ 0 ]  =  0.0 ;   
			
		
	
		
			
				
					  for  ( int  xidx = 1 ,  tidx = 0 ;  xidx < TRAJECTORY_SIZE ;  xidx + + )  {   
			
		
	
		
			
				
					    // increment tidx until we find an element that's further away than the current xidx
   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -348,27 +333,8 @@ void fill_model(cereal::ModelDataV2::Builder &framed, const ModelDataRaw &net_ou 
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  fill_plan ( framed ,  best_plan ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  // lane lines
   
			
		
	
		
			
				
					  auto  lane_lines  =  framed . initLaneLines ( 4 ) ;   
			
		
	
		
			
				
					  float  lane_line_probs_arr [ 4 ] ;   
			
		
	
		
			
				
					  float  lane_line_stds_arr [ 4 ] ;   
			
		
	
		
			
				
					  for  ( int  i  =  0 ;  i  <  4 ;  i + + )  {   
			
		
	
		
			
				
					    fill_xyzt ( lane_lines [ i ] ,  & net_outputs . lane_lines [ i * TRAJECTORY_SIZE * 2 - 1 ] ,  2 ,  plan_t_arr ) ;   
			
		
	
		
			
				
					    lane_line_probs_arr [ i ]  =  sigmoid ( net_outputs . lane_lines_prob [ i * 2 + 1 ] ) ;   
			
		
	
		
			
				
					    lane_line_stds_arr [ i ]  =  exp ( net_outputs . lane_lines [ 2 * TRAJECTORY_SIZE * ( 4  +  i ) ] ) ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					  framed . setLaneLineProbs ( lane_line_probs_arr ) ;   
			
		
	
		
			
				
					  framed . setLaneLineStds ( lane_line_stds_arr ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  // road edges
   
			
		
	
		
			
				
					  auto  road_edges  =  framed . initRoadEdges ( 2 ) ;   
			
		
	
		
			
				
					  float  road_edge_stds_arr [ 2 ] ;   
			
		
	
		
			
				
					  for  ( int  i  =  0 ;  i  <  2 ;  i + + )  {   
			
		
	
		
			
				
					    fill_xyzt ( road_edges [ i ] ,  & net_outputs . road_edges [ i * TRAJECTORY_SIZE * 2 - 1 ] ,  2 ,  plan_t_arr ) ;   
			
		
	
		
			
				
					    road_edge_stds_arr [ i ]  =  exp ( net_outputs . road_edges [ 2 * TRAJECTORY_SIZE * ( 2  +  i ) ] ) ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					  framed . setRoadEdgeStds ( road_edge_stds_arr ) ;   
			
		
	
		
			
				
					  fill_lane_lines ( framed ,  plan_t_arr ,  * net_outputs . lane_lines ) ;   
			
		
	
		
			
				
					  fill_road_edges ( framed ,  plan_t_arr ,  * net_outputs . road_edges ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  // meta
   
			
		
	
		
			
				
					  fill_meta ( framed . initMeta ( ) ,  net_outputs . meta ) ;