def infect_limmited_return_num_bad_edges(graph, numToInfect):
	infecter = Infecter()

	infecter.infect_limited(graph.users, numToInfect, 10)
	numInfected = infecter.get_num_infected(graph.users)

	return infecter.get_solution_quality(graph.users), numInfected
示例#2
0
def test_infect_limited_no_errors(resource_semi_random_graph_users):
	users = resource_semi_random_graph_users
	infecter = Infecter()
	
	infecter.infect_limited(users, 25, 0)

	assert True
示例#3
0
def infect_and_return_num_bad_edges(graph, numToInfect):
	infecter = Infecter()

	start = random.choice(graph.users)
	infecter.infect_limited_from(start, numToInfect)

	return infecter.get_solution_quality(graph.users)
示例#4
0
def test_infect_from(resource_semi_random_graph_users):
	users = resource_semi_random_graph_users
	user = random.choice(users)
	infecter = Infecter()

	infecter.infect_from(user)

	subgraphs = graphTraverser.get_subgraphs(users)
	assert exactly_one_subgraph_infected(subgraphs)
示例#5
0
def test_get_num_infected_large():
	expectedInfected = 100
	graph = CoachingGraph()
	graph.init_semi_random(expectedInfected)
	infecter = Infecter()

	infecter.infect_all(graph.users)
	actualInfected = infecter.get_num_infected(graph.users)

	assert actualInfected == expectedInfected
示例#6
0
def test_infect_limited_doesnt_change_num_users():
	originalUsers = 100
	graph = CoachingGraph()
	graph.init_semi_random(originalUsers)
	infecter = Infecter()

	infecter.infect_limited(graph.users, 50, 10)
	remaingingUsers = len(graph.users)

	assert remaingingUsers == originalUsers
示例#7
0
def test_infect_limited_infects_correct_number_connected():
	graph = CoachingGraph()
	graph.init_semi_random_connected(200)
	numToInfect = 70
	users = graph.users
	infecter = Infecter()

	infecter.infect_limited(users, numToInfect, 0, False)
	numInfected = infecter.get_num_infected(users)

	assert numInfected == numToInfect
示例#8
0
def test_infect_limited_from():
	graph = CoachingGraph()
	graph.init_semi_random_connected(200)
	numToInfect = 70
	users = graph.users
	user = random.choice(users)
	infecter = Infecter()

	infecter.infect_limited_from(user, numToInfect)
	numInfected = infecter.get_num_infected(users)

	assert numInfected == numToInfect
示例#9
0
def test_get_num_infected():
	graph = CoachingGraph()
	A = User()
	B = User()
	C = User()
	graph.add_users([A, B, C])

	A.infected = True
	B.infected = True

	infecter = Infecter()

	assert infecter.get_num_infected(graph.users) == 2
示例#10
0
def test_find_user_with_fewest_connections():
	subgraph = CoachingGraph()
	A = User()
	B = User()
	C = User()
	D = User()
	subgraph.add_users([A, B, D, C])
	subgraph.create_coach_coachee_relationship(A, B)
	subgraph.create_coach_coachee_relationship(A, C)
	subgraph.create_coach_coachee_relationship(A, D)
	subgraph.create_coach_coachee_relationship(B, C)
	expected = D
	infecter = Infecter()

	actual = infecter.find_user_with_fewest_connections(subgraph.users)

	assert expected == actual
示例#11
0
def test_find_neighbor_with_fewest_connections():
	graph = CoachingGraph()
	A = User()
	B = User()
	C = User()
	D = User()
	E = User()
	F = User()
	graph.add_users([A, B, C, D, E, F])

	graph.create_coach_coachee_relationship(A, B)
	graph.create_coach_coachee_relationship(B, C)
	graph.create_coach_coachee_relationship(B, D)
	graph.create_coach_coachee_relationship(C, E)
	graph.create_coach_coachee_relationship(A, F)

	infecter = Infecter()
	infecter.infect_single_user(A)
	userWithFewest = infecter.find_neighbor_with_fewest_connections(A)

	assert userWithFewest == F
示例#12
0
def infect_limmited_return_num_bad_edges(graph, numToInfect):
    infecter = Infecter()

    infecter.infect_limited(graph.users, numToInfect, 10)
    numInfected = infecter.get_num_infected(graph.users)

    return infecter.get_solution_quality(graph.users), numInfected
示例#13
0
 def __init__(self):
     self.users = []
     self.infecter = Infecter()
     self.visualizer = GraphVisualizer(self.users)
示例#14
0
class CoachingGraph():
    def __init__(self):
        self.users = []
        self.infecter = Infecter()
        self.visualizer = GraphVisualizer(self.users)

    def init_random(self, numUsers):
        self.users = []
        self.create_and_add_users(numUsers)
        self.make_random_connections(3)

    def create_and_add_users(self, numUsers):
        for i in range(numUsers):
            user = User()
            self.add_user(user)

    def make_random_connections(self, iterations):
        for i in range(iterations):
            for user in self.users:
                self.make_random_connection(user)

    # generates a random aproximation of coach coachee relations
    def init_semi_random(self, size, connectionFactor=10, coacheesFactor=2):
        self.users = []

        numCoaches = (size // 6) + 1
        remainingCoachees = size - numCoaches
        coacheesPerCoach = remainingCoachees // numCoaches
        remaining = size

        while remaining > 0:

            numCoachees = random.randint(
                1, math.floor(coacheesPerCoach * coacheesFactor))
            remaining -= 1

            numCoachees = min(numCoachees, remaining)
            self.add_coach(numCoachees)
            remaining -= numCoachees

        self.make_sparse_random_connections(size // connectionFactor)

    def init_semi_random_connected(self, size):
        self.init_semi_random(size, connectionFactor=1)

    def add_coach(self, numCoachees):
        coach = User()
        self.add_user(coach)
        self.add_coachees(coach, numCoachees)

    def add_coachees(self, user, numToAdd):
        if user not in self.users: return
        for i in range(numToAdd):
            coachee = User()
            self.add_user(coachee)
            self.create_coach_coachee_relationship(user, coachee)

    def make_sparse_random_connections(self, numConnections):
        for user in random.sample(self.users, numConnections):
            self.make_random_connection(user)

    def make_random_connection(self, user):
        coachee = user
        while coachee == user:
            coachee = random.choice(self.users)
            if coachee in user.neighbors: continue
        self.create_coach_coachee_relationship(user, coachee)

    def add_user(self, user):
        if user in self.users: return
        self.users.append(user)

    def add_users(self, users):
        for user in users:
            self.add_user(user)

    def create_coach_coachee_relationship(self, userA, userB):
        if userA not in self.users or userB not in self.users: return
        userA.add_coachee(userB)
        userB.add_coach(userA)

    def clean(self):
        for user in self.users:
            user.infected = False
            user.numConnections = 0
            user.epicenter = False
            user.visited = False

    def draw(self):
        self.visualizer.update(self.users)
        self.visualizer.draw(self.infecter.get_solution_quality(self.users))

    def save_as(self, filename):
        self.visualizer.update(self.users)
        data = [self.users, self.visualizer]
        pickler.save_as(data, filename)

    def load_from(self, filename):
        try:
            data = pickler.load_file(filename)
        except FileNotFoundError:
            logger.error('Failed to load, File not found', exc_info=True)
            return
        except Exception:
            logger.error('Failed to load, something else went wrong',
                         exc_info=True)
            return
        self.users, self.visualizer = data
示例#15
0
	def __init__(self):
		self.users = []
		self.infecter = Infecter()
		self.visualizer = GraphVisualizer(self.users)
示例#16
0
class CoachingGraph():	
	def __init__(self):
		self.users = []
		self.infecter = Infecter()
		self.visualizer = GraphVisualizer(self.users)

	def init_random(self, numUsers):
		self.users = []
		self.create_and_add_users(numUsers)
		self.make_random_connections(3)

	def create_and_add_users(self, numUsers):
		for i in range(numUsers):
			user = User()
			self.add_user(user)

	def make_random_connections(self, iterations):
		for i in range(iterations):
			for user in self.users:
				self.make_random_connection(user)

	# generates a random aproximation of coach coachee relations
	def init_semi_random(self, size, connectionFactor=10, coacheesFactor=2):
		self.users = []

		numCoaches = (size // 6) + 1
		remainingCoachees = size - numCoaches
		coacheesPerCoach = remainingCoachees // numCoaches
		remaining = size

		while remaining > 0:

			numCoachees = random.randint(1, math.floor(coacheesPerCoach * coacheesFactor))
			remaining -= 1

			numCoachees = min(numCoachees, remaining)
			self.add_coach(numCoachees)
			remaining -= numCoachees

		self.make_sparse_random_connections(size // connectionFactor)

	def init_semi_random_connected(self, size):
		self.init_semi_random(size, connectionFactor=1)

	def add_coach(self, numCoachees):
		coach = User()
		self.add_user(coach)
		self.add_coachees(coach, numCoachees)

	def add_coachees(self, user, numToAdd):
		if user not in self.users: return
		for i in range(numToAdd):
			coachee = User()
			self.add_user(coachee)
			self.create_coach_coachee_relationship(user, coachee)

	def make_sparse_random_connections(self, numConnections):
		for user in random.sample(self.users, numConnections):
				self.make_random_connection(user)

	def make_random_connection(self, user):
		coachee = user
		while coachee == user:
			coachee = random.choice(self.users)
			if coachee in user.neighbors: continue
		self.create_coach_coachee_relationship(user, coachee)

	def add_user(self, user):
		if user in self.users: return
		self.users.append(user)

	def add_users(self, users):
		for user in users:
			self.add_user(user)

	def create_coach_coachee_relationship(self, userA, userB):
		if userA not in self.users or userB not in self.users: return
		userA.add_coachee(userB)
		userB.add_coach(userA)

	def clean(self):
		for user in self.users:
			user.infected = False
			user.numConnections = 0
			user.epicenter = False
			user.visited = False

	def draw(self):
		self.visualizer.update(self.users)
		self.visualizer.draw(self.infecter.get_solution_quality(self.users))

	def save_as(self, filename):
		self.visualizer.update(self.users)
		data = [self.users, self.visualizer]
		pickler.save_as(data, filename)

	def load_from(self, filename):
		try:
			data = pickler.load_file(filename)
		except FileNotFoundError:
			logger.error('Failed to load, File not found', exc_info=True)
			return
		except Exception:
			logger.error('Failed to load, something else went wrong', exc_info=True)
			return
		self.users, self.visualizer = data