Full completed project

This commit is contained in:
2025-02-10 12:37:33 +00:00
commit b9abff8012
229 changed files with 16866 additions and 0 deletions

View File

@@ -0,0 +1,132 @@
from modules.user import info as user_info
from modules.algorithms.univ import dict_key_verify
from modules.algorithms.uuid import hash_string
class User():
def __init__(self, username, origin=False):
self.username = username
self.friends = user_info.friend(username=username)
self.origin = origin
self.exclude = []
self.count = 1
self.depth = 0
self.score = 0
self.friend_list = []
def find_friends(self, exclude=[], **kwargs):
self.exclude += exclude
friends = self.friends.get()
if dict_key_verify(friends, "friends"):
self.__organise_friends(friends['friends'])
self.__find_excluded()
def __organise_friends(self, friends, **kwargs):
for friend in friends:
if friend['username'] not in self.exclude:
self.friend_list.append(User(friend['username']))
def __find_excluded(self):
if self.username not in self.exclude:
self.exclude.append(self.username)
if self.origin:
self.exclude = self.exclude + [friend.username for friend in self.friend_list]
requests = self.friends.get_requests()
print(f"requests: {requests}")
if dict_key_verify(requests, "requests"):
self.exclude = self.exclude + [request for request in requests["requests"]]
print(f"EXCLUDED: {self.exclude}")
def __hash__(self):
obj_hash = hash_string(self.username)
return obj_hash
class Graph():
def __init__(self, username):
self.origin_user = User(username, True)
self.graph = [[]] * (10**7+7)
self.friend_directory = [None] * (10**7+7)
self.friend_directory[hash(self.origin_user)] = self.origin_user
self.exclude = []
def generate(self, depth=1):
self.__add_user_friends(self.origin_user, self.origin_user, depth)
def __add_user_friends(self, origin, source, depth):
origin.find_friends(self.exclude + [source.username])
if hash(self.origin_user) == hash(origin):
self.exclude += origin.exclude
for friend in origin.friend_list:
friend_hash = hash(friend)
self.__add_edge(hash(origin), friend_hash)
if self.friend_directory[friend_hash]:
self.friend_directory[friend_hash].count += 1
self.friend_directory[friend_hash].depth += depth
else:
self.friend_directory[friend_hash] = friend
if depth-1 > 0:
self.__add_user_friends(friend, origin, depth-1)
def __add_edge(self, node, edge):
self.graph[node] = self.graph[node] + [edge]
def dft(self):
self.visted = []
self.edge_stack = [hash(self.origin_user)]
self.edge_queue = [hash(self.origin_user)]
self.__visit(self.edge_stack[0])
def __visit(self, origin):
start_pos = self.graph[origin]
self.__on_visit(origin)
self.edge_stack.pop(len(self.edge_stack)-1)
self.visted.append(origin)
for neigbour in start_pos:
if neigbour not in self.visted and neigbour not in self.edge_stack:
self.edge_stack.append(neigbour)
while len(self.edge_stack) > 0:
i = len(self.edge_stack) - 1
self.__visit(self.edge_stack[i])
def __on_visit(self, origin):
origin_obj = self.friend_directory[origin]
origin_obj.score += origin_obj.depth
def recomend_friends(self):
self.recomendations = []
while len(self.recomendations) != len(self.visted):
largest = User(username="")
largest.score = -1
for friend in self.visted:
friend_obj = self.friend_directory[friend]
if friend_obj not in self.recomendations and friend_obj.score > largest.score:
largest = friend_obj
self.recomendations.append(largest)
def recomend_friend(amount=1, depth=1):
if depth not in [1, 2, 3, 4]:
depth = 4
friend_graph = Graph("user1")
friend_graph.generate(depth)
friend_graph.dft()
friend_graph.recomend_friends()
recomended = [{'username': recomended.username} for recomended in friend_graph.recomendations[:amount]]
print(recomended)
return recomended
def main():
recomend_friend(3, 4)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,156 @@
from modules.user import info as user_info
from modules.algorithms.univ import dict_key_verify
from modules.algorithms.uuid import hash_string
# RBP
import time
# RBP
class user():
def __init__(self, username, origin=False, **kwargs):
self.username = username
self.origin = origin
self.friend_list = []
self.friends = user_info.friend(username=self.username)
self.count = 1
def print_list(self):
username_list = [friend.username for friend in self.friend_list]
return username_list
def print_count(self):
count_list = []
for friend in self.friend_list:
if self.friend_count[hash(friend)] != 0:
count_list.append({friend.username: friend.count})
return count_list
def get_friends(self, depth=1, exclude=[], **kwargs):
friends = self.friends.get()
if dict_key_verify(friends, "friends"):
self.__organise_friends(friends['friends'], depth, exclude)
def __organise_friends(self, friends, depth=1, exclude=[], **kwargs):
for friend in friends:
if friend['username'] not in exclude:
self.friend_list.append(user(friend['username']))
depth -= 1
if depth > 0:
if self.username not in exclude:
exclude.append(self.username)
if self.origin:
exclude = exclude + [friend.username for friend in self.friend_list]
for friend in self.friend_list:
friend.get_friends(depth=depth, exclude=exclude)
def count_friend_frequency_old(self):
friend_count = []
self.friend_count = self.__inspect_friends(friend_count)
def __inspect_friends_old(self, friend_count):
for friend in self.friend_list:
if friend.friend_list:
friend_count = friend.__inspect_friends(friend_count)
hash_friend_count = [hash(friend) for friend in friend_count]
found = False
for i, friend_hash in enumerate(hash_friend_count):
if friend_hash == hash(friend):
friend_count[i].count += 1
found = True
break
if not found:
friend_count.append(friend)
return friend_count
def count_friend_frequency(self):
pre = time.time()
friend_count = [0]*(10**7+7)
print(f"friend_count took to create: {time.time() - pre}")
self.friend_count = self.__inspect_friends(friend_count)
def __inspect_friends(self, friend_count):
for friend in self.friend_list:
if friend.friend_list:
friend_count = friend.__inspect_friends(friend_count)
print("returned")
print("")
if friend in friend_count:
pre = time.time()
friend_count[hash(friend)].count += 1
print(f"count lookup took: {time.time() - pre}")
else:
pre = time.time()
friend_count[hash(friend)] = friend
print(f"append lookup took: {time.time() - pre}")
print("RETURNING")
return friend_count
def count_user_frequency(self):
user_id = user_info.user_id(username=self.username).get()['user_id']
self.cur.execute("SELECT COUNT * FROM friends WHERE friend_id = ?", (user_id,))
rez = self.cur.fetchone()
if rez:
return rez[0]
else:
return 0
def __hash__(self):
obj_hash = hash_string(self.username)
return obj_hash
def choose_recomendations(amount, origin_user):
recomended = []
recomended_hash = []
for i in range(amount):
largest = user("user")
largest.count = 0
for friend in origin_user.friend_list:
if origin_user.friend_count[hash(friend)] != 0:
if hash(friend) not in recomended_hash:
if friend.count > largest.count:
largest = friend
elif friend.count == largest.count:
largest_frequency = largest.count_user_frequency()
friend_frequency = friend.count_user_frequency()
if friend_frequency > largest_frequency:
largest = friend
recomended.append(largest)
recomended_hash.append(hash(largest))
# RBP
for i, friend in enumerate(recomended):
print(f"{i}: {friend.username}")
# RBP
return recomended
def friend_recomend(username, amount=1, depth=1, **kwargs):
origin_user = user(username, origin=True)
origin_user.get_friends(depth)
print(f"origin_user: {origin_user.username}: {origin_user.print_list()}")
if not origin_user.friend_list:
# NOT FINSIHED
pass
db.cur.execute("SELECT COUNT * FROM friends")
origin_user.count_friend_frequency()
print(origin_user.print_count())
recomended = choose_recomendations(amount, origin_user)
def main():
friend_recomend("user1", 1, 3)
if __name__ == "__main__":
main()