#! /usr/bin/env python 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# type: ignore 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  numpy  as  np 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  collections  import  OrderedDict 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  matplotlib . pyplot  as  plt 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  selfdrive . car . honda . interface  import  CarInterface 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  selfdrive . controls . lib . lateral_mpc  import  libmpc_py 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  selfdrive . controls . lib . vehicle_model  import  VehicleModel 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# plot lateral MPC trajectory by defining boundary conditions: 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# lane lines, p_poly and vehicle states. Use this script to tune MPC costs 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								libmpc  =  libmpc_py . libmpc 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								mpc_solution  =  libmpc_py . ffi . new ( " log_t * " ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								points_l  =  np . array ( [ 1.1049711 ,  1.1053879 ,  1.1073375 ,  1.1096942 ,  1.1124474 ,  1.1154714 ,  1.1192677 ,  1.1245866 ,  1.1321017 ,  1.1396152 ,  1.146443 ,  1.1555313 ,  1.1662073 ,  1.1774249 ,  1.1888939 ,  1.2009926 ,  1.2149779 ,  1.2300836 ,  1.2450289 ,  1.2617753 ,  1.2785473 ,  1.2974714 ,  1.3151019 ,  1.3331807 ,  1.3545501 ,  1.3763691 ,  1.3983455 ,  1.4215056 ,  1.4446729 ,  1.4691089 ,  1.4927692 ,  1.5175346 ,  1.5429921 ,  1.568854 ,  1.5968665 ,  1.6268958 ,  1.657122 ,  1.6853137 ,  1.7152609 ,  1.7477539 ,  1.7793678 ,  1.8098511 ,  1.8428392 ,  1.8746407 ,  1.9089606 ,  1.9426043 ,  1.9775689 ,  2.0136933 ,  2.0520134 ,  2.0891454 ] ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								points_r  =  np . array ( [ - 2.4442139 ,  - 2.4449506 ,  - 2.4448867 ,  - 2.44377 ,  - 2.4422617 ,  - 2.4393811 ,  - 2.4374201 ,  - 2.4334245 ,  - 2.4286852 ,  - 2.4238286 ,  - 2.4177458 ,  - 2.4094386 ,  - 2.3994849 ,  - 2.3904033 ,  - 2.380136 ,  - 2.3699453 ,  - 2.3594661 ,  - 2.3474073 ,  - 2.3342307 ,  - 2.3194637 ,  - 2.3046403 ,  - 2.2881098 ,  - 2.2706163 ,  - 2.2530098 ,  - 2.235604 ,  - 2.2160542 ,  - 2.1967411 ,  - 2.1758952 ,  - 2.1544619 ,  - 2.1325269 ,  - 2.1091819 ,  - 2.0850561 ,  - 2.0621953 ,  - 2.0364127 ,  - 2.0119917 ,  - 1.9851667 ,  - 1.9590458 ,  - 1.9306552 ,  - 1.9024918 ,  - 1.8745357 ,  - 1.8432863 ,  - 1.8131843 ,  - 1.7822732 ,  - 1.7507075 ,  - 1.7180918 ,  - 1.6845931 ,  - 1.650871 ,  - 1.6157099 ,  - 1.5787286 ,  - 1.5418037 ] ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								points_c  =  ( points_l  +  points_r )  /  2.0 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  compute_path_pinv ( ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  deg  =  3 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  x  =  np . arange ( 50.0 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  X  =  np . vstack ( tuple ( x * * n  for  n  in  range ( deg ,  - 1 ,  - 1 ) ) ) . T 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  pinv  =  np . linalg . pinv ( X ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  pinv 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  model_polyfit ( points ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  path_pinv  =  compute_path_pinv ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  np . dot ( path_pinv ,  map ( float ,  points ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								xx  =  [ ] 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								yy  =  [ ] 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								deltas  =  [ ] 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								psis  =  [ ] 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								times  =  [ ] 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								CP  =  CarInterface . get_params ( " HONDA CIVIC 2016 TOURING " ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								VM  =  VehicleModel ( CP ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								v_ref  =  32.00   # 45 mph 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								curvature_factor  =  VM . curvature_factor ( v_ref ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								print ( curvature_factor ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								LANE_WIDTH  =  3.9 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								p_l  =  map ( float ,  model_polyfit ( points_l ) ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								p_r  =  map ( float ,  model_polyfit ( points_r ) ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								p_p  =  map ( float ,  model_polyfit ( points_c ) ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								l_poly  =  libmpc_py . ffi . new ( " double[4] " ,  p_l ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								r_poly  =  libmpc_py . ffi . new ( " double[4] " ,  p_r ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								p_poly  =  libmpc_py . ffi . new ( " double[4] " ,  p_p ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								l_prob  =  1.0 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								r_prob  =  1.0 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								p_prob  =  1.0   # This is always 1 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								mpc_x_points  =  np . linspace ( 0. ,  2.5 * v_ref ,  num = 50 ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								points_poly_l  =  np . polyval ( p_l ,  mpc_x_points ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								points_poly_r  =  np . polyval ( p_r ,  mpc_x_points ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								points_poly_p  =  np . polyval ( p_p ,  mpc_x_points ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								print ( points_poly_l ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								lanes_x  =  np . linspace ( 0 ,  49 ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cur_state  =  libmpc_py . ffi . new ( " state_t * " ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cur_state [ 0 ] . x  =  0.0 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cur_state [ 0 ] . y  =  0.5 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cur_state [ 0 ] . psi  =  0.0 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cur_state [ 0 ] . delta  =  0.0 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								xs  =  [ ] 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ys  =  [ ] 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								deltas  =  [ ] 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								titles  =  [ 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ' Steer rate cost ' , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ' Heading cost ' , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ' Lane cost ' , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ' Path cost ' , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								] 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Steer rate cost 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								sol_x  =  OrderedDict ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								sol_y  =  OrderedDict ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								delta  =  OrderedDict ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								for  cost  in  np . logspace ( - 1 ,  1.0 ,  5 ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  libmpc . init ( 1.0 ,  3.0 ,  1.0 ,  cost ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  _  in  range ( 10 ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    libmpc . run_mpc ( cur_state ,  mpc_solution ,  l_poly ,  r_poly ,  p_poly ,  l_prob ,  r_prob , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                  curvature_factor ,  v_ref ,  LANE_WIDTH ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  sol_x [ cost ]  =  map ( float ,  list ( mpc_solution [ 0 ] . x ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  sol_y [ cost ]  =  map ( float ,  list ( mpc_solution [ 0 ] . y ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  delta [ cost ]  =  map ( float ,  list ( mpc_solution [ 0 ] . delta ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								xs . append ( sol_x ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ys . append ( sol_y ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								deltas . append ( delta ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Heading cost 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								sol_x  =  OrderedDict ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								sol_y  =  OrderedDict ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								delta  =  OrderedDict ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								for  cost  in  np . logspace ( - 1 ,  1.0 ,  5 ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  libmpc . init ( 1.0 ,  3.0 ,  cost ,  1.0 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  _  in  range ( 10 ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    libmpc . run_mpc ( cur_state ,  mpc_solution ,  l_poly ,  r_poly ,  p_poly ,  l_prob ,  r_prob , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                  curvature_factor ,  v_ref ,  LANE_WIDTH ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  sol_x [ cost ]  =  map ( float ,  list ( mpc_solution [ 0 ] . x ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  sol_y [ cost ]  =  map ( float ,  list ( mpc_solution [ 0 ] . y ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  delta [ cost ]  =  map ( float ,  list ( mpc_solution [ 0 ] . delta ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								xs . append ( sol_x ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ys . append ( sol_y ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								deltas . append ( delta ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Lane cost 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								sol_x  =  OrderedDict ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								sol_y  =  OrderedDict ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								delta  =  OrderedDict ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								for  cost  in  np . logspace ( - 1 ,  2.0 ,  5 ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  libmpc . init ( 1.0 ,  cost ,  1.0 ,  1.0 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  _  in  range ( 10 ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    libmpc . run_mpc ( cur_state ,  mpc_solution ,  l_poly ,  r_poly ,  p_poly ,  l_prob ,  r_prob , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                  curvature_factor ,  v_ref ,  LANE_WIDTH ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  sol_x [ cost ]  =  map ( float ,  list ( mpc_solution [ 0 ] . x ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  sol_y [ cost ]  =  map ( float ,  list ( mpc_solution [ 0 ] . y ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  delta [ cost ]  =  map ( float ,  list ( mpc_solution [ 0 ] . delta ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								xs . append ( sol_x ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ys . append ( sol_y ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								deltas . append ( delta ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Path cost 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								sol_x  =  OrderedDict ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								sol_y  =  OrderedDict ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								delta  =  OrderedDict ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								for  cost  in  np . logspace ( - 1 ,  1.0 ,  5 ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  libmpc . init ( cost ,  3.0 ,  1.0 ,  1.0 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  _  in  range ( 10 ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    libmpc . run_mpc ( cur_state ,  mpc_solution ,  l_poly ,  r_poly ,  p_poly ,  l_prob ,  r_prob , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                  curvature_factor ,  v_ref ,  LANE_WIDTH ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  sol_x [ cost ]  =  map ( float ,  list ( mpc_solution [ 0 ] . x ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  sol_y [ cost ]  =  map ( float ,  list ( mpc_solution [ 0 ] . y ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  delta [ cost ]  =  map ( float ,  list ( mpc_solution [ 0 ] . delta ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								xs . append ( sol_x ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ys . append ( sol_y ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								deltas . append ( delta ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								plt . figure ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								for  i  in  range ( len ( xs ) ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ax  =  plt . subplot ( 2 ,  2 ,  i  +  1 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  sol_x  =  xs [ i ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  sol_y  =  ys [ i ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  cost  in  sol_x . keys ( ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . plot ( sol_x [ cost ] ,  sol_y [ cost ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . plot ( lanes_x ,  points_r ,  ' .b ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . plot ( lanes_x ,  points_l ,  ' .b ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . plot ( lanes_x ,  ( points_l  +  points_r )  /  2.0 ,  ' --g ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . plot ( mpc_x_points ,  points_poly_l ,  ' b ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . plot ( mpc_x_points ,  points_poly_r ,  ' b ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . plot ( mpc_x_points ,  ( points_poly_l  +  points_poly_r )  /  2.0 ,  ' g ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . legend ( map ( lambda  x :  str ( round ( x ,  2 ) ) ,  sol_x . keys ( ) )  +  [ ' right ' ,  ' left ' ,  ' center ' ] ,  loc = 3 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . title ( titles [ i ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . grid ( True ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  # ax.set_aspect('equal', 'datalim') 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								plt . figure ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								for  i  in  range ( len ( xs ) ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . subplot ( 2 ,  2 ,  i  +  1 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  sol_x  =  xs [ i ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  delta  =  deltas [ i ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  cost  in  sol_x . keys ( ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . plot ( delta [ cost ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . title ( titles [ i ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . legend ( map ( lambda  x :  str ( round ( x ,  2 ) ) ,  sol_x . keys ( ) ) ,  loc = 3 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . grid ( True ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								plt . show ( )