@ -243,7 +243,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                AssertionError ( " Can not insert the send op by original  " 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                               " variable name : " ,  orig_varname ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            program . global_block ( ) .  insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            program . global_block ( ) . _ insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                index = index  +  1 , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                type = " send " , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                inputs = { " X " :  splited_vars } , 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -429,7 +429,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            # clone vars 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            for  var  in  origin_block . vars : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                new_sub_block .  clone_variable( var ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                new_sub_block . _ clone_variable( var ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            # clone ops 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            for  origin_op  in  origin_block . ops : 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -525,7 +525,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            outputs = { } , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            attrs = attrs ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        pserver_program .  sync_with_cpp( ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        pserver_program . _ sync_with_cpp( ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        return  pserver_program 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    def  get_startup_program ( self ,  endpoint ,  pserver_program ) : 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -557,7 +557,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        pserver_vars  =  pserver_program . global_block ( ) . vars 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        created_var_map  =  dict ( ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        for  _ ,  var  in  pserver_vars . iteritems ( ) : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            tmpvar  =  s_prog . global_block ( ) .  clone_variable( var ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            tmpvar  =  s_prog . global_block ( ) . _ clone_variable( var ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            created_var_map [ var . name ]  =  tmpvar 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        # 2. rename op outputs 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -760,7 +760,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    self . all_prefetch_output_vars . append ( prefetch_output_vars ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    # insert split_ids_op 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    program . global_block ( ) .  insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    program . global_block ( ) . _ insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        index = lookup_table_op_index , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        type = " split_ids " , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        inputs = { 
 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -772,7 +772,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        outputs = { " Out " :  prefetch_input_vars } ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    # insert prefetch_op 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    program . global_block ( ) .  insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    program . global_block ( ) . _ insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        index = lookup_table_op_index  +  1 , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        type = " prefetch " , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        inputs = { ' X ' :  prefetch_input_vars } , 
 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -783,7 +783,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        } ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    # insert concat_op 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    program . global_block ( ) .  insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    program . global_block ( ) . _ insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        index = lookup_table_op_index  +  2 , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        type = " merge_ids " , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        inputs = { 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -814,14 +814,14 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            if  table_grad_name  in  op . output_arg_names : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                op_index  =  list ( all_ops ) . index ( op ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                # insert split_ids_op 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                program . global_block ( ) .  insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                program . global_block ( ) . _ insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    index = op_index  +  1 , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    type = " split_ids " , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    inputs = { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        ' Ids ' :  [ program . global_block ( ) . vars [ table_grad_name ] ] 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    } , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    outputs = { " Out " :  self . trainer_side_table_grad_list } ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                program . global_block ( ) .  insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                program . global_block ( ) . _ insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    index = op_index  +  2 , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    type = " send " , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    inputs = { ' X ' :  self . trainer_side_table_grad_list } , 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -880,7 +880,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            persistable = True ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        # parameter must be selected rows 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        param_var . desc . set_type ( core . VarDesc . VarType . SELECTED_ROWS ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        grad_var  =  pserver_program . global_block ( ) .  clone_variable( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        grad_var  =  pserver_program . global_block ( ) . _ clone_variable( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            self . origin_program . global_block ( ) . vars [ grad_var_name ( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                self . table_name ) ] ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -920,7 +920,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            if  not  splited_grad_name . startswith ( origin_grad_name ) : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                raise  ValueError ( " origin_grad_var:  "  +  splited_grad_name  + 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                                 "  grad_var: "  +  grad_var . name ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            grad_var  =  pserver_program . global_block ( ) .  rename_var( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            grad_var  =  pserver_program . global_block ( ) . _ rename_var( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                origin_grad_name ,  splited_grad_name ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        lr_var  =  pserver_program . global_block ( ) . vars [ table_opt_op . input ( 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -996,7 +996,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                if  self . sync_mode  and  add_trainer_suffix : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    new_var_name  =  " %s .trainer_ %d "  %  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        ( orig_var . name ,  self . trainer_id ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    program . global_block ( ) .  rename_var( varname ,  new_var_name ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    program . global_block ( ) . _ rename_var( varname ,  new_var_name ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    var_mapping [ varname ]  =  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        [ program . global_block ( ) . var ( new_var_name ) ] 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                else : 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -1030,8 +1030,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    type = orig_var . type , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    shape = splited_shape )   # flattend splited var 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                var_mapping [ varname ] . append ( var ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            program . global_block ( ) . sync_with_cpp ( ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            program . global_block ( ) . _sync_with_cpp ( ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        return  var_mapping 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    def  create_splited_vars ( self ,  source_var ,  block ,  tag ) : 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -1059,7 +1058,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            height_sections  =  [ ] 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            for  v  in  splited_vars : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                height_sections . append ( v . shape [ 0 ] ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            program . global_block ( ) .  insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            program . global_block ( ) . _ insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                index = index  +  1 , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                type = " split_selected_rows " , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                inputs = { " X " :  orig_var } , 
 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -1069,7 +1068,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            sections  =  [ ] 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            for  v  in  splited_vars : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                sections . append ( v . shape [ 0 ] ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            program . global_block ( ) .  insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            program . global_block ( ) . _ insert_op( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                index = index  +  1 , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                type = " split_byref " , 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                inputs = { " X " :  orig_var } , 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -1258,7 +1257,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                varlist  =  [ varlist ] 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            for  var  in  varlist : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                if  var  not  in  program . global_block ( ) . vars : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    block .  clone_variable( var ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    block . _ clone_variable( var ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        outputs  =  self . _get_output_map_from_op ( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            self . origin_program . global_block ( ) . vars ,  op ) 
 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -1267,7 +1266,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                varlist  =  [ varlist ] 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            for  var  in  varlist : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                if  var  not  in  program . global_block ( ) . vars : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    block .  clone_variable( var ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    block . _ clone_variable( var ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        return  block . append_op ( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            type = op . type ,  inputs = inputs ,  outputs = outputs ,  attrs = op . attrs ) 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -1305,7 +1304,7 @@ class DistributeTranspiler(object):
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                if  grad_block : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    outputs [ key ]  =  grad_block 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                elif  not  program . global_block ( ) . vars . has_key ( var . name ) : 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    program . global_block ( ) .  clone_variable( var ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    program . global_block ( ) . _ clone_variable( var ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        return  optimize_block . append_op ( 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            type = opt_op . type ,