예제 #1
0
파일: solver.c 프로젝트: xxyzzzq/open-wbo
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;

}
예제 #2
0
파일: solver.c 프로젝트: xxyzzzq/open-wbo
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;

}
예제 #3
0
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;
}