/* Create key-value table mapping set of root nodes to their densities. */ keyvalue_table_ptr shadow_density(shadow_mgr mgr, set_ptr roots) { keyvalue_table_ptr ldensity = NULL; keyvalue_table_ptr ddensity = NULL; keyvalue_table_ptr cdensity = NULL; keyvalue_table_ptr density = NULL; word_t wk, wv1, wv2; if (mgr->do_local) { ldensity = ref_density(mgr->ref_mgr, roots); density = ldensity; } if (mgr->do_dist) { ddensity = dist_density(mgr->ref_mgr, roots); if (!density) density = ddensity; } if (mgr->do_cudd) { cdensity = cudd_density(mgr, roots); if (!density) density = cdensity; } if (ddensity && ddensity != density) { /* Have both local and dist versions */ keyvalue_diff(ddensity, density, word_equal); while (keyvalue_removenext(ddensity, &wk, &wv1)) { ref_t r = (ref_t) wk; char buf[24]; double d1 = w2d(wv1); shadow_show(mgr, r, buf); if (keyvalue_find(density, wk, &wv2)) { double d2 = w2d(wv2); err(false, "Density mismatch for %s. local = %.2f, distance = %.2f", buf, d2, d1); } else { err(false, "Density error for %s. No local entry", buf); } } keyvalue_free(ddensity); } if (cdensity && cdensity != density) { /* Have local or dist, plus cudd */ keyvalue_diff(cdensity, density, word_equal); while (keyvalue_removenext(cdensity, &wk, &wv1)) { ref_t r = (ref_t) wk; char buf[24]; double d1 = w2d(wv1); shadow_show(mgr, r, buf); if (keyvalue_find(density, wk, &wv2)) { double d2 = w2d(wv2); err(false, "Density mismatch for %s. ref = %.2f, cudd = %.2f", buf, d2, d1); } else { err(false, "Density error for %s. No local entry", buf); } } keyvalue_free(cdensity); } return density; }
void operator<< ( std::vector<SPOTriplet> triplets ) { if ( !triplets.size() ) return; for ( auto triplet : triplets ) { if ( program.size() >= stmt_max ) program.pop(); program.push ( triplet ); } #ifdef FEELINGS if ( feelings.size() >= stmt_max ) feelings.pop(); feelings.push ( ql.feeling() ); #endif boost::posix_time::ptime now = boost::posix_time::second_clock::universal_time(); #ifndef CHARACTER_CONSOLE std::string image_file = "samu_vi_"+boost::posix_time::to_simple_string ( now ) +".png"; char * image_file_p = strdup ( image_file.c_str() ); pngwriter image ( 256, 256, 65535, image_file_p ); free ( image_file_p ); #else char console[nrows][ncols]; std::memset ( console, 0, nrows*ncols ); #endif char stmt_buffer[1024]; char *stmt_buffer_p = stmt_buffer; std::queue<SPOTriplet> run = program; #ifdef FEELINGS std::queue<Feeling> feels = feelings; #endif #ifndef Q_LOOKUP_TABLE std::string prg; stmt_counter = 0; #ifdef PYRAMID_VI SPOTriplets pyramid; #endif #ifdef PLACE_VALUE double wbuf[nrows][3]; #endif while ( !run.empty() ) { auto triplet = run.front(); prg += triplet.s.c_str(); prg += triplet.p.c_str(); prg += triplet.o.c_str(); #ifdef PLACE_VALUE // std::cerr << "iter " << triplet.s << "iter " << triplet.p<< "iter " << triplet.o<< std::endl; wbuf[stmt_counter][0] = w2d ( triplet.s ); wbuf[stmt_counter][1] = w2d ( triplet.p ); wbuf[stmt_counter][2] = w2d ( triplet.o ); #endif #ifdef PYRAMID_VI pyramid.push_back ( triplet ); SPOTriplets reverse_pyramid ( pyramid.size() ); std::reverse_copy ( pyramid.begin(), pyramid.end(), reverse_pyramid.begin() ); int cnt {0}; for ( SPOTriplets::iterator it=reverse_pyramid.begin(); it!=reverse_pyramid.end() && cnt < 80; ++it ) //while ( cnt < 80 ) //cnt += std::snprintf ( stmt_buffer+cnt, 1024-cnt, "%s.%s(%s);", triplet.s.c_str(), triplet.p.c_str(), triplet.o.c_str() ); cnt += std::snprintf ( stmt_buffer+cnt, 1024-cnt, "%s.%s(%s);", ( *it ).s.c_str(), ( *it ).p.c_str(), ( *it ).o.c_str() ); #elif JUSTIFY_VI int cnt {0}; while ( cnt < mcols ) cnt += std::snprintf ( stmt_buffer+cnt, 1024-cnt, "%s.%s(%s);", triplet.s.c_str(), triplet.p.c_str(), triplet.o.c_str() ); #else #ifndef FEELINGS #ifdef DRAW_WNUM std::snprintf ( stmt_buffer, 1024, "%s.%s(%s); %f.%f(%f)", triplet.s.c_str(), triplet.p.c_str(), triplet.o.c_str(), w2d ( triplet.s ), w2d ( triplet.p ), w2d ( triplet.o ) ); #else std::snprintf ( stmt_buffer, 1024, "%s.%s(%s);", triplet.s.c_str(), triplet.p.c_str(), triplet.o.c_str() ); #endif #else if ( !feels.empty() ) { auto s = feels.front(); std::stringstream ss; #ifndef FEELINGS ss << triplet.s << "." << triplet.p << "(" << triplet.o << ");"; #else ss << triplet.s << "." << triplet.p << "(" << triplet.o << "); " << w2d ( triplet.s ) << "." << w2d ( triplet.p ) << "(" << w2d ( triplet.o ) << "); "; #endif std::string spo = ss.str(); std::snprintf ( stmt_buffer, 1024, "%-30s %s", spo.c_str(), s.c_str() ); } #endif #endif #ifndef CHARACTER_CONSOLE char font[] = "/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf"; char *font_p = font; image.plot_text_utf8 ( font_p, 11, 5, 256- ( ++stmt_counter ) *28, 0.0, stmt_buffer_p, 0, 0, 0 ); #else std::strncpy ( console[stmt_counter++], stmt_buffer, 80 ); #endif run.pop(); #ifdef FEELINGS feels.pop(); #endif } #ifdef CELL_AUTOMATA char console2[nrows][ncols]; for ( int i {1}; i<nrows-1; ++i ) for ( int j {1}; j<ncols-1; ++j ) console2[i][j] = console[i-1][j]+console[i][j-1]+console[i+1][j]+console[i][j+1]; for ( int i {1}; i<nrows-1; ++i ) for ( int j {1}; j<ncols-1; ++j ) console[i][j] = console2[i][j]; #endif #ifdef PLACE_VALUE double *img_input = new double[nrows*3]; for ( int i {0}; i<nrows; ++i ) { for ( int j {0}; j<3; ++j ) { img_input[i*3+j] = wbuf[i][j]; //std::cerr << "iter " << img_input[i*3+j] << " | "; } //std::cerr << "iter " << std::endl; } #elif CHARACTER_CONSOLE #ifdef FOUR_TIMES double *img_input = new double[2*nrows*2*ncols]; #else double *img_input = new double[nrows*ncols]; #endif #ifdef DISP_CURSES std::stringstream con; #endif for ( int i {0}; i<nrows; ++i ) { #ifdef DISP_CURSES std::string ci; #endif for ( int j {0}; j<ncols; ++j ) { #ifdef FOUR_TIMES img_input[2*i*ncols+2*j] = ( ( double ) console[i][j] ) / 255.0; img_input[2*i*ncols+2*j+1] = ( ( double ) console[i][j] ) / 255.0; img_input[2* ( i+1 ) *ncols+2*j] = ( ( double ) console[i][j] ) / 255.0; img_input[2* ( i+1 ) *ncols+2*j+1] = ( ( double ) console[i][j] ) / 255.0; #else img_input[i*ncols+j] = ( ( double ) console[i][j] ) / 255.0; #endif #ifdef DISP_CURSES //if ( isgraph ( console[i][j] ) ) if ( isprint ( console[i][j] ) ) ci += console[i][j]; #endif } #ifdef DISP_CURSES con << " " << i << ". " << ( ( ci.length() <75 ) ?ci:ci.substr ( 0, 75 ) ) << std::endl; #endif } #ifdef DISP_CURSES #ifndef PRINTING_CHARBYCHAR samu.disp.vi ( con.str() ); #else samu.disp.vi ( &console[0][0] ); #endif #endif #else double *img_input = new double[256*256]; for ( int i {0}; i<256; ++i ) for ( int j {0}; j<256; ++j ) { img_input[i*256+j] = image.dread ( i, j ); } #endif #else std::string prg; while ( !run.empty() ) { auto triplet = run.front(); prg += triplet.s.c_str(); prg += triplet.p.c_str(); prg += triplet.o.c_str(); run.pop(); } #endif auto start = std::chrono::high_resolution_clock::now(); std::cerr << "QL start... "; #ifndef Q_LOOKUP_TABLE SPOTriplet response = ql ( triplets[0], prg, img_input ); std::stringstream resp; resp << samu.name #ifdef QNN_DEBUG << "@" << ( samu.sleep_?"sleep":"awake" ) << "." << ql.get_action_count() << "." << ql.get_action_relevance() << "%" #endif <<"> " << response; std::string r = resp.str(); std::cerr << r << std::endl; #ifdef DISP_CURSES samu.disp.log ( r ); #endif #else std::cerr << ql ( triplets[0], prg ) << std::endl; #endif std::cerr << std::chrono::duration_cast<std::chrono::milliseconds> ( std::chrono::high_resolution_clock::now() - start ).count() << " ms " << std::endl; #ifndef CHARACTER_CONSOLE #ifndef Q_LOOKUP_TABLE delete[] img_input; image.close(); #endif #else #ifndef Q_LOOKUP_TABLE delete[] img_input; #endif #endif }