00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "PfcParser.h"
00011 #include "Actionfield.h"
00012 #include "Motionfield.h"
00013 #include "PfieldDatatypes.h"
00014 #include "PotentialFunctions.h"
00015 #include "PfieldGeometry.h"
00016 #include "FieldObject.h"
00017 #include "FormationObject.h"
00018 #include "RandomMotionGenerator.h"
00019 #include "AStarSearch.h"
00020 #include <cassert>
00021 #include <iostream>
00022
00023
00024 inline double toDouble(const std::string& s)
00025 {
00026 return atof(s.c_str());
00027 }
00028
00029
00030 inline int toInt(const std::string& s)
00031 {
00032 return atoi(s.c_str());
00033 }
00034
00035
00036 inline bool toBool(const std::string& s)
00037 {
00038 if(s=="true")
00039 {
00040 return true;
00041 }
00042 else
00043 {
00044 return false;
00045 }
00046 }
00047
00048
00049 inline ChangeType toChangeType(const std::string& s)
00050 {
00051 if(s == "calls")
00052 {
00053 return CALLS;
00054 }
00055 else
00056 {
00057 return MILLISECONDS;
00058 }
00059 }
00060
00061
00062
00063 Parser::~Parser()
00064 {
00065 std::vector < Object* >::iterator object;
00066 for (object = objects.begin (); object != objects.end (); ++object)
00067 {
00068 delete (*object);
00069 }
00070 objects.clear();
00071 instanceGroups.clear();
00072 }
00073
00074
00075 inline char Parser::nextChar()
00076 {
00077 char ch;
00078 #ifdef POTENTIALFIELDS_FOR_GT2004_
00079 (*file) >> ch;
00080 #else
00081 ch = file.get();
00082 #endif //POTENTIALFIELDS_FOR_GT2004_
00083 return ch;
00084 }
00085
00086
00087 inline bool Parser::endOfFile()
00088 {
00089 #ifdef POTENTIALFIELDS_FOR_GT2004_
00090 return file->eof();
00091 #else
00092 return file.eof();
00093 #endif //POTENTIALFIELDS_FOR_GT2004_
00094 }
00095
00096
00097 std::string Parser::nextToken()
00098 {
00099 std::string token="";
00100 char ch;
00101 do
00102 {
00103 ch = nextChar();
00104 } while (((ch == ' ') || (ch == '\t') || (ch == '\n') ||
00105 (ch == 0x0A) || (ch == 0x0D) || (ch == ';')) && !endOfFile());
00106 while ((ch != ';') && !endOfFile())
00107 {
00108 token += ch;
00109 ch = nextChar();
00110 }
00111 return token;
00112 }
00113
00114
00115 inline double Parser::parseAngle()
00116 {
00117 return (toDouble(nextToken()) * pi_180);
00118 }
00119
00120
00121 void Parser::parseGeometricObject(PfieldGeometricObject*& geometricObject,
00122 const std::string& preparsedToken)
00123 {
00124 std::string geometryType;
00125 if(preparsedToken == "")
00126 {
00127 geometryType = nextToken();
00128 }
00129 else
00130 {
00131 geometryType = preparsedToken;
00132 }
00133 if(geometryType == "line")
00134 {
00135 Line* line= new Line();
00136 line->intersectable = toBool(nextToken());
00137 line->p1.x = toDouble(nextToken());
00138 line->p1.y = toDouble(nextToken());
00139 line->p2.x = toDouble(nextToken());
00140 line->p2.y = toDouble(nextToken());
00141 line->initRadiusOfCollisionCircle();
00142 geometricObject = line;
00143 }
00144 else if(geometryType == "polygon")
00145 {
00146 Polygon* polygon = new Polygon();
00147 polygon->intersectable = toBool(nextToken());
00148 std::string x;
00149 PfVec p;
00150 x = nextToken();
00151 while(x != "EOL")
00152 {
00153 p.x = toDouble(x);
00154 p.y = toDouble(nextToken());
00155 polygon->addPoint(p);
00156 x = nextToken();
00157 }
00158 polygon->initRadiusOfCollisionCircle();
00159 geometricObject = polygon;
00160 }
00161 else if(geometryType == "circle")
00162 {
00163 Circle* circle = new Circle();
00164 circle->radius = toDouble(nextToken());
00165 circle->intersectable = toBool(nextToken());
00166 circle->initRadiusOfCollisionCircle();
00167 geometricObject = circle;
00168 }
00169 else if(geometryType == "no-geometry")
00170 {
00171 NoGeometry* noGeometry = new NoGeometry();
00172 noGeometry->intersectable = false;
00173 noGeometry->initRadiusOfCollisionCircle();
00174 geometricObject = noGeometry;
00175 }
00176 }
00177
00178
00179 void Parser::parseFunction(PotentialfieldFunction*& function)
00180 {
00181 std::string functionType = nextToken();
00182 if(functionType == "linear-function")
00183 {
00184 double range = toDouble(nextToken());
00185 double atZero = toDouble(nextToken());
00186 LinearFunction* linearFunction = new LinearFunction(range, atZero);
00187 function = linearFunction;
00188 }
00189 else if(functionType == "parabolic-function")
00190 {
00191 double range = toDouble(nextToken());
00192 double atZero = toDouble(nextToken());
00193 ParabolicFunction* parabolicFunction = new ParabolicFunction(range, atZero);
00194 function = parabolicFunction;
00195 }
00196 if(functionType == "no-function")
00197 {
00198 NoFunction* noFunction = new NoFunction();
00199 function = noFunction;
00200 }
00201 else if(functionType == "asymptotic-function")
00202 {
00203 double range = toDouble(nextToken());
00204 double atZero = toDouble(nextToken());
00205 double solidCenter = toDouble(nextToken());
00206 assert(solidCenter > 0.0);
00207 AsymptoticFunction* asymptoticFunction = new AsymptoticFunction(range, atZero, solidCenter);
00208 function = asymptoticFunction;
00209 }
00210 else if(functionType == "social-function")
00211 {
00212 double cRep(toDouble(nextToken()));
00213 double omRep(toDouble(nextToken()));
00214 double cAtt(toDouble(nextToken()));
00215 double omAtt(toDouble(nextToken()));
00216 double epsilon(toDouble(nextToken()));
00217 double k(toDouble(nextToken()));
00218 assert((cRep >= 0.0) && (cAtt >= 0.0) && (omRep > omAtt) && (omAtt >= 0.0) && (epsilon >= 0.0));
00219 SocialFunction* socialFunction = new SocialFunction(cRep,omRep,cAtt,omAtt, epsilon, k);
00220 function = socialFunction;
00221 }
00222 if((functionType == "asymptotic-function") ||
00223 (functionType == "linear-function") ||
00224 (functionType == "parabolic-function"))
00225 {
00226 double smoothingAtObject(toDouble(nextToken())/100.0);
00227 double smoothingAtBorder(toDouble(nextToken())/100.0);
00228 double gradientAtObject(toDouble(nextToken()));
00229 double gradientAtBorder(toDouble(nextToken()));
00230 assert((smoothingAtObject >= 0.0) && (smoothingAtBorder >=0.0) &&
00231 (smoothingAtObject <= 1.0) && (smoothingAtBorder <=1.0));
00232 function->setSmoothingParameters(smoothingAtObject, smoothingAtBorder,
00233 gradientAtObject, gradientAtBorder);
00234 }
00235 }
00236
00237
00238 inline Object* Parser::getInstance(const std::string& name)
00239 {
00240 NameToIndexMap::const_iterator pos;
00241 pos = composition->objectMap.find(name);
00242 assert(pos != composition->objectMap.end());
00243 return composition->objects[pos->second];
00244 }
00245
00246
00247 void Parser::parseObjectsForField(const std::string& nameOfFirst,Potentialfield* field)
00248 {
00249 std::string objectName = nameOfFirst;
00250 Object* object;
00251 while(objectName != "EOL")
00252 {
00253 if(objectName == "include-group")
00254 {
00255 objectName = nextToken();
00256 addGroupToField(objectName, field);
00257 objectName = nextToken();
00258 }
00259 else
00260 {
00261 if(objectName == "include-formation")
00262 {
00263 objectName = nextToken();
00264 }
00265 object = getInstance(objectName);
00266 assert(object != 0);
00267 field->addObject(object);
00268 objectName = nextToken();
00269 }
00270 }
00271 }
00272
00273
00274 void Parser::addGroupToField(const std::string& groupName, Potentialfield* field)
00275 {
00276 bool groupFound = false;
00277 for(unsigned int i=0; i<instanceGroups.size(); i++)
00278 {
00279 if(instanceGroups[i].name == groupName)
00280 {
00281 for(unsigned int j=0; j<instanceGroups[i].objects.size(); j++)
00282 {
00283 field->addObject(instanceGroups[i].objects[j]);
00284 }
00285 groupFound = true;
00286 break;
00287 }
00288 }
00289 assert(groupFound);
00290 }
00291
00292
00293 void Parser::parseObjectStateSymbol()
00294 {
00295 std::string symbol(nextToken());
00296 composition->addDynamicObjectState(symbol);
00297 }
00298
00299
00300 void Parser::parseInstanceGroup()
00301 {
00302 InstanceGroup newGroup;
00303 newGroup.name = nextToken();
00304 std::string objectName = nextToken();
00305 Object* object;
00306 while(objectName != "EOL")
00307 {
00308 object = getInstance(objectName);
00309 assert(object != 0);
00310 newGroup.objects.push_back(object);
00311 objectName = nextToken();
00312 }
00313 instanceGroups.push_back(newGroup);
00314 }
00315
00316
00317 Object* Parser::parseObject()
00318 {
00319 std::string name(nextToken());
00320 std::string type(nextToken());
00321 ObjectType objectType;
00322 if(type=="attractive")
00323 {
00324 objectType = ATTRACTIVE;
00325 }
00326 else
00327 {
00328 objectType = REPULSIVE;
00329 }
00330 Object* object = new Object(name, objectType);
00331 std::string tangentialField = nextToken();
00332 if(tangentialField == "clockwise")
00333 {
00334 object->setTangentialField(CLOCKWISE);
00335 }
00336 else if(tangentialField == "counter-clockwise")
00337 {
00338 object->setTangentialField(COUNTER_CLOCKWISE);
00339 }
00340 object->setPfieldCompositionRef(composition);
00341 PotentialfieldFunction* function;
00342 parseFunction(function);
00343 object->setFunction(function);
00344 delete function;
00345 std::string fieldType = nextToken();
00346 if(fieldType == "point-field")
00347 {
00348 object->setField(POINT_FIELD);
00349 }
00350 else if(fieldType == "shape-field")
00351 {
00352 object->setField(SHAPE_FIELD);
00353 }
00354 else if(fieldType == "sector-field")
00355 {
00356 Sector sector;
00357 sector.openingAngle = parseAngle();
00358 std::string crossFunctionString = nextToken();
00359 if(crossFunctionString == "linear-function")
00360 {
00361 sector.crossFunction = new LinearFunction(1.0,1.0);
00362 }
00363 else if(crossFunctionString == "parabolic-function")
00364 {
00365 sector.crossFunction = new ParabolicFunction(1.0,1.0);
00366 }
00367 else if(crossFunctionString == "asymptotic-function")
00368 {
00369 sector.crossFunction = new AsymptoticFunction(1.0,1.0,0.0001);
00370 }
00371 sector.crossFunction->setSmoothingParameters(
00372 toDouble(nextToken()), toDouble(nextToken()),
00373 toDouble(nextToken()), toDouble(nextToken()));
00374 object->setField(SECTOR_FIELD, sector);
00375 }
00376 PfieldGeometricObject* geometricObject;
00377 parseGeometricObject(geometricObject);
00378 object->setGeometry(geometricObject);
00379 delete geometricObject;
00380 return object;
00381 }
00382
00383
00384 void Parser::parseAndInsertObject()
00385 {
00386 Object* object = parseObject();
00387 objectMap[object->getName()] = objects.size();
00388 objects.push_back(object);
00389 }
00390
00391
00392 void Parser::parseInstance()
00393 {
00394 Object* instance = 0;
00395 std::string type = nextToken();
00396 std::string name = nextToken();
00397 NameToIndexMap::iterator pos;
00398 pos = objectMap.find(type);
00399 assert(pos != objectMap.end());
00400 instance = objects[pos->second]->createInstance(name);
00401 std::string pose = nextToken();
00402 if(pose=="static-pose")
00403 {
00404 PfPose pose;
00405 pose.pos.x = toDouble(nextToken());
00406 pose.pos.y = toDouble(nextToken());
00407 pose.rotation = parseAngle();
00408 instance->setPose(pose);
00409 instance->setStatic(true);
00410 instance->setActivation(true);
00411 }
00412 else if(pose=="dynamic-pose")
00413 {
00414 std::string poseSymbol = nextToken();
00415 unsigned int dynamicPoseId = composition->getIdFromObjectStateSymbol(poseSymbol);
00416 instance->setStatic(false, dynamicPoseId);
00417 instance->setActivation(false);
00418 }
00419 composition->addObject(instance);
00420 }
00421
00422
00423 void Parser::parseSingleFormation(SingleFormation*& formation,
00424 const std::string& formationToken)
00425 {
00426 if(formationToken == "between")
00427 {
00428 BetweenFormation* betweenFormation = new BetweenFormation();
00429 betweenFormation->addObject(getInstance(nextToken()));
00430 betweenFormation->addObject(getInstance(nextToken()));
00431 formation = betweenFormation;
00432 }
00433 else if(formationToken == "among")
00434 {
00435 AmongFormation* amongFormation = new AmongFormation();
00436 std::string groupName(nextToken());
00437 bool groupFound = false;
00438 for(unsigned int i=0; i<instanceGroups.size(); i++)
00439 {
00440 if(instanceGroups[i].name == groupName)
00441 {
00442 for(unsigned int j=0; j<instanceGroups[i].objects.size(); j++)
00443 {
00444 amongFormation->addObject(instanceGroups[i].objects[j]);
00445 }
00446 groupFound = true;
00447 break;
00448 }
00449 }
00450 assert(groupFound);
00451 formation = amongFormation;
00452 }
00453 else if(formationToken == "relative-to")
00454 {
00455 RelativeFormation* relativeFormation = new RelativeFormation();
00456 relativeFormation->addObject(getInstance(nextToken()));
00457 double angle(parseAngle());
00458 std::string coordinateString(nextToken());
00459 if(coordinateString == "relative")
00460 {
00461 relativeFormation->setParameters(angle, RELATIVE_FORMATION);
00462 }
00463 else
00464 {
00465 relativeFormation->setParameters(angle, ABSOLUTE_FORMATION);
00466 }
00467 formation = relativeFormation;
00468 }
00469 formation->setPriority(toDouble(nextToken()));
00470 PotentialfieldFunction* function;
00471 parseFunction(function);
00472 formation->setFunction(function);
00473 delete function;
00474 formation->init();
00475 }
00476
00477
00478 void Parser::parseFormationObject()
00479 {
00480 FormationObject* object;
00481 std::string name(nextToken());
00482 object = new FormationObject(name);
00483 std::string formationToken(nextToken());
00484 while(formationToken != "EOL")
00485 {
00486 if(formationToken != "best-fit")
00487 {
00488 SingleFormation* singleFormation;
00489 parseSingleFormation(singleFormation, formationToken);
00490 object->addSingleFormation(singleFormation);
00491 }
00492 else
00493 {
00494 BestFitFormation* bestFitFormation = new BestFitFormation();
00495 std::string selectionString(nextToken());
00496 if(selectionString == "max-gradient")
00497 {
00498 bestFitFormation->setBestFitSelection(SELECT_MAX_GRADIENT);
00499 }
00500 else if(selectionString == "min-gradient")
00501 {
00502 bestFitFormation->setBestFitSelection(SELECT_MIN_GRADIENT);
00503 }
00504 else if(selectionString == "min-distance")
00505 {
00506 bestFitFormation->setBestFitSelection(SELECT_MIN_DISTANCE);
00507 }
00508 else
00509 {
00510 bestFitFormation->setBestFitSelection(SELECT_MAX_PRIORITY);
00511 }
00512 formationToken = nextToken();
00513 while(formationToken != "EOL")
00514 {
00515 SingleFormation* singleFormation;
00516 parseSingleFormation(singleFormation, formationToken);
00517 bestFitFormation->addFormation(singleFormation);
00518 formationToken = nextToken();
00519 }
00520 object->addSingleFormation(bestFitFormation);
00521 }
00522 formationToken = nextToken();
00523 }
00524 composition->addObject(object);
00525 }
00526
00527
00528 void Parser::parseTimeConstraintsForField(Potentialfield* field)
00529 {
00530 std::string whatToKeepStr(nextToken());
00531 KeepType whatToKeep;
00532 if(whatToKeepStr == "result")
00533 {
00534 whatToKeep = KEEP_RESULT;
00535 }
00536 else
00537 {
00538 whatToKeep = KEEP_FIELD;
00539 }
00540 ChangeType changeTypeN(toChangeType(nextToken()));
00541 int n(toInt(nextToken()));
00542 ChangeType changeTypeM(toChangeType(nextToken()));
00543 int m(toInt(nextToken()));
00544 ChangeType changeTypeO(toChangeType(nextToken()));
00545 int o(toInt(nextToken()));
00546 field->setTimeConstraints(whatToKeep, changeTypeN, n, changeTypeM, m,
00547 changeTypeO, o);
00548 }
00549
00550
00551 void Parser::parseMotionfield()
00552 {
00553 std::string name = nextToken();
00554 Motionfield* motionField = new Motionfield(name);
00555 bool disableTranslation(toBool(nextToken()));
00556 bool disableRotation(toBool(nextToken()));
00557 motionField->disableDegreesOfFreedom(disableTranslation, disableRotation);
00558 double maxAccel(toDouble(nextToken()));
00559 double maxGradientDifference(parseAngle());
00560 motionField->setAccelerationLimits(maxAccel, maxGradientDifference);
00561 parseTimeConstraintsForField(motionField);
00562 std::string criterion = nextToken();
00563 if(criterion == "gradient")
00564 {
00565 motionField->setCriterion(CRITERION_GRADIENT);
00566 }
00567 else if(criterion == "const")
00568 {
00569 motionField->setCriterion(CRITERION_CONST,toDouble(nextToken()));
00570 }
00571 std::string combinedField(nextToken());
00572 while(combinedField != "EOL")
00573 {
00574 motionField->addCombinedField(combinedField);
00575 combinedField = nextToken();
00576 }
00577 std::string nameOfFirstObject(nextToken());
00578 if(nameOfFirstObject == "avoid-local-minima")
00579 {
00580 std::string pathPlannerUsage(nextToken());
00581 bool alwaysPlanning(pathPlannerUsage == "always");
00582 double gradientLength(toDouble(nextToken()));
00583 Object* goalObject = getInstance(nextToken());
00584 PotentialfieldAStarParameterSet parameterSet;
00585 parameterSet.distanceToGoal = toDouble(nextToken());
00586 parameterSet.minExpansionRadius = toDouble(nextToken());
00587 parameterSet.maxExpansionRadius = toDouble(nextToken());
00588 parameterSet.minBranchingFactor = toInt(nextToken());
00589 parameterSet.maxBranchingFactor = toInt(nextToken());
00590 parameterSet.endOfNear = toDouble(nextToken());
00591 parameterSet.endOfFar = toDouble(nextToken());
00592 parameterSet.standardGradientLength = toDouble(nextToken());
00593 parameterSet.numberOfCalls = 0;
00594 int maxNumberOfSearchNodes(toInt(nextToken()));
00595 int minCacheSize(toInt(nextToken()));
00596 nameOfFirstObject = nextToken();
00597 if(nameOfFirstObject == "stabilization-element")
00598 {
00599 parameterSet.useStabilization = true;
00600 parameterSet.stabilizationDistance = toDouble(nextToken());
00601 nameOfFirstObject = nextToken();
00602 parameterSet.stabilizationObject = parseObject();
00603 nameOfFirstObject = nextToken();
00604 }
00605 AStarSearch<PotentialfieldAStarNode, PotentialfieldAStarParameterSet,double>* pathPlanner =
00606 new AStarSearch<PotentialfieldAStarNode, PotentialfieldAStarParameterSet,double>(minCacheSize,maxNumberOfSearchNodes,parameterSet);
00607 motionField->addPathPlanner(pathPlanner, alwaysPlanning,
00608 goalObject, parameterSet, gradientLength);
00609 }
00610 if(nameOfFirstObject == "include-random-motion-generator")
00611 {
00612 double minValue(toDouble(nextToken()));
00613 double maxValue(toDouble(nextToken()));
00614 double valueDx(toDouble(nextToken()));
00615 double directionDx(parseAngle());
00616 assert(minValue <= maxValue);
00617 assert(maxValue >= 0.0);
00618 assert(valueDx >= 0.0);
00619 assert(directionDx >= 0.0);
00620 ChangeType changeType;
00621 std::string changeString(nextToken());
00622 if(changeString == "calls") changeType = CALLS;
00623 else changeType = MILLISECONDS;
00624 unsigned long n = toInt(nextToken());
00625 RandomMotionGenerator* rmg = new RandomMotionGenerator
00626 (minValue, maxValue, valueDx, directionDx, changeType,n);
00627 motionField->addRandomMotionGenerator(rmg);
00628 nameOfFirstObject = nextToken();
00629 }
00630 parseObjectsForField(nameOfFirstObject,motionField);
00631 composition->addField(motionField);
00632 }
00633
00634
00635 void Parser::parseTransformation(PotentialfieldTransformation*& transformation,
00636 const std::string& typeToken)
00637 {
00638 if (typeToken == "translation")
00639 {
00640 Translation* translation = new Translation();
00641 translation->translation.x = toDouble(nextToken());
00642 translation->translation.y = toDouble(nextToken());
00643 translation->time = toDouble(nextToken())/1000.0;
00644 translation->speed = 0.0;
00645 translation->alongGradient = false;
00646 translation->stepLength = 0.0;
00647 translation->maxGradientDeviation = 0.0;
00648 translation->toObject = 0;
00649 transformation = translation;
00650 }
00651 else if (typeToken == "translation-to-object")
00652 {
00653 Translation* translation = new Translation();
00654 translation->alongGradient = false;
00655 translation->stepLength = 0.0;
00656 translation->maxGradientDeviation = 0.0;
00657 translation->toObject = getInstance(nextToken());
00658 translation->speed = toDouble(nextToken());
00659 translation->time = 0.0;
00660 transformation = translation;
00661 }
00662 else if (typeToken == "translation-along-gradient")
00663 {
00664 Translation* translation = new Translation();
00665 translation->alongGradient = true;
00666 translation->stepLength = toDouble(nextToken());
00667 translation->maxGradientDeviation = parseAngle();
00668 translation->maxLength = toDouble(nextToken());
00669 translation->speed = toDouble(nextToken());
00670 translation->time = 0.0;
00671 translation->toObject = 0;
00672 transformation = translation;
00673 }
00674 else if (typeToken == "rotation")
00675 {
00676 Rotation* rotation = new Rotation();
00677 rotation->toGradient = false;
00678 rotation->angle = parseAngle();
00679 rotation->speed = 0.0;
00680 rotation->time = toDouble(nextToken())/1000.0;
00681 rotation->toObject = 0;
00682 transformation = rotation;
00683 }
00684 else if (typeToken == "rotation-to-gradient")
00685 {
00686 Rotation* rotationToGradient = new Rotation();
00687 rotationToGradient->toGradient = true;
00688 rotationToGradient->toObject = 0;
00689 rotationToGradient->speed = parseAngle();
00690 rotationToGradient->time = 0.0;
00691 transformation = rotationToGradient;
00692 }
00693 else if (typeToken == "rotation-to-object")
00694 {
00695 Rotation* rotationToObject = new Rotation();
00696 rotationToObject->toGradient = false;
00697 rotationToObject->toObject = getInstance(nextToken());
00698 rotationToObject->speed = parseAngle();
00699 rotationToObject->time = 0.0;
00700 transformation = rotationToObject;
00701 }
00702 else if(typeToken == "no-transformation")
00703 {
00704 transformation = new NoTransformation();
00705 transformation->time = toDouble(nextToken());
00706 assert(transformation->time != 0.0);
00707 }
00708 }
00709
00710
00711 void Parser::parseAction(Action& action)
00712 {
00713 std::string manipulationType = nextToken();
00714 if(manipulationType == "move-object")
00715 {
00716 action.actionType = MOVE_OBJECT;
00717 action.joinAction = toBool(nextToken());
00718 action.manipulatedObject = getInstance(nextToken());
00719 std::string polygonString = nextToken();
00720 PfieldGeometricObject* geoObj;
00721 while(polygonString == "polygon")
00722 {
00723 parseGeometricObject(geoObj, polygonString);
00724 Polygon* polygon;
00725 polygon = (Polygon*)(geoObj);
00726 action.impactAreas.push_back(*polygon);
00727 delete geoObj;
00728 polygonString = nextToken();
00729 }
00730 }
00731 else if(manipulationType == "move-self")
00732 {
00733 action.actionType = MOVE_SELF;
00734 action.manipulatedObject = 0;
00735 action.joinAction = false;
00736 }
00737 else if(manipulationType == "measure-object")
00738 {
00739 action.actionType = MEASURE_OBJECT;
00740 action.manipulatedObject = getInstance(nextToken());
00741 action.joinAction = false;
00742 }
00743 else
00744 {
00745 action.actionType = MEASURE_SELF;
00746 action.manipulatedObject = 0;
00747 action.joinAction = false;
00748 }
00749 if((manipulationType == "move-object") || (manipulationType == "move-self"))
00750 {
00751 std::string transformationToken(nextToken());
00752 PotentialfieldTransformation* transformation;
00753 if(transformationToken == "probability-distribution")
00754 {
00755 transformationToken = nextToken();
00756 while(transformationToken != "EOL")
00757 {
00758 double probability = toDouble(transformationToken);
00759 transformationToken = nextToken();
00760 parseTransformation(transformation, transformationToken);
00761 transformation->probability = probability;
00762 action.transformations.push_back(transformation);
00763 transformationToken = nextToken();
00764 }
00765 }
00766 else
00767 {
00768 parseTransformation(transformation, transformationToken);
00769 transformation->probability = 1.0;
00770 action.transformations.push_back(transformation);
00771 }
00772 }
00773 else
00774 {
00775 PotentialfieldTransformation* transformation = new NoTransformation();
00776 transformation->time = 1.0;
00777 action.transformations.push_back(transformation);
00778 }
00779 }
00780
00781
00782 void Parser::parseActionfield()
00783 {
00784 std::string name = nextToken();
00785 Actionfield* actionField = new Actionfield(name);
00786 actionField->setConsiderTime(toBool(nextToken()));
00787 parseTimeConstraintsForField(actionField);
00788 std::string criterion = nextToken();
00789 if(criterion == "gain")
00790 {
00791 actionField->setCriterion(CRITERION_GAIN);
00792 }
00793 else if(criterion == "gradient")
00794 {
00795 actionField->setCriterion(CRITERION_GRADIENT);
00796 }
00797 else if(criterion == "absolute")
00798 {
00799 actionField->setCriterion(CRITERION_ABSOLUTE);
00800 }
00801 else if(criterion == "const")
00802 {
00803 actionField->setCriterion(CRITERION_CONST,toDouble(nextToken()));
00804 }
00805 std::string nextAction(nextToken());
00806 if(nextAction == "fixed-sequence")
00807 {
00808 actionField->setActionfieldType(FIXED_SEQUENCE_FIELD);
00809 nextAction = nextToken();
00810 }
00811 else if(nextAction == "find-best-sequence")
00812 {
00813 unsigned int depth(toInt(nextToken()));
00814 bool decreasingValuesOnly(toBool(nextToken()));
00815 actionField->setActionfieldType(BEST_SEQUENCE_FIELD,
00816 decreasingValuesOnly, depth);
00817 nextAction = nextToken();
00818 }
00819 else
00820 {
00821 actionField->setActionfieldType(SINGLE_ACTION_FIELD);
00822 }
00823 while (nextAction != "EOL")
00824 {
00825 Action action;
00826 action.name = nextToken();
00827 parseAction(action);
00828 actionField->addAction(action);
00829 nextAction = nextToken();
00830 }
00831 std::string combinedField = nextToken();
00832 while(combinedField != "EOL")
00833 {
00834 actionField->addCombinedField(combinedField);
00835 combinedField = nextToken();
00836 }
00837 std::string nameOfFirstObject(nextToken());
00838 parseObjectsForField(nameOfFirstObject, actionField);
00839 composition->addField(actionField);
00840 }
00841
00842
00843 void Parser::parseComposition()
00844 {
00845 std::string selectionProcedure(nextToken());
00846 int n = toInt(nextToken());
00847 if(selectionProcedure == "best-of-n")
00848 {
00849 composition->setFieldSelectionParameters(BEST_OF_N, n);
00850 }
00851 else
00852 {
00853 composition->setFieldSelectionParameters(SUCCESSIVE_N_TIMES, n);
00854 }
00855 }
00856
00857
00858 void Parser::parse(PotentialfieldComposition* composition, std::string filename)
00859 {
00860 setlocale(LC_NUMERIC, "C");
00861 this->composition = composition;
00862 #ifdef POTENTIALFIELDS_FOR_GT2004_
00863 std::string relativeFileName("Pfield/"+filename);
00864 file = new InBinaryFile(relativeFileName.c_str());
00865 assert(file->exists());
00866 #else
00867 file.open(filename.c_str());
00868 #endif //POTENTIALFIELDS_FOR_GT2004_
00869 std::string mainToken;
00870 while(!endOfFile())
00871 {
00872 mainToken = nextToken();
00873 if(mainToken == "object")
00874 {
00875 parseAndInsertObject();
00876 }
00877 else if(mainToken == "object-state-symbol")
00878 {
00879 parseObjectStateSymbol();
00880 }
00881 else if(mainToken == "instance-group")
00882 {
00883 parseInstanceGroup();
00884 }
00885 else if(mainToken == "formation-object")
00886 {
00887 parseFormationObject();
00888 }
00889 else if(mainToken == "object-instance")
00890 {
00891 parseInstance();
00892 }
00893 else if(mainToken == "motionfield")
00894 {
00895 parseMotionfield();
00896 }
00897 else if(mainToken == "actionfield")
00898 {
00899 parseActionfield();
00900 }
00901 else if(mainToken == "composition")
00902 {
00903 parseComposition();
00904 }
00905 else
00906 {
00907 assert(mainToken == "");
00908 }
00909 }
00910 #ifdef POTENTIALFIELDS_FOR_GT2004_
00911 delete file;
00912 #else
00913 file.close();
00914 #endif //POTENTIALFIELDS_FOR_GT2004_
00915 }
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984