Ejemplo n.º 1
0
/*------------------------------------------------------------*/
void
set_grey (void)
{
  assert (dstack_size >= 1);

  colour_set_grey (&given_colour, dstack [dstack_size - 1]);
  pop_dstack (1);

  if (invalid_colour (&given_colour)) return;

  assert (colour_valid_state (&given_colour));
}
Ejemplo n.º 2
0
/*------------------------------------------------------------*/
void
set_hsb (void)
{
  assert (dstack_size >= 3);

  colour_set_hsb (&given_colour,
		  dstack [dstack_size - 3],
		  dstack [dstack_size - 2],
		  dstack [dstack_size - 1]);
  pop_dstack (3);

  if (invalid_colour (&given_colour)) return;

  assert (colour_valid_state (&given_colour));
}
Ejemplo n.º 3
0
double stack_eval(double t, double *c_in, double *x_in, D_Stack *d_stack, StackExpr expr ) {

	// I_Stack *serial = new_istack();
	// I_Stack istack;
	// I_Stack *serial = &istack;

	clear_dstack(d_stack);
	int* serial = expr.serial;

	
	#ifdef print_stack_eval
	printf("Serial: |%d|", expr.s_len);
	#endif
	int s;
	for( s=0; s < expr.s_len; s++ ) {
	// #ifdef print_stack_eval
	// 	printf( "%d ", expr.serial[s]);
	// #endif
	// 	push_istack(serial,expr.serial[expr.s_len-s-1]);
	// }
	// #ifdef print_stack_eval
	// printf("\n");
	// #endif
	
	// clear_dstack(d_stack);

	// // fill i_stack with cmds and d_stack with leaves
	// while ( !is_empty_istack(serial) ) {
	// 	// printf( "processing serial\n");
		// int val = top_istack(serial);
		// pop_istack(serial);

		int val = serial[s];

	#ifdef print_stack_eval
		int dlen = len_dstack(d_stack);
		int slen = len_istack(serial);
		printf( "S: %d    val:  %d   \n", slen, val );
		printf( "serial(%d): [ ", slen); 
		for( i=0; i < slen; i++ )
			printf( "%d ", get_istack(serial,i) );
		printf(" ]\n");
		printf( "d_stack(%d): [ ", dlen); 
		for( i=0; i < dlen; i++ )
			printf( "%.2f ", get_dstack(d_stack,i) );
		printf(" ]\n");
	#endif

		switch (val) {
			
			// CONSTANT:  2
			case 2: {
				s++;
				int p = serial[s];
				// int p = top_istack(serial);
				// pop_istack(serial);
				push_dstack(d_stack,c_in[p]);
			}
				break; 

			// HACK***
			// CONSTANTF:  3
			case 3: {
				s++;
				int p = serial[s];
				// int p = top_istack(serial);
				// pop_istack(serial);
				push_dstack(d_stack,p);
			}
				break; 
			// TIME:      4
			case 4:
				push_dstack(d_stack,t);
				break;
			// SYSTEM:    5
			// case 5:
				// s++;
				// push_dstack(d_stack,sys_in[serial[s]]);
			// VAR:       6   should already be transformed, but just in case
			case 6: {
				s++;
				int p = serial[s];
				// int p = top_istack(serial);
				// pop_istack(serial);
				push_dstack(d_stack,x_in[p]);
				break;
			}
			// NEG:       9
			case 9: {
				double top = top_dstack(d_stack);
				pop_dstack(d_stack);
				push_dstack(d_stack, -top);
			}
				break;
			// ABS:       10
			case 10: {
				double top = top_dstack(d_stack);
				pop_dstack(d_stack);
				push_dstack(d_stack, fabs(top));
			}
				break;
			// SQRT:      11
			case 11: {
				double top = top_dstack(d_stack);
				pop_dstack(d_stack);
				push_dstack(d_stack, sqrt(top));
			}
				break;
			// SIN:       12
			case 12: {
				double top = top_dstack(d_stack);
				pop_dstack(d_stack);
				push_dstack(d_stack, sin(top));
			}
				break;
			// COS:       13
			case 13: {
				double top = top_dstack(d_stack);
				pop_dstack(d_stack);
				push_dstack(d_stack, cos(top));
			}
				break;
			// TAN:       14
			case 14: {
				double top = top_dstack(d_stack);
				pop_dstack(d_stack);
				push_dstack(d_stack, tan(top));
			}
				break;
			// EXP:       15
			case 15: {
				double top = top_dstack(d_stack);
				pop_dstack(d_stack);
				push_dstack(d_stack, exp(top));
			}
				break;
			// LOG:       16
			case 16: {
				double top = top_dstack(d_stack);
				pop_dstack(d_stack);
				push_dstack(d_stack, log(top));
			}
				break;

						// POWI:      18
			case 18: {
				double top = top_dstack(d_stack);
				pop_dstack(d_stack);
				s++;
				int pwr = serial[s];
				// int pwr = top_istack(serial);
				// pop_istack(serial);
				push_dstack(d_stack, pow(top,pwr));
			}
				break;
			// POWE:      20
			case 20: {
					double top = top_dstack(d_stack);
					pop_dstack(d_stack);
					double pwr = top_dstack(d_stack);
					pop_dstack(d_stack);
					push_dstack(d_stack, pow(top,pwr));
				}
				break;
			// DIV:       21
			case 21: {
					double denom = top_dstack(d_stack);
					pop_dstack(d_stack);
					double numer = top_dstack(d_stack);
					pop_dstack(d_stack);
					push_dstack(d_stack, numer / denom);
				}
				break;
			// ADD:       22
			case 22: {
					double lhs = top_dstack(d_stack);
					pop_dstack(d_stack);
					double rhs = top_dstack(d_stack);
					pop_dstack(d_stack);
					push_dstack(d_stack, lhs + rhs);
					// printf( "%f + %f = %f\n", lhs, rhs, top_dstack(d_stack));
				}
				break;
			// MUL:       23
			case 23: {
					double lhs = top_dstack(d_stack);
					pop_dstack(d_stack);
					double rhs = top_dstack(d_stack);
					pop_dstack(d_stack);
					push_dstack(d_stack, lhs * rhs);
					// printf( "%f * %f = %f\n", lhs, rhs, top_dstack(d_stack));
				}
				break;




			case 0:
			default:
				// STARTVAR:  25
				if (val >= 25) {
					push_dstack(d_stack,x_in[val-25]); // x_dim_of_var = val - STARTVAR
				} else {
					printf("pushing unknown cmd %d\n", val);
					int s;
					for( s=0; s < expr.s_len; s++ ) {
						printf( "%d ", expr.serial[s]);
					}
					printf( "\n");
					abort();
				}
		}

	#ifdef print_stack_eval
		dlen = len_dstack(d_stack);
		printf( "S: %d val: %d\n", s, val);
		printf( "d_stack(%d): [ ", dlen); 
		for( i=0; i < dlen; i++ )
			printf( "%.2f ", get_dstack(d_stack,i) );
		printf(" ]\n\n");
	#endif
	}

	// free(serial);
	return top_dstack(d_stack);

}