root/vtcross/trunk/src/cognitive_engines/CBR_CE/CognitiveEngine.cpp @ 521

Revision 521, 24.4 KB (checked in by bhilburn, 15 years ago)

Added some more doxygen docs at the top of files.

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