Пример #1
0
/**
 *
 * Execute the best play
 *
 * */
zet Agent::play(board& b,bool player){
	this->playing_color = player;
	if (lapse(get_generator())){
		std::vector<zet> s = enumerate_moves(b,player); 
		int rn_n = std::uniform_int_distribution<int>(0,s.size()-1)(get_generator());
		FILE_LOG(logDEBUG)<<" * lapsing - returning random move" <<std::endl;
		return s[rn_n];
	}
	std::vector<zet> s = solve(b,player); 
	FILE_LOG(logDEBUG)<<"Playing for player "<<((player==BLACK)?"BLACK":"WHITE")<< " there are "<< s.size() <<" moves" << std::endl;
	FILE_LOG(logDEBUG)<<" board is :" <<b<<std::endl;
	if(s.empty()){
		FILE_LOG(logERROR)<<" board with no moves "<<b <<std::endl;
	}
	assert(!s.empty());
	zet r;
	//std::random_shuffle(s.begin(),s.end());
	if (player == BLACK || is_negamax()){
		r=*std::max_element(s.begin(),s.end(),[](const zet& z1, const zet& z2 ){ return z1.val < z2.val;});
	} else{
		r=*std::min_element(s.begin(),s.end(),[](const zet& z1, const zet& z2 ){ return z1.val < z2.val;});
	}
	FILE_LOG(logDEBUG)<<((player==BLACK)?"BLACK":"WHITE")<<" playes move "<<r.zet_id<<" with value:"<<r.val <<std::endl;
	return r;
}
Пример #2
0
void UCTAgent::init(){
	FILE_LOG(logDEBUG) << " Init UCTAgent. Init Treeagent first "<<std::endl;
	TreeAgent::init();
	if (policy == NULL){
		FILE_LOG(logDEBUG) << " Getting policy code "<<std::endl;
		int policy_code =get_policy_code(); 
		FILE_LOG(logDEBUG) << " Selecting policy "<<policy_code<<std::endl;
		switch(policy_code){
			case 0:
				policy = new RandomPlayout();
				FILE_LOG(logDEBUG) << " Assigned Random policy for uct "<<std::endl;
				break;
			case 1:
				policy = new GeometricRandomPlayout(h);
				FILE_LOG(logDEBUG) << " Assigned GeoRandom policy for uct "<<std::endl;
				break;
			case 2:
				policy = new MyopicPolicyPlayout(h,get_generator(),get_policy_lapse_rate());
				FILE_LOG(logDEBUG) << " Assigned Myopic policy for uct "<<std::endl;
				break;
			case 3:
				policy = new PseudoRandomPlayout();
				FILE_LOG(logDEBUG) << " Assigned PseudoRandomPlayout policy for uct "<<std::endl;
				break;
			default:
				throw std::runtime_error("no policy");
		}
	}
}
Пример #3
0
    /**
     * Generate a uniform random real_t on the interval [0, 1)
     */
    real_t random_uniform()
    {
        std::uniform_real_distribution<real_t> dist =
            std::uniform_real_distribution<real_t>();
        real_t result = dist(*get_generator());

        return result;
    }
Пример #4
0
void Metalink4Writer::write_metalink()
{
    write_text(wxT("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"));
    start(wxT("metalink"));
    add_attr(wxT("xmlns"), wxT("urn:ietf:params:xml:ns:metalink"));
    close_start();
    add_element(wxT("generator"), get_generator());
    const std::vector<MetalinkFile>& files = metalink_.get_files();
    for(std::vector<MetalinkFile>::const_iterator i = files.begin(),
            eoi = files.end(); i != eoi; ++i) {
        write_file(*i);
    }
    end(wxT("metalink"));
}
Пример #5
0
void Metalink3Writer::write_metalink()
{
    write_text(wxString(wxT("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")), true);
    start(wxT("metalink"));
    add_attr(wxT("version"), wxT("3.0"));
    add_attr(wxT("generator"), get_generator());
    add_attr(wxT("xmlns"), wxT("http://www.metalinker.org/"));
    close_start();
    start(wxT("files"));
    close_start();
    const std::vector<MetalinkFile>& files = metalink_.get_files();
    for(std::vector<MetalinkFile>::const_iterator i = files.begin(),
            eoi = files.end(); i != eoi; ++i) {
        write_file(*i);
    }
    end(wxT("files"));
    end(wxT("metalink"));
}
Пример #6
0
 /**
  * Generate a uniform random real_t from N(0, 1)
  */
 real_t random_gaussian()
 {
     std::normal_distribution<real_t> dist =
         std::normal_distribution<real_t>();
     return dist(*get_generator());
 }
Пример #7
0
 /**
  * Generate a uniformly random integer between 0 (incl) and n (excl)
  */
 int random_int(int n){
     std::uniform_int_distribution<> dist(0, n-1);
     return dist(*get_generator());
 }
Пример #8
0
typename DistType::result_type gen() { return m_dist(get_generator()); }
Пример #9
0
/**
 * Select a random move 
 */
uint64 Agent::select_random_move(std::vector<zet> &moves){
	return moves[get_generator()() % moves.size()].zet_id; //TODO: uniform_distribution
}
int main(int argc, const char* argv[])
{
    argc--;
    argv++;
    srand (time(NULL));
    
    db_ranking db;
    
    int change_rate = 10;
    if ( argc > 1 ){
        sscanf(argv[1], "%d", &change_rate);
    }
    
    diagnosis_phase_detector::phase phases[4] = {
        diagnosis_phase_detector::diagnosis_plain,
        diagnosis_phase_detector::diagnosis_green,
        diagnosis_phase_detector::diagnosis_hinselmann,
        diagnosis_phase_detector::diagnosis_schiller
    };
    
    map<diagnosis_phase_detector::phase, string> names;
    names[diagnosis_phase_detector::diagnosis_plain] = "plain";
    names[diagnosis_phase_detector::diagnosis_green] = "green";
    names[diagnosis_phase_detector::diagnosis_hinselmann] = "hinselmann";
    names[diagnosis_phase_detector::diagnosis_schiller] = "schiller";
    
    int current_phase_index = 0;
    diagnosis_phase_detector::phase cphase = phases[current_phase_index];
    
    // Parse the videos specified in the input file
    ifstream fin(argv[0]);
    string next_seq;
    //int counter = 5;
    int vindex = 0;
    
    while ( getline(fin, next_seq) != 0 /*&& counter-- > 0*/ ){
        cout << next_seq << endl;
        // Filaname
        filenames.push_back(next_seq);
        
        // Index
        v_index.push_back(db.get_video_index(next_seq));
        
        // Sequence of frames
        map<diagnosis_phase_detector::phase, vector<int> > next_frames;
        get_sequence(next_seq.c_str(), next_frames); 
        frames.push_back(next_frames);
        
        // Frame generator
        map<diagnosis_phase_detector::phase, layer_generator> next_generator;
        get_generator(next_frames, next_generator);
        generators.push_back(next_generator);
        
        // Annotated instance
        anonadado::instance* next_instance = new anonadado::instance();
        next_instance->read(next_seq.c_str());
        instances.push_back(next_instance);
        cout << "Video " << vindex++ << " done." << endl;
    }
    
    fin.close();
    
    bool has = true;
    bool exit = false;
    bool go_to_next_phase = false;
    
    while ( !exit && has ){
        int remaining = change_rate;
        go_to_next_phase = false;
        cout << "\n\n\n NEEEEXT!\n\n\n";
        cout << current_phase_index << " " << cphase << endl;
        cout << endl << endl;
        
        for ( int level = 0; has && !exit && !go_to_next_phase; level++ )
        {
            cout << "LEVEL " << level << endl;
            //boost::this_thread::sleep( boost::posix_time::seconds(1) );
            
            vector< pair<int, pair< pair<int, int>,
                                    pair<int, int>
                                  >
                        >
                  > pairs;
            
            // Generate pairs <(video, frame), (video, frame)> for this level
            for ( size_t va = 0; va < instances.size(); va++ ){
                vector<int> framesl_a;
                generators[va][cphase].get_next(framesl_a, level);
                
                for ( size_t fa = 0; fa < framesl_a.size(); fa++){
                    for ( size_t vb = 0; vb < va; vb++ ){
                        vector<int> framesl_b;
                        generators[vb][cphase].get_next(framesl_b, level);
                        
                        for ( size_t fb = 0; fb < framesl_b.size(); fb++ ){
                            if ( va == vb && framesl_a[fa] == framesl_b[fb] ){
                                continue;
                            }

                            int priority = 
                                min(db.num_annotated_frames(v_index[va]),
                                    db.num_annotated_frames(v_index[vb]));

                            pairs.push_back(
                                make_pair(priority,
                                          make_pair(make_pair(va,
                                                              framesl_a[fa]),
                                                    make_pair(vb,
                                                              framesl_b[fb])
                                                   )
                                         )
                            );
                        }
                    }
                }
            }
            
            if ( pairs.size() == 0 ){
                has = false;
                break;
            } else {
                has = true;
            }
            
            // Randomly sort these pairs
            vector<int> change_priorities;
            sort(pairs.begin(), pairs.end());
            
            change_priorities.push_back(0);
            for (size_t i = 1; i < pairs.size(); i++){
                if ( pairs[i].first != pairs[i - 1].first ){
                    change_priorities.push_back(i);
                }
            }
            change_priorities.push_back(pairs.size());
            
            for (size_t i = 0; i + 1 < change_priorities.size(); i++){
                random_shuffle(pairs.begin() + change_priorities[i],
                               pairs.begin() + change_priorities[i + 1]);
            }

            // Eval these pairs
            for ( size_t i = 0; i < pairs.size() && !go_to_next_phase; i++ ){
                int va = pairs[i].second.first.first;
                int fa = pairs[i].second.first.second;
                
                int vb = pairs[i].second.second.first;
                int fb = pairs[i].second.second.second;
                
                cout << filenames[va] << " " << filenames[vb] << endl;
                cout << "(" << va << ":" << fa << ") "
                     << "(" << vb << ":" << fb << ") " << endl;
                
                if ( db.exists(cphase,
                               v_index[va], frames[va][cphase][fa],
                               v_index[vb], frames[vb][cphase][fb])
                   )
                {
                    continue;
                }
                
                better = -1;
                bool save = true;
                
                while ( true ){
                    Mat a, b, dst;
                    instances[va]->get_frame(frames[va][cphase][fa], a);
                    instances[vb]->get_frame(frames[vb][cphase][fb], b);
                    draw_ui(a, b, dst);
                    
                    imshow(names[cphase], dst);
                    
                    int key = waitKey(0) % 0x100;
                    if ( key == 81 ){
                        better = 1;
                    } else if ( key == 83 ){
                        better = 0;
                    } else if ( key == 32 ){
                        break;
                    } else if ( key == 27 ){
                        exit = true;
                        has = false;
                        break;
                    } else if ( key == 115 ){       // Skip
                       save = false;
                       break;
                    } else {
                        better = -1;
                    }
                }
                
                if ( exit ){
                    break;
                }
                
                // Save the annotation
                if ( save ){
                    db.insert_annotation(cphase,
                                         v_index[va], frames[va][cphase][fa],
                                         v_index[vb], frames[vb][cphase][fb],
                                         better);
                }
                
                cout << "remaining " << remaining << endl;
                
                remaining--;
                if ( remaining <= 0 ){
                    go_to_next_phase = true;
                    break;
                }
            }
        }
        cout << "go to next\n";
        cvDestroyWindow(names[cphase].c_str());
        current_phase_index = (current_phase_index + 1) % 4;
        cphase = phases[current_phase_index];
        
    }
    
    cout << "Bye!\n";
    return 0;
}