class Game():
	turns=5
	event=None
	house=None
	players=[]
	solution=[]
	fileName = None
	
	def __init__(self, filename=None, size_of_player=20, turns=10000000, players_number=20, mask_size=3, convergence=1000, mask=MaskMoveCore):
		self.convergence = convergence
		self.mask_size = mask_size
		self.mask = mask
		self.turns = turns
		self.house = House()
		if filename is not None:
			self.event = Event(filename=filename)
		else:
			self.event = Event(size=size_of_player)

		self.size_of_player = len(self.event)
		
		for index in range(players_number):
			player = Player(self.size_of_player)
			self.players.append(player)
	
	def generateMask(self):
		return self.mask(self.mask_size, self.size_of_player)
	
	def play(self):
		self.solution = self.event.getInitialSolution()
		convergence = 0
		#print "graph: "
		#print self.event
		print "iteration: -1; f(solution) = "+str(self.event.f(self.solution))
		for turn in range(self.turns):
			mask = self.generateMask()
			
			for player in self.players:
				player.calculateWeights(mask)
			
			self.house.calculateWeights(self.players)
			#print "Weights of house: "+ str(self.house.weights)
			
			for player in self.players:
				player.makeBets(self.house)
				#print "The player "+ player.name +" has "+ str(player.bankroll) +" and makes bets." + str(player.bets)
			
			result = mask.calculateBestMask(self.event, self.solution)
			#print "The result was "+ str(result["index"])
			
			for index in range(len(self.players)):
				player = self.players[index]
				if player.isWinner(result["index"]):
					player.receiveAward(self.house, result["index"])
					#print "The player "+ player.name +" receives award."
				if player.isBroken():
					#print "The player "+ player.name +" is out."
					self.players[index] = player.createNew()
					#print "The new player "+ self.players[index].name +" is in."
				#print "The player "+ player.name +" has "+ str(player.bankroll)
			
			#print "The house has "+ str(self.house.bankroll)
			if result["distance"] < self.event.f(self.solution):
				convergence = 0
				self.solution = result["solution"]
				#print "iteration: "+str(turn)+"; f(solution) = "+str(self.event.f(self.solution))
			else:
				convergence += 1
			
			
			if convergence >= self.convergence:
				break
		
		
		return self.solution
class Game():
    turns = 5
    event = None
    house = None
    players = []
    solution = []
    fileName = None

    def __init__(self,
                 filename=None,
                 size_of_player=20,
                 turns=10000000,
                 players_number=20,
                 mask_size=3,
                 convergence=1000,
                 mask=MaskMoveCore):
        self.convergence = convergence
        self.mask_size = mask_size
        self.mask = mask
        self.turns = turns
        self.house = House()
        if filename is not None:
            self.event = Event(filename=filename)
        else:
            self.event = Event(size=size_of_player)

        self.size_of_player = len(self.event)

        for index in range(players_number):
            player = Player(self.size_of_player)
            self.players.append(player)

    def generateMask(self):
        return self.mask(self.mask_size, self.size_of_player)

    def play(self):
        self.solution = self.event.getInitialSolution()
        convergence = 0
        #print "graph: "
        #print self.event
        print "iteration: -1; f(solution) = " + str(self.event.f(
            self.solution))
        for turn in range(self.turns):
            mask = self.generateMask()

            for player in self.players:
                player.calculateWeights(mask)

            self.house.calculateWeights(self.players)
            #print "Weights of house: "+ str(self.house.weights)

            for player in self.players:
                player.makeBets(self.house)
                #print "The player "+ player.name +" has "+ str(player.bankroll) +" and makes bets." + str(player.bets)

            result = mask.calculateBestMask(self.event, self.solution)
            #print "The result was "+ str(result["index"])

            for index in range(len(self.players)):
                player = self.players[index]
                if player.isWinner(result["index"]):
                    player.receiveAward(self.house, result["index"])
                    #print "The player "+ player.name +" receives award."
                if player.isBroken():
                    #print "The player "+ player.name +" is out."
                    self.players[index] = player.createNew()
                    #print "The new player "+ self.players[index].name +" is in."
                #print "The player "+ player.name +" has "+ str(player.bankroll)

            #print "The house has "+ str(self.house.bankroll)
            if result["distance"] < self.event.f(self.solution):
                convergence = 0
                self.solution = result["solution"]
                #print "iteration: "+str(turn)+"; f(solution) = "+str(self.event.f(self.solution))
            else:
                convergence += 1

            if convergence >= self.convergence:
                break

        return self.solution