Esempio n. 1
0
int main(){
	circular_array *c = createArray(7);
	for(int i = 0; i < 7; ++i){
		ca_set(c, i, i);
	}
	int isCorrect = 0;
	//Check
	for(int i = 0; i < 7; ++i){
		if(ca_get(c, i) != i){
			isCorrect = 1;
			printf("Failure in Circular array, piecewise, function access. Should be %d, is %f\n", i, ca_get(c, i));
		}
		if(c->arr[i] != i){
			isCorrect = 1;
			printf("Failure in Circular array, piecewise, raw access. Should be %d, is %f\n", i, ca_get(c, i));
		}
	}
	for(int i = 7; i < 14; ++i){
		double testVal = i - 7.0;
		if(ca_get(c, i) != testVal){
			isCorrect = 1;
			printf("Failure in Circular array, piecewise, function access, overflow. Should be %f, is %f\n", testVal, ca_get(c, i));
		}
	}
	return isCorrect;
}
Esempio n. 2
0
int readtag(cUINT utype, chid searchID)
{
	cUINT type;

	switch(utype)
	{
		case T_CIP_INT:
			type = DBR_INT;
			ca_get(type, searchID, &iDATA);
			break;
		case T_CIP_DINT:
			type = DBR_DOUBLE;
			ca_get(type, searchID, &dblDATA);
			break;
		case T_CIP_REAL:
			type = DBR_FLOAT;
			ca_get(type, searchID, &fltDATA);
			break;
		case T_CIP_BITS:
			type = T_CIP_DINT;
			ca_get(type, searchID, &fltDATA);
			break;
	}
	istatus = ca_pend_io(0.1);
	if(istatus != 1)	return 0;
	return 1;
}
Esempio n. 3
0
void print_integral(Integral integral)
{
     int plus = 0;
     unsigned i;
     
     if (ratfun_zero(integral.integrand)) {
          printf("0\n");
          return;
     }
     
     if (!ratfun_zero(integral.rational_part)){
          print_ratfun(integral.rational_part);
          plus = 1;
     }

     if (!coef_zero(integral.poly_part)) {
          if (plus) {
               printf(" + ");
          }
          print_coefficient(integral.poly_part);
          plus = 1;
     }

     /* print explicit sums */
     if (integral.QiS.size > 0) {
          for (i = 0; i < integral.QiS.size; ++i) {
               if (plus) {
                    printf(" + ");
               }
               if (!coef_one(ca_get(&integral.QiS, i))) {
                    print_coefficient(ca_get(&integral.QiS, i));
                    printf("*ln(");
               }
               else {
                    printf("ln(");
               }
               print_coefficient(ca_get(&integral.SiS, i));
               printf(")");
               plus = 1;
          }
     }

     /* print sums over roots */
     if (integral.Qi.size > 0) {
          for (i = 0; i < integral.Qi.size; ++i) {
               if (plus) {
                    printf(" + ");
               }
               printf("sum(%c | ", integral.newvar);
               print_coefficient(ca_get(&integral.Qi, i));
               printf(" = 0) %c*ln(", integral.newvar);
               print_coefficient(ca_get(&integral.Si, i));
               printf(")");
               plus = 1;
          }
     }

     printf("\n");     
}
Esempio n. 4
0
int main(int argc,char **argv)
{
  int indval,field;

  SEVCHK(ca_task_initialize(),"ca_task_initialize");
  SEVCHK(ca_search("enumCputDTYP",&putCchid[0]),"ca_search failure");
  SEVCHK(ca_search("enumCputPRIO",&putCchid[1]),"ca_search failure");
  SEVCHK(ca_search("enumCputVAL" ,&putCchid[2]),"ca_search failure");
  SEVCHK(ca_search("enumMDbputDTYP",&putMDbchid[0]),"ca_search failure");
  SEVCHK(ca_search("enumMDbputPRIO",&putMDbchid[1]),"ca_search failure");
  SEVCHK(ca_search("enumMDbputVAL" ,&putMDbchid[2]),"ca_search failure");
  SEVCHK(ca_search("enumMCaputDTYP",&putMCachid[0]),"ca_search failure");
  SEVCHK(ca_search("enumMCaputPRIO",&putMCachid[1]),"ca_search failure");
  SEVCHK(ca_search("enumMCaputVAL" ,&putMCachid[2]),"ca_search failure");
  SEVCHK(ca_search("enumCmbbi.DTYP" ,&getCchid[0]),"ca_search failure");
  SEVCHK(ca_search("enumCmbbi.PRIO" ,&getCchid[1]),"ca_search failure");
  SEVCHK(ca_search("enumCmbbi.VAL" ,&getCchid[2]),"ca_search failure");
  SEVCHK(ca_search("enumMDbmbbi.DTYP" ,&getMDbchid[0]),"ca_search failure");
  SEVCHK(ca_search("enumMDbmbbi.PRIO" ,&getMDbchid[1]),"ca_search failure");
  SEVCHK(ca_search("enumMDbmbbi.VAL" ,&getMDbchid[2]),"ca_search failure");
  SEVCHK(ca_search("enumMCambbi.DTYP" ,&getMCachid[0]),"ca_search failure");
  SEVCHK(ca_search("enumMCambbi.PRIO" ,&getMCachid[1]),"ca_search failure");
  SEVCHK(ca_search("enumMCambbi.VAL" ,&getMCachid[2]),"ca_search failure");
  SEVCHK(ca_pend_io(5.0),"ca_pend_io failure");

  for(indval=0; indval<2; indval++) {
      SEVCHK(ca_put(DBR_STRING,putCchid[0],dtypValue[indval]),"ca_put");
      SEVCHK(ca_put(DBR_STRING,putCchid[1],prioValue[indval]),"ca_put");
      SEVCHK(ca_put(DBR_STRING,putCchid[2],valValue[indval]),"ca_put");
      SEVCHK(ca_put(DBR_STRING,putMDbchid[0],dtypValue[indval]),"ca_put");
      SEVCHK(ca_put(DBR_STRING,putMDbchid[1],prioValue[indval]),"ca_put");
      SEVCHK(ca_put(DBR_STRING,putMDbchid[2],valValue[indval]),"ca_put");
      SEVCHK(ca_put(DBR_STRING,putMCachid[0],dtypValue[indval]),"ca_put");
      SEVCHK(ca_put(DBR_STRING,putMCachid[1],prioValue[indval]),"ca_put");
      SEVCHK(ca_put(DBR_STRING,putMCachid[2],valValue[indval]),"ca_put");
      /*Wait until evertthing updated*/
      ca_pend_event(2.0);
      for(field=0; field<3; field++) {
	SEVCHK(ca_get(DBR_STRING,getCchid[field],&getCvalue[field]),
		"ca_get");
	SEVCHK(ca_get(DBR_STRING,getMDbchid[field],&getMDbvalue[field]),
		"ca_get");
	SEVCHK(ca_get(DBR_STRING,getMCachid[field],&getMCavalue[field]),
		"ca_get");
      }
      SEVCHK(ca_pend_io(5.0),"ca_pend_io failure");
      printReport(indval);
  }
  return(0);
}
Esempio n. 5
0
void * steal(ws_deque *q) {

  long int t = (long int) g_atomic_pointer_get(&(q->top));
  long int b = q->bottom;
  circular_array * a = q->active_array;
  long int size = b - t;

  if( size <= 0 ) {
    return NULL;
  }

  void *value = ca_get(a, t);

  long int new_t = t + 1; // top stuff
  gboolean cas = g_atomic_pointer_compare_and_exchange((void * volatile*)&(q->top), 
                                                       (void*)t, 
                                                       (void*)new_t);

  if( !cas ) {
    return NULL;
  }

  return value;

}
Esempio n. 6
0
static int  CACommand(string strcmd)
{
#if 0
	//In event callback function, It' dosen't work ca_get() function. I don't understand the reason.
	struct dbr_time_long shotdata;
	chid shot_id;
	ca_create_channel("CCS_SHOT_NUMBER",NULL, NULL,20,&shot_id);
	ca_pend_io(1.0);
	int state = ca_state(shot_id);
	printf("State:%d\n", state);
	ca_get(DBR_TIME_LONG, shot_id, (void *)&shotdata);
	int status = ca_pend_io(1.0);
	if(status != ECA_NORMAL)
	{
		fprintf(stdout, "SHOT number: %s denied access\n",ca_name(shot_id));
		return;
	};
	fprintf(stdout, "%s:%d\n",ca_name(shot_id),shotdata.value);
#else
	FILE *fp= popen (strcmd.c_str(), "r");
	char buf[20];
	while (fgets (buf, sizeof(buf), fp) ) {};
	pclose(fp);
	return ((strcmd.compare("ShotNum")== 0)?atoi(buf):0);
#endif
}
Esempio n. 7
0
static void ca_read_process(MSFilter *f){
	CAData *d = (CAData *) f->data;
	mblk_t *m;
	while((m=ca_get(d))!=NULL){
		ms_queue_put(f->outputs[0],m);
	}
}
Esempio n. 8
0
circular_array * ca_grow(circular_array *a, long int b, long int t) {

  circular_array *na = ca_build(a->log_size + 1);

  for (long int i = t; i < b; i++) {
    ca_put(na, i, ca_get(a, i));
  }

  return na;

}
Esempio n. 9
0
void * pop_bottom(ws_deque *q) {

  long int b = q->bottom;
  circular_array *a = q->active_array;

  b = b - 1;
  q->bottom = b;

  long int t = (long int) g_atomic_pointer_get(&(q->top));
  long int size = b - t;
  long int zero = 0;

  if(size < zero) {
    q->bottom = t;
    return NULL;
  }

  void *value = ca_get(a, b);

  if(size > 0) {
    return value;
  }

  // this is the case for exactly one element, this is now the top so act accordingly

  long int new_t = t+1;
  gboolean cas = g_atomic_pointer_compare_and_exchange((void * volatile*)&(q->top), 
                                                       (void*)t, 
                                                       (void*)new_t);

  if( !cas ) {
    value = NULL;
  }
  
  q->bottom = t+1;

  return value;

}
Esempio n. 10
0
void print_integral_LaTeX(Integral integral)
{
     int plus = 0;
     unsigned i;
     
     printf("\\int \\! ");
     print_ratfun_LaTeX(integral.integrand);
     printf(" \\, d%c = ", integral.var);

     if (ratfun_zero(integral.integrand)) {
          printf("0\n");
          return;
     }
     
     if (!ratfun_zero(integral.rational_part)){
          print_ratfun_LaTeX(integral.rational_part);
          plus = 1;
     }

     if (!coef_zero(integral.poly_part)) {
          if (plus) {
               printf(" + ");
          }
          print_coefficient_LaTeX(integral.poly_part);
          plus = 1;
     }

     /* print explicit sums */
     if (integral.QiS.size > 0) {
          for (i = 0; i < integral.QiS.size; ++i) {
               if (plus) {
                    if (!coef_neg(ca_get(&integral.QiS, i))) {
                         printf(" + ");
                    }
                    else {
                         printf(" - ");
                    }
               }
               if (!coef_one2(ca_get(&integral.QiS, i))) {
                    print_coefficient_LaTeX2(ca_get(&integral.QiS, i), 1);
                    printf("\\ln(");
               }
               else if (coef_neg(ca_get(&integral.QiS, i))
                        && coef_one2(ca_get(&integral.QiS, i))) {
                    printf("-\\ln(");
               }
               else {
                    printf("\\ln(");
               }
               print_coefficient_LaTeX(ca_get(&integral.SiS, i));
               printf(")");
               plus = 1;
          }
     }

     /* print sums over roots */
     if (integral.Qi.size > 0) {
          for (i = 0; i < integral.Qi.size; ++i) {
               if (plus) {
                    printf(" + ");
               }
               printf("\\sum_{%c | ", integral.newvar);
               print_coefficient_LaTeX(ca_get(&integral.Qi, i));
               printf(" = 0} %c \\ln(", integral.newvar);
               print_coefficient_LaTeX(ca_get(&integral.Si, i));
               printf(")");
               plus = 1;
          }
     }

     printf("\n");
}
Esempio n. 11
0
void IntegrateRationalFunction(node_type *root, char var, char newvar,
                               int trace)
{
     RatFun A, h, content;
     Coefficient R = {special}, rat_part = {rational}, solution = {special};
     Coefficient *Qit = NULL, *Sit = NULL;
     Coefficient Qit2 = {special}, Sit2 = {special};
     Integral integral;
     unsigned i;

     init_ratfun(&A);
     init_ratfun(&h);
     init_ratfun(&content);

     init_bigrat(&rat_part.u.rat);

     init_integral(&integral);

     if (root->type != ratfun_type) {
          printf("Error! IntegrateRationalFunction"
                 "requires a rational function.\n");
          return;
     }

     copy_ratfun(&integral.integrand, root->u.ratfun);
     integral.var = var;
     integral.newvar = newvar;

     if (ratfun_zero(integral.integrand)) {
          goto print;
     }

     /* make numerator and denominator primitive */
     coef_content(&content.num, root->u.ratfun.num, var);
     exact_div_coefficients(&root->u.ratfun.num,
                            root->u.ratfun.num,
                            content.num);
     coef_content(&content.den, root->u.ratfun.den, var);
     exact_div_coefficients(&root->u.ratfun.den,
                            root->u.ratfun.den,
                            content.den);

     if (trace) {
          printf("Computing rational part of integral using "
                 "Hermite reduction...\n");
          WAIT;
     }

     HermiteReduce(&integral.rational_part,
                   &h,
                   root->u.ratfun,
                   var,
                   trace);

     /* put contents back on */
     /* PRINTR(content); */
     mul_ratfuns(&integral.rational_part, integral.rational_part, content);
     mul_ratfuns(&h, h, content);
     /* PRINTR(h); */

     if (trace) {
          printf("Found rational part:\t\t");
          print_ratfun(integral.rational_part);
          printf("\n");

          printf("\nHermite reduction leaves:\t");
          print_ratfun(h);
          printf("\n");
          WAIT;

          printf("Remove polynomial part...\n");
          WAIT;
     }

     polydiv_coefficients(&integral.poly_part, &R, h.num, h.den);

     if (trace) {
          printf("Polynomial part:\t\t");
          print_coefficient(integral.poly_part);
          printf("\n");
     }

     coef_integrate(&integral.poly_part, integral.poly_part, var);

     if (trace) {
          printf("Integrate it:\t\t\t");
          print_coefficient(integral.poly_part);
          printf("\n");
          WAIT;

          printf("Left over:\t\t\t");
          print_coefficient(R);
          printf("/");
          print_coefficient(h.den);
          printf("\n");
     }

     if (!coef_zero(R) && coef_deg(h.den, var) > coef_deg(R, var)) {

          if (trace) {
               printf("\nComputing logarithmic part using "
                      "Lazard-Rioboo-Trager algorithm...\n");
               WAIT;
          }

          IntRationalLogPart(&integral.Qi, &integral.Si, R, h.den, var, newvar,
                             trace);
          
          /* make Qi and Si primitive */
          for (i = 0; i < integral.Qi.size; ++i) {
               Qit = ca_get2(&integral.Qi, i);
               Sit = ca_get2(&integral.Si, i);
               
               rat_part.u.rat = coef_rat_part(*Qit);
               mul_coefficients(Qit, *Qit, rat_part);
               free_bigrat(&rat_part.u.rat);
               
               /* rat_part.u.rat = coef_rat_part(*Sit); */
               /* mul_coefficients(Sit, *Sit, rat_part); */
               /* free_bigrat(&rat_part.u.rat); */

               coef_pp(Qit, *Qit, newvar);
               /* coef_pp(Sit, *Sit, var); */
          }

          if (trace) {
               printf("Found logarithmic part.\n");
               printf("%d sum(s) over roots:\t\t", integral.Qi.size);
               if (integral.Qi.size > 0) {
                    for (i = 0; i < integral.Qi.size; ++i) {
                         printf("sum(%c | ", integral.newvar);
                         print_coefficient(ca_get(&integral.Qi, i));
                         printf(" = 0) %c*ln(", integral.newvar);
                         print_coefficient(ca_get(&integral.Si, i));
                         printf(")");
                         if (i < integral.Qi.size-1) {
                              printf(" + ");
                         }
                    }
               }
               printf("\n");
               WAIT;

               printf("Solve the linear univariate Qis to get explicit sums...\n");
          }

          /* solve linear univariate Qis */
          for (i = 0; i < integral.Qi.size; ++i) {
               if (coef_deg(ca_get(&integral.Qi, i), newvar) != 1
                   || !poly_univar(ca_get(&integral.Qi, i).u.poly)) {
                    continue;
               }
               solve_linear_poly(&solution, ca_get(&integral.Qi, i).u.poly);
               subst_var_coef(ca_get2(&integral.Si, i), solution, newvar);

               /* move to solved arrays */
               ca_push_back(&integral.QiS, solution);
               ca_push_back(&integral.SiS, ca_get(&integral.Si, i));

               /* remove from normal arrays */
               Qit2 = ca_remove(&integral.Qi, i);
               Sit2 = ca_remove(&integral.Si, i);
               free_coefficient(&Qit2);
               free_coefficient(&Sit2);
               --i;
          }

          /* make SiS primitive */
          for (i = 0; i < integral.SiS.size; ++i) {
               Sit = ca_get2(&integral.SiS, i);
               
               rat_part.u.rat = coef_rat_part(*Sit);
               mul_coefficients(Sit, *Sit, rat_part);
               free_bigrat(&rat_part.u.rat);

               coef_pp(Sit, *Sit, var);
          }

          if (trace) {
               printf("Found %d explicit sum(s):\t", integral.QiS.size);
               if (integral.QiS.size > 0) {
                    for (i = 0; i < integral.QiS.size; ++i) {
                         if (!coef_one(ca_get(&integral.QiS, i))) {
                              print_coefficient(ca_get(&integral.QiS, i));
                              printf("*ln(");
                         }
                         else {
                              printf("ln(");
                         }
                         print_coefficient(ca_get(&integral.SiS, i));
                         printf(")");
                         if (i < integral.QiS.size-1) {
                              printf(" + ");
                         }
                    }
               }
               printf("\n");
               WAIT;
          }
     }
     else if (coef_deg(h.den, var) == 0) {
          /* this is actually just a poly over a constant,
           * so integrate it trivially */
          coef_integrate(&R, R, var);
          /* move this to the numerator of h */
          free_coefficient(&h.num);
          h.num = R;
          R.type = special;
          /* add h to the rational part of integral */
          add_ratfuns(&integral.rational_part, integral.rational_part, h);
     }
     else {
          /* this shouldn't happen */
          printf("Error!  Invalid ratfun following Hermite reduction!\n");
          PRINTR(h);
          printf("\n");
          PRINTC(R);
          printf("\n");
     }

print:
     if (trace) {
          printf("\nFinal answer:\n");
     }
     print_integral(integral);
     printf("\nLaTeX format:\n");
     print_integral_LaTeX(integral);

     free_ratfun(&A);
     free_ratfun(&h);
     free_ratfun(&content);
     free_coefficient(&R);
     free_integral(&integral);
}
Esempio n. 12
0
void SinglePlotThread::run()
{
#if 0
	// event gathering
	//printchannel();	//for Debug
	mutex.lock();
	mynode.plot	= m_plot;
	chid unit_chid;
	dbr_string_t units;
	QString unitch = m_pvname + ".EGU";
	ca_create_channel(unitch.toStdString().c_str(), 0, 0, 0, &unit_chid);
	ca_pend_io(0.1);
	ca_get(DBR_STRING, unit_chid, (void *)&units);
	ca_pend_io(0.1);
	m_plot->SetUnit(units);

	ca_create_channel(m_pvname.toStdString().c_str(), connectionCallback, &mynode, 0, (oldChannelNotify**)&mynode.mychid);
	ca_replace_access_rights_event(mynode.mychid, accessRightsCallback);
	ca_create_subscription (DBR_TIME_DOUBLE, 0, mynode.mychid, DBE_VALUE|DBE_ALARM, eventCallback, &mynode, &mynode.myevid);
	//ca_add_event(DBR_GR_DOUBLE, mynode.mychid, eventCallback, &mynode, &mynode.myevid);
	mutex.unlock();
	ca_pend_event(0.0);
#else
	//periodic gathering
	mutex.lock();
	chid unit_chid, val_chid;
	dbr_string_t units;

	QString unitch = m_pvname + ".EGU";
	ca_create_channel(unitch.toStdString().c_str(), 0, 0, 0, &unit_chid); ca_pend_io(0.2);
	ca_get(DBR_STRING, unit_chid, (void *)&units); ca_pend_io(0.2);
	m_plot->SetUnit(units);

	struct dbr_time_double data;
	ca_create_channel(m_pvname.toStdString().c_str(), 0, 0, 0, &val_chid);
	ca_pend_io(0.2);

	epicsTime  stamp;

	struct local_tm_nano_sec tm;
	int totsec = 0;
	//for periodic single plot local time
	int year, month, day, hour, min, sec;
	int factor = 1;
	switch(mperiodic)
	{
		case PointOne:
			factor *= 0.1;
			break;
		case PointFive:
			factor *= 0.5;
			break;
		case FiveSec:
			factor *= 5;
			break;
		case TenSec:
			factor *= 10;
			break;
		case OneSec:
		default:
			break;
	};
	while(getStop()==false)
	{
		ca_get(DBR_TIME_DOUBLE, val_chid, (void *)&data);
		ca_pend_io(0.2);
		//qDebug("%s : %f\n",ca_name(val_chid), data.value);
		Epoch2Datetime(year, month, day, hour, min, sec);
#if 0
		stamp = data.stamp;
		tm = (local_tm_nano_sec) stamp;
		totsec = tm.ansi_tm.tm_hour*3600+tm.ansi_tm.tm_min*60+tm.ansi_tm.tm_sec;
		m_plot->GetValue(data.value, totsec,tm.ansi_tm.tm_year,tm.ansi_tm.tm_mon, tm.ansi_tm.tm_mday );
#else
		totsec = hour*3600+min*60+sec;
		m_plot->GetValue(data.value, totsec, year, month, day);
#endif
		usleep(1000000*factor);
	};
	//ca_clear_channel(unit_chid);
	//ca_clear_channel(val_chid);
	ca_context_destroy();
	mutex.unlock();
	exit();
	qDebug("SinglePlot Exit");
#endif
}