 class Characteristic {
 public:
 	// constructor
-	__device__ __host__ Characteristic(curandState& localState, int iter, double rate) :
-	state(localState), current_iter(iter), target_rate(rate), decay_rate(0.667);
+	__device__ __host__ Characteristic(curandState& localState, int iter) : state(localState), current_iter(iter);
 	__device__ __host__ virtual ~Characteristic() {}
 
 	// compute the conditional log-posterior density of the measurements given the characteristic
-	__device__ __host__ virtual double logdensity_meas(double* chi, double* meas, double* meas_unc, int pchi, int mfeat)
+	__device__ __host__ virtual double logdensity_meas(double* chi, double* meas, double* meas_unc)
 	{
 		return 0.0;
 	}
 
 	// compute the conditional log-posterior dentity of the characteristic given the population parameter
-	__device__ __host__ virtual double logdensity_pop(double* chi, double* theta, int pchi, int dim_theta)
+	__device__ __host__ virtual double logdensity_pop(double* chi, double* theta)
 	{
 		return 0.0;
 	}
 
 	// propose a new value for the characteristic
-	__device__ __host__ virtual double* Propose(double* chi, double* cholfact, double* snorm_deviate, double* scaled_proposal, int pchi)
+	__device__ __host__ virtual double* Propose(double* chi, double* cholfact, double* snorm_deviate, double* scaled_proposal)
 	{
 		// get the unit proposal
-		for (int j=0; j<pchi; j++) {
+		for (int j=0; j<c_pchi; j++) {
 			snorm_deviate[j] = curand_normal_double(&state);
 		}
 
 		// propose a new chi value
-		double proposed_chi[pchi];
+		double proposed_chi[c_pchi];
 		int cholfact_index = 0;
-		for (int j=0; j<pchi; j++) {
+		for (int j=0; j<c_pchi; j++) {
 			double scaled_proposal_j = 0.0;
 			for (int k=0; k<(j+1); k++) {
 				// transform the unit proposal to the centered proposal, drawn from a multivariate normal.

		CUDA_CHECK_RETURN(cudaDeviceSynchronize());

		// set initial values for the characteristics. this will launch a CUDA kernel.
		InitialValue<ChiType><<<nBlocks,nThreads>>>(p_chi, p_meas, p_meas_unc, p_cholfact, p_logdens_meas,
				p_logdens_pop, ndata, mfeat, pchi);

		// copy values from device to host
		h_chi = d_chi;

		double* p_logdens_meas = thrust::raw_pointer_cast(&d_logdens_meas[0]);
		double* p_logdens_pop = thrust::raw_pointer_cast(&d_logdens_pop[0]);
		int* p_naccept = thrust::raw_pointer_cast(&d_naccept[0]);
		double* p_theta = Theta.GetDevThetaPtr();

		// launch the kernel to update the characteristics on the GPU
		UpdateKernel<ChiType><<<nBlocks,nThreads>>>(p_meas, p_meas_unc, p_chi, p_theta, p_cholfact, p_logdens_meas, p_logdens_pop,
				p_devStates, current_iter, p_naccept);

        CUDA_CHECK_RETURN(cudaDeviceSynchronize());
