Changeset 231 for vtcross/trunk/src/cognitive_engines/CognitiveEngine.cpp
- Timestamp:
- 04/07/09 00:42:38 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
vtcross/trunk/src/cognitive_engines/CognitiveEngine.cpp
r230 r231 22 22 #include "vtcross/cbr.h" 23 23 24 // TODO this is really bad; need to move to a proper cbr.h 24 25 #include "cbr.c" 25 26 … … 28 29 29 30 30 31 31 static cbr myCBR; 32 32 33 33 34 CognitiveEngine::CognitiveEngine() … … 41 42 CognitiveEngine::~CognitiveEngine() 42 43 { 43 44 cbr_free(myCBR); 44 45 delete [] pList; 45 46 delete [] oList; … … 49 50 50 51 51 CognitiveEngine::CognitiveEngine(const char * serverName, const char*serverPort, \52 CognitiveEngine::CognitiveEngine(const char *serverName, const char *serverPort, \ 52 53 const bool SML) 53 54 { … … 72 73 73 74 void 74 CognitiveEngine::ConnectToRemoteComponent(const char *serverName, \75 const char *serverPort, const bool SML)75 CognitiveEngine::ConnectToRemoteComponent(const char *serverName, \ 76 const char *serverPort, const bool SML) 76 77 { 77 78 commandSocketFD = ClientSocket(serverName, serverPort); … … 98 99 { 99 100 LOG("Cognitive Engine:: Receiving feedback.\n"); 100 101 102 103 104 105 106 107 108 101 102 uint32_t numberColumns = 103 radioInfo->numParameters + 104 radioInfo->numUtilities; 105 106 uint32_t obsColumns = radioInfo->numObservables + 1; 107 108 float valList[numberColumns]; 109 float obsVals[numberColumns]; 109 110 char *nameList[numberColumns]; 110 111 char *obsList[obsColumns]; … … 112 113 size_t columnObsIndex = 0; 113 114 for (size_t i = 0; i < radioInfo->numObservables; i++){ 114 115 obsList[columnObsIndex] = (char*)observables[i].name.c_str(); 115 116 columnObsIndex++; 116 117 } … … 119 120 size_t columnIndex = 0; 120 121 for (size_t i = 0; i < radioInfo->numParameters; i++){ 121 122 nameList[columnIndex] = (char*)parameters[i].name.c_str(); 122 123 columnIndex++; 123 124 } 124 125 for (size_t i = 0; i < radioInfo->numUtilities; i++){ 125 126 nameList[columnIndex] = (char*)uList[i].name.c_str(); 126 127 columnIndex++; 127 128 } 128 129 129 130 size_t obsValueIndex = 0; 130 131 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; 132 obsVals[obsValueIndex] = observables[i].value; 133 obsValueIndex++; 134 } 135 136 /* Calculate Utility */ 137 float newUtilityValue = 0; 136 138 137 139 for(size_t i = 0; i < radioInfo->numUtilities; i++) { 138 139 140 141 142 140 newUtilityValue = newUtilityValue + (uList[i].target - observables[i].value); 141 } 142 obsVals[obsValueIndex] = newUtilityValue; 143 144 size_t returnValueIndex = 0; 143 145 for(size_t i = 0; i < radioInfo->numParameters; i++) { 144 145 146 146 valList[returnValueIndex] = parameters[i].value; 147 returnValueIndex++; 148 } 147 149 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); 150 valList[returnValueIndex] = uList[i].target; 151 returnValueIndex++; 152 } 153 154 cbr_update(myCBR, nameList, obsList, valList, obsVals, 155 numberColumns, obsColumns); 155 156 } 156 157 … … 177 178 /* Receive Set of current Parameters */ 178 179 memset(buffer, 0, 256); 179 ReadMessage(commandSocketFD, buffer);180 ReadMessage(commandSocketFD, buffer); 180 181 uint32_t numParameters = atoi(buffer); 181 182 … … 193 194 194 195 /* Receive Set of Observables */ 196 memset(buffer, 0, 256); 197 ReadMessage(commandSocketFD, buffer); 198 uint32_t numObservables = atoi(buffer); 199 200 Observable *o = new Observable[numObservables]; 201 202 for(size_t i = 0; i < numObservables; i++) { 203 memset(buffer, 0, 256); 204 ReadMessage(commandSocketFD, buffer); 205 o[i].name = std::string(buffer); 206 207 memset(buffer, 0, 256); 208 ReadMessage(commandSocketFD, buffer); 209 o[i].value = atof(buffer); 210 } 211 212 ReceiveFeedback(o,p); 213 214 delete [] o; 215 delete [] p; 216 } 217 else if(strcmp(buffer, "request_optimization") == 0) { 218 219 /* Receive Set of Observables */ 220 LOG("\nCognitive Engine:: Receiving Observable Parameters\n"); 221 195 222 memset(buffer, 0, 256); 196 223 ReadMessage(commandSocketFD,buffer); … … 209 236 } 210 237 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"); 238 /* Receive Set of current Parameters */ 239 LOG("Cognitive Engine:: Receiving Current Transmission Parameters\n"); 220 240 221 241 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 237 /* Receive Set of current Parameters */ 238 LOG("Cognitive Engine:: Receiving Current Transmission Parameters\n"); 239 240 memset(buffer, 0, 256); 241 ReadMessage(commandSocketFD,buffer); 242 ReadMessage(commandSocketFD, buffer); 242 243 uint32_t numCurrentParameters = atoi(buffer); 243 244 … … 253 254 cp[i].value = atof(buffer); 254 255 } 255 256 LOG("Cognitive Engine:: Processing parameters....\n"); 256 257 257 258 Parameter *solutionSet; 258 259 259 260 solutionSet = GetSolution(o,cp); 260 261 261 262 // TODO need to actually do something with the observables here 262 263 263 264 265 266 sprintf(numParametersChar,"%i",radioInfo->numParameters);267 SendMessage(commandSocketFD,numParametersChar);264 LOG("Cognitive Engine:: Sending Optimal Parameters to Application.\n"); 265 char numParametersChar[10]; 266 char solutionValue[50]; 267 sprintf(numParametersChar, "%i", radioInfo->numParameters); 268 SendMessage(commandSocketFD, numParametersChar); 268 269 for(size_t i = 0; i < radioInfo->numParameters; i++) { 269 SendMessage(commandSocketFD, solutionSet[i].name.c_str());270 SendMessage(commandSocketFD, solutionSet[i].name.c_str()); 270 271 memset(solutionValue, 0, 50); 271 sprintf(solutionValue,"%f",solutionSet[i].value);272 SendMessage(commandSocketFD, solutionValue);273 272 sprintf(solutionValue, "%f", solutionSet[i].value); 273 SendMessage(commandSocketFD, solutionValue); 274 } 274 275 275 276 delete [] o; … … 430 431 /* Receive Set of Utilities */ 431 432 memset(buffer, 0, 256); 432 ReadMessage(commandSocketFD, buffer);433 ReadMessage(commandSocketFD, buffer); 433 434 radioInfo->numUtilities = atoi(buffer); 434 435 435 436 for(size_t i = 0; i < radioInfo->numUtilities; i++) { 436 437 memset(buffer, 0, 256); 437 ReadMessage(commandSocketFD, buffer);438 ReadMessage(commandSocketFD, buffer); 438 439 uList[i].name = std::string(buffer); 439 440 440 441 memset(buffer, 0, 256); 441 ReadMessage(commandSocketFD, buffer);442 ReadMessage(commandSocketFD, buffer); 442 443 uList[i].units = std::string(buffer); 443 444 444 445 memset(buffer, 0, 256); 445 ReadMessage(commandSocketFD, buffer);446 ReadMessage(commandSocketFD, buffer); 446 447 uList[i].goal = std::string(buffer); 447 448 448 449 memset(buffer, 0, 256); 449 ReadMessage(commandSocketFD, buffer);450 ReadMessage(commandSocketFD, buffer); 450 451 uList[i].target = atof(buffer); 451 452 } … … 484 485 memset(buffer, 0, 256); 485 486 ReadMessage(commandSocketFD,buffer); 487 // TODO for + if{break} = while? 486 488 for(size_t k = 0; k < radioInfo->numUtilities; k++) { 487 if(uList[k].name == std::string(buffer)){489 if(uList[k].name == std::string(buffer)) { 488 490 pList[i].affection_list[j].u = &uList[k]; 489 491 break; … … 492 494 493 495 memset(buffer, 0, 256); 494 ReadMessage(commandSocketFD, buffer);496 ReadMessage(commandSocketFD, buffer); 495 497 pList[i].affection_list[j].relation = std::string(buffer); 496 498 } … … 499 501 /* Receive Set of Observables */ 500 502 memset(buffer, 0, 256); 501 ReadMessage(commandSocketFD, buffer);503 ReadMessage(commandSocketFD, buffer); 502 504 radioInfo->numObservables = atoi(buffer); 503 505 504 506 for(size_t i = 0; i < radioInfo->numObservables; i++) { 505 507 memset(buffer, 0, 256); 506 ReadMessage(commandSocketFD, buffer);508 ReadMessage(commandSocketFD, buffer); 507 509 oList[i].name = std::string(buffer); 508 510 509 511 memset(buffer, 0, 256); 510 ReadMessage(commandSocketFD, buffer);512 ReadMessage(commandSocketFD, buffer); 511 513 oList[i].numAffects = atoi(buffer); 512 514 513 515 for(size_t j = 0; j < oList[i].numAffects; j++) { 514 516 memset(buffer, 0, 256); 515 ReadMessage(commandSocketFD,buffer); 517 ReadMessage(commandSocketFD, buffer); 518 // TODO for + if{break} = while? 516 519 for(size_t k = 0; k < radioInfo->numUtilities; k++) { 517 520 if(uList[k].name == std::string(buffer)){ 518 521 oList[i].affection_list[j].u = &uList[k]; 519 522 break; … … 522 525 523 526 memset(buffer, 0, 256); 524 ReadMessage(commandSocketFD, buffer);527 ReadMessage(commandSocketFD, buffer); 525 528 oList[i].affection_list[j].relation = std::string(buffer); 526 529 } … … 529 532 SendMessage(commandSocketFD, "receive_config_ack"); 530 533 531 534 BuildCognitiveEngine(); 532 535 } 533 536 … … 541 544 /* Receive number of experience entries */ 542 545 memset(buffer, 0, 256); 543 ReadMessage(commandSocketFD, buffer);546 ReadMessage(commandSocketFD, buffer); 544 547 numberExp = atoi(buffer); 545 548 546 LOG("Cognitive Engine:: Waiting for %i number of entries.\n", numberExp);549 LOG("Cognitive Engine:: Waiting for %i number of entries.\n", numberExp); 547 550 548 551 SendMessage(commandSocketFD, "receive_exp_ack"); … … 558 561 for(size_t i = 0; i < radioInfo->numUtilities; i++) { 559 562 searchNames[i] = (char*)observables[i].name.c_str(); 560 563 } 561 564 562 565 float searchVals[radioInfo->numUtilities]; 563 566 564 565 567 for(size_t i = 0; i < radioInfo->numUtilities; i++) { 568 searchVals[i] = uList[i].target; 566 569 } 567 570 568 571 uint32_t numberColumns = 569 570 571 572 573 574 575 572 radioInfo->numUtilities + 573 radioInfo->numParameters + 574 radioInfo->numObservables + 1; 575 576 float returnValues[numberColumns]; 577 578 int searchOps[radioInfo->numUtilities]; 576 579 for(size_t i = 0; i < radioInfo->numUtilities; i++) { 577 580 578 581 /* If the goal is to maximum, set the search operation to 579 * return values greater than the target. 580 * 581 * If the goal is to minimize, set the search operation to 582 * return values less than the target. 583 */ 584 585 if(strcmp(uList[i].goal.c_str(),"max") == 0) { 586 searchOps[i] = GT; 587 } else if(strcmp(uList[i].goal.c_str(),"min") == 0) { 588 searchOps[i] = LT; 589 } 590 } 591 592 /* CBR specific call */ 593 uint32_t rc = cbr_search(myCBR, searchNames, searchOps, searchVals, 594 radioInfo->numUtilities, returnValues); 595 596 if(rc == 0){ 582 * return values greater than the target. 583 * 584 * If the goal is to minimize, set the search operation to 585 * return values less than the target. 586 */ 587 if(strcmp(uList[i].goal.c_str(), "max") == 0) { 588 searchOps[i] = GT; 589 } else if(strcmp(uList[i].goal.c_str(), "min") == 0) { 590 searchOps[i] = LT; 591 } 592 } 593 594 /* CBR specific call */ 595 uint32_t rc = cbr_search(myCBR, searchNames, searchOps, searchVals, 596 radioInfo->numUtilities, returnValues); 597 598 if(rc == 0){ 597 599 /* Adapt the returned parameters to meet the objective */ 598 599 600 WARNING("Cognitive Engine:: Found\n"); 600 601 601 // Should do a random adaptation.. 602 603 604 602 /* Should do a random adaptation.. */ 603 if(returnValues[numberColumns-1] < 0) { 604 returnValues[2] = returnValues[2] - 15; 605 returnValues[3] = returnValues[3] - 2; 605 606 } else { 606 607 608 609 } else if(rc == 31337) {607 returnValues[2] = returnValues[2] + 15; 608 returnValues[3] = returnValues[3] + 2; 609 } 610 } else if(rc == 31337) { 610 611 WARNING("Cognitive Engine:: Not Found.\n"); 611 612 // Currently this is hard coded and implementation specific! 613 614 612 /* No rows in the CBR, pick default parameters */ 613 /* Currently this is hard coded and implementation specific! */ 614 returnValues[2] = currentParameters[0].value + 5; 615 returnValues[3] = currentParameters[1].value + 10; 615 616 616 617 } else { 617 618 WARNING("Cognitive Engine:: Search return an invalid value.\n"); 618 619 620 619 } 620 621 size_t returnValueIndex = 0; 621 622 for(size_t i = 0; i < radioInfo->numUtilities; i++) { 622 623 624 623 uList[i].value = returnValues[returnValueIndex]; 624 returnValueIndex++; 625 } 625 626 for(size_t i = 0; i < radioInfo->numParameters; i++) { 626 627 628 627 pList[i].value = returnValues[returnValueIndex]; 628 returnValueIndex++; 629 } 629 630 for(size_t i = 0; i < radioInfo->numObservables; i++) { 630 631 632 631 oList[i].value = returnValues[returnValueIndex]; 632 returnValueIndex++; 633 } 633 634 returnValues[returnValueIndex] = 0; 634 635 635 636 char *allNames[numberColumns]; 636 637 size_t allNameIndex = 0; 637 638 for(size_t i = 0; i < radioInfo->numUtilities; i++) { 638 639 allNames[allNameIndex] = (char*)uList[i].name.c_str(); 639 640 641 640 returnValues[allNameIndex] = uList[i].target; 641 allNameIndex++; 642 } 642 643 for(size_t i = 0; i < radioInfo->numParameters; i++) { 643 644 allNames[allNameIndex] = (char*)pList[i].name.c_str(); 644 645 645 allNameIndex++; 646 } 646 647 for(size_t i = 0; i < radioInfo->numObservables; i++) { 647 648 allNames[allNameIndex] = (char*)oList[i].name.c_str(); 648 649 650 649 returnValues[allNameIndex] = 0; 650 allNameIndex++; 651 } 651 652 allNames[allNameIndex] = "utility"; 652 653 653 // Add row to CBR. 654 cbr_add_row(myCBR, allNames, returnValues, returnValueIndex+1); 655 656 return pList; 657 654 // Add row to CBR. 655 cbr_add_row(myCBR, allNames, returnValues, returnValueIndex+1); 656 657 return pList; 658 658 } 659 659 660 660 661 661 Parameter* 662 CognitiveEngine::GetSolution(Observable *observables, Parameter *currentParameters, std::string service) 663 { 664 LOG("Cognitive Engine:: Generating solution for %s service.\n",service.c_str()); 662 CognitiveEngine::GetSolution(Observable *observables, \ 663 Parameter *currentParameters, std::string service) 664 { 665 LOG("Cognitive Engine:: Generating solution for %s service.\n", service.c_str()); 665 666 666 667 return pList; … … 679 680 CognitiveEngine::BuildCognitiveEngine() 680 681 { 681 682 682 char filename[] = {"ex1"}; 683 char tablename[] = {"data"}; 683 684 684 685 uint32_t numberColumns = 685 686 687 686 radioInfo->numUtilities + 687 radioInfo->numParameters + 688 radioInfo->numObservables + 1; 688 689 689 690 char *cols[numberColumns]; … … 691 692 size_t columnIndex = 0; 692 693 for (size_t i = 0; i < radioInfo->numUtilities; i++){ 693 694 cols[columnIndex] = (char*)uList[i].name.c_str(); 694 695 columnIndex++; 695 696 } 696 697 for (size_t i = 0; i < radioInfo->numParameters; i++){ 697 698 cols[columnIndex] = (char*)pList[i].name.c_str(); 698 699 columnIndex++; 699 700 } 700 701 for (size_t i = 0; i < radioInfo->numObservables; i++){ 701 702 cols[columnIndex] = (char*)oList[i].name.c_str(); 702 703 columnIndex++; 703 704 }