/
objects_original.py
143 lines (131 loc) · 6.56 KB
/
objects_original.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
'''
Created on Oct 17, 2011
@author: kykamath
'''
from collections import defaultdict
import random
from library.classes import GeneralMethods
from settings import stickinessLowerThreshold, noOfPayloadsPerTopic,\
noOfPayloadsPerSpammer, noOfGlobalSpammerPayloads, globalSpammerId
topicClasses = range(2)
#topicClasses = range(1)
class PayLoad(object):
def __init__(self, id, generatorId):
self.id = str(generatorId)+'_'+str(id)
self.generatorId = generatorId
self.isSpam = False
@staticmethod
def generatePayloads(generatorId, noOfPayLoadsToGenerate): return [PayLoad(id, generatorId) for id in range(noOfPayLoadsToGenerate)]
class SpamPayLoad(PayLoad):
def __init__(self, id, spammerId):
super(SpamPayLoad, self).__init__(id, spammerId)
self.isSpam = True
@staticmethod
def generatePayloads(generatorId, noOfPayLoadsToGenerate): return [SpamPayLoad(id, generatorId) for id in range(noOfPayLoadsToGenerate)]
class Topic(object):
def __init__(self, id):
self.id = id
self.totalCount = 0
self.countDistribution = defaultdict(int)
self.age = 0
self.topicClass = random.choice(topicClasses)
self.decayCoefficient = -3
if GeneralMethods.trueWith(0.05): self.stickiness = random.uniform(stickinessLowerThreshold, 1.0)
else: self.stickiness = random.uniform(0.0, 0.1)
self.payloads = PayLoad.generatePayloads(self.id, noOfPayloadsPerTopic)
#Non-modeling attributes.
self.color = GeneralMethods.getRandomColor()
def getPayLoad(self): return random.choice(self.payloads)
def __str__(self): return ' '.join([str(self.id)])
@staticmethod
def incrementTopicAge(currentTopics):
for topic in currentTopics: topic.age+=1
@staticmethod
def addNewTopics(currentTopics, noOfTopicsToAdd):
if not currentTopics: initialId = 0
else: initialId = currentTopics[-1].id+1
[currentTopics.append(Topic(initialId+i)) for i in range(noOfTopicsToAdd)]
class Message:
def __init__(self, id, timeStep, payLoad, topic):
self.id = id
self.timeStep = timeStep
self.payLoad = payLoad
self.topic = topic
class User(object):
def __init__(self, id):
self.id = id
self.messagingProbability = 0.1
self.numberOfTopicsPerMessage = 1
self.messagesSent = 0
def __str__(self): return ' '.join([str(self.id)])
def generateMessage(self, timeStep, topic):
self.messagesSent+=1
return Message(str(self.id)+'_'+str(self.messagesSent), timeStep, topic.getPayLoad(), topic)
@staticmethod
def addNormalUsers(currentUsers, noOfUsersToAdd, **conf):
if not currentUsers: initialId = 0
else: initialId = currentUsers[-1].id+1
[currentUsers.append(NormalUser(initialId+i)) for i in range(noOfUsersToAdd)]
@staticmethod
def addSpammers(currentUsers, noOfUsersToAdd, **conf):
if not currentUsers: initialId = 0
else: initialId = currentUsers[-1].id+1
[currentUsers.append(Spammer(initialId+i, **conf)) for i in range(noOfUsersToAdd)]
@staticmethod
def addSpammersInRatio(currentUsers, noOfUsersToAdd, **conf):
ratio = conf['spamRatio']
if '%0.1f'%(ratio['localPayloads']+ratio['globalPayloads'])!='%0.1f'%1.0: raise Exception('Ratio Should sum to 1.0')
globalSpammerPayloads = conf.get('noOfGlobalSpammerPayloads', noOfGlobalSpammerPayloads)
conf['noOfGlobalSpammerPayloads'] = False
User.addSpammers(currentUsers, int(noOfUsersToAdd*ratio['localPayloads']), **conf)
conf['noOfGlobalSpammerPayloads'] = globalSpammerPayloads
User.addSpammers(currentUsers, int(noOfUsersToAdd*ratio['globalPayloads']), **conf)
@staticmethod
def addUsersUsingRatio(currentUsers, noOfUsersToAdd, **conf):
ratio = conf['ratio']
if '%0.1f'%(ratio['normal']+ratio['spammer'])!='%0.1f'%1.0: raise Exception('Ratio Should sum to 1.0')
User.addNormalUsers(currentUsers, int(noOfUsersToAdd*ratio['normal']), **conf)
if conf.get('spamRatio', False): User.addSpammersInRatio(currentUsers, int(noOfUsersToAdd*ratio['spammer']), **conf)
else: User.addSpammers(currentUsers, int(noOfUsersToAdd*ratio['spammer']), **conf)
@staticmethod
def addUsersUsingRatioWithSpamDetection(currentUsers, noOfUsersToAdd, **conf):
ratio = conf['ratio']
if '%0.1f'%(ratio['normal']+ratio['spammer'])!='%0.1f'%1.0: raise Exception('Ratio Should sum to 1.0')
User.addNormalUsers(currentUsers, int(noOfUsersToAdd*ratio['normal']), **conf)
if conf.get('spamRatio', False): raise Exception('Doesnt support spam ratio')
else:
spammers = []
User.addSpammers(spammers, int(noOfUsersToAdd*ratio['spammer']), **conf)
currentUsers+=filter(lambda u: random.random() >= conf['spamDetectionRatio'], spammers)
print len(currentUsers)
print 'x'
class NormalUser(User):
def __init__(self, id):
super(NormalUser, self).__init__(id)
self.topicClass = random.choice(topicClasses) # Models interest of a user. Ex. User interested in sports, technology.
self.probabilityOfPickingPopularTopic = 0.40
self.newTopicProbability = 0.001
class Spammer(User):
globalPayloads = None
def __init__(self, id, **conf):
super(Spammer, self).__init__(id)
self.topicClass = None
self.probabilityOfPickingPopularTopic = 0.75
self.newTopicProbability = 0.0
self.messagingProbability = conf.get('spammerMessagingProbability', 1.0)
# Spammer.globalPayloads = None
if conf.get('noOfGlobalSpammerPayloads', False):
if not Spammer.globalPayloads: Spammer.globalPayloads = SpamPayLoad.generatePayloads(globalSpammerId, conf.get('noOfGlobalSpammerPayloads', noOfGlobalSpammerPayloads))
self.payLoads = [random.choice(Spammer.globalPayloads)]
else:
self.payLoads = SpamPayLoad.generatePayloads(id, conf.get('noOfPayloadsPerSpammer', noOfPayloadsPerSpammer))
def getPayLoad(self): return random.choice(self.payLoads)
def generateMessage(self, timeStep, topic):
self.messagesSent+=1
return Message(str(self.id)+'_'+str(self.messagesSent), timeStep, self.getPayLoad(), topic)
if __name__ == '__main__':
currentUsers = []
conf = {'spamRatio': {'localPayloads': 0.75, 'globalPayloads': 0.25}, 'noOfGlobalSpammerPayloads':2}
User.addSpammersInRatio(currentUsers, 100, **conf)
for user in currentUsers:
print user.id, user.payLoads[0].id