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)); }
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; }