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

Revision 465, 25.7 KB (checked in by bhilburn, 15 years ago)

First step in revamping component architecture in preperation for fixing
the CBR implementation. Files only now include the declaration for the
component they need - not all of them.

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