Example #1
0
void AnalyzeInput::evaltrajs(vector<Trajectory*> &trajs){
 //******Calculate Cost, Acceleration, and Distance traveled per time step*******************************
	Cost evalcost;
	this->DR = 0;
	this->C = 0;

	for (int i = 0; i < trajs.size(); i++){
		trajs[i]->R = 0;
		trajs[i]->C = 0;
		double Cmin = 100;
		double Cmax = 0;
		double Rmin = 1E9;
		double Rmax = 0;
		for (int j = 0; j < trajs[i]->particles.size()-1; j++){
			Particle* P = trajs[i]->particles[j];
			Particle* Pn = trajs[i]->particles[j+1];
			P->dr = distance(P,Pn);
			if(P->dr > Rmax)
				Rmax = P->dr;

			if(P->dr < Rmin)
				Rmin = P->dr;

            		trajs[i]->R += P->dr;

            		Pn->vel = P->dr * FRAMESPERSEC;
			if (j>1){
				Particle* Pm = trajs[i]->particles[j-1];
				P->accel = abs(Pn->vel - Pm->vel) * FRAMESPERSEC/2.0;
			}

			if (j >= COST_TRAJ_SIZE - 1){
				int s = (j) - (COST_TRAJ_SIZE -1);
				Trajectory tr;
				for (int x = s; x <= j; x++){
					tr.particles.push_back(trajs[i]->particles[x]);
				}
				Pn->cost = evalcost.cost(&tr, Pn);
			}else{
				Pn->cost = 0.0;
			}

			if(Pn->cost > Cmax)
				Cmax = Pn->cost;

			if(Pn->cost < Cmin && Pn->cost != 0)
				Cmin = Pn->cost;

			trajs[i]->C += Pn->cost;
		}
		trajs[i]->Cl = Cmin;
		trajs[i]->Ch = Cmax;
		trajs[i]->C = trajs[i]->C / ((double) trajs[i]->particles.size());
		this->C += trajs[i]->C;

		trajs[i]->Rl = Rmin;
		trajs[i]->Rh = Rmax;
		trajs[i]->R = trajs[i]->R / ((double) trajs[i]->particles.size());
		this->DR += trajs[i]->R;
	}
    	this->C = this->C / trajs.size();
	this->DR = this->DR / trajs.size();
}
Example #2
0
std::vector<std::pair<std::vector<uint>, std::vector<SentenceInfo>  aStar::Suchalgorithmus(char* eingabe, PTree<PTree <Cost> >* blacktree, Lexicon* eLex, Lexicon* fLex){
     igzstream in(eingabe);
     aStar::flex=fLex;
     elex=eLex;
     schwarz=blacktree;


     string token,line;

	  unsigned int lineNumber = 0;
	
     while(getline(in,line)){
	  istringstream ist(line); //Einlesen des Satzes
	  
	  vector<unsigned int> sentence_id;

	  vector<HypothesisNode> Knoten;
	  Knoten.push_back(HypothesisNode());//initialisiert den ersten Knoten
	  Cost startkosten(0);
	  Knoten[0].setBestcost(startkosten);
	  //cout << "start kosten " << Knoten[0].getBestcost().cost() << endl;
	  
	  int aktPos=0; //merkt sich, wieviele Wörter schon eingelesen wurden

	  while ( ist >> token){
	       Word word_id_french=flex->getWord_or_add(token); // das word zum Wort (mit 2 Bits Sprache)
	       unsigned int id_french= word_id_french.wordId(); //die id ohne sprachbits

	       sentence_id.push_back(id_french);
	       aktPos++;
	       
	       HypothesisNode knoten_next= HypothesisNode();//initialisiert den nächsten Knoten mit den bisherigen Kosten
	       
	       for (int laengePhrase=1; laengePhrase<5; laengePhrase++){
		    int posPhraseStart=aktPos-laengePhrase; //gibt die Pos. für den Knoten, auf dem die Phrase beginnt
		    if (posPhraseStart < 0)	break; //wir befinden uns am Satzanfang und es gibt keine Phrasen

		    vector<unsigned int> fphrase;
		    for (int i=posPhraseStart; i<aktPos; i++){
			 fphrase.push_back(sentence_id[i]);
		    }
			PTree<PTree <Cost> >* schwarzRest=schwarz->traverse(fphrase);
			if (!schwarzRest)	continue; //wenn es die französische Phrase nicht gibt, nächste überprüfen
			PTree <Cost>* blauBaum=&schwarzRest->c;
			

		    
		    if (blauBaum){
			 int counter=0; //nur fürs Programmieren, damit alle Fehler ausgemerzt werden 
			 for (PTree<Cost>::iterator it=blauBaum->begin(); it!=blauBaum->end(); it++){
			      //if (counter++==10)	continue;
			      vector<unsigned int> ephrase=it->phrase();
			      
			      Cost relfreq = it->c;
				
			      if (relfreq.cost() == 1./0. )	continue;
			      
			      double cost_till_aktPos=Knoten[posPhraseStart].getBestcost().cost();
			      
			      if (cost_till_aktPos+prune > knoten_next.getBestcost().cost())	continue; //pruning ergibt, das ist eine schlecht Übersetzung
			      
			      if(cost_till_aktPos+relfreq.cost() < knoten_next.getBestcost().cost())	knoten_next.setBestcost(Knoten[posPhraseStart].getBestcost()+relfreq.cost());
			      
			      PartialTranslation* Kante= new PartialTranslation(relfreq,ephrase,&knoten_next,posPhraseStart);
			      Knoten[posPhraseStart].add_PartialTranslation_to_Inbound(Kante);
			      knoten_next.add_PartialTranslation_to_Outbound(Kante);   
			 }
		    }
		
	       }
		if (knoten_next.getOutbound().size() == 0){
			//zuerst in das englische Lexicon einfügen
			string word_string = flex->getString(sentence_id[aktPos-1]);
			unsigned int id_english=elex->getWord_or_add(word_string);

			//dann die Kante anlegen, dabei sollen die Kosten niedrig sein, da sie sowieso genutzt werden muss, kann sie auch direkt exploriert werden
			PartialTranslation* Kante= new PartialTranslation(Cost(0),vector<unsigned int>{id_english},&Knoten[aktPos],aktPos-1);
			knoten_next.setBestcost(Knoten.back().getBestcost());
			knoten_next.add_PartialTranslation_to_Outbound(Kante);
			Knoten.back().add_PartialTranslation_to_Inbound(Kante);
		}
	       Knoten.push_back(knoten_next); //letzter Knoten (node_next) hat keine eingehenden Kanten
	       
	  }
	  
	  //dotGraph(Knoten, elex);
	  aStar astar(Knoten);
	  astar.lineNumber = lineNumber;

	  std::vector<SentenceInfo> sentenceInfos = astar.print(astar.search(), sentence_id, schwarz);
	  
	  for(unsigned int i = 0; i < Knoten.size(); i++){
		 HypothesisNode& hnode = Knoten[i];
		 for(unsigned int j = 0; j < hnode.getOutbound().size(); j++)
		 	delete hnode.getOutbound()[j];
	  }
	  
	  std::pair<std::vector<uint>, std::vector<SentenceInfo> > pair_tmp;
	  pair_tmp.first = sentence_id;
	  pair_tmp.second = sentenceInfos;
	  nBestLists.push_back(pair_tmp);
	  lineNumber ++;
     }
     return nBestLists;
}