示例#1
0
bool is_learned(double teacher[][IN_SIZE], double *in, double *out, double weights[][OUT_SIZE])
{
  for (int j = 0; j < MAX_TEACHERS; j++) {
    for (int k = 0; k < IN_SIZE - 1; k++) {
      in[k] = teacher[j][k];
    }

    for (int k = 0; k < OUT_SIZE; k++) {
      // calculating the current output
      double o = 0;
      for (int l = 0; l < IN_SIZE; l++) {
        o += weights[l][k] * in[l];
      }
      if (teacher[j][IN_SIZE-1] != step_func(o)) {
        return false;
      }
    }
  }
  return true;
}
示例#2
0
int main(int argc, char *argv[])
{
  if (argc != 2) {
    std::cerr << "usage: " << argv[0] << " inputfile" << std::endl;
    exit(1);
  }
  double teacher[MAX_TEACHERS][IN_SIZE];
  if (!read_teacher(argv[1], teacher)) {
    std::cerr << "read_teacher failed" << std::endl;
    exit(1);
  }

	double in[IN_SIZE], out[OUT_SIZE];
	double weights[IN_SIZE][OUT_SIZE];

  // initialize weights
	for (int i = 0; i < IN_SIZE; i++) {
		for (int j = 0; j < OUT_SIZE; j++) {
			weights[i][j] = 0; // works only for perceptron ? (should be random numbers)
		}
	}

  // learning
  bool is_learning = true;
  int num_loops = 0;
	while (is_learning) {
		for (int j = 0; j < MAX_TEACHERS; j++) {
      for (int k = 0; k < IN_SIZE - 1; k++) {
        in[k] = teacher[j][k];
      }
      in[IN_SIZE-1] = 1;

      for (int k = 0; k < OUT_SIZE; k++) {
        // calculating the current output
        double o = 0;
        for (int l = 0; l < IN_SIZE; l++) {
          o += weights[l][k] * in[l];
        }
        // check if it fires or not
        out[k] = step_func(o);
      }
      if (is_learned(teacher, in, out, weights)) {
        is_learning = false;
        break;
      }
      // update weights
      for (int k = 0; k < OUT_SIZE; k++) {
        for (int l = 0; l < IN_SIZE; l++) {
          weights[l][k] += ETA * (teacher[j][IN_SIZE-1] - out[k]) * in[l];
        }
      }
		}
    if (++num_loops == MAX_LOOPS) {
      std::cout << "not solved" << std::endl;
      break;
    }
  }
  std::cout << "num_loops: " << num_loops << std::endl;
  for (int k = 0; k < OUT_SIZE; k++) {
    for (int l = 0; l < IN_SIZE; l++) {
      std::cout << weights[l][k] << " ";
    }
    std::cout << std::endl;
  }

  // check if learning works
  for (int j = 0; j < MAX_TEACHERS; j++) {
    for (int k = 0; k < IN_SIZE - 1; k++) {
      in[k] = teacher[j][k];
    }

    for (int k = 0; k < OUT_SIZE; k++) {
      // calculating the current output
      double o = 0;
      for (int l = 0; l < IN_SIZE; l++) {
        o += weights[l][k] * in[l];
      }
      std::cout << "in: " << in[0] << ", " << in[1] << " - o: " << o << std::endl;
    }
  }

	return 0;
}
示例#3
0
connector_status_t connector_step(connector_handle_t const handle)
{
    connector_status_t result = connector_init_error;
    connector_data_t * const connector_ptr = handle;

    ASSERT_GOTO(handle != NULL, done);
    if (connector_ptr->signature != connector_signature) goto done;

    switch (connector_ptr->stop.state)
    {
        case connector_state_running:
            break;
        case connector_state_stop_by_initiate_action:
            if (is_connector_stopped(connector_ptr, connector_close_status_device_stopped))
            {
                result = connector_stop_callback(connector_ptr, connector_transport_all, connector_ptr->stop.user_context);
                if (result == connector_abort)
                {
                    goto error;
                }
                else if (result == connector_working)
                {
                    connector_ptr->stop.state = connector_state_running;
                }
            }
            break;
        case connector_state_abort_by_callback:
        case connector_state_terminate_by_initiate_action:
            if (is_connector_stopped(connector_ptr, connector_close_status_device_terminated))
            {
                connector_ptr->connector_got_device_id = connector_false; /* TODO, Probably this should not be done with provisioning! */
                connector_ptr->signature = NULL;
                result = (connector_ptr->stop.state == connector_state_terminate_by_initiate_action) ? connector_device_terminated : connector_abort;	/* ETHERIOS-EGEAR-MOD */
                free_data_buffer(connector_ptr, named_buffer_id(connector_data), connector_ptr);
                connector_debug_printf("connector_step: free Cloud Connector\n");
                goto done;
            }
            break;
        default:
            break;
    }

#if (CONNECTOR_TRANSPORT_COUNT == 1)
#if (defined CONNECTOR_TRANSPORT_TCP)
    result = connector_edp_step(connector_ptr);
#endif
#if (defined CONNECTOR_TRANSPORT_UDP)
    result = connector_udp_step(connector_ptr);
#endif
#if (defined CONNECTOR_TRANSPORT_SMS)
    result = connector_sms_step(connector_ptr);
#endif

#else
    {
#define next_network(current_network) (((current_network) == last_network_index) ? first_network_index : (connector_network_type_t) ((current_network) + 1))

        connector_network_type_t const first_network_index = (connector_network_type_t) 0;
        connector_network_type_t const last_network_index = (connector_network_type_t) (connector_network_count - 1);
        connector_network_type_t const first_network_checked = connector_ptr->first_running_network;
        connector_network_type_t current_network = first_network_checked;

        do
        {
            connector_status_t (*step_func)(connector_data_t * const connector_ptr);

            switch (current_network)
            {
#if (defined CONNECTOR_TRANSPORT_TCP)
            case connector_network_tcp: step_func = connector_edp_step; break;
#endif
#if (defined CONNECTOR_TRANSPORT_UDP)
            case connector_network_udp: step_func = connector_udp_step; break;
#endif
#if (defined CONNECTOR_TRANSPORT_SMS)
            case connector_network_sms: step_func = connector_sms_step; break;
#endif
            default:
                ASSERT(connector_false);
                result = connector_abort;
                goto error; break;
            }

            result = step_func(connector_ptr);

            current_network = next_network(current_network);
        } while ((current_network != first_network_checked) && (result == connector_idle));

        connector_ptr->first_running_network = (result == connector_idle) ? next_network(first_network_checked): current_network;

#undef next_network
    }
#endif

error:
    switch (result)
    {
    case connector_abort:
        abort_connector(connector_ptr);
        /* no break; */
    case connector_device_terminated:
        result = connector_working;
        break;
    default:
        break;
    }

done:
    return result;
}