int super_linear_branching() { int _result; sl_depth = 1; do { _result = march_solve_rec(); if( _result != UNSAT ) return _result; #ifdef TIMEOUT if( (int) clock() > CLOCKS_PER_SEC * TIMEOUT ) return UNKNOWN; #endif pb_reset(); sl_depth++; } while(1); return UNSAT; }
int distribution_branching() { int _result; target_rights = 0; current_rights = 0; current_record = 0; first_time = (float) clock(); do { assert( target_rights <= jump_depth ); #ifdef SUBTREE_SIZE path_length = 1; #endif _result = march_solve_rec(); if( _result != UNSAT ) return _result; #ifdef TIMEOUT if( (int) clock() > CLOCKS_PER_SEC * TIMEOUT ) return UNKNOWN; #endif #ifndef CUT_OFF pb_reset(); #endif target_rights++; current_record = 1; // print_records(); } while( records[1].UNSAT_flag == 0 ); return UNSAT; }
int read_data() { unsigned char buffer[BUFFER_SIZE]; oem4_header_t header; int result, read_len, rd_cnt; unsigned int crc; pushback_reader_t efd; oem4_bestpos_t bestpos; oem4_bestvel_t bestvel; gps_pos_novatel_t gps_pos; gps_vel_novatel_t gps_vel; struct timespec tloc; static int is_init = 0; //in case of read-errors from ser. device this function will be called several times in case of error from main. // if(is_init) { erret(pb_reset(&efd)); } else { erret(pb_init(fd, BUFFER_SIZE*2, &efd)); is_init = 1; } memset(buffer, 0, sizeof(buffer)); memset(&gps_pos, 0, sizeof(gps_pos)); memset(&gps_vel, 0, sizeof(gps_vel)); rd_cnt = 0; result = 0; while(1) { // read sync erret(pb_read(&efd, buffer, (unsigned int *)&read_len, OEM4_SYNC_SIZE)); if(read_len<=0) fprintf(stderr,"read timeout\r\n"); // read enough (3) sync bytes? if (read_len != OEM4_SYNC_SIZE) { // no, pusback what we had read so far and try again... erret(pb_unread(&efd, buffer, read_len)); continue; } // increment counter of read bytes rd_cnt += read_len; // sync found? if (buffer[0] != OEM4_BIN_SYNC_HEADER[0] || buffer[1] != OEM4_BIN_SYNC_HEADER[1] || buffer[2] != OEM4_BIN_SYNC_HEADER[2]) { // search for sync message or part of sync message result = oem4_search_sync(buffer, rd_cnt); // unread everything from the beginning of the sync message // if no (partial) sync message is found, nothing is unread (rd_cnt - result) == 0 erret(pb_unread(&efd, &buffer[result], rd_cnt - result)); // everything is pushed back, therefore nothing is read rd_cnt = 0; continue; } // read head length erret(pb_read(&efd, &buffer[rd_cnt], (unsigned int *)&read_len, 1)); // nothing was read? if (result == 0) { // search for sync message or part of sync message result = oem4_search_sync(buffer, rd_cnt); // push back and try again erret(pb_unread(&efd, &buffer[result], rd_cnt - result)); rd_cnt = 0; continue; } rd_cnt += read_len; // assign header length header.length = buffer[3]; // header too long for the buffer? if(header.length + OEM4_SYNC_SIZE >= BUFFER_SIZE) { // this is a serious error, search for sync result = oem4_search_sync(buffer, rd_cnt); // unread everything from the beginning of the sync message erret(pb_unread(&efd, &buffer[result], rd_cnt - result)); rd_cnt = 0; continue; } // read header, keep in mind that four bytes of the header are allready read erret(pb_read(&efd, &buffer[rd_cnt], (unsigned int *)&read_len, header.length - 4)); // read less than expected? if (read_len != header.length - 4) { // search for sync message or part of sync message result = oem4_search_sync(buffer, rd_cnt + read_len); // push back what we had and try again erret(pb_unread(&efd, &buffer[result], rd_cnt + read_len - result)); rd_cnt = 0; continue; } rd_cnt += read_len; oem4_fill_header(&header, buffer); // data too long for the buffer? if ((header.message_length + header.length + OEM4_SYNC_SIZE + OEM4_CRC_SIZE) >= BUFFER_SIZE) { // this is a serious error, search for sync result = oem4_search_sync(buffer, rd_cnt); // unread everything from the beginning of the sync message erret(pb_unread(&efd, &buffer[result], rd_cnt - result)); rd_cnt = 0; continue; } // read data and CRC erret(pb_read(&efd, &buffer[rd_cnt], (unsigned int *)&read_len, header.message_length + OEM4_CRC_SIZE)); // read less than expected? if (read_len != header.message_length + OEM4_CRC_SIZE) { // this is a serious error, search for sync result = oem4_search_sync(buffer, rd_cnt + read_len); // push back what we had and try again erret(pb_unread(&efd, &buffer[result], rd_cnt + read_len - result)); rd_cnt = 0; continue; } rd_cnt += read_len; crc32_block(buffer, rd_cnt, &crc); // CRC ok? (crc == 0) if (crc) { // this is a serious error, search for sync result = oem4_search_sync(buffer, rd_cnt); // unread everything from the beginning of the sync message erret(pb_unread(&efd, &buffer[result], rd_cnt - result)); rd_cnt = 0; continue; } // decode message switch(header.message_id) { case OEM4_BESTPOS: if (!oem4_get_best_pos(&bestpos, &buffer[header.length], header.message_length)) { #if AR_VERBOSE==1 oem4_dump_best_pos(&bestpos); #endif memcpy(&bestpos.gps_header, &header, sizeof(header)); create_gps_position(&bestpos, &gps_pos); SHM_WriteSlot(config.ishm_pos_out, &gps_pos, sizeof(gps_pos)); clock_gettime(CLOCK_REALTIME, &tloc); if(abs(tloc.tv_sec - gps_pos.gps_time.tv_sec) > 60*60*4 && gps_pos.solution_type>0) clock_settime(CLOCK_REALTIME, &gps_pos.gps_time); } break; case OEM4_BESTVEL: if (!oem4_get_best_vel(&bestvel, &buffer[header.length], header.message_length)) { memcpy(&bestvel.gps_header, &header, sizeof(header)); create_gps_velocity(&bestvel, &gps_vel); SHM_WriteSlot(config.ishm_vel_out, &gps_vel, sizeof(gps_vel)); } break; } rd_cnt = 0; } return 0; }