Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: sharing thoughts about general search code

Author: Daniel Shawul

Date: 06:13:03 04/02/04

Go up one level in this thread


On April 02, 2004 at 04:31:58, Vasik Rajlich wrote:

>On April 01, 2004 at 21:33:00, Uri Blass wrote:
>
>>I decided that there is probably no hope that movei will become commercial with
>>all the competition of smart people like Tord(and in any case sharing ideas is
>>not going to reduce the chances that it is going to happen) so I decided to
>>share my thoughts about searching that I still do not use in movei.
>>
>>I want to have some general search code(not only for chess) when it will be
>>possible to implement failsoft,failhard,mtd and many search ideas by the right
>>defines.
>>
>>I still do not have defines for different possibilities but I decided to post
>>the following heavy commented code that is based on ideas that I thought about
>>search but I do not use most of the ideas that are in this code for movei.
>>
>>I hope that other people will help me to make this code more general to allow
>>also ideas like mtd if the right things are defines and to change things to have
>>fail hard and fail soft and to add general code for the iterate function and the
>>hash functions.
>>
>>The idea is that there is going to be some general search code not only for
>>chess that every programmer will be able to use as a basis.
>>
>>part of the procedures or the functions may be empty in the first versions or
>>return a constant(for example in case that the program does not use iid it may
>>have return infinite in the function that calculate if to use iid.
>>
>>int Search(int depth,int alpha,int beta,int verify)
>>{
>>   int last,Newdepth,val;
>>   int first_alpha=alpha;
>>   int iidfirst=first_move[ply];
>>   int valmax=alpha;
>>   /*there is a move stack similiar to a lot of programs
>>     we always have first_move[0]=0 and first_move[i] ro be sum of perft 1 in
>>the positions in the line that leaded
>>     to the position.*/
>>
>>   int i=first_move[ply];
>>   int reduction;
>>   /*the function gen generates legal moves*/
>>    gen();
>>
>>
>>	last=first_move[ply+1];
>>	/*last-i is the number of moves of the side to move
>>
>>	hash did not help to prune and the same for null move so now you need to do
>>internal iterative deepening
>>	to find first move to search in the right conditions*/
>>	reduction=iid_reduction(depth,alpha);
>>	if (depth>reduction)
>>	{
>>		/*it is important to start with the right move
>>		do search to reduced depth to find a move and stop when a move generate
>>cutoff*/
>>		while (i<last)
>>		{
>>			makemove(gen_dat[i].m);
>>			val=-Search(depth-reduction,-beta,-valmax,verify);
>>			undomove();
>>			if (val>valmax)
>>			{
>>				valmax=val;
>>				iidfirst=i;
>>			}
>>			if (val>beta)
>>				break;
>>
>>		}
>>		replace_move_data(i,valmax);
>>		i=first_move[ply];
>>	}
>>
>>    while (i<last)
>>	{
>>		/*probability_to_fail_high_too_small also consider the previous moves
>>		if for example good captures were already searched then I may decide based on
>>evaluation and depth that
>>		probability to fail high is too small and return alpha but in previous move I
>>did not know it because
>>		I still hoped that the score will be above alpha
>>		both good_chance_to_fail_high and probability_to_fail_high_too_small may use a
>>function that evaluate probability
>>		but I do not suggest to call a function that evaluate probability because it
>>may be cheaper to do some lazy evaluation
>>		and not to evaluate exact probability in order to know if the probability is
>>too small and only if the lazy evaluation
>>		fails to calculate exact probability*/
>>		if (probability_to_fail_high_too_small(depth,alpha))
>>			return alpha;
>>		/*the function sortmove find the next move to search and put it in place i in
>>the global move stack
>>		it is logical to spend more time if the depth is bigger
>>		so the function gets not only the number of move in the move stack but also
>>the depth*/
>>
>>		sortmove(i,depth);
>>		/*it is possible that I cannot decide for all moves that there is no chance
>>that they will fail high
>>		but I may decide for the next move that it is not going to fail high
>>		I expect the function to say yes very fast in most cases and the only cases
>>when I expect no chance for
>>		the move to fail high is when the move is quiet move and the evaluation enough
>>below alpha*/
>>		if (chance_fail_high_this_move(depth,alpha,i))
>>		{
>>			makemove(gen_dat[i].m);
>>			/*first we check for draw by repetition or by endgame*/
>>			if (TryDraw())
>>				return 0;
>>			/*now we calculate the extensions so we can use later the hash tables to
>>decide if to prune the move*/
>>			Newdepth=depth+extensions();
>>			if (TryHashTables(Newdepth)>=beta)
>>				return beta;
>>			/*I will also try ETC here in case that the depth is big enough by generating
>>all moves and
>>			I need to write code for it*/
>>			if (nullconditions(depth))
>>			{
>>				reduction=calculate_null_reduction();
>>				donullmove();
>>				gen();
>>				/*starting_q_search_depth is simply a parameter that I give qsearch in the
>>beginning and I need it because
>>				I search different in different plies of the qsearch*/
>>				if (reduction<Newdepth)
>>					val=-Search(Newdepth-reduction,-beta,-beta+1,verify);
>>				else
>>					val=-Quies(-beta,-beta+1,starting_q_search_depth);
>>				undonullmove();
>>				if (val>=beta)
>>				{
>>					if (verify==1)
>>					{
>>						depth--;
>>						verify=0;
>>					}
>>					else
>>						return val;
>>				}
>>			}
>>			if (depth <= 0)
>>			{
>>				gen();
>>				return -Quies(-beta,-alpha,starting_q_search_depth);
>>			}
>>			else
>>			{
>>				if (depth>small_depth)
>>				{
>>					/*evalprobability search every legal move to depth-small_depth in order to
>>give exact evaluation
>>					that is going to be used for evaluating probabilities for every move to be
>>best
>>					when the probabilities are going to be used to decide later about
>>reductions or extensions
>>					and singular extension may be a private case
>>					I also think about having updateprobability function that update
>>probabilities for all moves
>>					when I call it only when the remaining depth is big enough.
>>
>>					I think also to store in the hash tables relatively small tree with
>>probabilities when I update
>>					the probabilities in all the nodes of that tree every time that I get new
>>information like changing
>>					the root score or fail high or fail low when the depth is big enough.*/
>>
>>					evalprobability(depth);
>>				}
>>				/*in cases of reduction I want to investigate later only in case of
>>unexpected fail high
>>				Reduction_Condition happens when the probability was not small enough to
>>prune but still small*/
>>				if (Reduction_Conditions())
>>				{
>>					val=-Search(Newdepth-PLY-Ply_Reduction(),-beta,-alpha,verify);
>>					if (val>alpha)
>>						val=-Search(Newdepth - PLY, -beta, -alpha,verify);
>>
>>				}
>>				else
>>				val = -Search(Newdepth - PLY, -beta, -alpha,verify);
>>			}
>>			undomove();
>>			if (val >= beta)
>>				return beta;
>>			if (val > alpha)
>>				alpha = val;
>>		}
>>		i++;
>>
>>    }
>>    return alpha;
>>
>>
>>}
>
>Hi Uri,
>
>One general comment: I've also had the idea to do both MTD (f) and PVS. Now I
>realize that this is not feasible. Too many things are different.
>
>The same holds true for a number of issues. Are you going to be essentially
>selective, or essentially brute force? Are you going to be fast, or intelligent?
>
>It makes sense to experiment a bit when you are starting, but I think you're
>past that point.

whether a starter or not,expermenting won't hurt.
Infact,i would like to have optional MTD(f) in my programme.

daniel
>
>Good luck.
>
>Vas



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.