Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Tools/Xabsl2/Xabsl2Engine/Xabsl2Option.cpp

Go to the documentation of this file.
00001 /** 
00002 * @file Xabsl2Option.cpp
00003 *
00004 * Implementation of class Xabsl2Option and helper classes
00005 *
00006 * @author Martin Lötzsch
00007 */
00008 
00009 #include "Xabsl2Option.h"
00010 
00011 Xabsl2Statement* Xabsl2Statement::createStatement(Xabsl2InputSource& input,    
00012                                                   Xabsl2Option* subsequentOption,
00013                                                   Xabsl2ErrorHandler& errorHandler,
00014                                                   Xabsl2Array<Xabsl2State*>& states,
00015                                                   Xabsl2Array<double>& parameters,
00016                                                   Xabsl2Symbols& symbols,    
00017                                                   unsigned long& timeOfOptionExecution,
00018                                                   unsigned long& timeOfStateExecution)
00019 {
00020   char c[100]; 
00021   
00022   input.readString(c,1);
00023   
00024   switch (*c)
00025   {
00026   case 't':
00027     return new Xabsl2TransitionToState(input, errorHandler, states);
00028   case 'i':
00029     return new Xabsl2IfElseBlock(input, subsequentOption,errorHandler, states, 
00030       parameters, symbols, timeOfOptionExecution, timeOfStateExecution);
00031   default:
00032     errorHandler.error("Xabsl2Statement::create(): unknown type \"%c\"",*c);
00033     return 0;
00034   }
00035 }
00036 
00037 Xabsl2Statement::~Xabsl2Statement()
00038 {
00039 }
00040 
00041 Xabsl2IfElseBlock::Xabsl2IfElseBlock(Xabsl2InputSource& input,    
00042                                                          Xabsl2Option* subsequentOption,
00043                                      Xabsl2ErrorHandler& errorHandler,
00044                                      Xabsl2Array<Xabsl2State*>& states,
00045                                      Xabsl2Array<double>& parameters,
00046                                      Xabsl2Symbols& symbols,    
00047                                      unsigned long& timeOfOptionExecution,
00048                                      unsigned long& timeOfStateExecution) :
00049 ifCondition(0), ifStatement(0), elseStatement(0)
00050 {
00051   
00052   // if case
00053   XABSL2_DEBUG_INIT(errorHandler.message("creating if statement"));
00054   
00055   ifCondition = Xabsl2BooleanExpression::create(input, subsequentOption,errorHandler, 
00056     parameters, symbols, timeOfOptionExecution, timeOfStateExecution);
00057   if (errorHandler.errorsOccurred)
00058   {
00059     errorHandler.error("Xabsl2IfElseBlock::Xabsl2IfElseBlock(): could not create if condition");
00060     return;
00061   }
00062   
00063   ifStatement = Xabsl2Statement::createStatement(input,subsequentOption,errorHandler,
00064     states,parameters, symbols, timeOfOptionExecution, timeOfStateExecution);
00065   if (errorHandler.errorsOccurred)
00066   {
00067     errorHandler.error("Xabsl2IfElseBlock::Xabsl2IfElseBlock(): could not create if statement");
00068     return;
00069   }
00070   
00071   // else if cases
00072   int numberOfElseIfStatements = (int)input.readValue();
00073   
00074   for (int i=0;i<numberOfElseIfStatements; i++)
00075   {
00076     XABSL2_DEBUG_INIT(errorHandler.message("creating else-if statement"));
00077     
00078     elseIfConditions.append("else-if",Xabsl2BooleanExpression::create(input, subsequentOption,
00079       errorHandler, parameters, symbols,timeOfOptionExecution, timeOfStateExecution));
00080     if (errorHandler.errorsOccurred)
00081     {
00082       errorHandler.error("Xabsl2IfElseBlock::Xabsl2IfElseBlock(): could not create else-if condition");
00083       return;
00084     }
00085     
00086     elseIfStatements.append("else-if",Xabsl2Statement::createStatement(input,subsequentOption,
00087       errorHandler,states, parameters, symbols, timeOfOptionExecution, timeOfStateExecution));
00088     if (errorHandler.errorsOccurred)
00089     {
00090       errorHandler.error("Xabsl2IfElseBlock::Xabsl2IfElseBlock(): could not create else-if statement");
00091       return;
00092     }
00093   }
00094   
00095   // else case
00096   XABSL2_DEBUG_INIT(errorHandler.message("creating else statement"));
00097   
00098   elseStatement = Xabsl2Statement::createStatement(input, subsequentOption,
00099     errorHandler, states, parameters, symbols, timeOfOptionExecution, timeOfStateExecution);
00100   if (errorHandler.errorsOccurred)
00101     errorHandler.error("Xabsl2IfElseBlock::Xabsl2IfElseBlock(): could not create else statement");
00102   
00103 }
00104 
00105 Xabsl2IfElseBlock::~Xabsl2IfElseBlock()
00106 {
00107   if (ifCondition != 0) delete ifCondition;
00108   if (ifStatement != 0) delete ifStatement;
00109   
00110   int i;
00111   for (i=0; i<elseIfStatements.getSize(); i++)
00112   {
00113     if (elseIfConditions[i] != 0)
00114       delete elseIfConditions[i];
00115     if (elseIfStatements[i] != 0) 
00116       delete elseIfStatements[i];
00117   }
00118   
00119   if (elseStatement != 0) delete elseStatement;
00120 }
00121 
00122 Xabsl2State* Xabsl2IfElseBlock::getNextState()
00123 {
00124   if (ifCondition->getValue()) return ifStatement->getNextState();
00125   
00126   for (int i=0; i<elseIfConditions.getSize(); i++)
00127   {
00128     if (elseIfConditions[i]->getValue()) return elseIfStatements[i]->getNextState();
00129   }
00130   
00131   return elseStatement->getNextState();
00132 }
00133 
00134 Xabsl2TransitionToState::Xabsl2TransitionToState(Xabsl2InputSource& input,    
00135                                                  Xabsl2ErrorHandler& errorHandler,
00136                                                  Xabsl2Array<Xabsl2State*>& states)
00137 {
00138   char buf[100];
00139   input.readString(buf,99);
00140   
00141   nextState = states.getElement(buf);
00142   
00143   XABSL2_DEBUG_INIT(errorHandler.message("creating a transition to state \"%s\"",nextState->n));
00144 }
00145 
00146 Xabsl2State* Xabsl2TransitionToState::getNextState()
00147 {
00148   return nextState;
00149 }
00150 
00151 Xabsl2State::Xabsl2State(const char* name, Xabsl2ErrorHandler& errorHandler,
00152                          unsigned long (*pTimeFunction)())
00153 : Xabsl2NamedItem(name), errorHandler(errorHandler), decisionTree(0),
00154 targetState(false), pTimeFunction(pTimeFunction)
00155 {
00156 }
00157 
00158 Xabsl2State::~Xabsl2State()
00159 {
00160   if (decisionTree != 0) delete decisionTree;
00161   for (int i=0; i<parameterValues.getSize(); i++)
00162     if (parameterValues[i]!=0)
00163       delete parameterValues[i];
00164 }
00165 
00166 void Xabsl2State::create(Xabsl2InputSource& input,
00167                          Xabsl2Array<Xabsl2Option*>& options,
00168                          Xabsl2Array<Xabsl2BasicBehavior&>& basicBehaviors,
00169                          Xabsl2Array<Xabsl2State*>& states,
00170                          Xabsl2Array<double>& parameters,
00171                          Xabsl2Symbols& symbols,
00172                          unsigned long& timeOfOptionExecution)
00173 { 
00174   XABSL2_DEBUG_INIT(errorHandler.message("creating state \"%s\"",n));
00175 
00176   char c[100]; char buf[100];
00177   
00178   // target state or not
00179   input.readString(c,1);
00180   if (*c == '1') 
00181   {
00182     targetState = true;
00183   }
00184   
00185   // subsequent option or basic behavior
00186   input.readString(c,1);
00187   input.readString(buf,99);
00188   switch (*c)
00189   {
00190   case 'o':
00191     subsequentOption = options.getElement(buf);
00192     subsequentBasicBehavior = 0;
00193     break;
00194   case 'b':
00195     if (!basicBehaviors.exists(buf))
00196     {
00197       errorHandler.error("Xabsl2State::create(): the subsequent basic behavior \"%s\" was not registered",buf);
00198       return;
00199     }
00200     subsequentBasicBehavior = &basicBehaviors.getElement(buf);
00201     subsequentOption = 0;
00202     break;
00203   }
00204   
00205   // read the parameters 
00206   int numberOfParameters = (int)input.readValue();
00207   
00208   int i;
00209   for (i = 0; i<numberOfParameters; i++)
00210   {
00211     input.readString(buf,99);
00212     XABSL2_DEBUG_INIT(errorHandler.message("creating expession for set parameter \"%s\"",buf));
00213     
00214     if (subsequentOption != 0)
00215     {
00216       if (!subsequentOption->parameters.exists(buf))
00217       {
00218         errorHandler.error("Xabsl2State::create(): the subsequent option does not have a parameter \"%s\"",buf);
00219         return;
00220       }
00221       parametersOfSubsequentBehavior.append(buf,&subsequentOption->parameters.getPElement(buf)->e);
00222     }
00223     else
00224     {
00225       if (!subsequentBasicBehavior->parameters.exists(buf))
00226       {
00227         errorHandler.error("Xabsl2State::create(): the subsequent basic behavior does not have a parameter \"%s\"",buf);
00228         return;
00229       }
00230       parametersOfSubsequentBehavior.append(buf,&subsequentBasicBehavior->parameters.getPElement(buf)->e);
00231     }
00232 
00233     parameterValues.append(buf,Xabsl2DecimalExpression::create(input,subsequentOption,errorHandler,parameters,symbols,timeOfOptionExecution,timeOfStateExecution));
00234     if (errorHandler.errorsOccurred)
00235     {
00236       errorHandler.error("Xabsl2State::create(): could not create decimal expression for parameter \"%s\"",buf);
00237       return;
00238     }
00239   }
00240   
00241   // set output symbols
00242   int numberOfSetOutputSymbol = (int)input.readValue();
00243   
00244   for(i = 0; i< numberOfSetOutputSymbol; i++)
00245   {
00246     input.readString(buf,99);
00247     XABSL2_DEBUG_INIT(errorHandler.message("creating reference to enumerated output symbol \"%s\"",buf));
00248     
00249     if (!symbols.existsEnumeratedOutputSymbol(buf))
00250     {
00251       errorHandler.error("Xabsl2State::create(): enumerated output symbol \"%s\" does not exist",buf);
00252       return;
00253     }
00254     outputSymbols.append(buf,symbols.getEnumeratedOutputSymbol(buf));
00255     input.readString(buf,99);
00256     
00257     if (!outputSymbols[i]->enumElements.exists(buf))
00258     {
00259       errorHandler.error("Xabsl2State::create(): enum element \"%s\" of enumerated output symbol \"%s\" does not exist",buf, outputSymbols[i]->n);
00260       return;
00261     }
00262     outputSymbolValues.append(buf,outputSymbols[i]->enumElements.getElement(buf)->v);
00263   }
00264   
00265   // transition to state or if / else block
00266   decisionTree = Xabsl2Statement::createStatement(input,subsequentOption,errorHandler,
00267     states,parameters, symbols, timeOfOptionExecution,timeOfStateExecution);
00268   if (errorHandler.errorsOccurred)
00269     errorHandler.error("Xabsl2State::create(): could not create decision tree for state \"%s\"",n);
00270 }
00271 
00272 Xabsl2State* Xabsl2State::getNextState()
00273 {
00274   timeOfStateExecution = pTimeFunction() - timeWhenStateWasActivated;
00275   
00276   Xabsl2State* nextState = decisionTree->getNextState();
00277   
00278   return nextState;
00279 }
00280 
00281 void Xabsl2State::setOutputSymbols()
00282 {
00283   int i;
00284 
00285   // set all parameters of the next subsequent behavior to 0
00286   if (subsequentBasicBehavior!=0)
00287   {
00288     for (i=0;i<subsequentBasicBehavior->parameters.getSize();i++)
00289     {
00290       subsequentBasicBehavior->parameters[i] = 0;
00291     }
00292   }
00293   else
00294   {
00295     for (i=0;i<subsequentOption->parameters.getSize();i++)
00296     {
00297       subsequentOption->parameters.setElement(i,0);
00298     }
00299   }
00300   
00301   // Sets the subsequent behavior parameters.
00302   for (i=0; i<parametersOfSubsequentBehavior.getSize(); i++)
00303   {
00304     *parametersOfSubsequentBehavior[i] = parameterValues[i]->getValue();
00305   }
00306 
00307   for (i = 0; i < outputSymbols.getSize(); i++)
00308   {
00309     outputSymbols[i]->activeValue = outputSymbolValues[i];
00310     outputSymbols[i]->activeValueWasSet = true;
00311   }
00312 }
00313 
00314 void Xabsl2State::reset()
00315 {
00316   timeWhenStateWasActivated = pTimeFunction();
00317   timeOfStateExecution = 0;
00318 }
00319 
00320 bool Xabsl2State::isTargetState() const
00321 {
00322   return targetState;
00323 }
00324 
00325 Xabsl2Option::Xabsl2Option(const char* name,
00326                            Xabsl2InputSource& input,
00327                            Xabsl2ErrorHandler& errorHandler,
00328                            unsigned long (*pTimeFunction)())
00329                            : Xabsl2NamedItem(name), activeState(0), optionIsActive(false), optionWasActive(false),
00330                            initialState(0), errorHandler(errorHandler),
00331                            pTimeFunction(pTimeFunction)
00332 {
00333   int numberOfOptionParameters = (int)input.readValue();
00334   char buf[100];
00335   for (int i=0; i< numberOfOptionParameters; i++)
00336   {
00337     input.readString(buf,99);
00338     XABSL2_DEBUG_INIT(errorHandler.message("registering option parameter \"%s\" for option \"%s\"",buf,n));
00339     
00340     parameters.append(buf,0);
00341   }
00342 }
00343 
00344 Xabsl2Option::~Xabsl2Option()
00345 {
00346   for (int i=0;i<states.getSize();i++)
00347     if (states[i]!=0) 
00348       delete states[i];
00349 }
00350 
00351 void Xabsl2Option::create(Xabsl2InputSource& input,    
00352                           Xabsl2Array<Xabsl2Option*>& options,
00353                           Xabsl2Array<Xabsl2BasicBehavior&>& basicBehaviors,
00354                           Xabsl2Symbols& symbols
00355                           )
00356 {
00357   int i;
00358   
00359   // the number of states of the option
00360   int numberOfStates = (int)input.readValue();
00361   
00362   char stateName[100];
00363   
00364   // register all states to the array
00365   for (i=0; i< numberOfStates; i++)
00366   {
00367     input.readString(stateName, 99);
00368     states.append(stateName, new Xabsl2State(stateName,errorHandler,pTimeFunction));
00369   }
00370   XABSL2_DEBUG_INIT(errorHandler.message("Xabsl2Option::create(): registered %i states",numberOfStates));
00371   
00372   // set the initial state
00373   input.readString(stateName,99);
00374   initialState = states.getElement(stateName);
00375   activeState = initialState;
00376   
00377   XABSL2_DEBUG_INIT(errorHandler.message("Xabsl2Option::create(): initial state: \"%s\"",initialState->n));
00378   
00379   // create the states and their subelements
00380   for (i=0; i< numberOfStates; i++)
00381   {
00382     states[i]->create(input, options, basicBehaviors, states, parameters, symbols, timeOfOptionExecution);
00383     if (errorHandler.errorsOccurred)
00384     {
00385       errorHandler.error("Xabsl2Option::create(): could not create state \"%s\"",states[i]->n);
00386       return;
00387     }
00388   }
00389   
00390 }  
00391 
00392 void Xabsl2Option::execute()
00393 {
00394   if (!optionWasActive)
00395   {
00396     timeWhenOptionWasActivated = pTimeFunction();
00397     activeState = initialState;
00398     activeState->reset();
00399   }
00400   optionIsActive = true;
00401   timeOfOptionExecution = pTimeFunction() - timeWhenOptionWasActivated;
00402   
00403   Xabsl2State* newState = activeState->getNextState();
00404   
00405   if (newState != activeState)
00406   {
00407     newState->reset();
00408   }
00409   activeState = newState;
00410   activeState->setOutputSymbols();
00411 }
00412 
00413 bool Xabsl2Option::getOptionReachedATargetState() const
00414 {
00415   if (optionWasActive && activeState->isTargetState())
00416   {
00417     return true;
00418   }
00419   else
00420   {
00421     return false;
00422   }
00423 }
00424 
00425 /*
00426 * Change Log:
00427 *
00428 * $Log: Xabsl2Option.cpp,v $
00429 * Revision 1.1.1.1  2004/05/22 17:37:56  cvsadm
00430 * created new repository GT2004_WM
00431 *
00432 * Revision 1.4  2004/05/12 13:58:26  loetzsch
00433 * bug fix
00434 * (creation of option graph crashed if a basic behavior was not registered)
00435 *
00436 * Revision 1.3  2004/03/15 09:58:15  dueffert
00437 * time-of-state-execution bug fixed
00438 *
00439 * Revision 1.2  2003/10/08 11:50:09  loetzsch
00440 * made the Xabsl2Engine really platform independent
00441 * (removed inclusion of Platform/SystemCall.h)
00442 * A time function is given to the engine by parameter.
00443 *
00444 * Revision 1.1  2003/10/07 10:13:25  cvsadm
00445 * Created GT2004 (M.J.)
00446 *
00447 * Revision 1.5  2003/09/30 10:51:11  dueffert
00448 * typos fixed
00449 *
00450 * Revision 1.4  2003/09/20 16:34:16  loetzsch
00451 * renamed "following-option-..." to "subsequent-option-.." and
00452 * "following-basic-behavior-.." to "subsequent-basic-behavior-.."
00453 * for consistency with publications
00454 *
00455 * Revision 1.3  2003/08/04 16:00:28  loetzsch
00456 * bug fix: the engine doesn't crash anymore when a parameter of a subsequent option or basic behavior is wrong
00457 *
00458 * Revision 1.2  2003/07/23 22:25:52  loetzsch
00459 * implemented question mark operator
00460 *
00461 * Revision 1.1.1.1  2003/07/02 09:40:29  cvsadm
00462 * created new repository for the competitions in Padova from the 
00463 * tamara CVS (Tuesday 2:00 pm)
00464 *
00465 * removed unused solutions
00466 *
00467 * Revision 1.14  2003/05/25 22:36:32  loetzsch
00468 * only when an output symbol was set during the execution of the graph,
00469 * coresponding function is invoked or the coresponding variable is changed.
00470 *
00471 * Revision 1.13  2003/05/05 17:47:55  loetzsch
00472 * added in Xabsl2:
00473 * - marking of states as target-states with attribute is-target-state="true"
00474 * - boolean expression "subsequent-option-reached-target-state"
00475 * - common-decision-tree
00476 *
00477 * Revision 1.12  2003/03/28 14:18:49  loetzsch
00478 * Parameters that are not set become set to 0.
00479 *
00480 * Revision 1.11  2003/03/06 11:44:47  dueffert
00481 * re-order warnings removed
00482 *
00483 * Revision 1.10  2003/01/27 14:38:13  loetzsch
00484 * in Xabsl2State::reset() the timeOfStateExecution is set to 0
00485 *
00486 * Revision 1.9  2003/01/15 08:18:47  juengel
00487 * GT2003 compiles now.
00488 *
00489 * Revision 1.8  2003/01/14 16:28:32  loetzsch
00490 * creation of references to output symbols added
00491 * setting of output symbols added
00492 *
00493 * Revision 1.7  2003/01/13 22:39:38  loetzsch
00494 * implemented the execution of the engine.
00495 *
00496 * Revision 1.6  2003/01/13 13:18:18  loetzsch
00497 * Creation of boolean and decimal expressions finished.
00498 *
00499 * Revision 1.5  2003/01/12 14:54:04  loetzsch
00500 * continued creation of option tree: Xabsl2Statement and derivates added
00501 *
00502 * Revision 1.4  2003/01/11 14:41:42  loetzsch
00503 * continued creation of the option tree
00504 *
00505 * Revision 1.3  2003/01/09 17:28:33  loetzsch
00506 * introduced Xabsl2Agent, continued Xabsl2Option
00507 *
00508 * Revision 1.2  2003/01/08 18:47:17  loetzsch
00509 * first version of state implementation
00510 *
00511 * Revision 1.1  2003/01/08 15:22:33  loetzsch
00512 * - started implementation of the option tree
00513 * - started the reading of the intermediate code
00514 *
00515 */

Generated on Thu Sep 23 19:57:42 2004 for GT2004 by doxygen 1.3.6