コード例 #1
0
ファイル: gff_utils.cpp プロジェクト: xiongxu/gffread
void collectLocusData(GList<GenomicSeqData>& ref_data) {
  int locus_num=0;
  for (int g=0;g<ref_data.Count();g++) {
    GenomicSeqData* gdata=ref_data[g];
    for (int l=0;l<gdata->loci.Count();l++) {
      GffLocus& loc=*(gdata->loci[l]);
      GHash<int> gnames(true); //gene names in this locus
      GHash<int> geneids(true); //Entrez GeneID: numbers
      for (int i=0;i<loc.rnas.Count();i++) {
        GffObj& t=*(loc.rnas[i]);
        GStr gname(t.getGeneName());
        if (!gname.is_empty()) {
           gname.upper();
           int* prevg=gnames.Find(gname.chars());
           if (prevg!=NULL) (*prevg)++;
                  else gnames.Add(gname, new int(1));
           }
        //parse GeneID xrefs, if any:
        GStr xrefs(t.getAttr("xrefs"));
        if (!xrefs.is_empty()) {
          xrefs.startTokenize(",");
          GStr token;
          while (xrefs.nextToken(token)) {
            token.upper();
            if (token.startsWith("GENEID:")) {
              token.cut(0,token.index(':')+1);
              int* prevg=geneids.Find(token.chars());
              if (prevg!=NULL) (*prevg)++;
                     else geneids.Add(token, new int(1));
              }
            } //for each xref
          } //xrefs parsing
        }//for each transcript
      locus_num++;
      loc.locus_num=locus_num;
      if (gnames.Count()>0) { //collect all gene names associated to this locus
         gnames.startIterate();
         int* gfreq=NULL;
         char* key=NULL;
         while ((gfreq=gnames.NextData(key))!=NULL) {
            loc.gene_names.AddIfNew(new CGeneSym(key,*gfreq));
            }
         } //added collected gene_names
      if (loc.gene_ids.Count()>0) { //collect all GeneIDs names associated to this locus
         geneids.startIterate();
         int* gfreq=NULL;
         char* key=NULL;
         while ((gfreq=geneids.NextData(key))!=NULL) {
           loc.gene_ids.AddIfNew(new CGeneSym(key,*gfreq));
            }
          }
      } //for each locus
  }//for each genomic sequence
}
コード例 #2
0
int main(int argc, char** argv)
{
	quadrotor::State xref;
	xref.R=SO3::exp((Vec3()<<0,0,0).finished());
	xref.xq=Vec3::Zero();
	xref.omega=Vec3::Zero();
	xref.vq=Vec3::Zero();


	std::vector<quadrotor::State> xrefs(4000,xref);
	std::vector<quadrotor::U> us(4000, 1*(Vec4()<<1,0,1,0).finished());

	std::srand((unsigned int) time(0));
	// Set up quadrotor parameters
	double m=0.6; // mass of the quadrotor
	double Ix=8*5e-3; // moment of inertia in X- Y- and Z-axis
	double Iy=7.5*5e-3;
	double Iz=13.5*5e-3;
	double d=0.2; // displacement of rotors
	double kt=0.6;
	double km=0.15;

	quadrotor::System sys(Ix,Iy,Iz,m,d,km,kt);

	// Set up cost function
	Mat12 Mf=5*Mat12::Identity()*10;
	Mf.block(0,0,3,3)*=2;
	Mf.block(3,3,3,3)*=6;
	Mf.block(6,6,6,6)=Mat6::Identity()*2;
	Mat12 M=Mf/2;
//	M.block(6,6,6,6)*=4;
	Mat4 R=Mat4::Identity()*2;
	DDP<quadrotor>::Params params(M,R,Mf);

	// Set up initial state
	quadrotor::State x0=xrefs[0];

	x0.xq-=(Vec3::Random()).normalized()*10;
	x0.R*=SO3::exp(Vec3::Random().normalized()*3);
	x0.omega=Vec3::Random().normalized()*1;
	x0.vq-=Vec3::Random().normalized()*1;
	// Set up simulator
	double dt=0.01;

	size_t num=200;
	Sim<quadrotor> sim(sys,dt);
	sim.init(x0,num);

	Vec4 umin=-Vec4::Ones()*3;
	Vec4 umax=Vec4::Ones()*3;

	DDP<quadrotor> ddp(sys,dt);

	int sn=1;
	int itr_max=200;
  for(int i=0;i<1000;i+=sn)
  {
    Vec12 error=quadrotor::State::diff(sim.get_state(),xrefs[0]);
    std::cout<<dt*i<<": "<<error.head(3).norm()<<" "<<error.head(6).tail(3).norm()<<std::endl;

    if(error.block(3,0,3,1).norm()<0.05 && error.head(3).norm()<0.4)
      break;

    double err=error.head(6).norm();
    if(err<2.5)
      itr_max=2000;
    else
      itr_max=1000;

    if(i==0)
      itr_max=10000;

    if(err<2)
    {
      M=2.5*Mat12::Identity()*10;
      M.block(0,0,3,3)*=2;
      M.block(3,3,3,3)*=6;
      M.block(6,6,6,6)=Mat6::Identity()*std::max(0.01, 1.25*err*err);

      Mf=5*Mat12::Identity()*100;
      Mf.block(0,0,3,3)*=2;
      Mf.block(3,3,3,3)*=6;
      Mf.block(6,6,6,6)=Mat6::Identity()*0.1;

      R=Mat4::Identity()*std::max(0.001, 0.5*err*err);
    }
    else
    {
      Mf=5*Mat12::Identity()*10;
      Mf.block(0,0,3,3)*=4;
      Mf.block(3,3,3,3)*=6;
      Mf.block(6,6,6,6)=Mat6::Identity()*5;
      M=Mf;
      R=Mat4::Identity()*1;
    }

    if(i%150==0 || (i%50==0 && us[0].norm()+us[10].norm()<0.5))
    {
      Vec4 u0=(Vec4()<<0.62,0.52,0.42,0.32).finished();
      for(int i=0;i<20;i++)
        us[i]=u0;
      ddp.init(sim.get_state(), us, xrefs, params, umin, umax, 150);
      ddp.iterate(40000,us);
    }
    else
    {
      timespec T_start, T_end;
      clock_gettime(CLOCK_MONOTONIC,&T_start);
      ddp.init(sim.get_state(), us, xrefs, params, umin, umax, 150);
      ddp.iterate(itr_max,us);
      clock_gettime(CLOCK_MONOTONIC,&T_end);
      std::cout<<"time consumed is "<<(T_end.tv_sec-T_start.tv_sec)+(T_end.tv_nsec-T_start.tv_nsec)/1000000000.0<<"s"<<std::endl;
    }

    for(int j=0;j<sn;j++)
    {
      sim.update(us.front());
      xrefs.erase(xrefs.begin());
      us.erase(us.begin());
    }
  }

  std::string path="/media/fantaosha/Documents/Northwestern/2016/Spring/Machine-Learning/Project/Data/quadrotor_ddp_1";
  if (argc>=2)
  {
    path.append("_");
    path.append(argv[1]);
  }
  path.append(".mat");
  sim.save(path);
}
コード例 #3
0
ファイル: quadrotor_ddp.cpp プロジェクト: fantaosha/iLQG
int main()
{
#ifdef TRACK
	char file[]="/media/fantaosha/Documents/JHU/Summer 2015/quad_rotor_traj/traj_full_12s_1_small.mat";

	mxArray *mxR;
	mxArray *mxw;
	mxArray *mxxq;
	mxArray *mxvq;
	mxArray *mxU;

	mxR=matGetVariable(matOpen(file,"r"),"state_R");
	mxw=matGetVariable(matOpen(file,"r"),"state_w");
	mxxq=matGetVariable(matOpen(file,"r"),"state_xq");
	mxvq=matGetVariable(matOpen(file,"r"),"state_vq");

	mxU=matGetVariable(matOpen(file,"r"),"U");

	size_t N=mxGetN(mxU);
	size_t sN=10;

	void *pR=mxGetPr(mxR);
	void *pw=mxGetPr(mxw);
	void *pxq=mxGetPr(mxxq);
	void *pvq=mxGetPr(mxvq);
	void *pU=mxGetPr(mxU);

	std::vector<typename quadrotor::State> xrefs;
	xrefs.reserve(N/sN+1);

	for(int i=0;i<N;i+=sN)
	{
		Eigen::Matrix<double,3,3> R;
		Eigen::Matrix<double,3,1> w,xq,vq;

		memcpy(R.data(),pR,sizeof(double)*R.rows()*R.cols());
//		R=(Vec3()<<1,-1,-1).finished().asDiagonal();
//		w<<0,0,0;
		memcpy(w.data(),pw,sizeof(double)*w.rows()*w.cols());
		memcpy(xq.data(),pxq,sizeof(double)*xq.rows()*xq.cols());
		memcpy(vq.data(),pvq,sizeof(double)*vq.rows()*vq.cols());

		xrefs.emplace_back(R,xq,w,R.transpose()*vq);

		pR+=sizeof(double)*R.rows()*R.cols()*sN;
		pw+=sizeof(double)*w.rows()*w.cols()*sN;
		pxq+=sizeof(double)*xq.rows()*xq.cols()*sN;
		pvq+=sizeof(double)*vq.rows()*vq.cols()*sN;
	}

	sN=10;

	std::vector<typename quadrotor::U> us;
	us.reserve(N/sN+1);

	for(int i=0;i<N;i+=sN)
	{
		Eigen::Matrix<double,4,1> u;
		memcpy(u.data(),pU,sizeof(double)*u.rows()*u.cols());
		us.push_back(u.cwiseProduct(u));
		pU+=sizeof(double)*u.rows()*u.cols()*sN;
	}
#else
	quadrotor::State xref;
	xref.g.block(0,0,3,3)=SO3::exp((Vec3()<<0,0,0).finished());
	xref.g.block(0,3,3,1)=(Vec3()<<0,0,0).finished();

	std::vector<quadrotor::State> xrefs(4000,xref);
	std::vector<quadrotor::U> us(4000, Vec4::Zero());
#endif

	std::srand((unsigned int) time(0));
	// Set up quadrotor parameters
	double m=0.6;
	double Ix=8*1e-3; // moment of inertia in X- Y- and Z-axis
	double Iy=7.5*1e-3;
	double Iz=13.5*1e-3;
	double d=0.2; // displacement of rotors
	double kt=0.6;
	double km=0.15;

	quadrotor::System sys(Ix,Iy,Iz,m,d,km,kt);
	
	// Set up cost function
	Mat12 Mf=5*Mat12::Identity()/10;
	Mf.block(0,0,3,3)*=1;
	Mf.block(3,3,3,3)*=6;
//	Mf.block(6,6,6,6)=Mf.block(0,0,6,6);
	Mat12 M=Mf/2;
	Mat4 R=Mat4::Identity()/50;
	DDP<quadrotor>::Params params(M,R,Mf);

	// Set up initial state
	quadrotor::State x0=xrefs[0];

	x0.g.block(0,3,3,1)-=(Vec3::Random()).normalized()*3;
	x0.g.block(0,0,3,3)*=SO3::exp(Vec3::Random().normalized()*1);
//	x0.g.block(0,0,3,3)*=SO3::exp((Vec3()<<3.14,0,0).finished());
	x0.v.head(3)-=Vec3::Random().normalized()*0;
	x0.v.tail(3)-=Vec3::Random().normalized()*0;
	// Set up simulator
	double dt=0.01;
	
	size_t num=200;
	Sim<quadrotor> sim(sys,dt);
	sim.init(x0,num);

	Vec4 umin=-Vec4::Ones()*0;
	Vec4 umax=Vec4::Ones()*6;
	
	DDP<quadrotor> ddp(sys,dt);

	double ts=0.02;
	double T=36;
	double Tp=1.5;
	size_t SN=size_t(ts/dt+0.5);
	size_t ND=size_t(Tp/dt+0.5)+1;

	int sn=2;
	int itr_max=20;
	for(int i=0;i<2000;i+=sn)
	{
		timespec T_start, T_end;
		clock_gettime(CLOCK_MONOTONIC,&T_start);
		ddp.init(sim.get_state(), us, xrefs, params, umin, umax, 150);
		ddp.iterate(itr_max,us);
		clock_gettime(CLOCK_MONOTONIC,&T_end);
		std::cout<<"time consumed is "<<(T_end.tv_sec-T_start.tv_sec)+(T_end.tv_nsec-T_start.tv_nsec)/1000000000.0<<"s"<<std::endl;
	
		for(int j=0;j<sn;j++)
		{
			sim.update(us.front());
			xrefs.erase(xrefs.begin());
			us.erase(us.begin());
		}
		Vec12 error=quadrotor::State::diff(sim.get_state(),xrefs[0]);
		std::cout<<dt*i<<": "<<error.head(3).norm()<<" "<<error.head(6).tail(3).norm()<<std::endl;

		if(error.norm()<0.1)
			break;
	}

	sim.save("/media/fantaosha/Documents/JHU/Summer 2015/results/quadrotor_ddp.mat");

}