Changeset 230

Show
Ignore:
Timestamp:
04/03/09 13:05:41 (15 years ago)
Author:
trnewman
Message:

Added a loop in the demo to actually adapt.

Added simple adaptation functionality and proper db querying in the CE.

Location:
vtcross/trunk/src
Files:
7 modified

Legend:

Unmodified
Added
Removed
  • vtcross/trunk/src/cognitive_engines/CognitiveEngine.cpp

    r228 r230  
    1212#include <cstring> 
    1313#include <stdint.h> 
     14#include <math.h> 
    1415 
    1516#include "vtcross/common.h" 
     
    9495 
    9596void  
     97CognitiveEngine::ReceiveFeedback(Observable *observables, Parameter *parameters) 
     98{  
     99   LOG("Cognitive Engine:: Receiving feedback.\n"); 
     100         
     101        uint32_t numberColumns =  
     102                radioInfo->numParameters + 
     103                radioInfo->numUtilities; 
     104 
     105        uint32_t obsColumns = radioInfo->numObservables + 1; 
     106 
     107        float valList[numberColumns]; 
     108        float obsVals[numberColumns]; 
     109    char *nameList[numberColumns]; 
     110    char *obsList[obsColumns]; 
     111 
     112    size_t columnObsIndex = 0; 
     113    for (size_t i = 0; i < radioInfo->numObservables; i++){ 
     114                obsList[columnObsIndex] = (char*)observables[i].name.c_str(); 
     115        columnObsIndex++; 
     116    }   
     117    obsList[columnObsIndex] = "utility"; 
     118 
     119    size_t columnIndex = 0; 
     120    for (size_t i = 0; i < radioInfo->numParameters; i++){ 
     121                nameList[columnIndex] = (char*)parameters[i].name.c_str(); 
     122        columnIndex++; 
     123    }    
     124    for (size_t i = 0; i < radioInfo->numUtilities; i++){ 
     125                nameList[columnIndex] = (char*)uList[i].name.c_str(); 
     126        columnIndex++; 
     127    }    
     128 
     129        size_t obsValueIndex = 0; 
     130    for(size_t i = 0; i < radioInfo->numObservables; i++) { 
     131                obsVals[obsValueIndex] = observables[i].value; 
     132                obsValueIndex++; 
     133        } 
     134        // Calculate Utility 
     135        float newUtilityValue = 0; 
     136 
     137    for(size_t i = 0; i < radioInfo->numUtilities; i++) { 
     138                newUtilityValue = newUtilityValue + (uList[i].target - observables[i].value); 
     139        } 
     140        obsVals[obsValueIndex] = newUtilityValue; 
     141 
     142        size_t returnValueIndex = 0; 
     143    for(size_t i = 0; i < radioInfo->numParameters; i++) { 
     144                valList[returnValueIndex] = parameters[i].value; 
     145                returnValueIndex++; 
     146        } 
     147    for(size_t i = 0; i < radioInfo->numUtilities; i++) { 
     148                valList[returnValueIndex] = uList[i].target; 
     149                returnValueIndex++; 
     150        } 
     151 
     152 
     153        cbr_update(myCBR, nameList, obsList, valList, obsVals,  
     154                        numberColumns, obsColumns); 
     155} 
     156 
     157 
     158void  
    96159CognitiveEngine::WaitForSignal() 
    97160{ 
     
    110173        // MUCH faster since instead of donig string compares we can simply 
    111174        // switch on the integer value... 
    112         if(strcmp(buffer, "request_optimization") == 0) { 
     175        if(strcmp(buffer, "update_performance") == 0) { 
    113176             
     177            /* Receive Set of current Parameters */ 
     178            memset(buffer, 0, 256); 
     179            ReadMessage(commandSocketFD,buffer); 
     180            uint32_t numParameters = atoi(buffer); 
     181    
     182            Parameter *p = new Parameter[numParameters]; 
     183  
     184            for(size_t i = 0; i < numParameters; i++) { 
     185                memset(buffer, 0, 256); 
     186                ReadMessage(commandSocketFD, buffer); 
     187                p[i].name = std::string(buffer); 
     188     
     189                memset(buffer, 0, 256); 
     190                ReadMessage(commandSocketFD, buffer); 
     191                p[i].value = atof(buffer); 
     192            }  
     193 
    114194            /* Receive Set of Observables */ 
    115                         LOG("Cognitive Engine:: Receiving Observable Parameters\n"); 
    116  
    117195            memset(buffer, 0, 256); 
    118196            ReadMessage(commandSocketFD,buffer); 
     
    131209            }   
    132210 
     211                        ReceiveFeedback(o,p); 
     212 
     213            delete [] o; 
     214            delete [] p; 
     215                }  
     216                else if(strcmp(buffer, "request_optimization") == 0) { 
     217             
     218            /* Receive Set of Observables */ 
     219                        LOG("\nCognitive Engine:: Receiving Observable Parameters\n"); 
     220 
     221            memset(buffer, 0, 256); 
     222            ReadMessage(commandSocketFD,buffer); 
     223            uint32_t numObservables = atoi(buffer); 
     224    
     225            Observable *o = new Observable[numObservables]; 
     226  
     227            for(size_t i = 0; i < numObservables; i++) { 
     228                memset(buffer, 0, 256); 
     229                ReadMessage(commandSocketFD, buffer); 
     230                o[i].name = std::string(buffer); 
     231     
     232                memset(buffer, 0, 256); 
     233                ReadMessage(commandSocketFD, buffer); 
     234                o[i].value = atof(buffer); 
     235            }   
     236 
    133237            /* Receive Set of current Parameters */ 
    134238                        LOG("Cognitive Engine:: Receiving Current Transmission Parameters\n"); 
     
    156260 
    157261            // TODO need to actually do something with the observables here 
    158              
     262            
    159263                        LOG("Cognitive Engine:: Sending Optimal Parameters to Application.\n"); 
    160264                        char numParametersChar[10]; 
     
    453557 
    454558    for(size_t i = 0; i < radioInfo->numUtilities; i++) { 
    455         searchNames[i] = (char*)uList[i].name.c_str(); 
     559        searchNames[i] = (char*)observables[i].name.c_str(); 
    456560        } 
    457561 
     
    492596        if(rc == 0){ 
    493597        /* Adapt the returned parameters to meet the objective */ 
    494  
     598             
     599        WARNING("Cognitive Engine:: Found\n"); 
     600 
     601                // Should do a random adaptation..  
     602                if(returnValues[numberColumns-1] < 0) { 
     603                        returnValues[2] = returnValues[2] - 15; 
     604                        returnValues[3] = returnValues[3] - 2; 
     605        } else { 
     606                        returnValues[2] = returnValues[2] + 15; 
     607                        returnValues[3] = returnValues[3] + 2; 
     608                } 
    495609    } else if(rc == 31337){ 
     610        WARNING("Cognitive Engine:: Not Found.\n"); 
    496611                /* No rows in the CBR, pick default parameters */ 
    497612                // Currently this is hard coded and implementation specific! 
    498             //returnValues[2] = currentParameters[0].value + 5; 
    499             //returnValues[3] = currentParameters[1].value + 10; 
     613            returnValues[2] = currentParameters[0].value + 5; 
     614            returnValues[3] = currentParameters[1].value + 10; 
    500615         
    501616        } else { 
     
    516631                returnValueIndex++; 
    517632        } 
     633    returnValues[returnValueIndex] = 0; 
     634 
     635    char *allNames[numberColumns]; 
     636        size_t allNameIndex = 0; 
     637    for(size_t i = 0; i < radioInfo->numUtilities; i++) { 
     638        allNames[allNameIndex] = (char*)uList[i].name.c_str(); 
     639                returnValues[allNameIndex] = uList[i].target; 
     640                allNameIndex++; 
     641        } 
     642    for(size_t i = 0; i < radioInfo->numParameters; i++) { 
     643        allNames[allNameIndex] = (char*)pList[i].name.c_str(); 
     644                allNameIndex++; 
     645        } 
     646    for(size_t i = 0; i < radioInfo->numObservables; i++) { 
     647        allNames[allNameIndex] = (char*)oList[i].name.c_str(); 
     648                returnValues[allNameIndex] = 0; 
     649                allNameIndex++; 
     650        } 
     651    allNames[allNameIndex] = "utility"; 
    518652 
    519653        // Add row to CBR.  
     654        cbr_add_row(myCBR, allNames, returnValues, returnValueIndex+1); 
    520655 
    521656        return pList; 
     
    535670void  
    536671CognitiveEngine::ReceiveFeedback(Observable *observables, Parameter *parameters, \ 
    537     Utility *utilities) 
    538 { 
    539     LOG("Cognitive Engine:: Receiving feedback.\n"); 
    540 } 
    541  
    542  
    543 void  
    544 CognitiveEngine::ReceiveFeedback(Observable *observables, Parameter *parameters, \ 
    545     Utility *utilities, std::string service) 
     672    std::string service) 
    546673{ 
    547674    LOG("Cognitive Engine:: Receiving feedback.\n"); 
  • vtcross/trunk/src/cognitive_engines/cbr.c

    r228 r230  
    222222    } 
    223223 
    224     printf("search command: %s\n", _cbr->command); 
     224    //printf("search command: %s\n", _cbr->command); 
    225225 
    226226    //ExecuteCommand(_cbr); 
     
    235235} 
    236236 
     237 
     238// update a row  
     239int cbr_update(cbr _cbr, char *_where[], char*_set[], float *_wherevals, float *_setvals,  
     240                unsigned int _wherelen, unsigned int _setlen) 
     241{ 
     242    unsigned int i; 
     243     
     244    // generate command 
     245    //printf("%s\n", _cbr->command); 
     246    strcpy(_cbr->command, "UPDATE "); 
     247    strcat(_cbr->command, _cbr->tablename); 
     248     
     249    strcat(_cbr->command, " SET "); 
     250    for (i=0; i<_setlen; i++) { 
     251        strcat(_cbr->command, _set[i]); 
     252        strcat(_cbr->command, " = "); 
     253        sprintf(_cbr->command, "%s%f", _cbr->command, _setvals[i]); 
     254        strcat(_cbr->command, "  "); 
     255        if (i != _setlen-1) // not last entry 
     256            strcat(_cbr->command, ", "); 
     257    } 
     258    strcat(_cbr->command, " WHERE "); 
     259 
     260    for (i=0; i<_wherelen; i++) { 
     261        strcat(_cbr->command, _where[i]); 
     262        strcat(_cbr->command, " = "); 
     263        sprintf(_cbr->command, "%s%f", _cbr->command, _wherevals[i]); 
     264        strcat(_cbr->command, "  "); 
     265        if (i != _wherelen-1) // not last entry 
     266            strcat(_cbr->command, "AND "); 
     267    } 
     268    strcat(_cbr->command, ";"); 
     269     
     270    //printf("search command: %s\n", _cbr->command); 
     271    // execute add command 
     272    ExecuteCommand(_cbr); 
     273 
     274    return 0; 
     275} 
    237276 
    238277// cbr add a row 
     
    264303    strcat(_cbr->command, ");"); 
    265304     
     305    //printf("search command: %s\n", _cbr->command); 
    266306    // execute add command 
    267307    ExecuteCommand(_cbr); 
  • vtcross/trunk/src/include/vtcross/components.h

    r228 r230  
    272272         */ 
    273273        void ReceiveFeedback(Observable *observables,\ 
    274                 Parameter *parameters, Utility *utilities); 
     274                Parameter *parameters); 
    275275        void ReceiveFeedback(Observable *observables, \ 
    276                 Parameter *parameters, Utility *utilities, std::string service); 
     276                Parameter *parameters, std::string service); 
    277277 
    278278 
     
    352352        bool SendRadioConfiguration(int32_t socketFD); 
    353353        bool SendRadioExperience(int32_t socketFD); 
    354   
     354 
     355                bool UpdateParameterPerformance(int32_t socketFD); 
     356 
    355357        bool SML_present; 
    356358        bool PE_present; 
  • vtcross/trunk/src/include/vtcross/libvtcross.h

    r228 r230  
    8686 * radio's performance? 
    8787 */ 
    88 bool UpdateParameterPerformance(Parameter *radioParameters, \ 
    89         Observable *radioObservables, Utility *radioUtilies); 
    90  
     88bool UpdateParameterPerformance(Parameter *p, uint32_t numParameters, Observable *o, \ 
     89        uint32_t numObservables); 
    9190 
    9291/* Deactivate/Activate/Disconnect a component by id. 
     
    107106 */ 
    108107uint32_t GetNumParameters(); 
     108uint32_t GetNumObservables(); 
     109uint32_t GetNumUtilities(); 
    109110 
    110111 
  • vtcross/trunk/src/libvtcross/libvtcross.cpp

    r229 r230  
    2525     
    2626    return socket; 
     27} 
     28 
     29uint32_t 
     30GetNumObservables() 
     31{ 
     32        uint32_t socketfd, numObservables; 
     33    char buffer[256]; 
     34 
     35    socketfd = ConnectToRemoteComponent(); 
     36    SendMessage(socketfd,"get_number_observables"); 
     37     
     38    memset(buffer, 0, 256); 
     39    ReadMessage(socketfd, buffer); 
     40    numObservables = atoi(buffer); 
     41         
     42        return numObservables;  
     43} 
     44 
     45uint32_t 
     46GetNumUtilities() 
     47{ 
     48        uint32_t socketfd, numUtilities; 
     49    char buffer[256]; 
     50 
     51    socketfd = ConnectToRemoteComponent(); 
     52    SendMessage(socketfd,"get_number_utilities"); 
     53     
     54    memset(buffer, 0, 256); 
     55    ReadMessage(socketfd, buffer); 
     56    numUtilities = atoi(buffer); 
     57         
     58        return numUtilities;  
    2759} 
    2860 
     
    106138} 
    107139 
     140bool 
     141UpdateParameterPerformance(Parameter *p, uint32_t numParameters, Observable *o, 
     142                uint32_t numObservables) 
     143{ 
     144        char counter[55]; 
     145    char var[50]; 
     146 
     147    uint32_t socketFD = ConnectToRemoteComponent(); 
     148    SendMessage(socketFD, "update_performance"); 
     149     
     150    // Send Parameters  
     151    memset(counter, 0, 55); 
     152    sprintf(counter, "%i", numParameters); 
     153    SendMessage(socketFD, counter); 
     154         
     155        for(size_t i = 0; i < numParameters; i++) { 
     156        SendMessage(socketFD,p[i].name.c_str()); 
     157        sprintf(var,"%f",p[i].value); 
     158        SendMessage(socketFD,var);       
     159    } 
     160     
     161        // Send Observables 
     162    sprintf(counter, "%i", numObservables); 
     163    SendMessage(socketFD, counter); 
     164    for(size_t i = 0; i < numObservables; i++) { 
     165        SendMessage(socketFD, o[i].name.c_str()); 
     166        sprintf(var, "%f", o[i].value); 
     167        SendMessage(socketFD, var);      
     168    } 
     169} 
  • vtcross/trunk/src/libvtcross/libvtcross_demo.cpp

    r228 r230  
    2323main(int32_t argc, char *argv[]) 
    2424{ 
    25     Observable *o = new Observable[1]; 
     25 
     26        for(size_t i = 0; i < 10; i++) { 
     27    Observable *o = new Observable[2]; 
    2628    Parameter *currentParameters = new Parameter[2]; 
    2729    Parameter * p; 
    2830 
    2931        uint32_t numParameters; 
     32        uint32_t numObservables; 
     33        uint32_t numUtilities; 
    3034 
    31     o[0].name = "PER"; 
    32         o[0].value = 12.00; 
     35    o[0].name = "throughput"; 
     36        o[0].value = 150.00; 
     37    o[1].name = "PER"; 
     38        o[1].value = 12.00; 
    3339 
    34     currentParameters[0].name = "tx_power"; 
    35     currentParameters[0].value = 10.0; 
    36     currentParameters[1].name = "bandwidth"; 
    37     currentParameters[1].value = 300.0; 
     40        if(i == 0) { 
     41    currentParameters[0].name = "bandwidth"; 
     42    currentParameters[0].value = 300.0; 
     43    currentParameters[1].name = "tx_power"; 
     44    currentParameters[1].value = 10.0; 
    3845 
    39     p = GetOptimalParameters(o,1,currentParameters,2); 
     46        } else { 
     47    currentParameters[0].value = p[0].value; 
     48    currentParameters[1].value = p[1].value; 
     49        } 
     50    p = GetOptimalParameters(o,2,currentParameters,2); 
    4051    numParameters = GetNumParameters(); 
     52    numObservables = GetNumObservables(); 
     53    numUtilities = GetNumUtilities(); 
    4154 
    4255        printf("Application:: Received the following parameters.\n"); 
     
    4861        // Try them out! Do they work? 
    4962     
    50     Utility *resultingUtility = new Utility[2]; 
    51          
    52         // UpdateParameterPerformance(p,o,resultingUtility);     
     63    o[0].value = 0.5*p[0].value + .1*p[1].value; 
     64    o[1].value = 15-p[1].value; 
     65 
     66        UpdateParameterPerformance(p,numParameters,o,numObservables);    
    5367         
    5468         
    5569        delete [] p;  
    5670    delete [] o;  
    57  
     71        } 
    5872        return 0; 
    5973} 
  • vtcross/trunk/src/shell/CognitiveRadioShell.cpp

    r229 r230  
    552552} 
    553553 
    554  
     554bool 
     555CognitiveRadioShell::UpdateParameterPerformance(int32_t socketFD) 
     556{ 
     557    char counter[55]; 
     558    uint32_t numObservables,numParameters; 
     559    char var[50]; 
     560    char buffer[256]; 
     561 
     562        /* Receive Set of Parameters */ 
     563    memset(buffer, 0, 256); 
     564    ReadMessage(commandSocketFD,buffer); 
     565    numParameters = atoi(buffer); 
     566   
     567    Parameter *p = new Parameter[numParameters]; 
     568 
     569    for (size_t i = 0; i < numParameters; i++){ 
     570        memset(buffer, 0, 256); 
     571        ReadMessage(commandSocketFD,buffer); 
     572        p[i].name = std::string(buffer); 
     573        memset(buffer, 0, 256); 
     574        ReadMessage(commandSocketFD,buffer); 
     575        p[i].value = atof(buffer); 
     576    } 
     577 
     578    /* Receive Set of Observables */ 
     579    memset(buffer, 0, 256); 
     580    ReadMessage(commandSocketFD, buffer); 
     581    numObservables = atoi(buffer); 
     582   
     583    Observable *o = new Observable[numObservables]; 
     584  
     585    for(size_t i = 0; i < numObservables; i++) { 
     586        memset(buffer, 0, 256); 
     587        ReadMessage(commandSocketFD, buffer); 
     588        o[i].name = std::string(buffer); 
     589    
     590        memset(buffer, 0, 256); 
     591        ReadMessage(commandSocketFD, buffer); 
     592        o[i].value = atof(buffer); 
     593    } 
     594 
     595 
     596    SendMessage(ceSocketFD, "update_performance"); 
     597    
     598    // Send Parameters  
     599    memset(counter, 0, 55); 
     600    sprintf(counter, "%i", numParameters); 
     601    SendMessage(ceSocketFD, counter); 
     602     
     603    for(size_t i = 0; i < numParameters; i++) { 
     604        SendMessage(ceSocketFD,p[i].name.c_str()); 
     605        sprintf(var,"%f",p[i].value); 
     606        SendMessage(ceSocketFD,var);   
     607    }    
     608     
     609    // Send Observables 
     610    sprintf(counter, "%i", numObservables); 
     611    SendMessage(ceSocketFD, counter); 
     612    for(size_t i = 0; i < numObservables; i++) { 
     613        SendMessage(ceSocketFD, o[i].name.c_str()); 
     614        sprintf(var, "%f", o[i].value); 
     615        SendMessage(ceSocketFD, var);  
     616    }    
     617     
     618    return 1; 
     619} 
    555620void 
    556621CognitiveRadioShell::HandleMessage(int32_t socketFD) 
     
    572637    } else if(strcmp(buffer, "deregister_sml") == 0) { 
    573638        DeregisterSML(socketFD); 
     639    } else if(strcmp(buffer, "update_performance") == 0) { 
     640        UpdateParameterPerformance(socketFD); 
     641    } else if(strcmp(buffer,"get_number_utilities") == 0) { 
     642                char numUtilities[20]; 
     643                sprintf(numUtilities,"%i",radio_info->numUtilities); 
     644        SendMessage(commandSocketFD,numUtilities); 
     645    } else if(strcmp(buffer,"get_number_observables") == 0) { 
     646                char numObservables[20]; 
     647                sprintf(numObservables,"%i",radio_info->numObservables); 
     648        SendMessage(commandSocketFD,numObservables); 
    574649    } else if(strcmp(buffer,"get_number_parameters") == 0) { 
    575650                char numParameters[20];