Beispiel #1
0
float Marker::getRatio(float o) {
// deprivated
// derivate of old2new
// hardcode the derivate to improve performance
  switch (getInterpolationMode()) {
    // linear
    case 0: {
      int i=getAreaOld(o);
      if (i<0 || i+1>getLength()-1) return 0;
      float dold=(getOld(i+1)-getOld(i));
      if (dold<=0) return 0;
      return (getNew(i+1)-getNew(i))/dold;
    } break;
    default: {
      // approxmiate ratio
      float n=100; // TODO automate this
      float o1=o-1/n;
      if (o1<0) o1=0;
      if (o1>1) return 0;
      float o2=o+1/n;
      if (o2<0) return 0;
      if (o2>1) o2=1;
      if (o2-o1<=0) return 0;
      return ((old2new(o2)-old2new(o1))/(o2-o1));
    }
  }
}
struct utmpx *
getutxent(void)
{

	if (fp == NULL) {
		struct stat st;

		if ((fp = fopen(utfile, "re+")) == NULL)
			if ((fp = fopen(utfile, "we+")) == NULL) {
				if ((fp = fopen(utfile, "re")) == NULL)
					goto fail;
				else
					readonly = 1;
			}
					

		/* get file size in order to check if new file */
		if (fstat(fileno(fp), &st) == -1)
			goto failclose;

		if (st.st_size == 0) {
			/* new file, add signature record */
			(void)memset(&ut, 0, sizeof(ut));
			ut.ut_type = SIGNATURE;
			(void)memcpy(ut.ut_user, vers, sizeof(vers));
			if (fwrite(&ut, sizeof(ut), 1, fp) != 1)
				goto failclose;
		} else {
			/* old file, read signature record */
			if (fread(&ut, sizeof(ut), 1, fp) != 1)
				goto failclose;
			if (memcmp(ut.ut_user, vers, 5) != 0 ||
			    ut.ut_type != SIGNATURE)
				goto failclose;
		}
		version = ut.ut_user[6] - '0';
	}

	if (fread(&ut, sizeof(ut), 1, fp) != 1)
		goto fail;
	if (version == 1)
		old2new(&ut);

	return &ut;
failclose:
	(void)fclose(fp);
fail:
	(void)memset(&ut, 0, sizeof(ut));
	return NULL;
}
Beispiel #3
0
void CNPLCM_CR_Basic_Freq::permute_latent_classes_by_nu(){
	//reorder latent classes increasingly according to nuK. 
	std::vector<int> new2old(par->K), old2new(par->K);
	std::vector<_CNPLCM_CR_Basic_Freq_mypair> s_index(par->K);
	for (int k = 0; k < par->K; k++){
		s_index[k].first = 1.0 - par->nuK[k];
		s_index[k].second = k;
	}
	std::sort(s_index.begin(), s_index.end(), _CNPLCM_CR_Basic_Freq_comparator);
	std::vector<int> perm(K);
	for (int k = 0; k < par->K; k++){
		new2old[k] = s_index[k].second;
	} // new2old[a] == b <=> former b-th element is now a-th element.
	for (int k = 0; k < par->K; k++){
		old2new[ new2old[k] ] = k;
	}
	CParams_NPLCM_CR_Basic_Freq *tmp = new CParams_NPLCM_CR_Basic_Freq(*par);
	//for (int i = 0; i < par->n; i++){
	//	tmp->zI[i] = old2new[ par->zI[i] ];
	//}
	for (int m = 0; m < par->M; m++){
		for (int k = 0; k < par->K; k++){
			tmp->count_zIK[m][k] = par->count_zIK[m][ new2old[k] ];
		}
	}	
	for (int j = 0; j < par->J; j++){
		for (int k = 0; k < par->K; k++){
			tmp->lambdaJK[j][k] = par->lambdaJK[j][ new2old[k] ];
			tmp->aux_JK2[j][k][0] = par->aux_JK2[j][ new2old[k] ][0];
			tmp->aux_JK2[j][k][1] = par->aux_JK2[j][ new2old[k] ][1];
		}
	}
	for (int k = 0; k < par->K; k++){
		tmp->nuK[k] = par->nuK[new2old[k]];
		tmp->log_nuK[k] = par->log_nuK[new2old[k]];
		tmp->countK[k] = par->countK[new2old[k]];
		tmp->count0K[k] = par->count0K[new2old[k]];
	}
	//std::copy(tmp->zI, tmp->zI + par->n, par->zI);
	std::copy(tmp->count_zIK[0], tmp->count_zIK[0] + par->M * par->J, par->count_zIK[0]);
	std::copy(tmp->lambdaJK[0], tmp->lambdaJK[0] + par->J * par->K, par->lambdaJK[0]);
	std::copy(tmp->aux_JK2[0][0], tmp->aux_JK2[0][0] + par->J * par->K * 2, par->aux_JK2[0][0]);
	std::copy(tmp->nuK, tmp->nuK + par->K, par->nuK);
	std::copy(tmp->log_nuK, tmp->log_nuK + par->K, par->log_nuK);
	std::copy(tmp->countK, tmp->countK + par->K, par->countK);
	std::copy(tmp->count0K, tmp->count0K + par->K, par->count0K);
	delete tmp;
}
Beispiel #4
0
Tree Tree::reorderNodes (const vguard<TreeNodeIndex>& newOrder) const {
  Tree newTree;
  newTree.node.reserve (nodes());
  vguard<TreeNodeIndex> old2new (nodes(), -1);
  for (auto oldIdx : newOrder) {
    old2new[oldIdx] = newTree.node.size();
    newTree.node.push_back (node[oldIdx]);
  }
  for (auto& n : newTree.node) {
    if (n.parent >= 0)
      n.parent = old2new[n.parent];
    for (auto& c : n.child)
      c = old2new[c];
  }
  return newTree;
}
Beispiel #5
0
float Marker::new2old(float n) {
// inverse of old2new
// hardcode the derivate to improve performance
  switch (getInterpolationMode()) {
    // linear
    case 0: {
      int i=getAreaNew(n);
      if (i<0 || i+1>getLength()-1) return 0;
      return (n-getNew(i))/(getNew(i+1)-getNew(i))*(getOld(i+1)-getOld(i))+getOld(i);
    } break;
    default: {
      // TODO
      // approximate o;
      float o=n;
      for (int i=1; i<10; ++i) {
        o+=(n-old2new(o))/i;
      }
      return o;
    }
  }
}
Beispiel #6
0
void Tree::reorderSeqs (vguard<FastSeq>& seq) const {
  Assert (seq.size() == nodes(), "Number of sequences doesn't match number of nodes in tree");
  map<string,size_t> name2seq;
  for (size_t n = 0; n < seq.size(); ++n) {
    Assert (name2seq.find (seq[n].name) == name2seq.end(), "Duplicate sequence name: %s", seq[n].name.c_str());
    name2seq[seq[n].name] = n;
  }
  vguard<size_t> new2old (seq.size()), old2new (seq.size());
  for (TreeNodeIndex n = 0; n < nodes(); ++n) {
    Assert (name2seq.find (seqName(n)) != name2seq.end(), "Tree node %s is absent from sequence dataset", seqName(n).c_str());
    const size_t old_n = name2seq[seqName(n)];
    new2old[n] = old_n;
    old2new[old_n] = n;
  }

  for (size_t n = 0; n < new2old.size(); ++n) {
    const size_t o = new2old[n], m = old2new[n];
    swap (seq[n], seq[o]);
    swap (old2new[n], old2new[o]);
    swap (new2old[n], new2old[m]);
  }
}