cost_function reversible_program_options::costs() const { assert( d->has_costs ); switch ( d->costs ) { case 0: return costs_by_circuit_func( gate_costs() ); case 1: return costs_by_circuit_func( line_costs() ); case 2: return costs_by_gate_func( transistor_costs() ); default: assert( false ); return cost_function(); } }
void *master_connection_handler(void *socket_desc){ //Connection handler for TCP connections //Get the socket descriptor int client_id = clients-1; int sock = *(int*)socket_desc; int read_size; char client_message[BUFSIZE], *message; sleep(1); client_message[0] = (clients-1)+'0'; write(sock , client_message , strlen(client_message)); //Give client ID bzero(client_message,BUFSIZE); struct timeval tv; tv.tv_sec = 11; // 11 Secs Timeout tv.tv_usec = 0; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,(char *)&tv,sizeof(tv)); //Receive a message from client while( (read_size = recv(sock , client_message , BUFSIZE , 0)) > 0 ){ Message message_send,message_receive; message_receive = deserialization(client_message); switch(message_receive.type){ case BUTTON_CHECK: printf("Reciever Button floor & type: "); printf("%d ",message_receive.button.floor); printf("%d \n",message_receive.button.type); switch(message_receive.button.type){ case BUTTON_INSIDE: break; default: if(add_to_queue(message_receive.button.type, message_receive.button.floor)){ char server_message[BUFSIZE]; for(int i = 0;i<6;i++){ message_send.orders[i][0] = queue[i][0]; message_send.orders[i][1] = queue[i][1]; } message_send.ID = cost_function(message_receive.button.type, message_receive.button.floor); printf("Which client gets the order: %d",message_send.ID); message_send.elevator.new_floor_order=message_receive.button.floor; pthread_t order_counter_thread; char order_and_ID[2]; order_and_ID[1] = message_send.ID; if(message_receive.button.type==BUTTON_CALL_UP){ queue[message_receive.button.floor][1] = message_send.ID; queue[message_receive.button.floor][0] = 1; message_send.orders[message_receive.button.floor][1] = message_send.ID; order_and_ID[0] = message_receive.button.floor; pthread_create(&order_counter_thread, NULL, order_counter, (void*)order_and_ID); } else{ queue[message_receive.button.floor+2][1] = message_send.ID; queue[message_receive.button.floor+2][0] = 1; message_send.orders[message_receive.button.floor+2][1] = message_send.ID; order_and_ID[0] = message_receive.button.floor+2; pthread_create(&order_counter_thread, NULL, order_counter, (void*)order_and_ID); } serialization(ELEV_ORDER, message_send, server_message); for(int i = 0;i<clients;i++){ write(client_sockets[i], server_message, strlen(server_message)); } } } break; case ELEV_UPDATE: //Only updates elevator location printf("ELEV FLOOR UPDATE BY ELEVATOR #%d\n",client_id); elev_client[client_id].floor_current = message_receive.elevator.floor_current; elev_client[client_id].direction = message_receive.elevator.direction; for(int i = 0;i<clients;i++){ printf("Elevator #%d \t Floor current: %d \t Direction: %1d\n", i,elev_client[i].floor_current,(int)elev_client[i].direction); } break; case ORDER_UPDATE: //Clears orders that are done and sets lamps elev_client[client_id].floor_current = message_receive.elevator.floor_current; elev_client[client_id].direction = message_receive.elevator.direction; for(int i = 0;i<clients;i++){ printf("Elevator #%d \t Floor current: %d \t Direction: %1d\n", i,elev_client[i].floor_current,(int)elev_client[i].direction); } for(int i = 0;i<6;i++){ queue[i][0] &= message_receive.orders[i][0]; if(!(queue[i][0]&&message_receive.orders[i][0])) queue[i][1] = -1; } puts("\nNew queue"); for(int i = 0;i<6;i++){ printf("Order: %d \t ID: %d\n",queue[i][0],queue[i][1]); } message_send.ID = -1; for(int i = 0;i<6;i++){ message_send.orders[i][0] = queue[i][0]; message_send.orders[i][1] = queue[i][1]; } char server_message[BUFSIZE]; serialization(ELEV_ORDER, message_send, server_message); for(int i = 0;i<clients;i++){ write(client_sockets[i], server_message, strlen(server_message)); } break; case NETCHECK: client_checkin[client_id] = 1; break; case ID_UPDATE: client_id = message_receive.ID; break; } bzero(client_message,BUFSIZE); } if(read_size == 0){ puts("Client disconnected"); clients--; fflush(stdout); printf("#Clients: %d\n",clients); if(client_id == 0){ system("gnome-terminal -x ./elevator 0"); } else{ if((clients+1)==2 && client_id == 1){//Client 1 disconnected, client 2 will now be client 1 elev_client[1].floor_current = elev_client[2].floor_current; Message message_send; message_send.type = ID_UPDATE; message_send.ID = client_id; client_sockets[1] = client_sockets[2]; char server_message[BUFSIZE]; serialization(ID_UPDATE, message_send, server_message); write(client_sockets[1], server_message, strlen(server_message)); } reallocate_orders(clients); } } else if(read_size == -1){ clients--; perror("recv failed, handler"); printf("Client id: %d", client_id); printf("#Clients: %d\n",clients); if((clients+1)==2 && client_id == 1){//Client 1 disconnected, client 2 will now be client 1 elev_client[1].floor_current = elev_client[2].floor_current; Message message_send; message_send.type = ID_UPDATE; message_send.ID = client_id; client_sockets[1] = client_sockets[2]; char server_message[BUFSIZE]; serialization(ID_UPDATE, message_send, server_message); write(client_sockets[1], server_message, strlen(server_message)); } reallocate_orders(clients); } //Free the socket pointer free(socket_desc); return 0; }
PRIVATE double adaptive_walk(char *start, const char *target) { #ifdef DUMMY printf("%s\n%s %c\n", start, target, backtrack_type ); return 0.; #endif int i,j,p,tt,w1,w2, n_pos, len, flag; long walk_len; char *string, *string2, *cstring, *structure, *struct2; int *mut_pos_list, mut_sym_list[MAXALPHA+1], mut_pair_list[2*MAXALPHA+1]; int *w1_list, *w2_list, mut_position, symbol, bp; int *target_table, *test_table; char cont; double cost, current_cost, ccost2; double (*cost_function)(const char *, char *, const char *); len = strlen(start); if (strlen(target)!=len) { fprintf(stderr, "%s\n%s\n", start, target); nrerror("adaptive_walk: start and target have unequal length"); } string = (char *) space(sizeof(char)*(len+1)); cstring = (char *) space(sizeof(char)*(len+1)); string2 = (char *) space(sizeof(char)*(len+1)); structure = (char *) space(sizeof(char)*(len+1)); struct2 = (char *) space(sizeof(char)*(len+1)); mut_pos_list = (int *) space(sizeof(int)*len); w1_list = (int *) space(sizeof(int)*len); w2_list = (int *) space(sizeof(int)*len); target_table = (int *) space(sizeof(int)*len); test_table = (int *) space(sizeof(int)*len); make_ptable(target, target_table); for (i=0; i<base; i++) mut_sym_list[i] = i; for (i=0; i<npairs; i++) mut_pair_list[i] = i; for (i=0; i<len; i++) string[i] = (islower(start[i]))?toupper(start[i]):start[i]; walk_len = 0; if (fold_type==0) cost_function = mfe_cost; else cost_function = pf_cost; cost = cost_function(string, structure, target); if (fold_type==0) ccost2=cost2; else { ccost2 = -1.; cost2=0; } strcpy(cstring, string); current_cost = cost; if (cost>0) do { cont=0; if (fold_type==0) { /* min free energy fold */ make_ptable(structure, test_table); for (j=w1=w2=flag=0; j<len; j++) if ((tt=target_table[j])!=test_table[j]) { if ((tt<j)&&(isupper(start[j]))) w1_list[w1++] = j; /* incorrectly paired */ if ((flag==0)&&(j>0)) if ((target_table[j-1]<j-1)&&isupper(start[j-1])) w2_list[w2++] = j-1; /* adjacent to incorrect position */ if (w2>1) if (w2_list[w2-2]==w2_list[w2-1]) w2--; flag = 1; } else { if (flag==1) if ((tt<j)&&isupper(start[j])) w2_list[w2++] = j; /* adjacent to incorrect position */ flag = 0; } shuffle(w1_list, w1); shuffle(w2_list, w2); for (j=n_pos=0; j<w1; j++) mut_pos_list[n_pos++] = w1_list[j]; for (j=0; j<w2; j++) mut_pos_list[n_pos++] = w2_list[j]; } else { /* partition_function */ for (j=n_pos=0; j<len; j++) if (isupper(start[j])) if (target_table[j]<=j) mut_pos_list[n_pos++] = j; shuffle(mut_pos_list, n_pos); } string2[0]='\0'; for (mut_position=0; mut_position<n_pos; mut_position++){ strcpy(string, cstring); shuffle(mut_sym_list, base); shuffle(mut_pair_list, npairs); i = mut_pos_list[mut_position]; if (target_table[i]<0) /* unpaired base */ for (symbol=0;symbol<base;symbol++) { if(cstring[i]== symbolset[mut_sym_list[symbol]]) continue; string[i] = symbolset[mut_sym_list[symbol]]; cost = cost_function(string, structure, target); if ( cost + DBL_EPSILON < current_cost ) break; if (( cost == current_cost)&&(cost2<ccost2)){ strcpy(string2, string); strcpy(struct2, structure); ccost2 = cost2; } } else /* paired base */ for (bp=0; bp<npairs; bp++) { j = target_table[i]; p = mut_pair_list[bp]*2; if ((cstring[i] == pairset[p]) && (cstring[j] == pairset[p+1])) continue; string[i] = pairset[p]; string[j] = pairset[p+1]; cost = cost_function(string, structure, target); if ( cost < current_cost ) break; if (( cost == current_cost)&&(cost2<ccost2)){ strcpy(string2, string); strcpy(struct2, structure); ccost2 = cost2; } } if ( cost < current_cost ) { strcpy(cstring, string); current_cost = cost; ccost2 = cost2; walk_len++; if (cost>0) cont=1; break; } } if ((current_cost>0)&&(cont==0)&&(string2[0])) { /* no mutation that decreased cost was found, but the the sequence in string2 decreases cost2 while keeping cost constant */ strcpy(cstring, string2); strcpy(structure, struct2); nc2++; cont=1; } } while (cont); for (i=0; i<len; i++) if (isupper(start[i])) start[i]=cstring[i]; #if TDIST if (fold_type==0) { free_tree(T0); T0=NULL; } #endif free(test_table); free(target_table); free(mut_pos_list); free(w2_list); free(w1_list); free(struct2); free(structure); free(string2); free(cstring); free(string); return current_cost; }
void *master_connection_handler(void *socket_desc){ int client_id = clients-1; int sock = *(int*)socket_desc; int read_size; char client_message[BUFSIZE], *message; sleep(1); client_message[0] = (clients-1)+'0'; write(sock , client_message , strlen(client_message)); //Give client ID bzero(client_message,BUFSIZE); //Set up timed socket struct timeval tv; tv.tv_sec = 11; tv.tv_usec = 0; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,(char *)&tv,sizeof(tv)); while( (read_size = recv(sock , client_message , BUFSIZE , 0)) > 0 ){ Message message_send,message_receive; message_receive = deserialization(client_message); switch(message_receive.type){ case BUTTON_CHECK: if(add_to_queue(message_receive.button.type, message_receive.button.floor)){ char server_message[BUFSIZE]; for(int i = 0;i<6;i++){ message_send.orders[i][0] = queue[i][0]; message_send.orders[i][1] = queue[i][1]; } message_send.ID = cost_function(message_receive.button.type, message_receive.button.floor); message_send.elevator.new_floor_order=message_receive.button.floor; pthread_t order_counter_thread; char order_and_ID[2]; order_and_ID[1] = message_send.ID; //Starts counter on each order if(message_receive.button.type==BUTTON_CALL_UP){ queue[message_receive.button.floor][1] = message_send.ID; queue[message_receive.button.floor][0] = 1; message_send.orders[message_receive.button.floor][1] = message_send.ID; order_and_ID[0] = message_receive.button.floor; pthread_create(&order_counter_thread, NULL, order_counter, (void*)order_and_ID); } else{ queue[message_receive.button.floor+2][1] = message_send.ID; queue[message_receive.button.floor+2][0] = 1; message_send.orders[message_receive.button.floor+2][1] = message_send.ID; order_and_ID[0] = message_receive.button.floor+2; pthread_create(&order_counter_thread, NULL, order_counter, (void*)order_and_ID); } serialization(ELEV_ORDER, message_send, server_message); for(int i = 0;i<clients;i++){ write(client_sockets[i], server_message, strlen(server_message)); } } break; case ELEV_UPDATE: //Updates elevator location elev_client[client_id].floor_current = message_receive.elevator.floor_current; elev_client[client_id].direction = message_receive.elevator.direction; break; case ORDER_UPDATE: //Clears orders that are done and sets lamps elev_client[client_id].floor_current = message_receive.elevator.floor_current; elev_client[client_id].direction = message_receive.elevator.direction; for(int i = 0;i<6;i++){ queue[i][0] &= message_receive.orders[i][0]; if(!(queue[i][0]&&message_receive.orders[i][0])) queue[i][1] = -1; } puts("\nNew queue"); for(int i = 0;i<6;i++){ printf("Order: %d \t ID: %d\n",queue[i][0],queue[i][1]); } message_send.ID = -1; for(int i = 0;i<6;i++){ message_send.orders[i][0] = queue[i][0]; message_send.orders[i][1] = queue[i][1]; } char server_message[BUFSIZE]; serialization(ELEV_ORDER, message_send, server_message); for(int i = 0;i<clients;i++){ write(client_sockets[i], server_message, strlen(server_message)); } break; case NETCHECK: break; case ID_UPDATE: client_id = message_receive.ID; break; } bzero(client_message,BUFSIZE); } if(read_size == 0){ puts("Client disconnected, terminal exit"); clients--; fflush(stdout); printf("#Clients: %d\n",clients); if(client_id == 0){ system("gnome-terminal -x ./elevator 0"); } else{ if((clients+1)==2 && client_id == 1){//Client 1 disconnected, client 2 will now be client 1 elev_client[1].floor_current = elev_client[2].floor_current; Message message_send; message_send.type = ID_UPDATE; message_send.ID = client_id; client_sockets[1] = client_sockets[2]; char server_message[BUFSIZE]; serialization(ID_UPDATE, message_send, server_message); write(client_sockets[1], server_message, strlen(server_message)); } } sleep(1); reallocate_orders(clients); Message message_send; char server_message[BUFSIZE]; for(int i = 0;i<6;i++){ message_send.orders[i][0] = queue[i][0]; message_send.orders[i][1] = queue[i][1]; } serialization(ORDER_UPDATE, message_send, server_message); for(int i = 0;i<clients;i++){ write(client_sockets[i], server_message, strlen(server_message)); } } else if(read_size == -1){ clients--; perror("Network connection lost"); printf("Client id: %d", client_id); printf("#Clients: %d\n",clients); if((clients+1)==2 && client_id == 1){//Client 1 disconnected, client 2 will now be client 1 elev_client[1].floor_current = elev_client[2].floor_current; Message message_send; message_send.type = ID_UPDATE; message_send.ID = client_id; client_sockets[1] = client_sockets[2]; char server_message[BUFSIZE]; serialization(ID_UPDATE, message_send, server_message); write(client_sockets[1], server_message, strlen(server_message)); } sleep(1); reallocate_orders(clients); Message message_send; char server_message[BUFSIZE]; for(int i = 0;i<6;i++){ message_send.orders[i][0] = queue[i][0]; message_send.orders[i][1] = queue[i][1]; } serialization(ORDER_UPDATE, message_send, server_message); for(int i = 0;i<clients;i++){ write(client_sockets[i], server_message, strlen(server_message)); } } //Free the socket pointer free(socket_desc); return 0; }