Weather casting with Machine Learning (SVM and SRNN).
Dependencies: EthernetInterface GraphicHandler NTPClient SRNN SVM SensorModule mbed-rtos mbed
setup.cpp@6:29d393d430d0, 2015-02-22 (annotated)
- Committer:
- yukari_hinata
- Date:
- Sun Feb 22 01:06:19 2015 +0000
- Revision:
- 6:29d393d430d0
- Parent:
- 5:b61f3f5b0fc8
add svm sample data
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yukari_hinata | 0:f6cdb984f638 | 1 | #include "setup.hpp" |
yukari_hinata | 0:f6cdb984f638 | 2 | |
yukari_hinata | 0:f6cdb984f638 | 3 | // mcsvmのセットアップ : サンプル/係数のセット |
yukari_hinata | 0:f6cdb984f638 | 4 | static void mcsvm_setup(void) |
yukari_hinata | 0:f6cdb984f638 | 5 | { |
yukari_hinata | 0:f6cdb984f638 | 6 | FILE* svm_setup_fp; |
yukari_hinata | 0:f6cdb984f638 | 7 | char buf_str[20]; |
yukari_hinata | 0:f6cdb984f638 | 8 | int ret, line; |
yukari_hinata | 0:f6cdb984f638 | 9 | float buf_data[DIM_SIGNAL]; |
yukari_hinata | 0:f6cdb984f638 | 10 | |
yukari_hinata | 2:20ecfe6edd71 | 11 | float* svm_tmp_sample = new float[MCSVM_NUM_SAMPLES * DIM_SIGNAL]; |
yukari_hinata | 2:20ecfe6edd71 | 12 | int* svm_tmp_sample_label = new int[MCSVM_NUM_SAMPLES]; |
yukari_hinata | 2:20ecfe6edd71 | 13 | float* svm_tmp_mc_alpha = new float[MCSVM_NUM_SAMPLES * NUM_WEATHERS * (NUM_WEATHERS - 1) / 2]; |
yukari_hinata | 0:f6cdb984f638 | 14 | |
yukari_hinata | 6:29d393d430d0 | 15 | // You can use /dat/SVM_SAMP.txt |
yukari_hinata | 2:20ecfe6edd71 | 16 | svm_setup_fp = fopen( "/local/SVM_SAMP.CSV" , "r" ); |
yukari_hinata | 0:f6cdb984f638 | 17 | if( svm_setup_fp == NULL ) { |
yukari_hinata | 0:f6cdb984f638 | 18 | fprintf( stderr, "Error in svm setup : sample file cannot open. \r \n" ); |
yukari_hinata | 0:f6cdb984f638 | 19 | exit(1); |
yukari_hinata | 0:f6cdb984f638 | 20 | } |
yukari_hinata | 0:f6cdb984f638 | 21 | |
yukari_hinata | 0:f6cdb984f638 | 22 | line = 0; |
yukari_hinata | 0:f6cdb984f638 | 23 | while( ( ret = fscanf( svm_setup_fp, " %[^\n,],%f,%f,%f", buf_str, &(buf_data[0]), &(buf_data[1]), &(buf_data[2])) ) != EOF ) { |
yukari_hinata | 1:8538381cae81 | 24 | |
yukari_hinata | 0:f6cdb984f638 | 25 | if ( !strcmp(buf_str,"shiny") ) { |
yukari_hinata | 2:20ecfe6edd71 | 26 | svm_tmp_sample_label[line] = SHINY; |
yukari_hinata | 0:f6cdb984f638 | 27 | } else if ( !strcmp(buf_str,"cloudy") ) { |
yukari_hinata | 2:20ecfe6edd71 | 28 | svm_tmp_sample_label[line] = CLOUDY; |
yukari_hinata | 0:f6cdb984f638 | 29 | } else if ( !strcmp(buf_str,"rainy") ) { |
yukari_hinata | 2:20ecfe6edd71 | 30 | svm_tmp_sample_label[line] = RAINY; |
yukari_hinata | 0:f6cdb984f638 | 31 | } else if ( !strcmp(buf_str,"snowy") ) { |
yukari_hinata | 2:20ecfe6edd71 | 32 | svm_tmp_sample_label[line] = SNOWY; |
yukari_hinata | 0:f6cdb984f638 | 33 | } else { |
yukari_hinata | 0:f6cdb984f638 | 34 | continue; |
yukari_hinata | 0:f6cdb984f638 | 35 | } |
yukari_hinata | 0:f6cdb984f638 | 36 | |
yukari_hinata | 2:20ecfe6edd71 | 37 | memcpy(&(svm_tmp_sample[line * DIM_SIGNAL]), buf_data, sizeof(float) * DIM_SIGNAL); |
yukari_hinata | 2:20ecfe6edd71 | 38 | // printf("svm sample loading.... ret : %d line : %d %s %f %f %f \r\n", ret, line, buf_str, svm_tmp_sample[line*3], svm_tmp_sample[line*3+1], svm_tmp_sample[line*3+2]); |
yukari_hinata | 0:f6cdb984f638 | 39 | line++; |
yukari_hinata | 0:f6cdb984f638 | 40 | } |
yukari_hinata | 0:f6cdb984f638 | 41 | |
yukari_hinata | 2:20ecfe6edd71 | 42 | mcsvm = new MCSVM(NUM_WEATHERS, DIM_SIGNAL, MCSVM_NUM_SAMPLES, svm_tmp_sample, svm_tmp_sample_label); |
yukari_hinata | 0:f6cdb984f638 | 43 | |
yukari_hinata | 2:20ecfe6edd71 | 44 | // Thank you freopen. |
yukari_hinata | 2:20ecfe6edd71 | 45 | // Here, we should not use fclose -> fopen |
yukari_hinata | 6:29d393d430d0 | 46 | |
yukari_hinata | 6:29d393d430d0 | 47 | // You can use /dat/SVM_ALPH.txt |
yukari_hinata | 2:20ecfe6edd71 | 48 | svm_setup_fp = freopen("/local/SVM_ALPH.CSV", "r", svm_setup_fp ); |
yukari_hinata | 2:20ecfe6edd71 | 49 | fflush( svm_setup_fp ); // required. |
yukari_hinata | 2:20ecfe6edd71 | 50 | |
yukari_hinata | 0:f6cdb984f638 | 51 | if ( svm_setup_fp == NULL ) { |
yukari_hinata | 0:f6cdb984f638 | 52 | fprintf( stderr, "Error in open learned alpha data. \r\n"); |
yukari_hinata | 0:f6cdb984f638 | 53 | exit(1); |
yukari_hinata | 0:f6cdb984f638 | 54 | } |
yukari_hinata | 0:f6cdb984f638 | 55 | |
yukari_hinata | 0:f6cdb984f638 | 56 | // 一列のデータではfscanfフォーマットがだるいので, fgetsを使用 |
yukari_hinata | 0:f6cdb984f638 | 57 | line = 0; |
yukari_hinata | 2:20ecfe6edd71 | 58 | while( fgets( buf_str, 20, svm_setup_fp ) != NULL ) { |
yukari_hinata | 2:20ecfe6edd71 | 59 | svm_tmp_mc_alpha[line] = atof(buf_str); |
yukari_hinata | 0:f6cdb984f638 | 60 | // printf("%d %f \r\n", line, tmp_mc_alpha[line]); |
yukari_hinata | 0:f6cdb984f638 | 61 | line++; |
yukari_hinata | 0:f6cdb984f638 | 62 | } |
yukari_hinata | 1:8538381cae81 | 63 | |
yukari_hinata | 2:20ecfe6edd71 | 64 | fclose( svm_setup_fp ); |
yukari_hinata | 2:20ecfe6edd71 | 65 | |
yukari_hinata | 2:20ecfe6edd71 | 66 | mcsvm->set_alpha(svm_tmp_mc_alpha, MCSVM_NUM_SAMPLES, NUM_WEATHERS); |
yukari_hinata | 1:8538381cae81 | 67 | |
yukari_hinata | 2:20ecfe6edd71 | 68 | delete [] svm_tmp_sample; |
yukari_hinata | 2:20ecfe6edd71 | 69 | delete [] svm_tmp_sample_label; |
yukari_hinata | 2:20ecfe6edd71 | 70 | delete [] svm_tmp_mc_alpha; |
yukari_hinata | 0:f6cdb984f638 | 71 | |
yukari_hinata | 0:f6cdb984f638 | 72 | } |
yukari_hinata | 0:f6cdb984f638 | 73 | |
yukari_hinata | 0:f6cdb984f638 | 74 | // SRNNのセットアップ. 初期データのセット. |
yukari_hinata | 0:f6cdb984f638 | 75 | static void srnn_setup(void) |
yukari_hinata | 0:f6cdb984f638 | 76 | { |
yukari_hinata | 1:8538381cae81 | 77 | FILE* srnn_setup_fp; |
yukari_hinata | 1:8538381cae81 | 78 | int ret; |
yukari_hinata | 1:8538381cae81 | 79 | float buf_data[DIM_SIGNAL]; |
yukari_hinata | 3:5add3759e08a | 80 | float sample_maxmin[DIM_SIGNAL * 2]; |
yukari_hinata | 2:20ecfe6edd71 | 81 | char buf_str[20]; |
yukari_hinata | 5:b61f3f5b0fc8 | 82 | |
yukari_hinata | 5:b61f3f5b0fc8 | 83 | // グローバルなサンプルキューを**ここで**アロケート |
yukari_hinata | 5:b61f3f5b0fc8 | 84 | srnn_sample_queue = new float[DIM_SIGNAL * LEN_DATA_SEQUENCE]; |
yukari_hinata | 0:f6cdb984f638 | 85 | |
yukari_hinata | 1:8538381cae81 | 86 | // 信号の正規化のために, 信号の最大値と最小値を決めてやる必要がある. |
yukari_hinata | 1:8538381cae81 | 87 | sample_maxmin[0] = 50; |
yukari_hinata | 1:8538381cae81 | 88 | sample_maxmin[1] = -20; // 気温の最大/最小値(想定値) |
yukari_hinata | 1:8538381cae81 | 89 | sample_maxmin[2] = 1030; |
yukari_hinata | 1:8538381cae81 | 90 | sample_maxmin[3] = 960; // 気圧 |
yukari_hinata | 1:8538381cae81 | 91 | sample_maxmin[4] = 100; |
yukari_hinata | 1:8538381cae81 | 92 | sample_maxmin[5] = 0; // 湿度 |
yukari_hinata | 0:f6cdb984f638 | 93 | |
yukari_hinata | 2:20ecfe6edd71 | 94 | srnn_setup_fp = fopen( SEQUENCE_DATA_NAME, "r"); |
yukari_hinata | 1:8538381cae81 | 95 | if( srnn_setup_fp == NULL ) { |
yukari_hinata | 2:20ecfe6edd71 | 96 | fprintf( stderr, "Error in SRNN setup. sample file cannot open. \r\n"); |
yukari_hinata | 1:8538381cae81 | 97 | exit(1); |
yukari_hinata | 1:8538381cae81 | 98 | } |
yukari_hinata | 0:f6cdb984f638 | 99 | |
yukari_hinata | 1:8538381cae81 | 100 | int line = 0; |
yukari_hinata | 2:20ecfe6edd71 | 101 | while( ( ret = fscanf( srnn_setup_fp, " %[^\n,],%f,%f,%f", buf_str, &(buf_data[0]), &(buf_data[1]), &(buf_data[2])) ) != EOF ) { |
yukari_hinata | 4:00da8e8c7e2a | 102 | if ( line == LEN_DATA_SEQUENCE ) break; |
yukari_hinata | 5:b61f3f5b0fc8 | 103 | memcpy(&(srnn_sample_queue[line * DIM_SIGNAL]), buf_data, sizeof(float) * DIM_SIGNAL); |
yukari_hinata | 5:b61f3f5b0fc8 | 104 | // printf("sample %d : %f %f %f \r\n", line, MATRIX_AT(srnn_sample_queue,DIM_SIGNAL,line,0),MATRIX_AT(srnn_sample_queue,DIM_SIGNAL,line,1), MATRIX_AT(srnn_sample_queue,DIM_SIGNAL,line,2)); |
yukari_hinata | 1:8538381cae81 | 105 | line++; |
yukari_hinata | 1:8538381cae81 | 106 | } |
yukari_hinata | 0:f6cdb984f638 | 107 | |
yukari_hinata | 2:20ecfe6edd71 | 108 | fclose( srnn_setup_fp ); |
yukari_hinata | 2:20ecfe6edd71 | 109 | |
yukari_hinata | 1:8538381cae81 | 110 | /* アドバイス:RNNにおいては,ダイナミクス(中間層のニューロン数)は多いほど良い */ |
yukari_hinata | 5:b61f3f5b0fc8 | 111 | srnn = new SRNN(DIM_SIGNAL, 20, LEN_DATA_SEQUENCE, PREDICT_LENGTH, srnn_sample_queue, sample_maxmin); |
yukari_hinata | 2:20ecfe6edd71 | 112 | |
yukari_hinata | 0:f6cdb984f638 | 113 | } |
yukari_hinata | 0:f6cdb984f638 | 114 | |
yukari_hinata | 0:f6cdb984f638 | 115 | // センサーのセットアップ. |
yukari_hinata | 0:f6cdb984f638 | 116 | static void sensor_setup(void) |
yukari_hinata | 0:f6cdb984f638 | 117 | { |
yukari_hinata | 1:8538381cae81 | 118 | sensor_module = new SensorModule(5); |
yukari_hinata | 0:f6cdb984f638 | 119 | } |
yukari_hinata | 0:f6cdb984f638 | 120 | |
yukari_hinata | 5:b61f3f5b0fc8 | 121 | // ネットワークのセットアップ |
yukari_hinata | 0:f6cdb984f638 | 122 | static void network_setup(void) |
yukari_hinata | 0:f6cdb984f638 | 123 | { |
yukari_hinata | 0:f6cdb984f638 | 124 | // セットアップ, 最初の時間取得 |
yukari_hinata | 3:5add3759e08a | 125 | const char prefix_net_str[] = "[Network Status]"; |
yukari_hinata | 1:8538381cae81 | 126 | |
yukari_hinata | 1:8538381cae81 | 127 | //setup ethernet interface |
yukari_hinata | 1:8538381cae81 | 128 | printf("%s Ethernet initializing....", prefix_net_str); |
yukari_hinata | 1:8538381cae81 | 129 | if ( eth_if.init() < 0 ) {// Use DHCP |
yukari_hinata | 1:8538381cae81 | 130 | fprintf( stderr, "%s Ethernet init failed. \r\n", prefix_net_str); |
yukari_hinata | 1:8538381cae81 | 131 | exit(1); |
yukari_hinata | 1:8538381cae81 | 132 | } |
yukari_hinata | 1:8538381cae81 | 133 | |
yukari_hinata | 1:8538381cae81 | 134 | if ( eth_if.connect() < 0 ) { |
yukari_hinata | 2:20ecfe6edd71 | 135 | // (offlineが確定する -> offline modeへ). |
yukari_hinata | 5:b61f3f5b0fc8 | 136 | fprintf( stderr, "%s Ethernet connect failed. Go To offline \r\n", prefix_net_str); |
yukari_hinata | 5:b61f3f5b0fc8 | 137 | return; |
yukari_hinata | 1:8538381cae81 | 138 | } |
yukari_hinata | 1:8538381cae81 | 139 | |
yukari_hinata | 1:8538381cae81 | 140 | // init time |
yukari_hinata | 1:8538381cae81 | 141 | printf("%s Trying to update time...\r\n", prefix_net_str); |
yukari_hinata | 1:8538381cae81 | 142 | |
yukari_hinata | 1:8538381cae81 | 143 | // Please specify near ntp server. ex) Japan -> ntp.nict.jp:123 |
yukari_hinata | 1:8538381cae81 | 144 | if (ntp_client.setTime("ntp.nict.jp") == 0) { |
yukari_hinata | 2:20ecfe6edd71 | 145 | printf("%s Set time successfully! \r\n", prefix_net_str); |
yukari_hinata | 1:8538381cae81 | 146 | } else { |
yukari_hinata | 1:8538381cae81 | 147 | fprintf( stderr, "%s Error in setup time \r\n", prefix_net_str); |
yukari_hinata | 1:8538381cae81 | 148 | } |
yukari_hinata | 1:8538381cae81 | 149 | |
yukari_hinata | 2:20ecfe6edd71 | 150 | // setup http server |
yukari_hinata | 3:5add3759e08a | 151 | // http_server = new HTTPServer(80, "/local/"); |
yukari_hinata | 1:8538381cae81 | 152 | |
yukari_hinata | 1:8538381cae81 | 153 | printf("%s IP Address : %s \r\n", prefix_net_str, eth_if.getIPAddress()); |
yukari_hinata | 1:8538381cae81 | 154 | printf("%s Network setup finished! \r\n", prefix_net_str); |
yukari_hinata | 0:f6cdb984f638 | 155 | } |
yukari_hinata | 0:f6cdb984f638 | 156 | |
yukari_hinata | 2:20ecfe6edd71 | 157 | // グラフィックハンドラの初期化 |
yukari_hinata | 2:20ecfe6edd71 | 158 | static void graphic_handler_setup(void) |
yukari_hinata | 2:20ecfe6edd71 | 159 | { |
yukari_hinata | 4:00da8e8c7e2a | 160 | graphic_handler = new GraphicHandler(DIM_SIGNAL, PREDICT_INTERVAL_TIME, PREDICT_LENGTH, time(NULL)); |
yukari_hinata | 2:20ecfe6edd71 | 161 | } |
yukari_hinata | 2:20ecfe6edd71 | 162 | |
yukari_hinata | 2:20ecfe6edd71 | 163 | // データの初期化(アロケート) |
yukari_hinata | 2:20ecfe6edd71 | 164 | static void data_setup(void) |
yukari_hinata | 2:20ecfe6edd71 | 165 | { |
yukari_hinata | 2:20ecfe6edd71 | 166 | new_seqence_data = new float[DIM_SIGNAL]; // 現在の(一番新しい)系列データ |
yukari_hinata | 2:20ecfe6edd71 | 167 | new_predict_data = new float[DIM_SIGNAL * PREDICT_LENGTH]; // 現在の予測結果 |
yukari_hinata | 2:20ecfe6edd71 | 168 | new_predict_weather = new int[PREDICT_LENGTH]; // 現在の予測天気 |
yukari_hinata | 2:20ecfe6edd71 | 169 | new_predict_probability = new float[PREDICT_LENGTH]; // 現在の予測天気の確率 |
yukari_hinata | 2:20ecfe6edd71 | 170 | } |
yukari_hinata | 2:20ecfe6edd71 | 171 | |
yukari_hinata | 4:00da8e8c7e2a | 172 | // 時刻の設定 |
yukari_hinata | 4:00da8e8c7e2a | 173 | static void jst_setup(int year, int month, int day, int hour, int min) |
yukari_hinata | 4:00da8e8c7e2a | 174 | { |
yukari_hinata | 4:00da8e8c7e2a | 175 | // setup time structure |
yukari_hinata | 4:00da8e8c7e2a | 176 | struct tm t; |
yukari_hinata | 4:00da8e8c7e2a | 177 | t.tm_sec = 0; // 0-59 |
yukari_hinata | 4:00da8e8c7e2a | 178 | t.tm_min = min; // 0-59 |
yukari_hinata | 4:00da8e8c7e2a | 179 | t.tm_hour = hour; // 0-23 |
yukari_hinata | 4:00da8e8c7e2a | 180 | t.tm_mday = day; // 1-31 |
yukari_hinata | 4:00da8e8c7e2a | 181 | t.tm_mon = (month-1); // 0-11 |
yukari_hinata | 4:00da8e8c7e2a | 182 | t.tm_year = (year-1900); // year since 1900 |
yukari_hinata | 4:00da8e8c7e2a | 183 | |
yukari_hinata | 4:00da8e8c7e2a | 184 | // convert to timestamp and set |
yukari_hinata | 4:00da8e8c7e2a | 185 | time_t seconds = mktime(&t); |
yukari_hinata | 4:00da8e8c7e2a | 186 | set_time(seconds); |
yukari_hinata | 4:00da8e8c7e2a | 187 | } |
yukari_hinata | 4:00da8e8c7e2a | 188 | |
yukari_hinata | 0:f6cdb984f638 | 189 | // セットアップ. |
yukari_hinata | 0:f6cdb984f638 | 190 | void setup(void) |
yukari_hinata | 0:f6cdb984f638 | 191 | { |
yukari_hinata | 2:20ecfe6edd71 | 192 | printf("SETUP START "); |
yukari_hinata | 2:20ecfe6edd71 | 193 | printf("-------------------------- \r\n"); |
yukari_hinata | 2:20ecfe6edd71 | 194 | mcsvm_setup(); |
yukari_hinata | 2:20ecfe6edd71 | 195 | printf("SVM ...OK \r\n"); |
yukari_hinata | 1:8538381cae81 | 196 | srnn_setup(); |
yukari_hinata | 2:20ecfe6edd71 | 197 | printf("SRNN ...OK \r\n"); |
yukari_hinata | 6:29d393d430d0 | 198 | //sensor_setup(); |
yukari_hinata | 2:20ecfe6edd71 | 199 | printf("SENSOR ...OK \r\n"); |
yukari_hinata | 4:00da8e8c7e2a | 200 | // network_setup(); |
yukari_hinata | 5:b61f3f5b0fc8 | 201 | jst_setup(2015, 2, 20, 4, 0); |
yukari_hinata | 5:b61f3f5b0fc8 | 202 | printf("NETWORK ...NO(offline) \r\n"); |
yukari_hinata | 2:20ecfe6edd71 | 203 | graphic_handler_setup(); |
yukari_hinata | 2:20ecfe6edd71 | 204 | printf("GRAPHIC ...OK \r\n"); |
yukari_hinata | 2:20ecfe6edd71 | 205 | data_setup(); |
yukari_hinata | 2:20ecfe6edd71 | 206 | printf("SHARED DATA ...OK \r\n"); |
yukari_hinata | 3:5add3759e08a | 207 | printf("SETUP SUCCESS "); |
yukari_hinata | 2:20ecfe6edd71 | 208 | printf("-------------------------- \r\n"); |
yukari_hinata | 0:f6cdb984f638 | 209 | } |