root/vtcross/trunk/src/cognitive_engines/OSSIE_DEMO_CE/OSSIE_CE.cpp @ 457

Revision 457, 23.8 KB (checked in by cdietric, 15 years ago)

updates for CROSS-OSSIE demo

Line 
1/* Virginia Tech Cognitive Radio Open Source Systems
2 * Virginia Tech, 2009
3 *
4 * LICENSE INFORMATION GOES HERE
5 */
6
7/* DESCRIPTION OF FILE.
8 */
9
10
11#include <cstdlib>
12#include <cstring>
13#include <stdint.h>
14#include <math.h>
15
16#include "vtcross/common.h"
17#include "vtcross/components.h"
18#include "vtcross/containers.h"
19#include "vtcross/debug.h"
20#include "vtcross/error.h"
21#include "vtcross/socketcomm.h"
22#include "vtcross/cbr.h"
23
24// TODO this is really bad; need to move to a proper cbr.h
25#include "cbr.c"
26
27#include "sqlite3.h"
28#include "sqlite3ext.h"
29
30#define TXPOWER 1
31#define DECREMENTSCALE 5
32#define INCREMENTSCALE 5
33
34static cbr myCBR;
35
36
37CognitiveEngine::CognitiveEngine()
38{
39    LOG("Creating Cognitive Engine.\n");
40    SML_present = false;
41    commandSocketFD = -1;
42}
43
44
45CognitiveEngine::~CognitiveEngine()
46{
47    cbr_free(myCBR);
48    delete [] pList;
49    delete [] oList;
50    delete [] uList;
51    delete [] radioInfo;
52}
53
54
55CognitiveEngine::CognitiveEngine(const char *serverName, const char *serverPort, \
56        const bool SML)
57{
58    LOG("Creating Cognitive Engine.\n");
59
60    pList = new Parameter[10];
61    oList = new Observable[10];
62    uList = new Utility[10];
63    radioInfo = new Radio_Info;
64
65    ConnectToRemoteComponent(serverName, serverPort, SML);
66}
67
68
69void
70CognitiveEngine::SendComponentType()
71{
72    SendMessage(commandSocketFD, "response_engine_cognitive");
73    LOG("Cognitive Engine responded to GetRemoteComponentType query.\n");
74}
75
76
77void
78CognitiveEngine::ConnectToRemoteComponent(const char *serverName, \
79        const char *serverPort, const bool SML)
80{
81    commandSocketFD = ClientSocket(serverName, serverPort);
82
83    SML_present = SML;
84
85    if(SML) {
86       
87        RegisterComponent();
88        LOG("Cognitive Engine connected to SML at %s.\n", serverName);
89        ReceiveRadioConfiguration();
90        ReceiveExperience();
91       
92        RegisterServices();
93    }
94    else {
95        RegisterComponent();
96        LOG("Cognitive Engine connected to shell at %s.\n", serverName);
97        ReceiveRadioConfiguration();
98        ReceiveExperience();
99    }
100}
101
102void
103CognitiveEngine::ReceiveFeedback(Observable *observables, Parameter *parameters)
104{
105   LOG("Cognitive Engine:: Receiving feedback.\n");
106   
107    uint32_t numberColumns =
108        radioInfo->numParameters +
109        radioInfo->numUtilities;
110
111    uint32_t obsColumns = radioInfo->numObservables + 1;
112
113    float valList[numberColumns];
114    float obsVals[numberColumns];
115    char *nameList[numberColumns];
116    char *obsList[obsColumns];
117
118    size_t columnObsIndex = 0;
119    for (size_t i = 0; i < radioInfo->numObservables; i++){
120        obsList[columnObsIndex] = (char*)observables[i].name.c_str();
121        columnObsIndex++;
122    } 
123    obsList[columnObsIndex] = (char*) "utility";
124
125    size_t columnIndex = 0;
126    for (size_t i = 0; i < radioInfo->numParameters; i++){
127        nameList[columnIndex] = (char*)parameters[i].name.c_str();
128        columnIndex++;
129    }   
130    for (size_t i = 0; i < radioInfo->numUtilities; i++){
131        nameList[columnIndex] = (char*)uList[i].name.c_str();
132        columnIndex++;
133    }   
134
135    size_t obsValueIndex = 0;
136    for(size_t i = 0; i < radioInfo->numObservables; i++) {
137        obsVals[obsValueIndex] = observables[i].value;
138        obsValueIndex++;
139    }
140
141    /* Calculate Utility */
142    float newUtilityValue = 0;
143
144    // This should probably take into acount that the BER has a log distribution,
145    //  we are getting raw BER values here.
146    for(size_t i = 0; i < radioInfo->numUtilities; i++) {
147        newUtilityValue = newUtilityValue + (uList[i].target - observables[i].value);
148    }
149    obsVals[obsValueIndex] = newUtilityValue;
150
151    size_t returnValueIndex = 0;
152    for(size_t i = 0; i < radioInfo->numParameters; i++) {
153        valList[returnValueIndex] = parameters[i].value;
154        returnValueIndex++;
155    }
156    for(size_t i = 0; i < radioInfo->numUtilities; i++) {
157        valList[returnValueIndex] = uList[i].target;
158        returnValueIndex++;
159    }
160
161    cbr_update(myCBR, nameList, obsList, valList, obsVals,
162            numberColumns, obsColumns);
163}
164
165
166void
167CognitiveEngine::WaitForSignal()
168{
169    char buffer[256];
170
171    while(true) {
172        memset(buffer, 0, 256);
173       
174        ReadMessage(commandSocketFD, buffer);
175
176        // TODO this is ugly... is there a better way? Doesn't strcmp compare the
177        // whole string?  We only need to compare until we find a single different
178        // byte...
179        //
180        // If we send integer op codes rather than strings, this process will be
181        // MUCH faster since instead of donig string compares we can simply
182        // switch on the integer value...
183        if(strcmp(buffer, "update_performance") == 0) {
184           
185            /* Receive Set of current Parameters */
186            memset(buffer, 0, 256);
187            ReadMessage(commandSocketFD, buffer);
188            uint32_t numParameters = atoi(buffer);
189   
190            Parameter *p = new Parameter[numParameters];
191 
192            for(size_t i = 0; i < numParameters; i++) {
193                memset(buffer, 0, 256);
194                ReadMessage(commandSocketFD, buffer);
195                p[i].name = std::string(buffer);
196   
197                memset(buffer, 0, 256);
198                ReadMessage(commandSocketFD, buffer);
199                p[i].value = atof(buffer);
200            }
201
202            /* Receive Set of Observables */
203            memset(buffer, 0, 256);
204            ReadMessage(commandSocketFD, buffer);
205            uint32_t numObservables = atoi(buffer);
206   
207            Observable *o = new Observable[numObservables];
208 
209            for(size_t i = 0; i < numObservables; i++) {
210                memset(buffer, 0, 256);
211                ReadMessage(commandSocketFD, buffer);
212                o[i].name = std::string(buffer);
213   
214                memset(buffer, 0, 256);
215                ReadMessage(commandSocketFD, buffer);
216                o[i].value = atof(buffer);
217            } 
218
219            ReceiveFeedback(o,p);
220
221            delete [] o;
222            delete [] p;
223        }
224        else if(strcmp(buffer, "request_optimization_service") == 0) {
225            // THIS IS CURRENTLY IN DEMO MODE           
226
227
228            /* Receive Set of Observables */
229            LOG("\nCognitive Engine:: Receiving service name\n");
230
231            memset(buffer, 0, 256);
232            ReadMessage(commandSocketFD,buffer);
233            LOG("\nCognitive Engine:: Got service name, %s\n", buffer);
234
235            /* Receive Set of Observables */
236            LOG("\nCognitive Engine:: Receiving Observable Parameters\n");
237
238            memset(buffer, 0, 256);
239            ReadMessage(commandSocketFD,buffer);
240            uint32_t numObservables = atoi(buffer);
241   
242            Observable *o = new Observable[numObservables];
243 
244            for(size_t i = 0; i < numObservables; i++) {
245                memset(buffer, 0, 256);
246                ReadMessage(commandSocketFD, buffer);
247                o[i].name = std::string(buffer);
248   
249                memset(buffer, 0, 256);
250                ReadMessage(commandSocketFD, buffer);
251                o[i].value = atof(buffer);
252            } 
253
254            /* Receive Set of current Parameters */
255            LOG("Cognitive Engine:: Receiving Current Transmission Parameters\n");
256
257            memset(buffer, 0, 256);
258            ReadMessage(commandSocketFD, buffer);
259            uint32_t numCurrentParameters = atoi(buffer);
260   
261            Parameter *cp = new Parameter[numCurrentParameters];
262 
263            for(size_t i = 0; i < numCurrentParameters; i++) {
264                memset(buffer, 0, 256);
265                ReadMessage(commandSocketFD, buffer);
266                cp[i].name = std::string(buffer);
267   
268                memset(buffer, 0, 256);
269                ReadMessage(commandSocketFD, buffer);
270                cp[i].value = atof(buffer);
271            } 
272            LOG("Cognitive Engine:: Processing parameters....\n");
273
274            //Parameter *solutionSet;
275           
276            //solutionSet = GetSolution(o,cp);
277
278            // TODO need to actually do something with the observables here
279           
280            LOG("Cognitive Engine:: Sending Optimal Parameters to Application.\n");
281            char numParametersChar[10];
282            //char solutionValue[50];
283            sprintf(numParametersChar, "%i", radioInfo->numParameters);
284            SendMessage(commandSocketFD, numParametersChar);
285            for(size_t i = 0; i < radioInfo->numParameters; i++) {
286                //SendMessage(commandSocketFD, solutionSet[i].name.c_str());
287                SendMessage(commandSocketFD, "test");
288                //memset(solutionValue, 0, 50);
289                //sprintf(solutionValue, "%f", solutionSet[i].value);
290                //SendMessage(commandSocketFD, solutionValue);
291                SendMessage(commandSocketFD, "00");
292            }
293
294            delete [] o;
295            delete [] cp;
296        }
297        else if(strcmp(buffer, "request_optimization") == 0) {
298           
299            /* Receive Set of Observables */
300            LOG("\nCognitive Engine:: Receiving Observable Parameters\n");
301
302            memset(buffer, 0, 256);
303            ReadMessage(commandSocketFD,buffer);
304            uint32_t numObservables = atoi(buffer);
305   
306            Observable *o = new Observable[numObservables];
307 
308            for(size_t i = 0; i < numObservables; i++) {
309                memset(buffer, 0, 256);
310                ReadMessage(commandSocketFD, buffer);
311                o[i].name = std::string(buffer);
312   
313                memset(buffer, 0, 256);
314                ReadMessage(commandSocketFD, buffer);
315                o[i].value = atof(buffer);
316            } 
317
318            /* Receive Set of current Parameters */
319            LOG("Cognitive Engine:: Receiving Current Transmission Parameters\n");
320
321            memset(buffer, 0, 256);
322            ReadMessage(commandSocketFD, buffer);
323            uint32_t numCurrentParameters = atoi(buffer);
324   
325            Parameter *cp = new Parameter[numCurrentParameters];
326 
327            for(size_t i = 0; i < numCurrentParameters; i++) {
328                memset(buffer, 0, 256);
329                ReadMessage(commandSocketFD, buffer);
330                cp[i].name = std::string(buffer);
331   
332                memset(buffer, 0, 256);
333                ReadMessage(commandSocketFD, buffer);
334                cp[i].value = atof(buffer);
335            } 
336            LOG("Cognitive Engine:: Processing parameters....\n");
337
338            Parameter *solutionSet;
339           
340            solutionSet = GetSolution(o,cp);
341
342            // TODO need to actually do something with the observables here
343           
344            LOG("Cognitive Engine:: Sending Optimal Parameters to Application.\n");
345            char numParametersChar[10];
346            char solutionValue[50];
347            sprintf(numParametersChar, "%i", radioInfo->numParameters);
348            SendMessage(commandSocketFD, numParametersChar);
349            for(size_t i = 0; i < radioInfo->numParameters; i++) {
350                SendMessage(commandSocketFD, solutionSet[i].name.c_str());
351                memset(solutionValue, 0, 50);
352                sprintf(solutionValue, "%f", solutionSet[i].value);
353                SendMessage(commandSocketFD, solutionValue);
354            }
355
356            delete [] o;
357            delete [] cp;
358        }
359        else if(strcmp(buffer, "query_component_type") == 0) {
360            SendComponentType();
361        }
362        else if(strcmp(buffer, "connect_sml") == 0) {
363            /* This command implies that we are disconnecting from the shell and
364             * connecting to a SML component. */
365            char serverName[256];
366            char serverPort[256];
367            // TODO is this going to end up being too slow?
368            memset(serverName, 0, 256);
369            memset(serverPort, 0, 256);
370
371            ReadMessage(commandSocketFD, serverName);
372            ReadMessage(commandSocketFD, serverPort);
373
374            /* Only continue if we are currently connected to a shell. */
375            if(!SML_present) {
376                DeregisterComponent();
377
378                shutdown(commandSocketFD, 2);
379                close(commandSocketFD);
380
381                ConnectToRemoteComponent(serverName, serverPort, true);
382            }
383        }
384        else if(strcmp(buffer, "disconnect_sml") == 0) {
385            /* This command implies that we are disconnecting from the SML and
386             * connecting to a shell component. */
387            char serverName[256];
388            char serverPort[256];
389            // TODO is this going to end up being too slow?
390            memset(serverName, 0, 256);
391            memset(serverPort, 0, 256);
392
393            ReadMessage(commandSocketFD, serverName);
394            ReadMessage(commandSocketFD, serverPort);
395
396            /* We only want to do this if we are actually connected to an SML
397             * currently. */
398            if(SML_present) {
399                DeregisterServices();
400
401                shutdown(commandSocketFD, 2);
402                close(commandSocketFD);
403
404                ConnectToRemoteComponent(serverName, serverPort, false);
405            }
406        }
407        else if(strcmp(buffer, "reset_engine_cognitive") == 0) {
408            Reset();
409        }
410        else if(strcmp(buffer, "shutdown_engine_cognitive") == 0) {
411            Shutdown();
412        }
413    }
414}
415
416
417void
418CognitiveEngine::Shutdown()
419{
420    if(SML_present) {
421        //DeregisterServices();
422        DeregisterComponent();
423    }
424    else {
425        DeregisterComponent();
426    }
427    // TODO should something else be happening here?
428}
429
430
431void
432CognitiveEngine::Reset()
433{
434    LOG("Resetting Cognitive Engine.\n");
435
436    if(SML_present) {
437        DeregisterServices();
438        DeregisterComponent();
439    }
440    else {
441        DeregisterComponent();
442    }
443}
444
445
446void
447CognitiveEngine::RegisterComponent()
448{
449    char buffer[256];
450    SendMessage(commandSocketFD, "register_engine_cognitive");
451    LOG("Cognitive Engine:: Registration message sent to shell.\n");
452
453    memset(buffer, 0, 256);
454    ReadMessage(commandSocketFD, buffer);
455}
456
457void
458CognitiveEngine::DeregisterComponent()
459{
460    SendMessage(commandSocketFD, "deregister_engine_cognitive");
461    LOG("Cognitive Engine:: Deregistration message sent.\n");
462
463    shutdown(commandSocketFD, 2);
464    close(commandSocketFD);
465    commandSocketFD = -1;
466    LOG("Cognitive Engine:: Shell socket closed.\n");
467}
468
469
470void
471CognitiveEngine::RegisterServices()
472{
473    LOG("Cognitive Engine:: Registering services.\n");
474
475    SendMessage(commandSocketFD, "register_service");
476    SendMessage(commandSocketFD, "test_srv");
477
478    SendMessage(commandSocketFD, "register_service");
479    SendMessage(commandSocketFD, "test_srv1");
480
481    SendMessage(commandSocketFD, "register_service");
482    SendMessage(commandSocketFD, "test_srv2");
483
484    SendMessage(commandSocketFD, "register_service");
485    SendMessage(commandSocketFD, "test_srv3");
486
487}
488
489//Combined with deregister component since those two things must happen togeather
490void
491CognitiveEngine::DeregisterServices()
492{
493    LOG("Cognitive Engine:: Deregistering services.\n");
494
495    SendMessage(commandSocketFD, "deregister_service");
496    SendMessage(commandSocketFD, "test_srv");
497
498    SendMessage(commandSocketFD, "deregister_service");
499    SendMessage(commandSocketFD, "test_srv1");
500
501    SendMessage(commandSocketFD, "deregister_service");
502    SendMessage(commandSocketFD, "test_srv2");
503
504    SendMessage(commandSocketFD, "deregister_service");
505    SendMessage(commandSocketFD, "test_srv3");
506
507}
508
509void
510CognitiveEngine::ReceiveRadioConfiguration()
511{
512    LOG("Cognitive Engine:: Receiving Radio Configuration.\n");
513   
514    char buffer[256];
515 
516    /* Receive Set of Utilities */
517    memset(buffer, 0, 256);
518    ReadMessage(commandSocketFD, buffer);
519    radioInfo->numUtilities = atoi(buffer);
520
521    for(size_t i = 0; i < radioInfo->numUtilities; i++) {
522        memset(buffer, 0, 256);
523        ReadMessage(commandSocketFD, buffer);
524        uList[i].name = std::string(buffer);
525   
526        memset(buffer, 0, 256);
527        ReadMessage(commandSocketFD, buffer);
528        uList[i].units = std::string(buffer);
529
530        memset(buffer, 0, 256);
531        ReadMessage(commandSocketFD, buffer);
532        uList[i].goal = std::string(buffer);
533   
534        memset(buffer, 0, 256);
535        ReadMessage(commandSocketFD, buffer);
536        uList[i].target = atof(buffer);
537    }
538
539    /* Receive Set of Parameters */
540    memset(buffer, 0, 256);
541    ReadMessage(commandSocketFD, buffer);
542    radioInfo->numParameters = atoi(buffer);
543   
544    for(size_t i = 0; i < radioInfo->numParameters; i++) {
545        memset(buffer, 0, 256);
546        ReadMessage(commandSocketFD, buffer);
547        pList[i].name = std::string(buffer);
548   
549        memset(buffer, 0, 256);
550        ReadMessage(commandSocketFD, buffer);
551        pList[i].units = std::string(buffer);
552
553        memset(buffer, 0, 256);
554        ReadMessage(commandSocketFD, buffer);
555        pList[i].min = atof(buffer);
556   
557        memset(buffer, 0, 256);
558        ReadMessage(commandSocketFD, buffer);
559        pList[i].max = atof(buffer);
560   
561        memset(buffer, 0, 256);
562        ReadMessage(commandSocketFD, buffer);
563        pList[i].step = atof(buffer);
564   
565        memset(buffer, 0, 256);
566        ReadMessage(commandSocketFD,buffer);
567        pList[i].numAffects = atoi(buffer);
568   
569        for(size_t j = 0; j < pList[i].numAffects; j++) {
570            memset(buffer, 0, 256);
571            ReadMessage(commandSocketFD,buffer);
572            // TODO for + if{break} = while?
573            for(size_t k = 0; k < radioInfo->numUtilities; k++) {
574                if(uList[k].name == std::string(buffer)) {   
575                    pList[i].affection_list[j].u = &uList[k];   
576                    break;
577                }
578            }
579
580            memset(buffer, 0, 256);
581            ReadMessage(commandSocketFD, buffer);
582            pList[i].affection_list[j].relation = std::string(buffer);   
583        }
584    }   
585
586    /* Receive Set of Observables */
587    memset(buffer, 0, 256);
588    ReadMessage(commandSocketFD, buffer);
589    radioInfo->numObservables = atoi(buffer);
590   
591    for(size_t i = 0; i < radioInfo->numObservables; i++) {
592        memset(buffer, 0, 256);
593        ReadMessage(commandSocketFD, buffer);
594        oList[i].name = std::string(buffer);
595   
596        memset(buffer, 0, 256);
597        ReadMessage(commandSocketFD, buffer);
598        oList[i].numAffects = atoi(buffer);
599   
600        for(size_t j = 0; j < oList[i].numAffects; j++) {
601            memset(buffer, 0, 256);
602            ReadMessage(commandSocketFD, buffer);
603            // TODO for + if{break} = while?
604            for(size_t k = 0; k < radioInfo->numUtilities; k++) {
605                if(uList[k].name == std::string(buffer)){   
606                    oList[i].affection_list[j].u = &uList[k];   
607                    break;
608                }
609            }
610 
611            memset(buffer, 0, 256);
612            ReadMessage(commandSocketFD, buffer);
613            oList[i].affection_list[j].relation = std::string(buffer);   
614        }
615    }
616
617    SendMessage(commandSocketFD, "receive_config_ack");
618
619    BuildCognitiveEngine();
620}
621
622void
623CognitiveEngine::ReceiveExperience()
624{
625    LOG("Cognitive Engine:: Receiving Experience Report.\n");
626    char buffer[256];
627    uint32_t numberExp;
628   
629    /* Receive number of experience entries */
630    memset(buffer, 0, 256);
631    ReadMessage(commandSocketFD, buffer);
632    numberExp = atoi(buffer);
633
634    LOG("Cognitive Engine:: Waiting for %i number of entries.\n", numberExp);
635 
636    SendMessage(commandSocketFD, "receive_exp_ack");
637}
638
639Parameter*
640CognitiveEngine::GetSolution(Observable *observables, Parameter *currentParameters)
641{
642    LOG("Cognitive Engine:: Generating solution.\n");
643
644    char *searchNames[radioInfo->numUtilities];
645
646    for(size_t i = 0; i < radioInfo->numUtilities; i++) {
647        searchNames[i] = (char*)observables[i].name.c_str();
648    }
649
650    float searchVals[radioInfo->numUtilities];
651
652    for(size_t i = 0; i < radioInfo->numUtilities; i++) {
653        searchVals[i] = uList[i].target;
654    }
655
656    uint32_t numberColumns =
657        radioInfo->numUtilities +
658        radioInfo->numParameters +
659        radioInfo->numObservables + 1;
660   
661    float returnValues[numberColumns];
662   
663    int searchOps[radioInfo->numUtilities];
664    for(size_t i = 0; i < radioInfo->numUtilities; i++) {
665
666        /* If the goal is to maximum, set the search operation to
667         * return values greater than the target.
668         *
669         * If the goal is to minimize, set the search operation to
670         * return values less than the target.
671         */
672        if(strcmp(uList[i].goal.c_str(), "max") == 0) {
673            searchOps[i] = GT;
674        } else if(strcmp(uList[i].goal.c_str(), "min") == 0) {
675            searchOps[i] = LT;
676        }
677    }
678
679    cbr_print(myCBR);
680
681    /* CBR specific call */
682    uint32_t rc = cbr_search(myCBR, searchNames, searchOps, searchVals,
683            radioInfo->numUtilities, returnValues);
684
685    if(rc == 0){
686        /* Adapt the returned parameters to meet the objective */
687        LOG("Cognitive Engine:: Found\n");
688
689        /* Should do a random adaptation.. */
690        if(returnValues[numberColumns-1] > (uList[0].target * 0.2)) {
691            returnValues[1] = returnValues[1] - DECREMENTSCALE*returnValues[numberColumns-1];
692        } else if(returnValues[numberColumns-1] < -(uList[0].target * 0.2)) {
693            returnValues[1] = returnValues[1] + INCREMENTSCALE*returnValues[numberColumns-1];
694        }
695    } else if(rc == 31337) {
696        LOG("Cognitive Engine:: Not Found.\n");
697        /* No rows in the CBR, pick default parameters */
698        /* Currently this is hard coded and implementation specific! */
699        returnValues[1] = currentParameters[0].value + .25;
700       
701    } else {
702        LOG("Cognitive Engine:: Search return an invalid value.\n");
703    }
704
705    size_t returnValueIndex = 0;
706    for(size_t i = 0; i < radioInfo->numUtilities; i++) {
707        uList[i].value = returnValues[returnValueIndex];
708        returnValueIndex++;
709    }
710    for(size_t i = 0; i < radioInfo->numParameters; i++) {
711        pList[i].value = returnValues[returnValueIndex];
712        returnValueIndex++;
713    }
714    for(size_t i = 0; i < radioInfo->numObservables; i++) {
715        oList[i].value = returnValues[returnValueIndex];
716        returnValueIndex++;
717    }
718    returnValues[returnValueIndex] = 0;
719
720    char *allNames[numberColumns];
721    size_t allNameIndex = 0;
722    for(size_t i = 0; i < radioInfo->numUtilities; i++) {
723        allNames[allNameIndex] = (char*)uList[i].name.c_str();
724        returnValues[allNameIndex] = uList[i].target;
725        allNameIndex++;
726    }
727    for(size_t i = 0; i < radioInfo->numParameters; i++) {
728        allNames[allNameIndex] = (char*)pList[i].name.c_str();
729        allNameIndex++;
730    }
731    for(size_t i = 0; i < radioInfo->numObservables; i++) {
732        allNames[allNameIndex] = (char*)oList[i].name.c_str();
733        returnValues[allNameIndex] = 0;
734        allNameIndex++;
735    }
736    allNames[allNameIndex] = (char *) "utility";
737
738    // Add row to CBR.
739    cbr_add_row(myCBR, allNames, returnValues, returnValueIndex+1);
740
741    return pList;
742}
743
744
745Parameter*
746CognitiveEngine::GetSolution(Observable *observables, \
747        Parameter *currentParameters, std::string service)
748{
749    LOG("Cognitive Engine:: Generating solution for %s service.\n", service.c_str());
750
751    return pList;
752}
753
754
755void
756CognitiveEngine::ReceiveFeedback(Observable *observables, Parameter *parameters, \
757    std::string service)
758{
759    LOG("Cognitive Engine:: Receiving feedback.\n");
760}
761
762
763void
764CognitiveEngine::BuildCognitiveEngine()
765{
766    char filename[] = {"ex1"};
767    char tablename[] = {"data"};
768
769    uint32_t numberColumns =
770        radioInfo->numUtilities +
771        radioInfo->numParameters +
772        radioInfo->numObservables + 1;
773
774    char *cols[numberColumns];
775
776    size_t columnIndex = 0;
777    for (size_t i = 0; i < radioInfo->numUtilities; i++){
778        cols[columnIndex] = (char*)uList[i].name.c_str();
779        columnIndex++;
780    }   
781    for (size_t i = 0; i < radioInfo->numParameters; i++){
782        cols[columnIndex] = (char*)pList[i].name.c_str();
783        columnIndex++;
784    }   
785    for (size_t i = 0; i < radioInfo->numObservables; i++){
786        cols[columnIndex] = (char*)oList[i].name.c_str();
787        columnIndex++;
788    }   
789    cols[columnIndex] = (char *)"utility";
790
791    myCBR = cbr_create(filename, tablename, cols, numberColumns);
792}
793
Note: See TracBrowser for help on using the browser.