root/vtcross/branches/trnewman/CR_engines/CBR/src/main_cognitive_engine.c @ 88

Revision 88, 16.1 KB (checked in by ahe, 16 years ago)

receive experience from cr, have bugs

Line 
1#include <stdio.h>
2#include <sys/types.h>
3#include <sys/socket.h>
4#include <netinet/in.h>
5#include <netdb.h>
6//#include <iostream>
7#include <stdlib.h>
8#include <string.h>
9
10#include "cbr.h"
11
12//using namespace std;
13
14struct CE_Info {
15    int numUtilities;
16    int numParameters;
17    int numObservables;
18};
19
20struct Utility {
21    char name[50];
22    char units[50];
23    char goal[50];
24   /* string name;
25    string units;
26    string goal;*/
27    float target;
28    float value;
29};
30
31struct Affect {
32    struct Utility u;
33    //string relation;
34    char relation[50];
35};     
36
37struct Parameter {
38    /*string name;
39    string units;*/
40    char name[50];
41    char units[50];
42    float min;
43    int numAffects;
44    struct Affect affection_list[10];
45    float max;
46    float step;
47    float value;
48};     
49       
50struct Observable {
51    //string name;
52    char name[50];
53    struct Affect affection_list[10];
54    int numAffects;
55    float value;
56};
57
58// error handling
59void error(char *msg)
60{
61    perror(msg);
62    exit(0);
63}
64
65void ReadMessage(int socket,char * buffer) {
66    int i,n;
67
68    n = recv(socket,buffer,256,MSG_PEEK);
69    for(i=0;i<256;i++){
70            if(strcmp(&buffer[i],"\0") == 0) break;
71    }
72    n = recv(socket,buffer,i+1,0);
73    if (n < 0)
74         error("ERROR reading from socket");
75//    printf("ReadMessage:%s %d\n",buffer,n);
76}
77
78
79int GetUtility(int sockfd, struct Utility uList[], struct CE_Info *ce_info)
80{
81    char buffer[256];
82    int i;
83
84    // read unitilities
85    // numUtilities
86    bzero(buffer,256);
87    ReadMessage(sockfd,buffer);
88    ce_info->numUtilities = atoi(buffer);
89    //printf("number of utilities: %d\n", ce_info->numUtilities);
90       
91    for (i = 0; i < ce_info->numUtilities; i++){
92        bzero(buffer,256);
93            ReadMessage(sockfd,buffer);
94            //printf("Name: %s\n", buffer);
95        strcpy(uList[i].name, buffer);
96                 
97        bzero(buffer,256);
98            ReadMessage(sockfd,buffer);
99            //printf("Units: %s\n", buffer);
100        strcpy(uList[i].units, buffer);
101
102        bzero(buffer,256);
103            ReadMessage(sockfd,buffer);
104        //printf("Goal: %s\n", buffer);
105        strcpy(uList[i].goal, buffer);
106       
107            bzero(buffer,256);
108            ReadMessage(sockfd,buffer);
109        //printf("Target: %s\n", buffer);
110        uList[i].target = atof(buffer);
111    }
112    return 1;
113}
114
115
116int GetParameter(int sockfd, struct Parameter pList[], struct CE_Info *ce_info)
117{
118    char buffer[256];
119    int i, j;
120
121    // numParameters
122    bzero(buffer,256);
123    ReadMessage(sockfd,buffer);
124    ce_info->numParameters = atoi(buffer);
125    //printf("number of parameters: %d\n", ce_info->numParameters);
126       
127    for (i = 0; i < ce_info->numParameters; i++){
128        bzero(buffer,256);
129            ReadMessage(sockfd,buffer);
130            //printf("Name: %s\n", buffer);
131        strcpy(pList[i].name, buffer);
132                 
133        bzero(buffer,256);
134            ReadMessage(sockfd,buffer);
135            //printf("Units: %s\n", buffer);
136        strcpy(pList[i].units, buffer);
137
138        bzero(buffer,256);
139            ReadMessage(sockfd,buffer);
140        //printf("Min: %s\n", buffer);
141        pList[i].min = atof(buffer);
142       
143        bzero(buffer,256);
144            ReadMessage(sockfd,buffer);
145        //printf("Max: %s\n", buffer);
146        pList[i].max = atof(buffer);
147       
148            bzero(buffer,256);
149            ReadMessage(sockfd,buffer);
150        //printf("Step: %s\n", buffer);
151        pList[i].step = atof(buffer);
152   
153        // numAffects
154        bzero(buffer,256);
155        ReadMessage(sockfd,buffer);
156        pList[i].numAffects = atoi(buffer);
157        //printf("number of affects: %d\n", pList[i].numAffects);
158       
159        for (j = 0; j < pList[i].numAffects; j++){
160            bzero(buffer,256);
161                ReadMessage(sockfd,buffer);
162                //printf("Utility name: %s\n", buffer);
163            strcpy(pList[i].affection_list[j].u.name, buffer);
164                 
165            bzero(buffer,256);
166                ReadMessage(sockfd,buffer);
167                //printf("Relation: %s\n", buffer);
168            strcpy(pList[i].affection_list[j].relation, buffer);
169        }
170    }
171    return 1;
172}
173
174
175int GetObservable(int sockfd, struct Observable oList[], struct CE_Info *ce_info)
176{
177    char buffer[256];
178    int i,j;
179
180    // numParameters
181    bzero(buffer,256);
182    ReadMessage(sockfd,buffer);
183    ce_info->numObservables = atoi(buffer);
184    //printf("number of observables: %d\n", ce_info->numObservables);
185       
186    for (i = 0; i < ce_info->numObservables; i++){
187        bzero(buffer,256);
188            ReadMessage(sockfd,buffer);
189            //printf("Name: %s\n", buffer);
190        strcpy(oList[i].name, buffer);
191                 
192        // numAffects
193        bzero(buffer,256);
194        ReadMessage(sockfd,buffer);
195        oList[i].numAffects = atoi(buffer);
196        //printf("number of affects: %d\n", oList[i].numAffects);
197       
198        for (j = 0; j < oList[i].numAffects; j++){
199            bzero(buffer,256);
200                ReadMessage(sockfd,buffer);
201                //printf("Utility name: %s\n", buffer);
202            strcpy(oList[i].affection_list[j].u.name, buffer);
203                 
204            bzero(buffer,256);
205                ReadMessage(sockfd,buffer);
206                //printf("Relation: %s\n", buffer);
207            strcpy(oList[i].affection_list[j].relation, buffer);
208        }
209    }
210    return 1;
211}
212
213
214// setup client socket connection
215int ClientSocket(int argc, char** argv)
216{
217    int sockfd;
218    int portno;
219    struct sockaddr_in serv_addr;
220    struct hostent *server;
221   
222    // setup client socket connection
223    if (argc < 3) {
224       fprintf(stderr,"usage: %s hostname port\n", argv[0]);
225       exit(0);
226    }
227    // server name
228    server = gethostbyname(argv[1]);
229    if (server == NULL) {
230        fprintf(stderr,"ERROR, no such host\n");
231        exit(0);
232    }
233    // port no.
234    portno = atoi(argv[2]);
235    // socket file descriptor
236    sockfd = socket(AF_INET, SOCK_STREAM, 0);
237    if (sockfd < 0)
238        error("ERROR opening socket");
239    // initiate struct socketaddr_in
240    bzero((char *) &serv_addr, sizeof(serv_addr));
241    serv_addr.sin_family = AF_INET;
242    serv_addr.sin_port = htons(portno);
243    bcopy((char *)server->h_addr,
244         (char *)&serv_addr.sin_addr.s_addr,
245         server->h_length);
246    // cast sockaddr_in to sockaddr
247    if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
248        error("ERROR connecting");
249
250    return sockfd;
251}
252
253   
254int SendMessage(int socketfd, char *message)
255{
256    int n;
257     
258    strcat(message, "\0000");
259    // Write message back to client
260    //n = write(socketfd,message,(strlen(message)+1));
261    n = send(socketfd,message,(strlen(message)+1),0);
262    if (n<0)
263        error("Error sending to server\n");
264    else if(n == 0)
265        printf("Server closed the socket.\n");
266   
267    return n;
268}
269
270
271int GetXMLFromServer(int sockfd, struct Utility uList[], struct Parameter pList[],
272        struct Observable oList[], struct CE_Info *ce_info)
273{
274    // get utilities
275    GetUtility(sockfd, uList, ce_info);
276   
277    // get parameters
278    GetParameter(sockfd, pList, ce_info);
279
280    // read obervables
281    GetObservable(sockfd, oList, ce_info);
282
283    // send ack back to server
284    char buffer[256];
285    strcpy(buffer, "xml received");
286    SendMessage(sockfd, buffer);
287    printf("xml reception done\n");
288   
289    return 1;
290}
291
292
293int GetExperienceSize(int sockfd, int *num_rows, int *num_cols)
294{
295    char buffer[256];
296   
297    // number of rows
298    bzero(buffer,256);
299    ReadMessage(sockfd,buffer);
300    *num_rows = atoi(buffer);
301    // number of columns
302    bzero(buffer,256);
303    ReadMessage(sockfd,buffer);
304    *num_cols = atoi(buffer);
305    /*printf("number of rows: %d, number of columns: %d\n",
306            *num_rows, *num_cols); */
307    return 1;
308}
309
310
311int GetExperience(int sockfd, int num_rows, int num_cols,
312        float **past_exp)
313{
314    char buffer[256];
315    int i, j;
316
317    // read experience
318    for (i = 0; i < num_rows; i++){
319        for (j = 0; j < num_cols; j++){
320            bzero(buffer,256);
321            ReadMessage(sockfd,buffer);
322    //    printf("experience: %s\n", buffer);
323        past_exp[i][j] = atof(buffer);
324        }
325    }
326
327    return 1;
328}
329
330
331void print_current_config(struct Utility uList[],
332        struct Parameter pList[],
333        struct Observable oList[],
334        struct CE_Info * ce_info)
335{   
336    int i = 0;
337    int j = 0;
338
339    // utilities
340    for(i = 0; i < ce_info->numUtilities ; i++) {
341        printf("Utility: %s\n", uList[i].name);
342        printf("    Units: %s\n", uList[i].units);
343        printf("    Goal: %s\n", uList[i].goal);
344        printf("    Target: %f\n", uList[i].target);
345        /*cout << "Utility:  " << uList[i].name << endl;
346        cout << "     Units:  " << uList[i].units << endl;
347        cout << "     Goal:   " << uList[i].goal << endl;
348        cout << "     Target: " << uList[i].target << endl;*/
349    }
350                       
351    // parameters                       
352    for(i = 0; i < ce_info->numParameters; i++) {
353        printf("Paramter: %s\n", pList[i].name);
354        printf("    Units: %s\n", pList[i].units);
355        printf("    Min: %f\n", pList[i].min);
356        printf("    Max: %f\n", pList[i].max);
357        printf("    Step: %f\n", pList[i].step);
358        /*cout << "Parameter:  " << pList[i].name << endl;
359        cout << "       Units:   " << pList[i].units << endl;
360        cout << "       Min:     " << pList[i].min << endl;
361        cout << "       Max:     " << pList[i].max << endl;
362        cout << "       Step:    " << pList[i].step << endl;*/
363        for(j = 0; j < pList[i].numAffects; j++) {
364            printf("        Affect: %s -> %s\n", pList[i].affection_list[j].u.name, pList[i].affection_list[j].relation);
365            //cout << "       Affect: " << pList[i].affection_list[j].u.name << " -> " << pList[i].affection_list[j].relation << endl;
366        }
367    }
368
369    // observables
370    for(i = 0; i < ce_info->numObservables; i++) {
371        printf("Observable: %s\n", oList[i].name);
372        //cout << "Observable:  " << oList[i].name << endl;
373        for(j = 0; j < oList[i].numAffects; j++) {
374            printf("        Affect: %s -> %s\n", oList[i].affection_list[j].u.name, oList[i].affection_list[j].relation);
375            //cout << "       Affect: " << oList[i].affection_list[j].u.name << " -> " << oList[i].affection_list[j].relation << endl;
376        }
377    }
378}
379
380int RunCBREngine(struct Utility uList[], struct Parameter pList[],
381        struct Observable oList[], struct CE_Info *ce_info,
382        int num_cols, int num_rows, float ** past_exp)
383{
384   
385    int i, j;
386
387    // get column names
388    //char *cols[50];
389    //char cols[num_cols][50];
390    char **cols;
391    cols = (char **)malloc(sizeof(char)*num_cols);
392    j = 0;
393    for (i = 0; i < ce_info->numUtilities; i++){
394        cols[j] = malloc(strlen(uList[i].name)+1);
395        cols[j] = uList[i].name;
396    //    strcpy(cols[j], uList[i].name);
397        j++;
398    }
399    for (i = 0; i < ce_info->numParameters; i++){
400        cols[j] = malloc(strlen(pList[i].name)+1);
401        cols[j] = pList[i].name;
402    //    strcpy(cols[j], pList[i].name);
403        j++;
404    }
405    for (i = 0; i < ce_info->numObservables; i++){
406        cols[j] = malloc(strlen(oList[i].name)+1);
407        cols[j] = oList[i].name;
408    //    strcpy(cols[j], oList[i].name);
409        j++;
410    }
411    printf("number of columns: %d, %d\n", num_cols, j);
412    cols[j] = malloc(strlen("utility")+1);
413    cols[j] = "utility";
414    //strcpy(cols[j], "utility");
415    printf("here\n");
416   
417    printf("number of columns: %d\n", num_cols);
418    printf("column names:");
419    for (i = 0; i<num_cols; i++){
420        printf(" %s",cols[i]);
421    }
422    printf("\n");
423
424    int rc;
425
426    // create cbr database/table
427    //printf("create cbr database\n");
428    char filename[] = {"ex1"}, tablename[] = {"data"};
429    cbr mycbr = cbr_create(filename, tablename, cols, num_cols);
430    //cbr mycbr = cbr_create("ex1", "data", cols, num_cols);
431   
432    // add row here
433    float vals[num_cols];
434    /*// sample table entry
435    vals[0] = 1e3f;    // throughput
436    vals[1] = 1;        // spectral_efficiency
437    vals[2] = -3.50;    // log10_ber
438    vals[3] = 1;        // mod_scheme
439    vals[4] = -3.5f;    // tx_power
440    vals[5] = 10.0f;   // SNR
441    vals[6] = 0.762;    // utility*/
442    printf("here\n");
443    for (i = 0; i < num_rows; i++){
444        for (j = 0; j < num_cols; j++){
445            vals[j] = past_exp[i][j];
446        }
447        printf("add row to cbr table\n");
448        rc = cbr_add_row(mycbr, cols, vals, num_cols);
449    }
450   
451    // print
452    printf("cbr table\n");
453    cbr_print(mycbr);
454   
455    // simple search: find entry where...
456    //   log10_ber < 1e-2 and SNR > 5
457    //char * search_names[] = {"log10_ber", "SNR"};
458    char ** search_names;
459    search_names
460        = (char **)malloc(sizeof(char)*(ce_info->numUtilities));
461    for (i = 0; i < ce_info->numUtilities; i++){
462        search_names[i]
463            = malloc(sizeof(char)*(strlen(uList[i].name)+1));
464        search_names[i] = uList[i].name;
465    }
466    int search_ops[] = {GT, GT, LT};
467    //float search_vals[] = {1e-2f, 5.f};
468    float *search_vals;
469    search_vals = malloc(sizeof(float)*(ce_info->numUtilities));
470    for (i = 0; i < ce_info->numUtilities; i++){
471        search_vals[i] = uList[i].target;
472    }
473    float retvals[num_cols];
474    rc = cbr_search(mycbr, search_names, search_ops,
475            search_vals, ce_info->numUtilities, retvals);
476
477    j = 0;
478    for (i = 0; i < ce_info->numUtilities; i++){
479        uList[i].value = retvals[j];
480        j++;
481    }
482    for (i = 0; i < ce_info->numParameters; i++){
483        pList[i].value = retvals[j];
484        j++;
485    }
486    for (i = 0; i < ce_info->numObservables; i++){
487        oList[i].value = retvals[j];
488        j++;
489    }
490
491    // clean up database
492    //printf("clean cbr database\n");
493    cbr_free(mycbr);
494   
495    return 1;
496}
497
498
499int SendCEResults(int sockfd, struct Utility uList[], struct Parameter pList[],
500        struct Observable oList[], struct CE_Info *ce_info)
501{
502    // send results back to server
503    char var[50];
504    int i;
505 
506    /*// utility
507    for (i = 0; i < ce_info->numUtilities; i++){
508        sprintf(var, "%f", uList[i].value);
509        SendMessage(sockfd, var);
510    }*/
511   
512    // parameter
513    for (i = 0; i < ce_info->numParameters; i++){
514        sprintf(var, "%f", pList[i].value);
515        SendMessage(sockfd, var);
516    }
517   
518    /*// observable
519    for (i = 0; i < ce_info->numObservables; i++){
520        sprintf(var, "%f", oList[i].value);
521        SendMessage(sockfd, var);
522    }*/
523
524    return 1;
525}
526
527
528// main client socket
529int main(int argc, char *argv[])
530{
531    struct Utility uList[10];
532    struct Parameter pList[10];
533    struct Observable oList[10];
534    struct CE_Info ce_info;
535
536    // setup client socket connection
537    int sockfd;
538    sockfd = ClientSocket(argc, argv);
539   
540    // get xml info from server
541    GetXMLFromServer(sockfd, uList, pList, oList, &ce_info);
542    print_current_config(uList, pList, oList, &ce_info);
543
544    // get experience size rom server
545    int num_rows, num_cols;
546    GetExperienceSize(sockfd, &num_rows, &num_cols);
547    //printf("number of rows: %d, number of columns: %d\n",
548    //        num_rows, num_cols);
549    // get experience
550    float **past_exp;
551    int i, j;
552    past_exp = (float **)malloc(sizeof(float)*num_rows);
553    for (i = 0; i< 1; i++){
554        past_exp[i] = (float*)malloc(sizeof(float)*num_cols);
555    }
556    GetExperience(sockfd, num_rows, num_cols, past_exp);
557    for (i = 0; i < num_rows; i++){
558        for (j = 0; j < num_cols; j++){
559        printf("experience: %f\n", past_exp[i][j]);
560        }
561    }
562   
563    // calculate utility
564   
565
566    // cbr operation
567    //unsigned int num_cols;
568    // get number of columns
569    num_cols = ce_info.numUtilities + ce_info.numParameters;
570    num_cols = num_cols + ce_info.numObservables;
571    num_cols = num_cols + 1;    // overall utility
572    printf("number of rows: %d, number of columns: %d\n",
573            num_rows, num_cols);
574    RunCBREngine(uList, pList, oList, &ce_info, num_cols, num_rows,
575            past_exp);   
576    // print out results
577    //int i;
578    printf("search result: ");
579    for (i=0;i<ce_info.numUtilities; i++)
580        printf("%f, ",uList[i].value);
581    for (i=0;i<ce_info.numParameters; i++)
582        printf("%f, ",pList[i].value);
583    for (i=0;i<ce_info.numObservables; i++)
584        printf("%f, ",oList[i].value);
585    printf("\n");
586   
587    // send results back to server
588    SendCEResults(sockfd, uList, pList, oList, &ce_info);
589
590
591  return 0;
592}
Note: See TracBrowser for help on using the browser.