root/vtcross/trunk/src/cognitive_engines/CognitiveEngine.cpp @ 301

Revision 301, 23.6 KB (checked in by trnewman, 15 years ago)

Demo fixups

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