functions{ row_vector mike_dot( int r , int c , vector beta , row_vector zeros , array[,] int index_pos_X_mat , array[] int index_pos_X_sizes , array[,] int col_index_into_X_first_unique_pos_X_mat , array[] int col_index_into_X_first_unique_pos_X_sizes , array[,] int index_of_cZ_for_each_col_in_Z_with_pos_X_mat , array[] int index_of_cZ_for_each_col_in_Z_with_pos_X_sizes , array[,] int index_neg_X_mat , array[] int index_neg_X_sizes , array[,] int col_index_into_X_first_unique_neg_X_mat , array[] int col_index_into_X_first_unique_neg_X_sizes , array[,] int index_of_cZ_for_each_col_in_Z_with_neg_X_mat , array[] int index_of_cZ_for_each_col_in_Z_with_neg_X_sizes ) { row_vector[c] out = zeros ; for(i_r in 1:r){ out[ index_pos_X_mat[ i_r , 1:(index_pos_X_sizes[i_r]) ] ] = ( out[ col_index_into_X_first_unique_pos_X_mat[ i_r , 1:(col_index_into_X_first_unique_pos_X_sizes[i_r]) ] ] + beta[i_r] )[ index_of_cZ_for_each_col_in_Z_with_pos_X_mat[ i_r , 1:(index_of_cZ_for_each_col_in_Z_with_pos_X_sizes[i_r]) ] ] ; out[ index_neg_X_mat[ i_r , 1:(index_neg_X_sizes[i_r]) ] ] = ( out[ col_index_into_X_first_unique_neg_X_mat[ i_r , 1:(col_index_into_X_first_unique_neg_X_sizes[i_r]) ] ] - beta[i_r] )[ index_of_cZ_for_each_col_in_Z_with_neg_X_mat[ i_r , 1:(index_of_cZ_for_each_col_in_Z_with_neg_X_sizes[i_r]) ] ] ; } return(out); } } data{ int r ; int c ; matrix[r,c] X; row_vector[c] Y; int index_pos_X_mat_rows ; int index_pos_X_mat_cols ; array[index_pos_X_mat_rows,index_pos_X_mat_cols] int index_pos_X_mat ; array[index_pos_X_mat_rows] int index_pos_X_sizes ; int col_index_into_X_first_unique_pos_X_mat_rows ; int col_index_into_X_first_unique_pos_X_mat_cols ; array[ col_index_into_X_first_unique_pos_X_mat_rows ,col_index_into_X_first_unique_pos_X_mat_cols ] int col_index_into_X_first_unique_pos_X_mat ; array[ col_index_into_X_first_unique_pos_X_mat_rows ] int col_index_into_X_first_unique_pos_X_sizes ; int index_of_cZ_for_each_col_in_Z_with_pos_X_mat_rows ; int index_of_cZ_for_each_col_in_Z_with_pos_X_mat_cols ; array[ index_of_cZ_for_each_col_in_Z_with_pos_X_mat_rows , index_of_cZ_for_each_col_in_Z_with_pos_X_mat_cols ] int index_of_cZ_for_each_col_in_Z_with_pos_X_mat ; array[ index_of_cZ_for_each_col_in_Z_with_pos_X_mat_rows ] int index_of_cZ_for_each_col_in_Z_with_pos_X_sizes ; int index_neg_X_mat_rows ; int index_neg_X_mat_cols ; array[index_neg_X_mat_rows,index_neg_X_mat_cols] int index_neg_X_mat ; array[index_neg_X_mat_rows] int index_neg_X_sizes ; int col_index_into_X_first_unique_neg_X_mat_rows ; int col_index_into_X_first_unique_neg_X_mat_cols ; array[ col_index_into_X_first_unique_neg_X_mat_rows ,col_index_into_X_first_unique_neg_X_mat_cols ] int col_index_into_X_first_unique_neg_X_mat ; array[ col_index_into_X_first_unique_neg_X_mat_rows ] int col_index_into_X_first_unique_neg_X_sizes ; int index_of_cZ_for_each_col_in_Z_with_neg_X_mat_rows ; int index_of_cZ_for_each_col_in_Z_with_neg_X_mat_cols ; array[ index_of_cZ_for_each_col_in_Z_with_neg_X_mat_rows , index_of_cZ_for_each_col_in_Z_with_neg_X_mat_cols ] int index_of_cZ_for_each_col_in_Z_with_neg_X_mat ; array[ index_of_cZ_for_each_col_in_Z_with_neg_X_mat_rows ] int index_of_cZ_for_each_col_in_Z_with_neg_X_sizes ; } transformed data{ row_vector[c] zeros = zeros_row_vector(c) ; } parameters{ vector[r] beta ; } transformed parameters{ row_vector[c] Z_dot_tp ; row_vector[c] Z_mike_tp ; profile("nodiff_order0_cdp"){ Z_dot_tp = columns_dot_product(X,rep_matrix(beta,c)) ; } profile("nodiff_order0_mike"){ Z_mike_tp = mike_dot( r , c , beta , zeros , index_pos_X_mat , index_pos_X_sizes , col_index_into_X_first_unique_pos_X_mat , col_index_into_X_first_unique_pos_X_sizes , index_of_cZ_for_each_col_in_Z_with_pos_X_mat , index_of_cZ_for_each_col_in_Z_with_pos_X_sizes , index_neg_X_mat , index_neg_X_sizes , col_index_into_X_first_unique_neg_X_mat , col_index_into_X_first_unique_neg_X_sizes , index_of_cZ_for_each_col_in_Z_with_neg_X_mat , index_of_cZ_for_each_col_in_Z_with_neg_X_sizes ) ; } } model{ beta ~ std_normal() ; Y ~ normal(Z_dot_tp,1.0) ; Y ~ normal(Z_mike_tp,1.0) ; }