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

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

Thresholds changing

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