def __init__(self, args):
		#super(Tranfer_One_Plan, self).__init__()
		#self.dest_sta_name = dest_sta_name
		#self.if_city_same = if_city_same #if it is True,transit_sta is tuple(a,b).if it's false,transit_sta is one sta.
		
		self.first_direct = args[0]
		self.second_direct = args[1]
		self.third_direct = args[2]
		self.transit_time = connect_time(args[0].end_time, args[1].start_time) + connect_time(args[1].end_time, args[2].start_time)
		self.transit_sta = [args[1].start_station_name, args[1].end_station_name]#transit_stas #same city has two transit_sta
		self.distance = self.first_direct.distance + self.second_direct.distance + self.third_direct.distance
		self.start_time = self.first_direct.start_time
		self.end_time = self.third_direct.end_time
		self.travel_time = self.first_direct.travel_time + self.second_direct.travel_time +\
							self.third_direct.travel_time + self.transit_time
def save_tranfer_one_plans(start_trains, end_trains):
	"""save one tranfer plans """
	tranfer_one_plans = [] #save tranfer result

	trains = lambda train:[(t,train[t.train_no]) for t in Train.objects(__raw__={"train_no":{"$in":train.keys()}})]

	start_train_seqs = trains(start_trains)
	start_sta_info =lambda d: dict([(s.sta_name, s) for s in d[0].edges if s.seq_no > d[1]]) #s.arrive_time,s.city_same
	start_trains_stas_v = map(start_sta_info, start_train_seqs)

	end_train_seqs = trains(end_trains)
	end_sta_info =lambda d: dict([(s.sta_name, s) for s in d[0].edges if s.seq_no < d[1]])#s.depart_time,s.city_same
	end_trains_stas_ev = map(end_sta_info, end_train_seqs)
		
	for i,sl in enumerate(start_trains_stas_v):
		set_one = set(sl.keys())
		train_one = start_train_seqs[i]
		for j,el in enumerate(end_trains_stas_ev):
			train_two = end_train_seqs[j]
			if len(train_one[0].cross_bureaus) == 1 and len(train_two[0].cross_bureaus) == 1:
				break #tranfer is not taking place in two bureau trains
			set_two = set(el.keys())
			set_union = set_one & set_two
			same_city_sta = [(st1,st2) for st1 in set_one - set_union for st2 in set_two - set_union \
							if sl[st1].city_same and sl[st1].city_same==el[st2].city_same]
			
			union_sets_sta = []
			union_sets_sta = list(set_union)
			union_sets_sta.extend(same_city_sta)

			if union_sets_sta:
				try:
					#union_sets_sta_dict = [] 
					#union_sets_sta_dict = zip(union_sets_sta, union_sets_sta)
					#union_sets_sta_dict.extend(same_city_sta)
					union_sets_connct_time = []
					union_sets_connct_time = [connect_time(sl[t].arrive_time, el[t].depart_time) for t in set_union]
					union_sets_connct_time.extend([connect_time(sl[t1].arrive_time, el[t2].depart_time) for (t1,t2) in same_city_sta])
				except TypeError, e:
					print "type error"
				except Exception, ex:
					print "other error"
					
				#union_sets_all = dict(zip(union_sets_sta,union_sets_connct_time))
				#union_sets_filter = sorted(union_sets_all.items(), key=lambda x: x[1])
				transit_time = max(union_sets_connct_time)
				for i,x in enumerate(union_sets_connct_time):
					if x == transit_time and i<len(set_union):
						transit_sta = union_sets_sta[i]
						transit_sta_seqs = (sl[transit_sta].seq_no, el[transit_sta].seq_no)
						tranfer_one = Tranfer_One_Plan(train_one[0],train_one[1], train_two[0],train_two[1], transit_sta_seqs, transit_sta,transit_time)
						tranfer_one_plans.append(tranfer_one)
						break
					elif x == transit_time and i>=len(set_union):
						if_city_same = True
						transit_stas = union_sets_sta[i]
						transit_sta_seqs = (sl[transit_stas[0]].seq_no, el[transit_stas[1]].seq_no)
						tranfer_one = Tranfer_One_Plan(train_one[0],train_one[1], train_two[0],train_two[1], transit_sta_seqs, transit_stas,transit_time,if_city_same)
						tranfer_one_plans.append(tranfer_one)
						break
					else:
						continue