class MooreAlghorithm: markers = [] def __init__(self, logPath): self.loger = Loger(logPath) self.loger.clear() def getMarkersPrint(self): printOut = '' for i, row in enumerate(self.markers): whitespace = ' ' * i printOut += '{}{}\n'.format(whitespace, row[i:]) return printOut def glueStates(self): P = [] whatWasGlued = [] allStates = [] for i, row in enumerate(self.markers): cutRow = row[i:] allStates.append(i) glued = [] for k, column in enumerate(cutRow): if k == 0: continue truePos = k + i if column == 0 and truePos not in whatWasGlued: glued.append(truePos) whatWasGlued.append(truePos) if glued: P.append(glued + [i]) whatWasGlued.append(i) # add states that were not glued diff = splitOff(allStates, whatWasGlued)[0] P += [[x] for x in diff] return P def minimize(self, automata): automata.prepereEntriesTable() L = [] N = len(automata.transitionTable) self.markers = res = [[0 for i in range(N)] for j in range(N)] for i, transition in enumerate(automata.transitionTable): for finalState in automata.finalStates: if i not in automata.finalStates: L.append([finalState, i]) self.markers[finalState][i] = 1 self.markers[i][finalState] = 1 index = 1 turnLength = len(L) rawIndex = 1 self.loger.log('Tura 1') while L: pair = L.pop(0) if turnLength + 1 == rawIndex: index += 1 rawIndex = 1 turnLength = len(L) self.loger.log('\nTura {}'.format(index)) for symbol, d in enumerate(automata.transitionTable[0]): entries1 = automata.entriesTable[pair[0]][symbol] entries2 = automata.entriesTable[pair[1]][symbol] self.loger.log('---------') self.loger.log('Pair: [{},{}] symbol: {}'.format( pair[0], pair[1], symbol)) if entries1 is None or entries2 is None: continue self.loger.log('{} is entered by: '.format(pair[0]) + ' '.join(str(x) for x in entries1)) self.loger.log('{} is entered by: '.format(pair[1]) + ' '.join(str(x) for x in entries2)) for entry in entries1: for entry2 in entries2: if self.markers[entry][entry2] == 0 and self.markers[ entry2][entry] == 0: self.loger.log('Can be added: {} {}'.format( entry, entry2)) L.append([entry, entry2]) self.markers[entry][entry2] = index + 1 self.markers[entry2][entry] = index + 1 rawIndex += 1 self.loger.log('\n') printOut = self.getMarkersPrint() P = self.glueStates() automataPrintOut = getAutomataPrintOut(P, automata) self.loger.log(printOut) self.loger.log('Glued states: {}'.format(str(P))) self.loger.log(automataPrintOut) return automataPrintOut
class HopcroftAlghorithm: def __init__(self,logPath): self.loger = Loger(logPath) self.loger.clear() def minimize(self, automata): L = [] P = [automata.finalStates] entries = automata.prepereEntriesTable() # initialize P and L regularStates = [] for i, state in enumerate(automata.transitionTable): if i not in automata.finalStates: regularStates.append(i) P.append(regularStates) # put smaller list on L toPutOnListL = [] if len(P[0]) < len(P[1]): toPutOnListL = statesSplitChar.join(str(x) for x in P[0]) else: toPutOnListL = statesSplitChar.join(str(x) for x in P[1]) for i,d in enumerate(automata.transitionTable[0]): L.append('{}{}{}'.format(toPutOnListL,symbolSplitChar,i)) # as long as there are elements in L loopCounter = 1; # If there is only one state if len(P[0]) < 1 or len(P[1]) < 1: return None while L: self.loger.log('\n======== {}. loop ========\n'.format(loopCounter)) self.loger.log('P: {}'.format(P)) self.loger.log('L: {}'.format(L)) itemFromL = L.pop(0) splited = itemFromL.split(symbolSplitChar) states = splited[0].split(statesSplitChar) symbol = splited[1] whatEnteres = [] for state in states: potentialEntry = automata.entriesTable[int(state)][int(symbol)] if not potentialEntry: continue else: whatEnteres += potentialEntry # łamanie if not whatEnteres: self.loger.log('Nothing enters {} via symbol: {}'.format(states,symbol)) loopCounter+=1 continue self.loger.log('States: {} are entering {} via symbol: {}'.format(whatEnteres,states,symbol)) tmpP = copy.deepcopy(P) self.loger.log('\nLooking for subset \'B\' of P to break apart') for i, B in enumerate(P): splited = splitOff(B, whatEnteres) if len(splited) > 1: self.loger.log('\n{}. B: {} broken by: {} to: {}'.format(i+1,B,whatEnteres,splited)) tmpP.remove(B) for split in splited: tmpP.append(split) self.loger.log('P after breaking up: {}'.format(tmpP)) # Uzupełnienie list L flattenB = ''.join(str(x) for x in B) wasFoundInL = False self.loger.log('L before filling: {}'.format(L)) for g, element in enumerate(L): split = element.split(symbolSplitChar) states = split[0].split(statesSplitChar) symbol = split[1] joinedStates = "".join(states) if flattenB in joinedStates: replaced = L.pop(g) for split in splited: joinedSplit = statesSplitChar.join(str(x) for x in split) self.loger.log('Replaced {} with {} in L'.format(replaced,joinedSplit+symbol)) L.insert(g,joinedSplit+symbolSplitChar+symbol) wasFoundInL = True if not wasFoundInL: if len(splited[0]) != len(splited[1]): splited = sorted(splited,key=len) smallerBreak = splited[0] else: smallerBreak = splited[1] smallerBreak = '-'.join(str(x) for x in smallerBreak) for i, transition in enumerate(automata.transitionTable[0]): L.append(smallerBreak+symbolSplitChar+str(i)) self.loger.log('Added {} to L'.format(smallerBreak+str(i))) self.loger.log('L after filling: {}'.format(L)) else: self.loger.log('\n{}. B: {} cannot be broken by {}'.format(i+1,B,whatEnteres)) P = tmpP loopCounter+=1 self.loger.log("\n") self.loger.log('Final P: {}'.format(P)) automataPrint = getAutomataPrintOut(P,automata) self.loger.log("\nMinimized automata transition table:\n") self.loger.log(automataPrint) return automataPrint;
class Chatting_server: '''A server for chat online service''' User_Info_Dict_Template = {'IP': '', 'PORT': 0, 'NICK': ''} def __init__(self): self.user_list = {} self.loger = Loger('Server is starting...') self.running = False # self.name = '' # self.ip # self.port = 0 # self.max_users = 0 # self.server signal.signal(signal.SIGINT, self.signal_handle) # 处理参数 self.parse_argvs() # 绑定IP和端口,并开启监听 # 进入循环处理消息状态 if self.bing_listen() and self.loop(): pass else: self.loger.log('error while initting server') clean_server() def loop(self): inputs = [self.server] # 新建线程接收来自键盘的消息 thread = threading.Thread(target=self.listen_keyboard) thread.setDaemon(True) thread.start() self.running = True # 等待接收键盘消息的套接字的连接 try: socket_key, t = self.server.accept() inputs.append(socket_key) except socket.error, e: self.loger.log('error while accept key socket') self.running = False # 循环等待消息 while self.running: #self.loger.log('user_list -->> ') #for i in self.user_list.keys(): # self.loger.log('%d ' % i.fileno() + str(self.user_list[i])) #self.loger.log('log before select') t = '[' + str(len(self.user_list)) + '] ' for i in self.user_list.keys(): t += str(i.fileno()) + '(' + self.user_list[i]['NICK'] + ') ' self.loger.log(t) try: rl, wl, el = select.select(inputs, [], []) except select.error, e: self.loger.log('error while selectting : %s' % e) #self.loger.log('log after select') #self.loger.log( 'rs = %d; ws = %d; es = %d' % (len(rl), len(wl), len(el))) # 有事件发生, 可读/可写/异常 for sock in rl: # 有新的连接请求 if sock == self.server: try: client_no, client_info = self.server.accept() except socket.error, e: self.loger.log( 'error while acceptting new connection : %s' % e) self.running = False continue client_info_dict = { 'IP': client_info[0], 'PORT': client_info[1] } if self.insert_user(client_no, client_info_dict): self.loger.log('add new connection %d OK' % client_no.fileno()) else: self.loger.log('add new connection %d failed' % client_no.fileno()) continue inputs.append(client_no) # 有新数据到达 else: try: recv_data = sock.recv(2048) self.loger.log('recveive data from %d [%s]' % (sock.fileno(), recv_data.rstrip())) except socket.error, e: self.loger.log('error while receiving data from %d' % sock.fileno()) self.loger.log('%d will be closed' % sock.fileno()) inputs.remove(sock) self.remove_user(sock) # 来自键盘的消息 if sock == inputs[1]: if 'EXIT' == recv_data: self.running = False continue elif len(recv_data): if recv_data.startswith('$$'): self.command_handle(sock, recv_data[2:], inputs) else: self.check_broadcast(sock, recv_data) else: if self.server == sock: self.running = False self.loger.log('%d has closed the socket' % sock.fileno()) inputs.remove(sock) self.remove_user(sock)
class Chatting_server: '''A server for chat online service''' User_Info_Dict_Template = {'IP':'', 'PORT':0, 'NICK':''} def __init__(self): self.user_list = {} self.loger = Loger('Server is starting...') self.running = False # self.name = '' # self.ip # self.port = 0 # self.max_users = 0 # self.server signal.signal(signal.SIGINT, self.signal_handle) # 处理参数 self.parse_argvs() # 绑定IP和端口,并开启监听 # 进入循环处理消息状态 if self.bing_listen() and self.loop(): pass else: self.loger.log('error while initting server') clean_server() def loop(self): inputs = [self.server] # 新建线程接收来自键盘的消息 thread = threading.Thread(target=self.listen_keyboard) thread.setDaemon(True) thread.start() self.running = True # 等待接收键盘消息的套接字的连接 try: socket_key, t = self.server.accept() inputs.append(socket_key) except socket.error, e: self.loger.log('error while accept key socket') self.running = False # 循环等待消息 while self.running: #self.loger.log('user_list -->> ') #for i in self.user_list.keys(): # self.loger.log('%d ' % i.fileno() + str(self.user_list[i])) #self.loger.log('log before select') t = '[' + str(len(self.user_list)) + '] ' for i in self.user_list.keys(): t += str(i.fileno()) + '(' + self.user_list[i]['NICK']+ ') ' self.loger.log(t) try: rl, wl, el = select.select(inputs, [], []) except select.error, e: self.loger.log('error while selectting : %s' % e) #self.loger.log('log after select') #self.loger.log( 'rs = %d; ws = %d; es = %d' % (len(rl), len(wl), len(el))) # 有事件发生, 可读/可写/异常 for sock in rl: # 有新的连接请求 if sock == self.server: try: client_no, client_info = self.server.accept() except socket.error, e: self.loger.log('error while acceptting new connection : %s' % e) self.running = False continue client_info_dict = {'IP':client_info[0], 'PORT':client_info[1]} if self.insert_user(client_no, client_info_dict): self.loger.log('add new connection %d OK' % client_no.fileno()) else: self.loger.log('add new connection %d failed' % client_no.fileno()) continue inputs.append(client_no) # 有新数据到达 else: try: recv_data = sock.recv(2048) self.loger.log('recveive data from %d [%s]' % (sock.fileno(), recv_data.rstrip())) except socket.error, e: self.loger.log('error while receiving data from %d' % sock.fileno()) self.loger.log('%d will be closed' % sock.fileno()) inputs.remove(sock) self.remove_user(sock) # 来自键盘的消息 if sock == inputs[1]: if 'EXIT' == recv_data: self.running = False continue elif len(recv_data): if recv_data.startswith('$$'): self.command_handle(sock, recv_data[2:], inputs) else: self.check_broadcast(sock, recv_data) else: if self.server == sock: self.running = False self.loger.log('%d has closed the socket' % sock.fileno()) inputs.remove(sock) self.remove_user(sock)