Example #1
0
void roots ( int n, dcmplx p[n], double eps, int maxit, dcmplx z[n-1] )
{
   dcmplx pp[n],dz,dp;
   double mpz,mdz,maxpz,maxdz;
   int i,k;

   for(i=0; i<n-1; i++)
   {
      z[i] = random_dcmplx1();
      pp[i] = div_dcmplx(p[i],p[n-1]);
   }
   pp[n-1] = create1(1.0);

   for(k=0; k<maxit; k++)
   {
      maxpz = 0.0;
      maxdz = 0.0;
      for(i=0; i<n-1; i++)
      {
         dz = horner(n,pp,z[i]);
         /* printf("residual at z[%d] : ", i);
            writeln_dcmplx(dz); */
         mpz = modulus(dz);
         if (mpz > maxpz) maxpz = mpz;
         dp = difference_product(n-1,i,z);
         dz = div_dcmplx(dz,dp);
         mdz = modulus(dz);
         if (mdz > maxdz) maxdz = mdz;
         /* printf("  update to z[%d] : ", i);
            writeln_dcmplx(dz); */
         z[i] = sub_dcmplx(z[i],dz);
      }
      if ((maxpz <= eps) || (maxdz <= eps)) break;
   }
}
Example #2
0
int degree ( dcmplx *a, int d )
{
  int i;
  for ( i=d; i>0; i-- )
      if ( !equal_dcmplx( a[i], create1(0), tol ))
         break;
  return i;
}
Example #3
0
int iszero ( int n,  dcmplx a[] )
{
  int i;
  for ( i=0; i<=n; i++ )
      if (! equal_dcmplx(a[i], create1(0), tol) )
      return 0;
  return 1;
}
Example #4
0
dcmplx* div_poly2 ( int n, dcmplx a[], int m, dcmplx b[],
			    int* dq )
{
  int i, j, k, dtemp, d;
  dcmplx *temp_a, *temp_b;
  dcmplx ** result=(dcmplx**) calloc(2, sizeof(dcmplx *));
  if ( iszero (m, b) ) 
  {
	  printf("The divisor can not be 0!\n"); 
	  return;
  }
  if ( m>n )
  {
	  *dq=0;
	  result[0] = (dcmplx*) calloc(*dq+1, sizeof(dcmplx));
	  result[0][0]=create1(0.0);

	  /*  *dr=n;
	      result[1] = (dcmplx*) calloc(*dr+1, sizeof(dcmplx));
	      for ( i=0; i<=*dr; i++)
	        result[1][i]=a[i]; */
  }
  else
  {
	  dtemp=n;
	  temp_a = (dcmplx*) calloc(dtemp+1, sizeof(dcmplx));
	  for ( i=0; i<=n; i++ )
		  temp_a[i]=a[i];
	  *dq=n-m;
	  result[0] = (dcmplx*) calloc(*dq+1, sizeof(dcmplx));
	  while ( dtemp>=m && (!iszero( dtemp,temp_a )))
	  {  
              d=dtemp-m;
	      result[0][d]=div_dcmplx(temp_a[dtemp], b[m]);
	
	      temp_b = (dcmplx*) calloc(dtemp+1, sizeof(dcmplx));
              for ( j=0; j<=m; j++ )
			  temp_b[d+j]=mul_dcmplx(result[0][d], b[j]);
	      for ( k=0; k<=dtemp; k++ )
			  temp_a[k]=sub_dcmplx(temp_a[k],temp_b[k]);
 	 
	      dtemp= degree ( temp_a, dtemp );           
               
	      free(temp_b);
          }

	  /* *dr=dtemp;
	     result[1] = (dcmplx*) calloc(dtemp+1, sizeof(dcmplx));
	     for ( i=0; i<=dtemp; i++ )
         	     result[1][i]=temp_a[i]; */
	  free(temp_a);
	
  } 

        return result[0];
}
Example #5
0
dcmplx difference_product ( int n, int i, dcmplx z[n] )
{
   dcmplx res = create1(1.0);
   int j;

   for(j=0; j<n; j++)
      if (j != i)
         res = mul_dcmplx(res,sub_dcmplx(z[i],z[j]));

   return res;
}
Example #6
0
void derivative ( int n, dcmplx p[n], dcmplx dp[n-1] )
{
   int i;
   double df_power;
   dcmplx dc_power;

   for(i=1; i<n; i++)
   {
      df_power = (double) i;
      dc_power = create1(df_power);
      dp[i-1] = mul_dcmplx(p[i],dc_power);
   }
}
int main( )                   /*主函数*/
{
    init( );   
	
    create1( );   

	create2( );

	combine( );

	getchar( );

}
int main()
{
    int no1,no2;
    node *fn,*fs,*sc;
    printf("enter no. of elements in 1st list.. \n");

    scanf("%d",&no1);
    fs=create1(no1);
    printf("enter no. of elements in 2nd list... \n");
    scanf("%d",&no2);
    sc=create2(no2);
    fn=join(fs,sc);
    delete_duplicate(fn);
    return 0;
}
Example #9
0
void test_cycle_one() {
    create1();
    triggerConversions();
    TEST_ASSERT_EQUAL(1, analog1started);
    TEST_ASSERT_EQUAL(0, analog2started);
    TEST_ASSERT_EQUAL(analog1value, analogInputValue(analog1));
    TEST_ASSERT_EQUAL(0, analogInputValue(analog2));

    // Another round
    analog1value = 1000;
    triggerConversions();
    TEST_ASSERT_EQUAL(2, analog1started);
    TEST_ASSERT_EQUAL(0, analog2started);
    TEST_ASSERT_EQUAL(analog1value, analogInputValue(analog1));
    TEST_ASSERT_EQUAL(0, analogInputValue(analog2));
}
Example #10
0
int main() {
	srand(time(0));
	//int *p_num = create(7);
	int *p_num = NULL;
	create1(7, &p_num);
	int num = 0;
	if (p_num) {
		for (num = 0;num <= 6;num++) {
			printf("%d ", *(p_num + num));
		}
		printf("\n");
		free(p_num);
		p_num = NULL;
	}
	return 0;
}
Example #11
0
void random_test ( int n )
{
   dcmplx p[n+1], x[n+1], f[n+1];
   int i, m[i+1];

   srand(time(NULL));
   
 /* printf(" The original polinomial is: \n");*/

   for(i=0; i<n; i++)
   {      
      p[i] = random_dcmplx1();
    /*  writeln_dcmplx(p[i]); */
   }
   p[n]=create1(1.0);
   /*writeln_dcmplx(p[n]); */
   
   for(i=0; i<=n; i++)
   {
	  x[i] = random_dcmplx1();
          m[i] = 1;
	  f[i] = horner(n+1, p, x[i]);
   }

   divided_difference ( n+1,  x, f, m );

 /*  printf(" The polynomial after interpolation is: \n");
   for(i=0; i<=n; i++)
   {
	   writeln_dcmplx(f[i]);
   }   
*/
   for(i=0; i<=n; i++)
   {
	   if( !equal(p[i], f[i]) )
       {   
		   printf("i=%d\n", i);
		   printf("The original polynomial item is:");
		   writeln_dcmplx(p[i]);
		   printf("The polynomial after interpolation is:");
		   writeln_dcmplx(f[i]);
		   printf(" BUG!!\n ");
		   exit(0);
	   }
   }
   printf(" OK!\n ");
}
void
run_assign_and_copy_constructor_test(const char *test_name) {
    REMARK("Testing assignment and copy construction for %s\n", test_name);

    // test initializer with exemplar
    T initializer0;
    test_helper<T>::init(initializer0);
    T initializer7;
    test_helper<T>::set(initializer7,7);
    tbb::enumerable_thread_specific<T> create1(initializer7);
    (void) create1.local();  // create an initialized value
    ASSERT(7 == test_helper<T>::get(create1.local()), NULL);

    // test copy construction with exemplar initializer
    create1.clear();
    tbb::enumerable_thread_specific<T> copy1(create1);
    (void) copy1.local();
    ASSERT(7 == test_helper<T>::get(copy1.local()), NULL);

    // test copy assignment with exemplar initializer
    create1.clear();
    tbb::enumerable_thread_specific<T> assign1(initializer0);
    assign1 = create1;
    (void) assign1.local();
    ASSERT(7 == test_helper<T>::get(assign1.local()), NULL);

    // test creation with finit function
    FunctorFinit<T,7> my_finit7(SecretTag);
    tbb::enumerable_thread_specific<T> create2(my_finit7);
    (void) create2.local();
    ASSERT(7 == test_helper<T>::get(create2.local()), NULL);

    // test copy construction with function initializer
    create2.clear();
    tbb::enumerable_thread_specific<T> copy2(create2);
    (void) copy2.local();
    ASSERT(7 == test_helper<T>::get(copy2.local()), NULL);

    // test copy assignment with function initializer
    create2.clear();
    FunctorFinit<T,0> my_finit(SecretTag);
    tbb::enumerable_thread_specific<T> assign2(my_finit);
    assign2 = create2;
    (void) assign2.local();
    ASSERT(7 == test_helper<T>::get(assign2.local()), NULL);
}
Example #13
0
void Call_Hermite ( int n, int m )
{
    POLY a[n][m], a1[n][m];
    POLY p[n][n], t[n][m];
    dcmplx deter, dcmplx_p[n][n], x;
    int k;

    printf("1 random matrix.\n");
    printf("2 input your own matrix.\n");
    printf("Please choose the test matrix:");
    scanf("%d", &k ); printf("%d\n\n", k );

    if(k==1) random_matrix ( n, m, a);
    if(k==2) read_matrix( n, m, a );
    printf("the original matrix generated :\n");
    print(n,m,a); 
    
    zero_matrix ( n, m, a1);
    I_matrix (  n, p);
    copy ( n, m, a, t);

    /* Eliminate_Col(n,m,a,p,0,0); */
    /* Eliminate_Row(n,m,a,q,0,0); */
    Hermite(n, m, a, p);

    printf("The hermite form of matrix a is :\n");
    print(n,m,a);

    /* now begin to test the result */
    Multiply ( n,  n,  m, p, t, a1 ); 
 
    
    printf("The calculated hermite form with p*a is:\n");
    print(n, m, a1);
    printf(" p is:\n");
    print(n, n, p);

    x=create1(1.1);
    evaluate_matrix(n, n, p, dcmplx_p, x);
    deter=determinant(n, dcmplx_p);
    printf("The determinant of the p is: ");
    writeln_dcmplx(deter);
    
}
Example #14
0
dcmplx* mul_poly ( int n, dcmplx a[], int m, dcmplx b[], int *k )
{
  int i, j;
  dcmplx *c; 
  if (iszero( n,a ) || iszero ( m, b ) )
  {
    *k=0;
    c = (dcmplx*) calloc(1, sizeof(dcmplx));
    c[0]=create1(0.0);
    return c;
  }
  *k=n+m;
  c = (dcmplx*) calloc(*k+1, sizeof(dcmplx));

  for ( i=0; i<=n; i++)
	  for ( j=0; j<=m; j++)
	    {
	      c[i+j]=add_dcmplx(c[i+j],mul_dcmplx(a[i],b[j]));            
            }
  *k=degree( c, *k ); 
  return c;
}
Example #15
0
void test_cycle_after_destroy() {
    create1();
    triggerConversions();
    TEST_ASSERT_EQUAL(1, analog1started);
    TEST_ASSERT_EQUAL(0, analog2started);

    create2();
    triggerConversions();
    TEST_ASSERT_EQUAL(2, analog1started);
    TEST_ASSERT_EQUAL(1, analog2started);

    analog1 = destroyAnalogInput(analog1);
    triggerConversions();
    TEST_ASSERT_EQUAL(2, analog1started);
    TEST_ASSERT_EQUAL(2, analog2started);

    analog2 = destroyAnalogInput(analog2);
    triggerConversions();
    triggerConversions();
    triggerConversions();
    TEST_ASSERT_EQUAL(2, analog1started);
    TEST_ASSERT_EQUAL(2, analog2started);
}
Example #16
0
int main(void)
{
   dcmplx one,imu,z1,z2;
   int ans;

   one = create1(1.0);

   printf("One as complex number : ");
   writeln_dcmplx(one);

   imu = create2(0.0,1.0);

   printf("The imaginary unit : ");
   writeln_dcmplx(imu);

   srand(time(NULL));

   for(;;)
   {
      printf("\nChoose one of the following :\n");
      printf("  0. exit this program; or\n");
      printf("  1. perform tests on user-given numbers; or\n");
      printf("  2. test operations on random numbers.\n");
      printf("Type 0, 1, or 2 to choose : ");
      scanf("%d", &ans);
      switch(ans)
      {
         case 0: return 0;
         case 1: interactive_test(); break;
         case 2: random_test(); break;
         default: printf("Invalid choice.  Please try again...\n");
      }
   }

   return 0;
}
Example #17
0
void manual_test ( int n, int m, int l )
{
  double eps = 1.0e-12;
  double tol = 1.0e-8;
  double mul_tol = 1.0e-3;
  dcmplx aa[n+1], bb[m+1], c[l+1], a[n+l+1], *dcmplx_a, b[m+l+1], *dcmplx_b, ra[n+l], rb[m+l], rc[l];
  int i, j, c_num, bug, dk, dl, dgcd, k1, k2, dc_gcd;
  dcmplx **gcd_coeff;
  dcmplx *t1, *t2, *c_gcd;  
  int dbd, dad, mult[l];

  printf("please input the polynomial aa\n"); 
  for(i=0; i<=n; i++)
     read_dcmplx( &(aa[i]));
  printf("please input the polynomial bb\n");
  for(i=0; i<=m; i++)
     read_dcmplx(&(bb[i]));
  printf("please input the polynomial c, (the leading coefficient must be one!)\n");
  for(i=0; i<=l; i++)
     read_dcmplx(&(c[i]));

  for(i=0; i<=n+l; i++)
      a[i]=create1(0.0);
  for(i=0; i<=n; i++)
    for(j=0; j<=l; j++)
       a[i+j]=add_dcmplx(a[i+j], mul_dcmplx(aa[i], c[j]));     
  
  for(i=0; i<=m+l; i++)  
    b[i]=create1(0.0);
  for(i=0; i<=m; i++)
    for(j=0; j<=l; j++)
       b[i+j]=add_dcmplx(b[i+j], mul_dcmplx(bb[i], c[j]));

  gcd( n+l+1, a, m+l+1, b, &c_num, ra, rb );

  printf("the roots number of the given common diviser is: %d \n", l);
  multiple_roots(l+1, c, eps, 10*l, rc, mul_tol, mult);
  printf("the root of the gcd is:\n");
  for(i=0; i<l; i++)
     writeln_dcmplx(rc[i]);      
  
  printf("the roots number of the calculated common diviser is: %d \n", c_num); 
  
  if(l!= c_num)
  {
    printf("Bug!!\n");
    exit(1);
  }

  for(i=0; i<l; i++)
  {
    bug=1;
    for(j=0; j<l; j++)
    {
      if(equal_dcmplx(rc[i], ra[j], tol))
        bug=0;
    }
    if( bug==1 )
    {
      printf(" Bug!!\n");
      exit(1);
    }
  }
 printf("the gcd is correct !\n");

 /* now begin to test extended gcd method */
 gcd_coeff=ExtPolyGcd( n+l+1, a, m+l+1, b, &dgcd, &dk, &dl, &dbd, &dad);

 Print_Poly(dl, gcd_coeff[1]);
 printf("a is:\n"); 
 Print_Poly(n+l, a);
 dcmplx_a=(dcmplx*) calloc(n+l+1, sizeof(dcmplx));
 /* for(i=0; i<=n+l; i++)
      dcmplx_a[i]=a[i]; */
  t1=mul_poly( dk, gcd_coeff[0], n+l, a, &k1 );
  t2=mul_poly( dl, gcd_coeff[1], m+l, b, &k2 );


 /*
 printf("t1 is:\n");  
 for(i=0; i<=k1; i++)
   writeln_dcmplx(t1[i]);

 printf("t2 is:\n");
 printf("dl=%d\n", dl);
printf("m+l=%d\n", m+l);
 for(i=0; i<=k2; i++)
    writeln_dcmplx(t2[i]);
 */

 printf("\n"); 
 printf("k is:\n");
 for(i=0; i<=dk; i++)
    writeln_dcmplx(gcd_coeff[0][i]);

 printf("l is:\n");
 for(i=0; i<=dl; i++)
    writeln_dcmplx(gcd_coeff[1][i]);
 printf("\n");

 c_gcd=add_poly( k1, t1, k2, t2, &dc_gcd);

 printf("the given polynomial a is:\n"); 
 for(i=0; i<=n+l; i++)
    writeln_dcmplx(a[i]);
 printf("a's roots are:\n");
 for(i=0; i<n+l; i++)
   writeln_dcmplx(ra[i]);
 printf("\n");

 printf("the given polynomial b is:\n");
 for(i=0; i<=m+l; i++)
    writeln_dcmplx(b[i]);
 printf("b's roots are:\n");
 for(i=0; i<m+l; i++)
   writeln_dcmplx(rb[i]);
 printf("\n");

 printf("the given gcd polynomial is:\n");
 for(i=0; i<=l; i++)
    writeln_dcmplx(c[i]);
 printf("\n");

  if(l!= dc_gcd)
  {
    printf("Bug!! the given gcd is different with the gcd method result.(0 is special case).\n");
    
  }
 
 printf("the calculated gcd polynomial is:\n");
 for(i=0; i<=dc_gcd; i++)
    writeln_dcmplx(c_gcd[i]);
 printf("\n");

 printf("the gcd from common roots method is:\n");
 for(i=0; i<=dgcd; i++)
   writeln_dcmplx(gcd_coeff[2][i]);
 printf("\n");

 free(t1); free(t2);
 free(c_gcd);

 free(gcd_coeff[0]);
 free(gcd_coeff[1]);
 free(gcd_coeff[2]);
 free(gcd_coeff[3]);
 free(gcd_coeff[4]);
 free(gcd_coeff);
}
Example #18
0
void random_test ( int n, int m, int l )
{
  double eps = 1.0e-12;
  double tol = 1.0e-8;
  double mul_tol = 1.0e-3;
  dcmplx aa[n+1], bb[m+1], c[l+1], a[n+l+1], b[m+l+1], ra[n+l], rb[m+l], rc[l];
  int i, j, c_num, bug, dk, dl, dgcd, k1, k2, dc_gcd;
  dcmplx **gcd_coeff;
  dcmplx *t1, *t2, *c_gcd;  
  dcmplx near;
  double error=1.0;
  int dbd, dad, mult[l];

  srand(time(NULL));

  for(i=0; i<=n; i++)
    aa[i] = random_dcmplx1();
  for(i=0; i<=m; i++)
    bb[i] = random_dcmplx1();

  c[l]=create1(1.0);
  for(i=0; i<l; i++)
    c[i] = random_dcmplx1();

  for(i=0; i<=n+l; i++)
      a[i]=create1(0.0);
  for(i=0; i<=n; i++)
    for(j=0; j<=l; j++)
       a[i+j]=add_dcmplx(a[i+j], mul_dcmplx(aa[i], c[j]));     
  
  for(i=0; i<=m+l; i++)  
    b[i]=create1(0.0);
  for(i=0; i<=m; i++)
    for(j=0; j<=l; j++)
       b[i+j]=add_dcmplx(b[i+j], mul_dcmplx(bb[i], c[j]));

  gcd( n+l+1, a, m+l+1, b, &c_num, ra, rb );

  printf("the roots number of the given common diviser is: %d \n", l);
  
  multiple_roots(l+1, c, eps, 10*l, rc, mul_tol, mult);
  /*
  printf(" the root of the gcd is:\n");
  for(i=0; i<l; i++)
     writeln_dcmplx(rc[i]);
  printf("\n");      
  */
  printf("the roots number of the calculated common diviser is: %d \n", c_num); 
  
  if(l!= c_num)
  {
    printf("Bug!!\n");
        printf("a is:\n");  
    for(i=0; i<=n+l; i++)
      writeln_dcmplx(a[i]);    
    
    printf("b is:\n");  
    for(i=0; i<=m+l; i++)
      writeln_dcmplx(b[i]);

    printf("a's roots are:\n");
    for(i=0; i<n+l; i++)
      writeln_dcmplx(ra[i]);

    printf("b's roots are:\n");
    for(i=0; i<m+l; i++)
      writeln_dcmplx(rb[i]);

    printf("fail reason: gcd roots number is not correct.\n");
    exit(1);
  }

  for(i=0; i<l; i++)
  {
    bug=1;
    for(j=0; j<l; j++)
    {
      if(equal_dcmplx(rc[i], ra[j], tol))
        bug=0;
      if(dcabs(sub_dcmplx(rc[i], ra[j]))<error)
      {
         error=dcabs(sub_dcmplx(rc[i], ra[j]));
         near=ra[j];        
      }
    }
    if( bug==1 )
    {
     printf("a is:\n");  
     for(i=0; i<=n+l; i++)
      writeln_dcmplx(a[i]);    
    
     printf("b is:\n");  
     for(i=0; i<=m+l; i++)
       writeln_dcmplx(b[i]);

     printf("a's roots are:\n");
     for(i=0; i<n+l; i++)
       writeln_dcmplx(ra[i]);

     printf("b's roots are:\n");
     for(i=0; i<m+l; i++)
       writeln_dcmplx(rb[i]);

      printf("the given common root is:");
      writeln_dcmplx(rc[i]);
      printf("the nearest one to the given common roots is:");
      writeln_dcmplx(near);
      printf("the difference is:%lf\n", error);
   
      printf("fail reason: the common root is not the given gcd root\n");  
      printf(" Bug!!\n");
      exit(1);
    }
  }
 printf("the result is correct !\n");
 
 /* now begin to test extended gcd method */
 gcd_coeff=ExtPolyGcd( n+l+1, a, m+l+1, b, &dgcd, &dk, &dl, &dbd, &dad);
 t1=mul_poly( dk, gcd_coeff[0], n+l, a, &k1 );
 t2=mul_poly( dl, gcd_coeff[1], m+l, b, &k2 );
 
 c_gcd=add_poly( k1, t1, k2, t2, &dc_gcd);

 /*
 printf("the given polynomial a is:\n"); 
 for(i=0; i<=n+l; i++)
    writeln_dcmplx(a[i]);
 printf("\n");

 printf("the given polynomial b is:\n");
 for(i=0; i<=m+l; i++)
    writeln_dcmplx(b[i]);
 printf("\n");
 */

 printf("the given gcd polynomial is:\n");
 for(i=0; i<=l; i++)
    writeln_dcmplx(c[i]);
 printf("\n");
 
 printf("the calculated gcd polynomial is:\n");
 for(i=0; i<=dc_gcd; i++)
    writeln_dcmplx(c_gcd[i]);
 printf("\n");

 printf("the gcd got from common roots is:\n");
 for(i=0; i<=dgcd; i++)
    writeln_dcmplx(gcd_coeff[2][i]);
 printf("\n");

  if(l!= dc_gcd)
  {
    printf("Bug!!\n");

    printf("a is:\n");  
    for(i=0; i<=n+l; i++)
      writeln_dcmplx(a[i]);    
    
    printf("b is:\n");  
    for(i=0; i<=m+l; i++)
      writeln_dcmplx(b[i]);

    printf("a's roots are:\n");
    for(i=0; i<n+l; i++)
      writeln_dcmplx(ra[i]);

    printf("b's roots are:\n");
    for(i=0; i<m+l; i++)
      writeln_dcmplx(rb[i]);

    exit(1);
  }

  if(l!=dgcd)
  {
    printf("Bug!! (get_poly)\n");
    exit(1);
  }

  for(i=0; i<=l; i++)
  {
    bug=1;
    for(j=0; j<=l; j++)
    {
      if(equal_dcmplx(c[i], c_gcd[j], tol))
        bug=0;
    }
    if( bug==1 )
    {
      printf(" Bug!!\n");
      exit(1);
    }
  }

  for(i=0; i<=l; i++)
  {
    bug=1;
    for(j=0; j<=l; j++)
    {
      if(equal_dcmplx(c[i], gcd_coeff[2][j], tol))
        bug=0;
    }
    if( bug==1 )
    {
      printf(" Bug!!(get_poly)\n");
      exit(1);
    }
  }
 printf(" the extended gcd result is correct !\n");

 free(t1); free(t2);
 free(c_gcd);

 free(gcd_coeff[0]);
 free(gcd_coeff[1]);
 free(gcd_coeff[2]);
 free(gcd_coeff);
}
int main_logic(char elements[100],int l)
{
int flag=0,flag1=0,flag2=0,pos=0,i=0,j=0,flag3=0,k=0,loop=0,len=0;
struct node1 *head1,*pointer;
char a,b,q[27];
head1=malloc(sizeof(struct node1));
pointer=malloc(sizeof(struct node1));
head1=NULL;
for(k=0;k<l;k=k+2) {

a=elements[k];
b=elements[k+1];
if(head1==NULL) {
if(a==b) {
   loop=2;
   return loop;
}
struct node1 *newnode=create1(a);
struct node1 *newnode1=create1(b);
head1=newnode;
newnode->next1=newnode1;
for(i=0;newnode->child_arr1[i]!='\0';i++);
newnode->child_arr1[i]=b;
for(i=0;newnode1->parent_arr1[i]!='\0';i++);
newnode1->parent_arr1[i]=a;
//printf("\nInsert done\n");
}
    
else {
if(a==b) {
   loop=2;
   return loop;
}
pointer=head1;
flag=0;
flag1=0;
flag2=0;
flag3=0;
len=0;
pointer=head1;
while(pointer!=NULL) {
	if(pointer->value1==a) {
           flag=1;	   
        }
	if(pointer->value1==b) {
	   flag1=1;
	}
        pointer=pointer->next1;
}
if(flag==1 && flag1==0) {
   flag2=0;
   pointer=head1;
   while(pointer!=NULL) {
     for(i=0;pointer->child_arr1[i]!='\0';i++) {
        if(pointer->child_arr1[i]==a) {
           if(pointer->value1!=b) {
              q[len++]=pointer->value1;
              for(j=i;pointer->child_arr1[j]!='\0';j++);
              pointer->child_arr1[j]=b;
	      //printf("\ninsert done flag=1,flag1=0\n");
           }
	   else {
             //printf("\nloop detected...insert failed\n");
	     flag2=1;
	     loop=1;
           }
           break;
        }
     }
     if(flag2==1) {
      break;
     }
     pointer=pointer->next1;
   }
  if(flag2!=1) {
   pointer=head1;
   while(pointer->value1!=a) {
     pointer=pointer->next1;
   }
   for(i=0;pointer->child_arr1[i]!='\0';i++);
   pointer->child_arr1[i]=b;
   pointer=head1;
   while(pointer->next1!=NULL) {
      pointer=pointer->next1;
   }
   struct node1 *newnode;
   newnode=create1(b);
   pointer->next1=newnode;   
   for(i=0;newnode->parent_arr1[i]!='\0';i++);
   newnode->parent_arr1[i]=a;
   for(i=0;i<len;i++)
   newnode->parent_arr1[i+1]=q[i];
   //printf("\ninsert done flag=1,flag1=0\n");
  }
}


else if(flag==0 && flag1==0) {
   pointer=head1;
   struct node1 *newnode;
   struct node1 *newnode1;
   newnode=create1(a);
   newnode1=create1(b);
   while(pointer->next1!=NULL) {
      pointer=pointer->next1;
   }
   pointer->next1=newnode;
   newnode->next1=newnode1;
   for(i=0;newnode->child_arr1[i]!='\0';i++);
   newnode->child_arr1[i]=b;
   for(i=0;newnode1->parent_arr1[i]!='\0';i++);
   newnode1->parent_arr1[i]=a;
   //printf("\ninsert done flag=0,flag1=0\n");
}

else if(flag==0 && flag1==1) {
   pointer=head1;
   while(pointer!=NULL) {
     for(i=0;pointer->parent_arr1[i]!='\0';i++) {
        if(pointer->parent_arr1[i]==b) {
           if(pointer->value1!=a) {
              q[len++]=pointer->value1;
              for(j=i;pointer->parent_arr1[j]!='\0';j++);
              pointer->parent_arr1[j]=a;
              //printf("\ninsert done flag=0,flag1=1\n");
           }
	   else {
             //printf("\nloop detected...insert failed\n");
             flag2=1;
	     loop=1;
           }
           break;
        }
     }
     if(flag2==1) {
      break;
     }
     pointer=pointer->next1;
   }
   
  if(flag2!=1) {
   pointer=head1;
   while(pointer->value1!=b) {
     pointer=pointer->next1;
   }
   for(i=0;pointer->parent_arr1[i]!='\0';i++);
   pointer->parent_arr1[i]=a;
   pointer=head1;
   while(pointer->next1!=NULL) {
      pointer=pointer->next1;
   }
   struct node1 *newnode;
   newnode=create1(a);
   pointer->next1=newnode;   
   for(i=0;newnode->child_arr1[i]!='\0';i++);
   newnode->child_arr1[i]=b;
   for(i=0;i<len;i++)
   newnode->child_arr1[i+1]=q[i];
   //printf("\ninsert done flag=0,flag1=1\n");
  }
}

else {
   pointer=head1;
   while(pointer!=NULL) {
       if(pointer->value1==a) {
          for(i=0;pointer->parent_arr1[i]!='\0';i++) {
              if(pointer->parent_arr1[i]==b) {
                  loop=1;
		  break;
              }
          }
          for(i=0;pointer->child_arr1[i]!='\0';i++) {
              if(pointer->child_arr1[i]==a) {
                  flag2=1;
                  break;
              }
          }
       }
       if(loop==1 || flag2==1) {
            break;
       }
       pointer=pointer->next1;
   }
   pointer=head1;
   if(loop!=1 && flag2!=1) {
     while(pointer!=NULL) {
       if(pointer->value1==a) {
          for(i=0;pointer->child_arr1[i]!='\0';i++);
          pointer->child_arr1[i]=b;
       }
       if(pointer->value1==b) {
          for(i=0;pointer->parent_arr1[i]!='\0';i++);
	  pointer->parent_arr1[i]=a;
       }
       pointer=pointer->next1;
     }
   }  
}
}
}
return loop;
}
Example #20
0
void test_create2() {
    create1();
    create2();
}
Example #21
0
int
main(int argc, char *argv[])
{
  int pid, i;

  if(argc != 3){
    fprintf(stderr, "Usage: test-lab-2-a dir1 dir2\n");
    exit(1);
  }

  sprintf(d1, "%s/d%d", argv[1], getpid());
  if(mkdir(d1, 0777) != 0){
    fprintf(stderr, "test-lab-2-a: failed: mkdir(%s): %s\n",
            d1, strerror(errno));
    exit(1);
  }
  sprintf(d2, "%s/d%d", argv[2], getpid());
  if(access(d2, 0) != 0){
    fprintf(stderr, "test-lab-2-a: failed: access(%s) after mkdir %s: %s\n",
            d2, d1, strerror(errno));
    exit(1);
  }

  setbuf(stdout, 0);

  for(i = 0; i < sizeof(big)-1; i++)
    big[i] = 'x';
  for(i = 0; i < sizeof(huge)-1; i++)
    huge[i] = '0';

  //addddddddddddd
  printf("Concurrent creates: ");
  pid = fork();
  if(pid < 0){
    perror("test-lab-2-a: fork");
    exit(1);
  }
  if(pid == 0){
    createn(d2, "xx", 20, false);
    exit(0);
  }
  createn(d1, "yy", 20, false);
  sleep(10);
  reap(pid);
  dircheck(d1, 40);
  checkn(d1, "xx", 20);
  checkn(d2, "yy", 20);
  unlinkn(d1, "xx", 20);
  unlinkn(d1, "yy", 20);
  printf("OK\n");

  printf("Concurrent create/delete: ");
  createn(d1, "x1", 20, false);
  createn(d2, "x2", 20, false);
  pid = fork();
  if(pid < 0){
    perror("test-lab-2-a: fork");
    exit(1);
  }
  if(pid == 0){
    unlinkn(d2, "x1", 20);
    createn(d1, "x3", 20, false);
    exit(0);
  }
  createn(d1, "x4", 20, false);
  reap(pid);
  unlinkn(d2, "x2", 20);
  unlinkn(d2, "x4", 20);
  unlinkn(d2, "x3", 20);
  dircheck(d1, 0);
  printf("OK\n");
  //additional
  printf("Create then read: ");
  create1(d1, "f1", "aaa");
  check1(d2, "f1", "aaa");
  check1(d1, "f1", "aaa");
  printf("OK\n");

  printf("Unlink: ");
  unlink1(d2, "f1");
  create1(d1, "fx1", "fxx"); /* checknot f1 fails w/o these */
  unlink1(d1, "fx1");
  checknot(d1, "f1");
  checknot(d2, "f1");
  create1(d1, "f2", "222");
  unlink1(d2, "f2");
  checknot(d1, "f2");
  checknot(d2, "f2");
  create1(d1, "f3", "333");
  check1(d2, "f3", "333");
  check1(d1, "f3", "333");
  unlink1(d1, "f3");
  create1(d2, "fx2", "22"); /* checknot f3 fails w/o these */
  unlink1(d2, "fx2");
  checknot(d2, "f3");
  checknot(d1, "f3");
  printf("OK\n");

  printf("Append: ");
  create1(d2, "f1", "aaa");
  append1(d1, "f1", "bbb");
  append1(d2, "f1", "ccc");
  check1(d1, "f1", "aaabbbccc");
  check1(d2, "f1", "aaabbbccc");
  printf("OK\n");

  printf("Readdir: ");
  dircheck(d1, 1);
  dircheck(d2, 1);
  unlink1(d1, "f1");
  dircheck(d1, 0);
  dircheck(d2, 0);
  create1(d2, "f2", "aaa");
  create1(d1, "f3", "aaa");
  dircheck(d1, 2);
  dircheck(d2, 2);
  unlink1(d2, "f2");
  dircheck(d2, 1);
  dircheck(d1, 1);
  unlink1(d2, "f3");
  dircheck(d1, 0);
  dircheck(d2, 0);
  printf("OK\n");

  printf("Many sequential creates: ");
  createn(d1, "aa", 10, false);
  createn(d2, "bb", 10, false);
  dircheck(d2, 20);
  checkn(d2, "bb", 10);
  checkn(d2, "aa", 10);
  checkn(d1, "aa", 10);
  checkn(d1, "bb", 10);
  unlinkn(d1, "aa", 10);
  unlinkn(d2, "bb", 10);
  printf("OK\n");

  printf("Write 20000 bytes: ");
  create1(d1, "bf", big);
  check1(d1, "bf", big);
  check1(d2, "bf", big);
  unlink1(d1, "bf");
  printf("OK\n");

  printf("Concurrent creates: ");
  pid = fork();
  if(pid < 0){
    perror("test-lab-2-a: fork");
    exit(1);
  }
  if(pid == 0){
    createn(d2, "xx", 20, false);
    exit(0);
  }
  createn(d1, "yy", 20, false);
  sleep(10);
  reap(pid);
  dircheck(d1, 40);
  checkn(d1, "xx", 20);
  checkn(d2, "yy", 20);
  unlinkn(d1, "xx", 20);
  unlinkn(d1, "yy", 20);
  printf("OK\n");

  printf("Concurrent creates of the same file: ");
  pid = fork();
  if(pid < 0){
    perror("test-lab-2-a: fork");
    exit(1);
  }
  if(pid == 0){
    createn(d2, "zz", 20, true);
    exit(0);
  }
  createn(d1, "zz", 20, true);
  sleep(4);
  dircheck(d1, 20);
  reap(pid);
  checkn(d1, "zz", 20);
  checkn(d2, "zz", 20);
  unlinkn(d1, "zz", 20);
  printf("OK\n");

  printf("Concurrent create/delete: ");
  createn(d1, "x1", 20, false);
  createn(d2, "x2", 20, false);
  pid = fork();
  if(pid < 0){
    perror("test-lab-2-a: fork");
    exit(1);
  }
  if(pid == 0){
    unlinkn(d2, "x1", 20);
    createn(d1, "x3", 20, false);
    exit(0);
  }
  createn(d1, "x4", 20, false);
  reap(pid);
  unlinkn(d2, "x2", 20);
  unlinkn(d2, "x4", 20);
  unlinkn(d2, "x3", 20);
  dircheck(d1, 0);
  printf("OK\n");

  printf("Concurrent creates, same file, same server: ");
  pid = fork();
  if(pid < 0){
    perror("test-lab-2-a: fork");
    exit(1);
  }
  if(pid == 0){
    createn(d1, "zz", 20, true);
    exit(0);
  }
  createn(d1, "zz", 20, true);
  sleep(2);
  dircheck(d1, 20);
  reap(pid);
  checkn(d1, "zz", 20);
  unlinkn(d1, "zz", 20);
  printf("OK\n");

  printf("Concurrent writes to different parts of same file: ");
  create1(d1, "www", huge);
  pid = fork();
  if(pid < 0){
    perror("test-lab-2-a: fork");
    exit(1);
  }
  if(pid == 0){
    write1(d2, "www", 65536, 64, '2');
    exit(0);
  }
  write1(d1, "www", 0, 64, '1');
  reap(pid);
  checkread(d1, "www", 0, 64, '1');
  checkread(d2, "www", 0, 64, '1');
  checkread(d1, "www", 65536, 64, '2');
  checkread(d2, "www", 65536, 64, '2');
  printf("OK\n");

  printf("test-lab-2-a: Passed all tests.\n");

  exit(0);
  return(0);
}
Example #22
0
void feedback(int n, int m, int p, int q, int nb, int output_level, int nn, int input, char *ifn, char *ofn)
{
  dcmplx A[n][n], B[n][m], C[p][n];
  dcmplx s[nn], Is[n][n], Is_A[n][n], tmp[p][n], M[p][m];  
  double a[nn*2], b[nn*p*m*2], *points, *planes, r;
  int i, j, k, start, nbsols;
  FILE *ifp, *ofp;
  timer t_phc;

 ofp=fopen(ofn, "w"); /*open for writing*/
 fprintf(ofp, "n=%d\n", n);
 fprintf(ofp, "m=%d\n", m);
 fprintf(ofp, "p=%d\n", p);
 fprintf(ofp, "q=%d\n", q);
 
 if(input == 0)
 {
  ifp=fopen(ifn, "r"); /*open for reading*/
  skip(ifp);

  read_dcmatrix0(n, n, A, ifp);
  printf( "The given matrix A(%d*%d) is:\n", n, n);
  print_dcmatrix(n, n, A);

  read_dcmatrix0(n, m, B, ifp);
  printf("The given matrix B(%d*%d) is:\n", n, m);
  print_dcmatrix(n, m, B);

  read_dcmatrix0(p, n, C, ifp);
  printf("The given matrix C(%d*%d) is:\n", p, n);
  print_dcmatrix(p, n, C); 
  
  for(i=0; i<n+q; i++)
    read_dcmplx0(&s[i], ifp);
  for(i=n+q; i<nn; i++)     /*generate more poles as interpolation points */
  {
    s[i] = create1(cos(rand()));
    if(s[i].re>0)
      s[i] = min_dcmplx(s[i]);  
  } 
  fclose(ifp);
 }

 if(input == 1)
 {
  ifp=fopen(ifn, "r"); /*open for reading*/
  skip(ifp);

  read_dcmatrix2(n, n, A, ifp);
  printf( "The given matrix A(%d*%d) is:\n", n, n);
  print_dcmatrix(n, n, A);

  read_dcmatrix2(n, m, B, ifp);
  printf("The given matrix B(%d*%d) is:\n", n, m);
  print_dcmatrix(n, m, B);

  read_dcmatrix2(p, n, C, ifp);
  printf("The given matrix C(%d*%d) is:\n", p, n);
  print_dcmatrix(p, n, C); 
  
  for(i=0; i<n+q; i++)
    read_dcmplx1(&s[i], ifp);
  for(i=n+q; i<nn; i++)     /*generate more poles as interpolation points */
  {
    s[i] = create1(cos(rand()));
    if(s[i].re>0)
      s[i] = min_dcmplx(s[i]);  
  } 
  fclose(ifp);
 }

 if(input==2)
 {

  random_dcmatrix ( n, n, A);
  printf("\nThe random generated matrix A is:\n");
  print_dcmatrix(n, n, A);

  random_dcmatrix ( n, m, B);
  printf("\nThe random generated matrix B is:\n");
  print_dcmatrix(n, m, B);

  random_dcmatrix ( p, n, C);
  printf("\nThe random generated matrix C is:\n");
  print_dcmatrix(p, n, C);

  s[0] = create2(-0.23423423423, 0);  /* fix one pole for testing realization */
  for(i=1; i<nn; i++)
  {
    r = rand();
    s[i] = create2(cos(r), sin(r));
    if(s[i].re>0)
      s[i] = min_dcmplx(s[i]); 
    s[++i] = conjugate(s[i]);
    if(i==(nn-2))
    {
       if((nn%2)==0)
          s[++i] = create1(-1.0); 
    }  
  }
  printf("\nThe random generated poles are:\n");
  for(i=0; i<nn; i++)
    writeln_dcmplx(s[i]);
 }

 if(input==3)
 {

  random_dcmatrix0 ( n, n, A);
  printf("\nThe random generated matrix A is:\n");
  print_dcmatrix(n, n, A);

  random_dcmatrix0 ( n, m, B);
  printf("\nThe random generated matrix B is:\n");
  print_dcmatrix(n, m, B);

  random_dcmatrix0 ( p, n, C);
  printf("\nThe random generated matrix C is:\n");
  print_dcmatrix(p, n, C);

  s[0] = create2(-0.23423423423, 0);  /* fix one pole for test */
  for(i=1; i<nn; i++)
  {
    r = rand();
    s[i] = create2(cos(r), sin(r));
    if(s[i].re>0)
      s[i] = min_dcmplx(s[i]);
    s[++i] = conjugate(s[i]);
    if(i==(nn-2))
    {
       if((nn%2)==0)
          s[++i] = create1(-1.0);
    }
  }
  printf("\nThe random generated poles are:\n");
  for(i=0; i<nn; i++)
    writeln_dcmplx(s[i]);
 }

 if(input == 4)
 {
  ifp=fopen(ifn, "r"); /*open for reading*/
  skip(ifp);

  read_dcmatrix0(n, n, A, ifp);
  printf( "The given matrix A(%d*%d) is:\n", n, n);
  print_dcmatrix(n, n, A);

  read_dcmatrix0(n, m, B, ifp);
  printf("The given matrix B(%d*%d) is:\n", n, m);
  print_dcmatrix(n, m, B);

  read_dcmatrix0(p, n, C, ifp);
  printf("The given matrix C(%d*%d) is:\n", p, n);
  print_dcmatrix(p, n, C);

  for(i=0; i<n+q; i++)
    read_dcmplx1(&s[i], ifp);
  for(i=n+q; i<nn; i++)     /*generate more poles as interpolation points */
  {
    s[i] = create1(cos(rand()));
    if(s[i].re>0)
      s[i] = min_dcmplx(s[i]);
  }
  fclose(ifp);
 }


 /* print the input matrices in matlab format for further study */
  fprintf(ofp,"A=[\n");  print_dcmatrix1(n, n, A, ofp); fprintf(ofp,"]\n");
  fprintf(ofp,"B=[\n");  print_dcmatrix1(n, m, B, ofp); fprintf(ofp,"]\n");
  fprintf(ofp,"C=[\n");  print_dcmatrix1(p, n, C, ofp); fprintf(ofp,"]\n");

  fprintf(ofp, "\nPoles=[");
  for(i=0; i<nn; i++)
  {
    write_dcmplx1(s[i], ofp);
    if(i!=(nn-1)) fprintf(ofp, ",");
  }
  fprintf(ofp, "]\n");

 /* end of input */



  j = 0;
  for(i=0; i<nn; i++)
  {
    a[j++] = s[i].re;
    a[j++] = s[i].im;
  }

  start = 0;
  for(k=0; k<n+q; k++)
  { 
    for(i=0; i<n; i++)
      for(j=0; j<n; j++)
      {
        if(i==j) Is[i][j] = s[k];
        else Is[i][j] = zero;
      }
   sub_dcmatrix(n, n, Is, A, Is_A);

   dcinverse(n, Is_A);

   multiply_dcmatrix(p, n, n, C, Is_A, tmp);
   multiply_dcmatrix(p, n, m, tmp, B, M);
   c2ada_dc_matrix( p, m, M, nn*p*m*2, b, start);
   start = start + p*m*2;  
    
  }

  /* generate some random planes */
  for( i=start ; i<nn*p*m*2; i++ )
  {
    b[i++] = cos(rand()); 
    b[i] = 0.0;
  }
 
  fflush(stdout);
  fflush(ofp); 

  printf("\nComputing the feedback law with PHC ...\n");
  tstart(&t_phc);
  adainit();
  nbsols = _ada_pieri_solver(m, p, q, nb, output_level, a, b, ofn);
  adafinal();
  tstop(&t_phc);
  /* This subroutine spends almost all the time */
  tprint(t_phc);

  printf("\nSee %s for the realization of the output feedbacks.\n", ofn);

  fclose(ofp);
}