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

Revision 411, 25.7 KB (checked in by trnewman, 15 years ago)

Adding Apache license information.

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