// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | // Multiple birth-death MCMC for Gaussian Graphical models with marginal pseudo-likelihood // for maximum a posterior probability estimation (MAP) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | void ggm_bdmcmc_mpl_map_multi_update( int *iter, int *burnin, int G[], double g_prior[], double S[], int *n, int *p, int all_graphs[], double all_weights[], char *sample_graphs[], double graph_weights[], int *size_sample_g, int *counter_all_g, int *multi_update , int *print ) { int print_c = *print, multi_update_C = *multi_update; int iteration = *iter, burn_in = *burnin, copy_n = *n, count_all_g = *counter_all_g; int selected_edge_i, selected_edge_j, selected_edge_ij, size_sample_graph = *size_sample_g; int nodexdim, count_mb, t, i, j, ij, counter, dim = *p, pxp = dim * dim; double sum_weights = 0.0, weight_C, sum_rates; bool this_one; string string_g; vector<string> sample_graphs_C( iteration - burn_in ); vector<double> copyS( pxp ); memcpy( ©S[0], S, sizeof( double ) * pxp ); int qp = dim * ( dim - 1 ) / 2; vector<char> char_g( qp ); // char string_g[pp]; // Counting size of notes vector<int> size_node( dim, 0 ); for( i = 0; i < dim; i++ ) { nodexdim = i * dim; for( j = 0; j < dim; j++ ) size_node[ i ] += G[ nodexdim + j ]; } // Caclulating the log_likelihood for the current graph G vector<int>mb_node( dim ); vector<double>curr_log_mpl( dim ); vector<double> S_mb_node( pxp ); // For dynamic memory used for( i = 0; i < dim; i++ ) { if( size_node[ i ] > 0 ) { nodexdim = i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } log_mpl( &i, &mb_node[0], &size_node[i], &curr_log_mpl[i], ©S[0], &S_mb_node[0], ©_n, &dim ); } vector<double> log_ratio_g_prior( pxp ); for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = j * dim + i; log_ratio_g_prior[ ij ] = log( static_cast<double>( g_prior[ ij ] / ( 1 - g_prior[ ij ] ) ) ); } // For finding the index of rates vector<int>index_row( qp ); vector<int>index_col( qp ); counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) { ij = g_prior[ j * dim + i ]; if( ( ij != 0.0 ) or ( ij != 1.0 ) ) { index_row[ counter ] = i; index_col[ counter ] = j; counter++; } } int sub_qp = counter; vector<double> rates( sub_qp ); int size_index = multi_update_C; vector<int> index_selected_edges( multi_update_C ); // - - main loop for birth-death MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - | GetRNGstate(); for( int i_mcmc = 0; i_mcmc < iteration; i_mcmc += size_index ) { if( ( i_mcmc + 1 ) % print_c < multi_update_C ) Rprintf( " Iteration %d \n", i_mcmc + 1 ); // - - - STEP 1: calculating birth and death rates - - - - - - - - - - - - - - - - - - - - - - - - | rates_ggm_mpl( &rates[0], &log_ratio_g_prior[0], &curr_log_mpl[0], G, &index_row[0], &index_col[0], &sub_qp, &size_node[0], ©S[0], ©_n, &dim ); // Selecting multiple edges based on birth and death rates select_multi_edges( &rates[0], &index_selected_edges[0], &size_index, &sum_rates, &multi_update_C, &sub_qp ); // - - - Saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | if( i_mcmc >= burn_in ) { counter = 0; for( j = 1; j < dim; j++ ) for( i = 0; i < j; i++ ) char_g[ counter++ ] = G[ j * dim + i ] + '0'; weight_C = 1.0 / sum_rates; string_g = string( char_g.begin(), char_g.end() ); all_weights[ count_all_g ] = weight_C; this_one = false; for( i = 0; i < size_sample_graph; i++ ) if( sample_graphs_C[ i ] == string_g ) { graph_weights[ i ] += all_weights[ count_all_g ]; all_graphs[ count_all_g ] = i; this_one = true; break; } if( !this_one || size_sample_graph == 0 ) { sample_graphs_C[ size_sample_graph ] = string_g; graph_weights[ size_sample_graph ] = all_weights[ count_all_g ]; all_graphs[ count_all_g ] = size_sample_graph; size_sample_graph++; } count_all_g++; sum_weights += weight_C; } // - - - End of saving result - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| // - - - Updating graph based on selected edges - - - - - - - - - - - - - - - - - - - - - - - - - -| for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; selected_edge_ij = selected_edge_j * dim + selected_edge_i; G[ selected_edge_ij ] = 1 - G[ selected_edge_ij ]; G[ selected_edge_i * dim + selected_edge_j ] = G[ selected_edge_ij ]; if( G[ selected_edge_ij ] ) { ++size_node[ selected_edge_i ]; ++size_node[ selected_edge_j ]; }else{ --size_node[ selected_edge_i ]; --size_node[ selected_edge_j ]; } } for ( i = 0; i < size_index; i++ ) { selected_edge_i = index_row[ index_selected_edges[ i ] ]; selected_edge_j = index_col[ index_selected_edges[ i ] ]; //curr_log_mpl[ i ] = log_mpl( node = i, mb_node = which( G[ i, ] == 1 ), size_node = sum( G[ i, ] ), S = S, n = n, p = p, alpha_ijl = alpha_ijl ) if( size_node[ selected_edge_i ] > 0 ) { nodexdim = selected_edge_i * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } //log_mpl_dis( &size_node[ selected_edge_i ], data, freq_data, &length_freq_data, max_range_nodes, &mb_node[0], alpha_ijl, &curr_log_mpl[ selected_edge_i ], &selected_edge_i, ©_n, &dim ); log_mpl( &selected_edge_i, &mb_node[0], &size_node[ selected_edge_i ], &curr_log_mpl[ selected_edge_i ], ©S[0], &S_mb_node[0], ©_n, &dim ); //curr_log_mpl[ j ] = log_mpl( node = j, mb_node = which( G[ j, ] == 1 ), size_node = sum( G[ j, ] ), S = S, n = n, p = p, alpha_ijl = alpha_ijl ) if( size_node[ selected_edge_j ] > 0 ) { nodexdim = selected_edge_j * dim; count_mb = 0; for( t = 0; t < dim; t++ ) if( G[ nodexdim + t ] ) mb_node[ count_mb++ ] = t; } //log_mpl_dis( &size_node[ selected_edge_j ], data, freq_data, &length_freq_data, max_range_nodes, &mb_node[0], alpha_ijl, &curr_log_mpl[ selected_edge_j ], &selected_edge_j, ©_n, &dim ); log_mpl( &selected_edge_j, &mb_node[0], &size_node[ selected_edge_j ], &curr_log_mpl[ selected_edge_j ], ©S[0], &S_mb_node[0], ©_n, &dim ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | } PutRNGstate(); // - - - End of MCMC sampling algorithm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| #pragma omp parallel for for( i = 0; i < ( iteration - burn_in ); i++ ) { sample_graphs_C[ i ].copy( sample_graphs[ i ], qp, 0 ); sample_graphs[ i ][ qp ] = '\0'; } *size_sample_g = size_sample_graph; *counter_all_g = count_all_g; }
struct Character char_A() { // bitmap: char_A // using: default_font_palette static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_a() { static int32_t pixels[6*6] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 6, .pixels = pixels }; return r; } struct Character char_B() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_b() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_C() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_c() { static int32_t pixels[5*6] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 6, .pixels = pixels }; return r; } struct Character char_D() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_d() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_E() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_e() { static int32_t pixels[5*6] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, }; struct Character r = { .w = 5, .h = 6, .pixels = pixels }; return r; } struct Character char_F() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_f() { static int32_t pixels[4*7] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 4, .h = 7, .pixels = pixels }; return r; } struct Character char_G() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_g() { static int32_t pixels[5*6] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0 }; struct Character r = { .w = 5, .h = 6, .pixels = pixels }; return r; } struct Character char_H() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_h() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_I() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_i() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_J() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_j() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_K() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_k() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_L() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_l() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_M() { static int32_t pixels[7*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 7, .h = 7, .pixels = pixels }; return r; } struct Character char_m() { static int32_t pixels[7*6] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 7, .h = 6, .pixels = pixels }; return r; } struct Character char_N() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_n() { static int32_t pixels[5*6] = { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 6, .pixels = pixels }; return r; } struct Character char_O() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_o() { static int32_t pixels[6*6] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 6, .pixels = pixels }; return r; } struct Character char_P() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_p() { static int32_t pixels[5*6] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0 }; struct Character r = { .w = 5, .h = 6, .pixels = pixels }; return r; } struct Character char_Q() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_q() { static int32_t pixels[5*6] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0 }; struct Character r = { .w = 5, .h = 6, .pixels = pixels }; return r; } struct Character char_R() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_r() { static int32_t pixels[5*6] = { 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 6, .pixels = pixels }; return r; } struct Character char_S() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_s() { static int32_t pixels[5*6] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 6, .pixels = pixels }; return r; } struct Character char_T() { static int32_t pixels[7*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; struct Character r = { .w = 7, .h = 7, .pixels = pixels }; return r; } struct Character char_t() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_U() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_u() { static int32_t pixels[6*6] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 6, .pixels = pixels }; return r; } struct Character char_V() { static int32_t pixels[7*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 7, .h = 7, .pixels = pixels }; return r; } struct Character char_v() { static int32_t pixels[7*6] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 7, .h = 6, .pixels = pixels }; return r; } struct Character char_W() { static int32_t pixels[7*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 7, .h = 7, .pixels = pixels }; return r; } struct Character char_w() { static int32_t pixels[7*6] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 7, .h = 6, .pixels = pixels }; return r; } struct Character char_X() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_x() { static int32_t pixels[7*6] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 7, .h = 6, .pixels = pixels }; return r; } struct Character char_Y() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_y() { static int32_t pixels[6*6] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 }; struct Character r = { .w = 6, .h = 6, .pixels = pixels }; return r; } struct Character char_Z() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_z() { static int32_t pixels[5*6] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 6, .pixels = pixels }; return r; } struct Character char_0() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_1() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_2() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_3() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_4() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_5() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_6() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_7() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_8() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_9() { static int32_t pixels[6*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 6, .h = 7, .pixels = pixels }; return r; } struct Character char_period() { static int32_t pixels[4*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 4, .h = 7, .pixels = pixels }; return r; } struct Character char_comma() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_colon() { static int32_t pixels[4*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 4, .h = 7, .pixels = pixels }; return r; } struct Character char_semicolon() { static int32_t pixels[4*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 }; struct Character r = { .w = 4, .h = 7, .pixels = pixels }; return r; } struct Character char_plus() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_minus() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_equal() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_asterisk() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_slash() { static int32_t pixels[5*7] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_open_paren() { static int32_t pixels[5*7] = { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_close_paren() { static int32_t pixels[5*7] = { 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_open_bracket() { static int32_t pixels[5*7] = { 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_close_bracket() { static int32_t pixels[5*7] = { 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_open_brace() { static int32_t pixels[5*7] = { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } struct Character char_close_brace() { static int32_t pixels[5*7] = { 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }; struct Character r = { .w = 5, .h = 7, .pixels = pixels }; return r; } void default_font_create(struct Character symbols[256]) { symbols['A'] = char_A(); symbols['B'] = char_B(); symbols['C'] = char_C(); symbols['D'] = char_D(); symbols['E'] = char_E(); symbols['F'] = char_F(); symbols['G'] = char_G(); symbols['H'] = char_H(); symbols['I'] = char_I(); symbols['J'] = char_J(); symbols['K'] = char_K(); symbols['L'] = char_L(); symbols['M'] = char_M(); symbols['N'] = char_N(); symbols['O'] = char_O(); symbols['P'] = char_P(); symbols['Q'] = char_Q(); symbols['R'] = char_R(); symbols['S'] = char_S(); symbols['T'] = char_T(); symbols['U'] = char_U(); symbols['V'] = char_V(); symbols['W'] = char_W(); symbols['X'] = char_X(); symbols['Y'] = char_Y(); symbols['Z'] = char_Z(); symbols['a'] = char_a(); symbols['b'] = char_b(); symbols['c'] = char_c(); symbols['d'] = char_d(); symbols['e'] = char_e(); symbols['f'] = char_f(); symbols['g'] = char_g(); symbols['h'] = char_h(); symbols['i'] = char_i(); symbols['j'] = char_j(); symbols['k'] = char_k(); symbols['l'] = char_l(); symbols['m'] = char_m(); symbols['n'] = char_n(); symbols['o'] = char_o(); symbols['p'] = char_p(); symbols['q'] = char_q(); symbols['r'] = char_r(); symbols['s'] = char_s(); symbols['t'] = char_t(); symbols['u'] = char_u(); symbols['v'] = char_v(); symbols['w'] = char_w(); symbols['x'] = char_x(); symbols['y'] = char_y(); symbols['z'] = char_z(); symbols['0'] = char_0(); symbols['1'] = char_1(); symbols['2'] = char_2(); symbols['3'] = char_3(); symbols['4'] = char_4(); symbols['5'] = char_5(); symbols['6'] = char_6(); symbols['7'] = char_7(); symbols['8'] = char_8(); symbols['9'] = char_9(); symbols['.'] = char_period(); symbols[','] = char_comma(); symbols[':'] = char_colon(); symbols[';'] = char_semicolon(); symbols['+'] = char_plus(); symbols['-'] = char_minus(); symbols['*'] = char_asterisk(); symbols['/'] = char_slash(); symbols['='] = char_equal(); symbols['('] = char_open_paren(); symbols[')'] = char_close_paren(); symbols['['] = char_open_bracket(); symbols[']'] = char_close_bracket(); symbols['{'] = char_open_brace(); symbols['}'] = char_close_brace(); }