root/vtcross/trunk/src/cognitive_engines/DSA_CE/DSA_CognitiveEngine.cpp @ 391

Revision 391, 25.2 KB (checked in by trnewman, 15 years ago)

Fleshed out DSA reference implementation

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