00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <iostream>
00030 using namespace std;
00031
00032 #include "../../sbpl/headers.h"
00033
00034
00035
00036
00037
00038
00039 ARAPlanner::ARAPlanner(DiscreteSpaceInformation* environment, bool bSearchForward)
00040 {
00041 bforwardsearch = bSearchForward;
00042
00043 environment_ = environment;
00044
00045 bsearchuntilfirstsolution = false;
00046 finitial_eps = ARA_DEFAULT_INITIAL_EPS;
00047 searchexpands = 0;
00048 MaxMemoryCounter = 0;
00049
00050 #ifndef ROS
00051 const char* debug = "debug.txt";
00052 #endif
00053 fDeb = SBPL_FOPEN(debug, "w");
00054 if(fDeb == NULL){
00055 SBPL_ERROR("ERROR: could not open planner debug file\n");
00056 throw new SBPL_Exception();
00057 }
00058
00059 pSearchStateSpace_ = new ARASearchStateSpace_t;
00060
00061
00062
00063 if(CreateSearchStateSpace(pSearchStateSpace_) != 1)
00064 {
00065 SBPL_ERROR("ERROR: failed to create statespace\n");
00066 return;
00067 }
00068
00069
00070 if(InitializeSearchStateSpace(pSearchStateSpace_) != 1)
00071 {
00072 SBPL_ERROR("ERROR: failed to create statespace\n");
00073 return;
00074 }
00075 finitial_eps_planning_time = -1.0;
00076 final_eps_planning_time = -1.0;
00077 num_of_expands_initial_solution = 0;
00078 final_eps = -1.0;
00079 }
00080
00081 ARAPlanner::~ARAPlanner()
00082 {
00083 if(pSearchStateSpace_ != NULL){
00084
00085 DeleteSearchStateSpace(pSearchStateSpace_);
00086 delete pSearchStateSpace_;
00087 }
00088 SBPL_FCLOSE(fDeb);
00089 }
00090
00091
00092 void ARAPlanner::Initialize_searchinfo(CMDPSTATE* state, ARASearchStateSpace_t* pSearchStateSpace)
00093 {
00094
00095 ARAState* searchstateinfo = (ARAState*)state->PlannerSpecificData;
00096
00097 searchstateinfo->MDPstate = state;
00098 InitializeSearchStateInfo(searchstateinfo, pSearchStateSpace);
00099 }
00100
00101
00102 CMDPSTATE* ARAPlanner::CreateState(int stateID, ARASearchStateSpace_t* pSearchStateSpace)
00103 {
00104 CMDPSTATE* state = NULL;
00105
00106 #if DEBUG
00107 if(environment_->StateID2IndexMapping[stateID][ARAMDP_STATEID2IND] != -1)
00108 {
00109 SBPL_ERROR("ERROR in CreateState: state already created\n");
00110 throw new SBPL_Exception();
00111 }
00112 #endif
00113
00114
00115 state = pSearchStateSpace->searchMDP.AddState(stateID);
00116
00117
00118 environment_->StateID2IndexMapping[stateID][ARAMDP_STATEID2IND] = pSearchStateSpace->searchMDP.StateArray.size()-1;
00119
00120 #if DEBUG
00121 if(state != pSearchStateSpace->searchMDP.StateArray[environment_->StateID2IndexMapping[stateID][ARAMDP_STATEID2IND]])
00122 {
00123 SBPL_ERROR("ERROR in CreateState: invalid state index\n");
00124 throw new SBPL_Exception();
00125 }
00126 #endif
00127
00128
00129
00130 state->PlannerSpecificData = (ARAState*)malloc(sizeof(ARAState));
00131 Initialize_searchinfo(state, pSearchStateSpace);
00132 MaxMemoryCounter += sizeof(ARAState);
00133
00134 return state;
00135
00136 }
00137
00138 CMDPSTATE* ARAPlanner::GetState(int stateID, ARASearchStateSpace_t* pSearchStateSpace)
00139 {
00140
00141 if(stateID >= (int)environment_->StateID2IndexMapping.size())
00142 {
00143 SBPL_ERROR("ERROR int GetState: stateID %d is invalid\n", stateID);
00144 throw new SBPL_Exception();
00145 }
00146
00147 if(environment_->StateID2IndexMapping[stateID][ARAMDP_STATEID2IND] == -1)
00148 return CreateState(stateID, pSearchStateSpace);
00149 else
00150 return pSearchStateSpace->searchMDP.StateArray[environment_->StateID2IndexMapping[stateID][ARAMDP_STATEID2IND]];
00151
00152 }
00153
00154
00155
00156
00157
00158
00159
00160
00161 int ARAPlanner::ComputeHeuristic(CMDPSTATE* MDPstate, ARASearchStateSpace_t* pSearchStateSpace)
00162 {
00163
00164
00165 if(bforwardsearch)
00166 {
00167
00168 #if MEM_CHECK == 1
00169
00170 #endif
00171
00172
00173 int retv = environment_->GetGoalHeuristic(MDPstate->StateID);
00174
00175 #if MEM_CHECK == 1
00176
00177
00178 #endif
00179
00180 return retv;
00181
00182 }
00183 else
00184 {
00185
00186 return environment_->GetStartHeuristic(MDPstate->StateID);
00187 }
00188 }
00189
00190
00191
00192 void ARAPlanner::InitializeSearchStateInfo(ARAState* state, ARASearchStateSpace_t* pSearchStateSpace)
00193 {
00194 state->g = INFINITECOST;
00195 state->v = INFINITECOST;
00196 state->iterationclosed = 0;
00197 state->callnumberaccessed = pSearchStateSpace->callnumber;
00198 state->bestnextstate = NULL;
00199 state->costtobestnextstate = INFINITECOST;
00200 state->heapindex = 0;
00201 state->listelem[ARA_INCONS_LIST_ID] = 0;
00202 state->numofexpands = 0;
00203
00204 state->bestpredstate = NULL;
00205
00206
00207 #if USE_HEUR
00208 if(pSearchStateSpace->searchgoalstate != NULL)
00209 state->h = ComputeHeuristic(state->MDPstate, pSearchStateSpace);
00210 else
00211 state->h = 0;
00212 #else
00213 state->h = 0;
00214 #endif
00215
00216
00217 }
00218
00219
00220
00221
00222 void ARAPlanner::ReInitializeSearchStateInfo(ARAState* state, ARASearchStateSpace_t* pSearchStateSpace)
00223 {
00224 state->g = INFINITECOST;
00225 state->v = INFINITECOST;
00226 state->iterationclosed = 0;
00227 state->callnumberaccessed = pSearchStateSpace->callnumber;
00228 state->bestnextstate = NULL;
00229 state->costtobestnextstate = INFINITECOST;
00230 state->heapindex = 0;
00231 state->listelem[ARA_INCONS_LIST_ID] = 0;
00232 state->numofexpands = 0;
00233
00234 state->bestpredstate = NULL;
00235
00236
00237 #if USE_HEUR
00238
00239 if(pSearchStateSpace->searchgoalstate != NULL)
00240 {
00241 state->h = ComputeHeuristic(state->MDPstate, pSearchStateSpace);
00242 }
00243 else
00244 state->h = 0;
00245
00246 #else
00247
00248 state->h = 0;
00249
00250 #endif
00251
00252
00253 }
00254
00255
00256
00257 void ARAPlanner::DeleteSearchStateData(ARAState* state)
00258 {
00259
00260 MaxMemoryCounter = 0;
00261 return;
00262 }
00263
00264
00265
00266
00267 void ARAPlanner::UpdatePreds(ARAState* state, ARASearchStateSpace_t* pSearchStateSpace)
00268 {
00269 vector<int> PredIDV;
00270 vector<int> CostV;
00271 CKey key;
00272 ARAState *predstate;
00273
00274 environment_->GetPreds(state->MDPstate->StateID, &PredIDV, &CostV);
00275
00276
00277 for(int pind = 0; pind < (int)PredIDV.size(); pind++)
00278 {
00279 CMDPSTATE* PredMDPState = GetState(PredIDV[pind], pSearchStateSpace);
00280 predstate = (ARAState*)(PredMDPState->PlannerSpecificData);
00281 if(predstate->callnumberaccessed != pSearchStateSpace->callnumber)
00282 ReInitializeSearchStateInfo(predstate, pSearchStateSpace);
00283
00284
00285 if(predstate->g > state->v + CostV[pind])
00286 {
00287 predstate->g = state->v + CostV[pind];
00288 predstate->bestnextstate = state->MDPstate;
00289 predstate->costtobestnextstate = CostV[pind];
00290
00291
00292 if(predstate->iterationclosed != pSearchStateSpace->searchiteration)
00293 {
00294 key.key[0] = predstate->g + (int)(pSearchStateSpace->eps*predstate->h);
00295
00296 if(predstate->heapindex != 0)
00297 pSearchStateSpace->heap->updateheap(predstate,key);
00298 else
00299 pSearchStateSpace->heap->insertheap(predstate,key);
00300 }
00301
00302 else if(predstate->listelem[ARA_INCONS_LIST_ID] == NULL)
00303 {
00304 pSearchStateSpace->inconslist->insert(predstate, ARA_INCONS_LIST_ID);
00305 }
00306 }
00307 }
00308
00309 }
00310
00311
00312 void ARAPlanner::UpdateSuccs(ARAState* state, ARASearchStateSpace_t* pSearchStateSpace)
00313 {
00314 vector<int> SuccIDV;
00315 vector<int> CostV;
00316 CKey key;
00317 ARAState *succstate;
00318
00319 environment_->GetSuccs(state->MDPstate->StateID, &SuccIDV, &CostV);
00320
00321
00322 for(int sind = 0; sind < (int)SuccIDV.size(); sind++)
00323 {
00324 CMDPSTATE* SuccMDPState = GetState(SuccIDV[sind], pSearchStateSpace);
00325 int cost = CostV[sind];
00326
00327 succstate = (ARAState*)(SuccMDPState->PlannerSpecificData);
00328 if(succstate->callnumberaccessed != pSearchStateSpace->callnumber)
00329 ReInitializeSearchStateInfo(succstate, pSearchStateSpace);
00330
00331
00332
00333 if(succstate->g > state->v + cost)
00334 {
00335 succstate->g = state->v + cost;
00336 succstate->bestpredstate = state->MDPstate;
00337
00338
00339 if(succstate->iterationclosed != pSearchStateSpace->searchiteration)
00340 {
00341
00342 key.key[0] = succstate->g + (int)(pSearchStateSpace->eps*succstate->h);
00343
00344
00345
00346 if(succstate->heapindex != 0)
00347 pSearchStateSpace->heap->updateheap(succstate,key);
00348 else
00349 pSearchStateSpace->heap->insertheap(succstate,key);
00350 }
00351
00352 else if(succstate->listelem[ARA_INCONS_LIST_ID] == NULL)
00353 {
00354 pSearchStateSpace->inconslist->insert(succstate, ARA_INCONS_LIST_ID);
00355 }
00356 }
00357
00358 }
00359 }
00360
00361
00362 int ARAPlanner::GetGVal(int StateID, ARASearchStateSpace_t* pSearchStateSpace)
00363 {
00364 CMDPSTATE* cmdp_state = GetState(StateID, pSearchStateSpace);
00365 ARAState* state = (ARAState*)cmdp_state->PlannerSpecificData;
00366 return state->g;
00367 }
00368
00369
00370 int ARAPlanner::ImprovePath(ARASearchStateSpace_t* pSearchStateSpace, double MaxNumofSecs)
00371 {
00372 int expands;
00373 ARAState *state, *searchgoalstate;
00374 CKey key, minkey;
00375 CKey goalkey;
00376
00377 expands = 0;
00378
00379
00380 if(pSearchStateSpace->searchgoalstate == NULL)
00381 {
00382 SBPL_ERROR("ERROR searching: no goal state is set\n");
00383 throw new SBPL_Exception();
00384 }
00385
00386
00387 searchgoalstate = (ARAState*)(pSearchStateSpace->searchgoalstate->PlannerSpecificData);
00388 if(searchgoalstate->callnumberaccessed != pSearchStateSpace->callnumber)
00389 ReInitializeSearchStateInfo(searchgoalstate, pSearchStateSpace);
00390
00391
00392 goalkey.key[0] = searchgoalstate->g;
00393
00394
00395
00396 minkey = pSearchStateSpace->heap->getminkeyheap();
00397 CKey oldkey = minkey;
00398 while(!pSearchStateSpace->heap->emptyheap() && minkey.key[0] < INFINITECOST && goalkey > minkey &&
00399 (clock()-TimeStarted) < MaxNumofSecs*(double)CLOCKS_PER_SEC)
00400 {
00401
00402
00403 state = (ARAState*)pSearchStateSpace->heap->deleteminheap();
00404
00405
00406 #if DEBUG
00407
00408
00409
00410
00411
00412 if(state->listelem[ARA_INCONS_LIST_ID] != NULL)
00413 {
00414 SBPL_FPRINTF(fDeb, "ERROR: expanding a state from inconslist\n");
00415 SBPL_ERROR("ERROR: expanding a state from inconslist\n");
00416 throw new SBPL_Exception();
00417 }
00418
00419 #endif
00420
00421 #if DEBUG
00422 if(minkey.key[0] < oldkey.key[0] && fabs(this->finitial_eps - 1.0) < ERR_EPS)
00423 {
00424
00425
00426 }
00427 oldkey = minkey;
00428 #endif
00429
00430 if(state->v == state->g)
00431 {
00432 SBPL_ERROR("ERROR: consistent state is being expanded\n");
00433 #if DEBUG
00434 SBPL_FPRINTF(fDeb, "ERROR: consistent state is being expanded\n");
00435 throw new SBPL_Exception();
00436 #endif
00437 }
00438
00439
00440 state->v = state->g;
00441 state->iterationclosed = pSearchStateSpace->searchiteration;
00442
00443
00444 expands++;
00445 state->numofexpands++;
00446
00447
00448 if(bforwardsearch == false)
00449 UpdatePreds(state, pSearchStateSpace);
00450 else
00451 UpdateSuccs(state, pSearchStateSpace);
00452
00453
00454 minkey = pSearchStateSpace->heap->getminkeyheap();
00455
00456
00457 if(goalkey.key[0] != (int)searchgoalstate->g)
00458 {
00459
00460
00461 goalkey.key[0] = searchgoalstate->g;
00462
00463 }
00464
00465 if(expands%100000 == 0 && expands > 0)
00466 {
00467 SBPL_PRINTF("expands so far=%u\n", expands);
00468 }
00469
00470 }
00471
00472 int retv = 1;
00473 if(searchgoalstate->g == INFINITECOST && pSearchStateSpace->heap->emptyheap())
00474 {
00475 SBPL_PRINTF("solution does not exist: search exited because heap is empty\n");
00476 retv = 0;
00477 }
00478 else if(!pSearchStateSpace->heap->emptyheap() && goalkey > minkey)
00479 {
00480 SBPL_PRINTF("search exited because it ran out of time\n");
00481 retv = 2;
00482 }
00483 else if(searchgoalstate->g == INFINITECOST && !pSearchStateSpace->heap->emptyheap())
00484 {
00485 SBPL_PRINTF("solution does not exist: search exited because all candidates for expansion have infinite heuristics\n");
00486 retv = 0;
00487 }
00488 else
00489 {
00490 SBPL_PRINTF("search exited with a solution for eps=%.3f\n", pSearchStateSpace->eps);
00491 retv = 1;
00492 }
00493
00494
00495
00496 searchexpands += expands;
00497
00498 return retv;
00499 }
00500
00501
00502 void ARAPlanner::BuildNewOPENList(ARASearchStateSpace_t* pSearchStateSpace)
00503 {
00504 ARAState *state;
00505 CKey key;
00506 CHeap* pheap = pSearchStateSpace->heap;
00507 CList* pinconslist = pSearchStateSpace->inconslist;
00508
00509
00510 while(pinconslist->firstelement != NULL)
00511 {
00512 state = (ARAState*)pinconslist->firstelement->liststate;
00513
00514
00515 key.key[0] = state->g + (int)(pSearchStateSpace->eps*state->h);
00516
00517
00518
00519 pheap->insertheap(state, key);
00520
00521 pinconslist->remove(state, ARA_INCONS_LIST_ID);
00522 }
00523 }
00524
00525
00526 void ARAPlanner::Reevaluatefvals(ARASearchStateSpace_t* pSearchStateSpace)
00527 {
00528 CKey key;
00529 int i;
00530 CHeap* pheap = pSearchStateSpace->heap;
00531
00532
00533 for (i = 1; i <= pheap->currentsize; ++i)
00534 {
00535 ARAState* state = (ARAState*)pheap->heap[i].heapstate;
00536 pheap->heap[i].key.key[0] = state->g +
00537 (int)(pSearchStateSpace->eps*state->h);
00538
00539 }
00540 pheap->makeheap();
00541
00542 pSearchStateSpace->bReevaluatefvals = false;
00543 }
00544
00545
00546
00547
00548
00549
00550 int ARAPlanner::CreateSearchStateSpace(ARASearchStateSpace_t* pSearchStateSpace)
00551 {
00552
00553
00554 pSearchStateSpace->heap = new CHeap;
00555 pSearchStateSpace->inconslist = new CList;
00556 MaxMemoryCounter += sizeof(CHeap);
00557 MaxMemoryCounter += sizeof(CList);
00558
00559 pSearchStateSpace->searchgoalstate = NULL;
00560 pSearchStateSpace->searchstartstate = NULL;
00561
00562 searchexpands = 0;
00563
00564
00565 pSearchStateSpace->bReinitializeSearchStateSpace = false;
00566
00567 return 1;
00568 }
00569
00570
00571 void ARAPlanner::DeleteSearchStateSpace(ARASearchStateSpace_t* pSearchStateSpace)
00572 {
00573 if(pSearchStateSpace->heap != NULL)
00574 {
00575 pSearchStateSpace->heap->makeemptyheap();
00576 delete pSearchStateSpace->heap;
00577 pSearchStateSpace->heap = NULL;
00578 }
00579
00580 if(pSearchStateSpace->inconslist != NULL)
00581 {
00582 pSearchStateSpace->inconslist->makeemptylist(ARA_INCONS_LIST_ID);
00583 delete pSearchStateSpace->inconslist;
00584 pSearchStateSpace->inconslist = NULL;
00585 }
00586
00587
00588 int iend = (int)pSearchStateSpace->searchMDP.StateArray.size();
00589 for(int i=0; i < iend; i++)
00590 {
00591 CMDPSTATE* state = pSearchStateSpace->searchMDP.StateArray[i];
00592 if(state != NULL && state->PlannerSpecificData != NULL){
00593 DeleteSearchStateData((ARAState*)state->PlannerSpecificData);
00594 free((ARAState*)state->PlannerSpecificData);
00595 state->PlannerSpecificData = NULL;
00596 }
00597 }
00598 pSearchStateSpace->searchMDP.Delete();
00599 }
00600
00601
00602
00603
00604
00605 int ARAPlanner::ResetSearchStateSpace(ARASearchStateSpace_t* pSearchStateSpace)
00606 {
00607 pSearchStateSpace->heap->makeemptyheap();
00608 pSearchStateSpace->inconslist->makeemptylist(ARA_INCONS_LIST_ID);
00609
00610 return 1;
00611 }
00612
00613
00614 void ARAPlanner::ReInitializeSearchStateSpace(ARASearchStateSpace_t* pSearchStateSpace)
00615 {
00616 CKey key;
00617
00618
00619 pSearchStateSpace->callnumber++;
00620
00621
00622 pSearchStateSpace->searchiteration = 0;
00623 pSearchStateSpace->bNewSearchIteration = true;
00624
00625 #if DEBUG
00626 SBPL_FPRINTF(fDeb, "reinitializing search state-space (new call number=%d search iter=%d)\n",
00627 pSearchStateSpace->callnumber,pSearchStateSpace->searchiteration );
00628 #endif
00629
00630
00631
00632 pSearchStateSpace->heap->makeemptyheap();
00633 pSearchStateSpace->inconslist->makeemptylist(ARA_INCONS_LIST_ID);
00634
00635
00636 pSearchStateSpace->eps = this->finitial_eps;
00637 pSearchStateSpace->eps_satisfied = INFINITECOST;
00638
00639
00640 ARAState* startstateinfo = (ARAState*)(pSearchStateSpace->searchstartstate->PlannerSpecificData);
00641 if(startstateinfo->callnumberaccessed != pSearchStateSpace->callnumber)
00642 ReInitializeSearchStateInfo(startstateinfo, pSearchStateSpace);
00643
00644 startstateinfo->g = 0;
00645
00646
00647 key.key[0] = (long int)(pSearchStateSpace->eps*startstateinfo->h);
00648
00649 pSearchStateSpace->heap->insertheap(startstateinfo, key);
00650
00651 pSearchStateSpace->bReinitializeSearchStateSpace = false;
00652 pSearchStateSpace->bReevaluatefvals = false;
00653 }
00654
00655
00656 int ARAPlanner::InitializeSearchStateSpace(ARASearchStateSpace_t* pSearchStateSpace)
00657 {
00658
00659 if(pSearchStateSpace->heap->currentsize != 0 ||
00660 pSearchStateSpace->inconslist->currentsize != 0)
00661 {
00662 SBPL_ERROR("ERROR in InitializeSearchStateSpace: heap or list is not empty\n");
00663 throw new SBPL_Exception();
00664 }
00665
00666 pSearchStateSpace->eps = this->finitial_eps;
00667 pSearchStateSpace->eps_satisfied = INFINITECOST;
00668 pSearchStateSpace->searchiteration = 0;
00669 pSearchStateSpace->bNewSearchIteration = true;
00670 pSearchStateSpace->callnumber = 0;
00671 pSearchStateSpace->bReevaluatefvals = false;
00672
00673
00674
00675 pSearchStateSpace->searchgoalstate = NULL;
00676
00677 pSearchStateSpace->searchstartstate = NULL;
00678
00679
00680 pSearchStateSpace->bReinitializeSearchStateSpace = true;
00681
00682 return 1;
00683
00684 }
00685
00686
00687 int ARAPlanner::SetSearchGoalState(int SearchGoalStateID, ARASearchStateSpace_t* pSearchStateSpace)
00688 {
00689 if(pSearchStateSpace->searchgoalstate == NULL ||
00690 pSearchStateSpace->searchgoalstate->StateID != SearchGoalStateID)
00691 {
00692 pSearchStateSpace->searchgoalstate = GetState(SearchGoalStateID, pSearchStateSpace);
00693
00694
00695 pSearchStateSpace->eps_satisfied = INFINITECOST;
00696 pSearchStateSpace->bNewSearchIteration = true;
00697 pSearchStateSpace_->eps = this->finitial_eps;
00698
00699
00700
00701 #if USE_HEUR
00702 for(int i = 0; i < (int)pSearchStateSpace->searchMDP.StateArray.size(); i++)
00703 {
00704 CMDPSTATE* MDPstate = pSearchStateSpace->searchMDP.StateArray[i];
00705 ARAState* state = (ARAState*)MDPstate->PlannerSpecificData;
00706 state->h = ComputeHeuristic(MDPstate, pSearchStateSpace);
00707 }
00708
00709 pSearchStateSpace->bReevaluatefvals = true;
00710 #endif
00711 }
00712
00713
00714 return 1;
00715
00716 }
00717
00718
00719 int ARAPlanner::SetSearchStartState(int SearchStartStateID, ARASearchStateSpace_t* pSearchStateSpace)
00720 {
00721
00722 CMDPSTATE* MDPstate = GetState(SearchStartStateID, pSearchStateSpace);
00723
00724 if(MDPstate != pSearchStateSpace->searchstartstate)
00725 {
00726 pSearchStateSpace->searchstartstate = MDPstate;
00727 pSearchStateSpace->bReinitializeSearchStateSpace = true;
00728 }
00729
00730 return 1;
00731
00732 }
00733
00734
00735
00736 int ARAPlanner::ReconstructPath(ARASearchStateSpace_t* pSearchStateSpace)
00737 {
00738
00739
00740 if(bforwardsearch)
00741 {
00742 CMDPSTATE* MDPstate = pSearchStateSpace->searchgoalstate;
00743 CMDPSTATE* PredMDPstate;
00744 ARAState *predstateinfo, *stateinfo;
00745
00746
00747
00748 #if DEBUG
00749 SBPL_FPRINTF(fDeb, "reconstructing a path:\n");
00750 #endif
00751
00752 while(MDPstate != pSearchStateSpace->searchstartstate)
00753 {
00754 stateinfo = (ARAState*)MDPstate->PlannerSpecificData;
00755
00756 #if DEBUG
00757 PrintSearchState(stateinfo, fDeb);
00758 #endif
00759 if(stateinfo->g == INFINITECOST)
00760 {
00761
00762
00763 return -1;
00764 }
00765
00766 if(stateinfo->bestpredstate == NULL)
00767 {
00768 SBPL_ERROR("ERROR in ReconstructPath: bestpred is NULL\n");
00769 throw new SBPL_Exception();
00770 }
00771
00772
00773 PredMDPstate = stateinfo->bestpredstate;
00774 predstateinfo = (ARAState*)PredMDPstate->PlannerSpecificData;
00775
00776
00777 predstateinfo->bestnextstate = MDPstate;
00778
00779
00780 if(predstateinfo->v >= stateinfo->g)
00781 {
00782 SBPL_ERROR("ERROR in ReconstructPath: g-values are non-decreasing\n");
00783 PrintSearchState(predstateinfo, fDeb);
00784 throw new SBPL_Exception();
00785 }
00786
00787
00788 MDPstate = PredMDPstate;
00789 }
00790 }
00791
00792 return 1;
00793 }
00794
00795
00796
00797 void ARAPlanner::PrintSearchPath(ARASearchStateSpace_t* pSearchStateSpace, FILE* fOut)
00798 {
00799 ARAState* searchstateinfo;
00800 CMDPSTATE* state;
00801 int goalID;
00802 int PathCost;
00803
00804 if(bforwardsearch)
00805 {
00806 state = pSearchStateSpace->searchstartstate;
00807 goalID = pSearchStateSpace->searchgoalstate->StateID;
00808 }
00809 else
00810 {
00811 state = pSearchStateSpace->searchgoalstate;
00812 goalID = pSearchStateSpace->searchstartstate->StateID;
00813 }
00814 if(fOut == NULL)
00815 fOut = stdout;
00816
00817 PathCost = ((ARAState*)pSearchStateSpace->searchgoalstate->PlannerSpecificData)->g;
00818
00819 SBPL_FPRINTF(fOut, "Printing a path from state %d to the goal state %d\n",
00820 state->StateID, pSearchStateSpace->searchgoalstate->StateID);
00821 SBPL_FPRINTF(fOut, "Path cost = %d:\n", PathCost);
00822
00823
00824 environment_->PrintState(state->StateID, false, fOut);
00825
00826 int costFromStart = 0;
00827 while(state->StateID != goalID)
00828 {
00829 SBPL_FPRINTF(fOut, "state %d ", state->StateID);
00830
00831 if(state->PlannerSpecificData == NULL)
00832 {
00833 SBPL_FPRINTF(fOut, "path does not exist since search data does not exist\n");
00834 break;
00835 }
00836
00837 searchstateinfo = (ARAState*)state->PlannerSpecificData;
00838
00839 if(searchstateinfo->bestnextstate == NULL)
00840 {
00841 SBPL_FPRINTF(fOut, "path does not exist since bestnextstate == NULL\n");
00842 break;
00843 }
00844 if(searchstateinfo->g == INFINITECOST)
00845 {
00846 SBPL_FPRINTF(fOut, "path does not exist since bestnextstate == NULL\n");
00847 break;
00848 }
00849
00850 int costToGoal = PathCost - costFromStart;
00851 int transcost = searchstateinfo->g - ((ARAState*)(searchstateinfo->bestnextstate->PlannerSpecificData))->v;
00852 if(bforwardsearch)
00853 transcost = -transcost;
00854
00855 costFromStart += transcost;
00856
00857 SBPL_FPRINTF(fOut, "g=%d-->state %d, h = %d ctg = %d ", searchstateinfo->g,
00858 searchstateinfo->bestnextstate->StateID, searchstateinfo->h, costToGoal);
00859
00860 state = searchstateinfo->bestnextstate;
00861
00862 environment_->PrintState(state->StateID, false, fOut);
00863
00864
00865
00866 }
00867 }
00868
00869 void ARAPlanner::PrintSearchState(ARAState* state, FILE* fOut)
00870 {
00871 SBPL_FPRINTF(fOut, "state %d: h=%d g=%u v=%u iterc=%d callnuma=%d expands=%d heapind=%d inconslist=%d\n",
00872 state->MDPstate->StateID, state->h, state->g, state->v,
00873 state->iterationclosed, state->callnumberaccessed, state->numofexpands, state->heapindex, state->listelem[ARA_INCONS_LIST_ID]?1:0);
00874 environment_->PrintState(state->MDPstate->StateID, true, fOut);
00875
00876 }
00877
00878
00879
00880 int ARAPlanner::getHeurValue(ARASearchStateSpace_t* pSearchStateSpace, int StateID)
00881 {
00882 CMDPSTATE* MDPstate = GetState(StateID, pSearchStateSpace);
00883 ARAState* searchstateinfo = (ARAState*)MDPstate->PlannerSpecificData;
00884 return searchstateinfo->h;
00885 }
00886
00887
00888 vector<int> ARAPlanner::GetSearchPath(ARASearchStateSpace_t* pSearchStateSpace, int& solcost)
00889 {
00890 vector<int> SuccIDV;
00891 vector<int> CostV;
00892 vector<int> wholePathIds;
00893 ARAState* searchstateinfo;
00894 CMDPSTATE* state = NULL;
00895 CMDPSTATE* goalstate = NULL;
00896 CMDPSTATE* startstate=NULL;
00897
00898 if(bforwardsearch)
00899 {
00900 startstate = pSearchStateSpace->searchstartstate;
00901 goalstate = pSearchStateSpace->searchgoalstate;
00902
00903
00904 ReconstructPath(pSearchStateSpace);
00905 }
00906 else
00907 {
00908 startstate = pSearchStateSpace->searchgoalstate;
00909 goalstate = pSearchStateSpace->searchstartstate;
00910 }
00911
00912
00913 state = startstate;
00914
00915 wholePathIds.push_back(state->StateID);
00916 solcost = 0;
00917
00918 FILE* fOut = stdout;
00919 if(fOut == NULL){
00920 SBPL_ERROR("ERROR: could not open file\n");
00921 throw new SBPL_Exception();
00922 }
00923 while(state->StateID != goalstate->StateID)
00924 {
00925 if(state->PlannerSpecificData == NULL)
00926 {
00927 SBPL_FPRINTF(fOut, "path does not exist since search data does not exist\n");
00928 break;
00929 }
00930
00931 searchstateinfo = (ARAState*)state->PlannerSpecificData;
00932
00933 if(searchstateinfo->bestnextstate == NULL)
00934 {
00935 SBPL_FPRINTF(fOut, "path does not exist since bestnextstate == NULL\n");
00936 break;
00937 }
00938 if(searchstateinfo->g == INFINITECOST)
00939 {
00940 SBPL_FPRINTF(fOut, "path does not exist since bestnextstate == NULL\n");
00941 break;
00942 }
00943
00944 environment_->GetSuccs(state->StateID, &SuccIDV, &CostV);
00945 int actioncost = INFINITECOST;
00946 for(int i = 0; i < (int)SuccIDV.size(); i++)
00947 {
00948
00949 if(SuccIDV.at(i) == searchstateinfo->bestnextstate->StateID && CostV.at(i)<actioncost)
00950 actioncost = CostV.at(i);
00951
00952 }
00953 if(actioncost == INFINITECOST)
00954 SBPL_PRINTF("WARNING: actioncost = %d\n", actioncost);
00955
00956 solcost += actioncost;
00957
00958
00959
00960
00961
00962
00963
00964 #if DEBUG
00965 ARAState* nextstateinfo = (ARAState*)(searchstateinfo->bestnextstate->PlannerSpecificData);
00966 if(actioncost != abs((int)(searchstateinfo->g - nextstateinfo->g)) && pSearchStateSpace->eps_satisfied <= 1.001)
00967 {
00968 SBPL_FPRINTF(fDeb, "ERROR: actioncost=%d is not matching the difference in g-values of %d\n",
00969 actioncost, abs((int)(searchstateinfo->g - nextstateinfo->g)));
00970 SBPL_ERROR("ERROR: actioncost=%d is not matching the difference in g-values of %d\n",
00971 actioncost,abs((int)(searchstateinfo->g - nextstateinfo->g)));
00972 PrintSearchState(searchstateinfo, fDeb);
00973 PrintSearchState(nextstateinfo, fDeb);
00974 }
00975 #endif
00976
00977
00978 state = searchstateinfo->bestnextstate;
00979
00980 wholePathIds.push_back(state->StateID);
00981 }
00982
00983
00984 return wholePathIds;
00985 }
00986
00987
00988
00989 bool ARAPlanner::Search(ARASearchStateSpace_t* pSearchStateSpace, vector<int>& pathIds, int & PathCost, bool bFirstSolution, bool bOptimalSolution, double MaxNumofSecs)
00990 {
00991 CKey key;
00992 TimeStarted = clock();
00993 searchexpands = 0;
00994
00995 #if DEBUG
00996 SBPL_FPRINTF(fDeb, "new search call (call number=%d)\n", pSearchStateSpace->callnumber);
00997 #endif
00998
00999 if(pSearchStateSpace->bReinitializeSearchStateSpace == true){
01000
01001 ReInitializeSearchStateSpace(pSearchStateSpace);
01002 }
01003
01004
01005 if(bOptimalSolution)
01006 {
01007 pSearchStateSpace->eps = 1;
01008 MaxNumofSecs = INFINITECOST;
01009 }
01010 else if(bFirstSolution)
01011 {
01012 MaxNumofSecs = INFINITECOST;
01013 }
01014
01015
01016 environment_->EnsureHeuristicsUpdated((bforwardsearch==true));
01017
01018
01019 int prevexpands = 0;
01020 clock_t loop_time;
01021 while(pSearchStateSpace->eps_satisfied > ARA_FINAL_EPS &&
01022 (clock()- TimeStarted) < MaxNumofSecs*(double)CLOCKS_PER_SEC)
01023 {
01024 loop_time = clock();
01025
01026 if(fabs(pSearchStateSpace->eps_satisfied - pSearchStateSpace->eps) < ERR_EPS && !bFirstSolution)
01027 {
01028 pSearchStateSpace->eps = pSearchStateSpace->eps - ARA_DECREASE_EPS;
01029 if(pSearchStateSpace->eps < ARA_FINAL_EPS)
01030 pSearchStateSpace->eps = ARA_FINAL_EPS;
01031
01032
01033 pSearchStateSpace->bReevaluatefvals = true;
01034
01035
01036 pSearchStateSpace->bNewSearchIteration = true;
01037
01038
01039 BuildNewOPENList(pSearchStateSpace);
01040
01041 }
01042
01043 if(pSearchStateSpace->bNewSearchIteration)
01044 {
01045 pSearchStateSpace->searchiteration++;
01046 pSearchStateSpace->bNewSearchIteration = false;
01047 }
01048
01049
01050 if(pSearchStateSpace->bReevaluatefvals)
01051 Reevaluatefvals(pSearchStateSpace);
01052
01053
01054 if(ImprovePath(pSearchStateSpace, MaxNumofSecs) == 1){
01055 pSearchStateSpace->eps_satisfied = pSearchStateSpace->eps;
01056 }
01057
01058
01059 SBPL_PRINTF("eps=%f expands=%d g(searchgoal)=%d time=%.3f\n", pSearchStateSpace->eps_satisfied, searchexpands - prevexpands,
01060 ((ARAState*)pSearchStateSpace->searchgoalstate->PlannerSpecificData)->g,double(clock()-loop_time)/CLOCKS_PER_SEC);
01061
01062 if(pSearchStateSpace->eps_satisfied == finitial_eps && pSearchStateSpace->eps == finitial_eps)
01063 {
01064 finitial_eps_planning_time = double(clock()-loop_time)/CLOCKS_PER_SEC;
01065 num_of_expands_initial_solution = searchexpands - prevexpands;
01066 }
01067
01068 #if DEBUG
01069 SBPL_FPRINTF(fDeb, "eps=%f expands=%d g(searchgoal)=%d time=%.3f\n", pSearchStateSpace->eps_satisfied, searchexpands - prevexpands,
01070 ((ARAState*)pSearchStateSpace->searchgoalstate->PlannerSpecificData)->g,double(clock()-loop_time)/CLOCKS_PER_SEC);
01071 PrintSearchState((ARAState*)pSearchStateSpace->searchgoalstate->PlannerSpecificData, fDeb);
01072 #endif
01073 prevexpands = searchexpands;
01074
01075
01076
01077 if(bFirstSolution)
01078 break;
01079
01080
01081 if(((ARAState*)pSearchStateSpace->searchgoalstate->PlannerSpecificData)->g == INFINITECOST)
01082 break;
01083
01084 }
01085
01086
01087 #if DEBUG
01088 SBPL_FFLUSH(fDeb);
01089 #endif
01090
01091 PathCost = ((ARAState*)pSearchStateSpace->searchgoalstate->PlannerSpecificData)->g;
01092 MaxMemoryCounter += environment_->StateID2IndexMapping.size()*sizeof(int);
01093
01094 SBPL_PRINTF("MaxMemoryCounter = %d\n", MaxMemoryCounter);
01095
01096 int solcost = INFINITECOST;
01097 bool ret = false;
01098 if(PathCost == INFINITECOST)
01099 {
01100 SBPL_PRINTF("could not find a solution\n");
01101 ret = false;
01102 }
01103 else
01104 {
01105 SBPL_PRINTF("solution is found\n");
01106 pathIds = GetSearchPath(pSearchStateSpace, solcost);
01107 ret = true;
01108 }
01109
01110 SBPL_PRINTF("total expands this call = %d, planning time = %.3f secs, solution cost=%d\n",
01111 searchexpands, (clock()-TimeStarted)/((double)CLOCKS_PER_SEC), solcost);
01112 final_eps_planning_time = (clock()-TimeStarted)/((double)CLOCKS_PER_SEC);
01113 final_eps = pSearchStateSpace->eps_satisfied;
01114
01115
01116 return ret;
01117
01118 }
01119
01120
01121
01122
01123 int ARAPlanner::replan(double allocated_time_secs, vector<int>* solution_stateIDs_V)
01124 {
01125 int solcost;
01126
01127 return replan(allocated_time_secs, solution_stateIDs_V, &solcost);
01128
01129 }
01130
01131
01132 int ARAPlanner::replan(double allocated_time_secs, vector<int>* solution_stateIDs_V, int* psolcost)
01133 {
01134 vector<int> pathIds;
01135 bool bFound = false;
01136 int PathCost;
01137 bool bFirstSolution = this->bsearchuntilfirstsolution;
01138 bool bOptimalSolution = false;
01139 *psolcost = 0;
01140
01141 SBPL_PRINTF("planner: replan called (bFirstSol=%d, bOptSol=%d)\n", bFirstSolution, bOptimalSolution);
01142
01143
01144 if((bFound = Search(pSearchStateSpace_, pathIds, PathCost, bFirstSolution, bOptimalSolution, allocated_time_secs)) == false)
01145 {
01146 SBPL_PRINTF("failed to find a solution\n");
01147 }
01148
01149
01150 *solution_stateIDs_V = pathIds;
01151 *psolcost = PathCost;
01152
01153 return (int)bFound;
01154
01155 }
01156
01157
01158 int ARAPlanner::set_goal(int goal_stateID)
01159 {
01160
01161 SBPL_PRINTF("planner: setting goal to %d\n", goal_stateID);
01162 environment_->PrintState(goal_stateID, true, stdout);
01163
01164 if(bforwardsearch)
01165 {
01166 if(SetSearchGoalState(goal_stateID, pSearchStateSpace_) != 1)
01167 {
01168 SBPL_ERROR("ERROR: failed to set search goal state\n");
01169 return 0;
01170 }
01171 }
01172 else
01173 {
01174 if(SetSearchStartState(goal_stateID, pSearchStateSpace_) != 1)
01175 {
01176 SBPL_ERROR("ERROR: failed to set search start state\n");
01177 return 0;
01178 }
01179 }
01180
01181 return 1;
01182 }
01183
01184
01185 int ARAPlanner::set_start(int start_stateID)
01186 {
01187
01188 SBPL_PRINTF("planner: setting start to %d\n", start_stateID);
01189 environment_->PrintState(start_stateID, true, stdout);
01190
01191 if(bforwardsearch)
01192 {
01193
01194 if(SetSearchStartState(start_stateID, pSearchStateSpace_) != 1)
01195 {
01196 SBPL_ERROR("ERROR: failed to set search start state\n");
01197 return 0;
01198 }
01199 }
01200 else
01201 {
01202 if(SetSearchGoalState(start_stateID, pSearchStateSpace_) != 1)
01203 {
01204 SBPL_ERROR("ERROR: failed to set search goal state\n");
01205 return 0;
01206 }
01207 }
01208
01209 return 1;
01210
01211 }
01212
01213
01214
01215 void ARAPlanner::costs_changed(StateChangeQuery const & stateChange)
01216 {
01217
01218
01219 pSearchStateSpace_->bReinitializeSearchStateSpace = true;
01220
01221
01222 }
01223
01224 void ARAPlanner::costs_changed()
01225 {
01226
01227 pSearchStateSpace_->bReinitializeSearchStateSpace = true;
01228
01229 }
01230
01231
01232
01233 int ARAPlanner::force_planning_from_scratch()
01234 {
01235 SBPL_PRINTF("planner: forceplanfromscratch set\n");
01236
01237 pSearchStateSpace_->bReinitializeSearchStateSpace = true;
01238
01239 return 1;
01240 }
01241
01242
01243 int ARAPlanner::set_search_mode(bool bSearchUntilFirstSolution)
01244 {
01245
01246 SBPL_PRINTF("planner: search mode set to %d\n", bSearchUntilFirstSolution);
01247
01248 bsearchuntilfirstsolution = bSearchUntilFirstSolution;
01249
01250 return 1;
01251 }
01252
01253
01254 void ARAPlanner::print_searchpath(FILE* fOut)
01255 {
01256 PrintSearchPath(pSearchStateSpace_, fOut);
01257 }
01258
01259
01260
01261