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();
    }
  }
Example #2
0
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;
}
Example #3
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;
}
Example #4
0
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;
}