Ejemplo n.º 1
0
static _rs_inline obj long_mul( INT_64 a, INT_64 b )
{
    int am, bm;
    if((am = search_one(a))<0 ||
            (bm = search_one(b))<0)
        return ZERO;
    if(am + bm <= 63)
        return int_64_compact( int_64_mul(a,b) );
    return bignum_mul(int64_to_bignum(a), int64_to_bignum(b));
}
Ejemplo n.º 2
0
static obj long_ashl(INT_64 a, INT_32 b)
{
    int am;
    if((am = search_one(a)) < 0)
        return ZERO;
    if(am + b < 63)
        return int_64_compact(int_64_shl(a, b));
    return bignum_shl(int64_to_bignum(a), b);
}
bool Search_OS<RETURNTYPE,DIMTYPE,SUBSET,CRITERION,EVALUATOR>::search(const DIMTYPE target_d, RETURNTYPE &result, const PSubset sub, const PCriterion crit, std::ostream& os) // returns found subset + criterion value
{
	// NOTE: certain parameter combinations (initial sub->get_d() versus _delta versus target_d versus parent::_generalization_level) 
	//       make it impossible to yield a valid solution. In such case search() just returns false
	StopWatch swatch;
	if(parent::_evaluator) parent::_evaluator->set_output_detail(grandparent::get_output_detail()); else throw FST::fst_error("Search_Sequential: Missing evaluator.");
	track=grandparent::result_tracker_active(); if(track) grandparent::_tracker->set_output_detail(grandparent::get_output_detail());
	assert(sub);
	assert(crit);
	assert(sub->get_n()>0);
	assert(target_d>=0 && target_d<sub->get_n());
	assert(parent::get_generalization_level()>=1 && parent::get_generalization_level()<=sub->get_n());

	if(!parent::initial_subset_enabled()) sub->deselect_all();

	if( (_delta<parent::get_generalization_level()) ) return false; // impossible to run the search

	if(grandparent::output_normal()) {
		std::ostringstream sos; 
		sos << "---------------------------------------" << std::endl;
		sos << "Starting " << *this << std::endl;
		sos << "with Criterion: " << *crit << std::endl;
		sos << "with initial subset: " << *sub << std::endl;
		if(target_d==0) sos << "Subset size to be optimized." << std::endl; else sos << "Target subset size set to: " << target_d << std::endl;
		sos << std::endl << std::flush;
		syncout::print(os,sos);
	}

	PSearchBIF bif;
	DIMTYPE _n=sub->get_n();

	if(target_d==0) { // evaluate all subset sizes
		if(!inisub || inisub->get_n()!=_n) inisub.reset(new SUBSET(_n));
		if(!tmpsub || tmpsub->get_n()!=_n) tmpsub.reset(new SUBSET(_n));
		RETURNTYPE value;
		if(!bif) {
			bif.reset(new SearchBIF());
			if(!bif->evaluate_individuals(_n, crit, os)) return false;
		}
		inisub->stateless_copy(*sub);
		for(DIMTYPE d=1;d<=_n;d++) {
			tmpsub->stateless_copy(*inisub);
			if(!adjust_initial_subset(d,tmpsub,bif,os)) return false;
			if(d<_n) {if(!search_one(value,tmpsub,crit,os)) return false;} else {if(!crit->evaluate(value,tmpsub)) return false;}
			if(d==1 || value>result) {
				result=value;
				sub->stateless_copy(*tmpsub);
				if(grandparent::output_normal()) {std::ostringstream sos; sos << "NEW MAXVAL (d="<<d<<") ="<<result<<", " << *sub << std::endl << swatch << std::endl << std::endl << std::flush; syncout::print(os,sos);}
			} else
				if(grandparent::output_normal()) {std::ostringstream sos; sos << "result (d="<<d<<") ="<<value<<", " << *tmpsub << std::endl << std::endl << std::flush; syncout::print(os,sos);}
		}
	} else { // evaluate subset of target_d features
		if(sub->get_d()!=target_d) {
			if(!bif) {
				bif.reset(new SearchBIF);
				if(!bif->evaluate_individuals(_n,crit,os)) return false;
			}
			if(!adjust_initial_subset(target_d,sub,bif,os)) return false;
		}
		if(!search_one(result,sub,crit,os)) return false;
	}
	if(grandparent::output_normal()) {
		std::ostringstream sos; 
		sos << "......................................." << std::endl;
		sos << "Search_OS() search finished. " << swatch << std::endl;
		sos << "Search result: "<< std::endl << *sub << std::endl << "Criterion value: " << result << std::endl << std::endl << std::flush;
		syncout::print(os,sos);
	}
	return true;
}