This repository has been archived by the owner on Jun 17, 2018. It is now read-only.
/
person.py
109 lines (102 loc) · 3.02 KB
/
person.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
from random import random as rr
from random import randint as ri
from post import Post
from constants import TOPICS
from parameters import FILTER_ON
class Person:
def __init__(self, pShare, pCreate, DoI, param_num):
# From parameters
self.pShare = pShare
self.pCreate = pCreate
self.DoI = DoI
self.param_num = param_num
# Add/fill/change later
self.interests = {}
for topic in TOPICS:
self.interests[topic] = 0
self.friends = []
self.preference = 0 # 0: topic not of interest, 1: one side, 2: the other side
def reset(self):
self.buffer = []
self.outbox = []
# To save results
self.received = {}
self.seen = {}
self.created = {}
self.shared = {}
for ii in self.interests:
# type as [site, created, shared]
if ii == "A":
# [same pref, different pref]
self.received[ii] = [[0, 0], [0, 0], [0, 0]]
else:
self.received[ii] = [0, 0, 0]
if ii == "A":
self.seen[ii] = [[0, 0], [0, 0], [0, 0]]
else:
self.seen[ii] = [0, 0, 0]
self.created[ii] = [0, 0, 0]
self.shared[ii] = [0, 0, 0]
def getPosts(self, site):
# Preference bonus
bonus = 0
if site.preference == self.preference:
bonus = 0.1
elif site.preference != 0:
bonus = -0.2
# Prevent negative interest
if self.interests[site.topic] + bonus < 0:
bonus = 0
num = int(len(site.posts) * (self.interests[site.topic] + bonus))
for post in site.posts[:num]:
self.buffer.append(post)
def seePosts(self, filter):
# Save received
for post in self.buffer:
if post.topic == "A":
if self.preference == post.preference:
self.received[post.topic][post.type][0] += 1
else:
self.received[post.topic][post.type][1] += 1
else:
self.received[post.topic][post.type] += 1
# Filter
if FILTER_ON[self.param_num]:
self.buffer = filter.filter(self.buffer, self.interests, self.preference)
# Save seen
for post in self.buffer:
if post.topic == "A":
if self.preference == post.preference:
self.seen[post.topic][post.type][0] += 1
else:
self.seen[post.topic][post.type][1] += 1
else:
self.seen[post.topic][post.type] += 1
def share(self):
for post in self.buffer:
# Probability of sharing and skip posts of opposite preference
if rr() < self.pShare and (post.preference == 0 or post.preference == self.preference) and self.interests[post.topic] != 0:
# Create new post for sharing
pref = 0
# Add preference if necessary
if post.topic == TOPICS[0]:
pref = self.preference
self.outbox.append(Post(post.topic, 2, pref))
def create(self):
for topic in self.interests:
# Check if interested
if self.interests[topic] != 0:
# To create or not to create
if rr() < self.pCreate:
# Create
for ii in range(ri(0, 3)): # HARDCODE (0, 3)
# Add preference if necessary
pref = 0
if topic == TOPICS[0]:
pref = self.preference
self.outbox.append(Post(topic, 1, pref))
def send(self, people):
for friend in self.friends:
for post in self.outbox:
people[friend].buffer.append(post)
self.outbox = []