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

Revision 390, 22.9 KB (checked in by trnewman, 15 years ago)

Functional DSA CBR, although it picks a random row.

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