1090 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			1090 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								/***************************************************************************************************
							 | 
						||
| 
								 | 
							
								  MCLPADS
							 | 
						||
| 
								 | 
							
									http://www.di.uniba.it/~ndm/mclpads/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Copyright (c) 2013 University of Bari "Aldo Moro"
							 | 
						||
| 
								 | 
							
								  Author: Nicola Di Mauro                                                 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									**************************************************************************************************
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									This code is part of the SLIPCOVER code https://sites.google.com/a/unife.it/ml/slipcover
							 | 
						||
| 
								 | 
							
									Copyright (c) 2011, Fabrizio Riguzzi and Elena Bellodi
							 | 
						||
| 
								 | 
							
									Parts of this code are thaken from the SLIPCOVER source code
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									***************************************************************************************************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  The MCLPADS Software is made available under the terms and conditions of the Artistic License 2.0.
							 | 
						||
| 
								 | 
							
									LICENSEE shall acknowledge University of Bari "Aldo Moro" as the provider of the Software. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								***************************************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- include(slipcover_lemur).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**************************************
							 | 
						||
| 
								 | 
							
									 __BEGIN__
							 | 
						||
| 
								 | 
							
									 New source code for MCLPADS
							 | 
						||
| 
								 | 
							
								 **************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%setting(mcts_max_depth,8).
							 | 
						||
| 
								 | 
							
								%setting(mcts_c,0.7). /* see L. Kocsis, C. Szepesvri, and J. Willemson, "Improved Monte-Carlo Search", 2006 */
							 | 
						||
| 
								 | 
							
								%setting(mcts_iter,100).
							 | 
						||
| 
								 | 
							
								setting(mcts_beamsize,3).
							 | 
						||
| 
								 | 
							
								setting(mcts_visits,+inf).
							 | 
						||
| 
								 | 
							
								%setting(max_rules,6).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								setting(max_var,4).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mcts(File,ParDepth,ParC,ParIter,ParRules,Covering):-
							 | 
						||
| 
								 | 
							
									assert(setting(mcts_max_depth,ParDepth)),
							 | 
						||
| 
								 | 
							
									assert(setting(mcts_c,ParC)),
							 | 
						||
| 
								 | 
							
									assert(setting(mcts_iter,ParIter)),
							 | 
						||
| 
								 | 
							
									assert(setting(mcts_covering,Covering)),
							 | 
						||
| 
								 | 
							
									( Covering = true ->
							 | 
						||
| 
								 | 
							
										assert(setting(max_rules,1)),
							 | 
						||
| 
								 | 
							
										assert(setting(mcts_maxrestarts,ParRules))
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										assert(setting(max_rules,ParRules))
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
								  setting(seed,Seed),
							 | 
						||
| 
								 | 
							
								  setrand(Seed),
							 | 
						||
| 
								 | 
							
									format("\nMonte Carlo Tree Search for LPAD Structure Learning\n",[]),
							 | 
						||
| 
								 | 
							
									generate_file_names(File,FileKB,FileIn,FileBG,FileOut,FileL),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									name(File,FileDot),
							 | 
						||
| 
								 | 
							
								  append(FileDot,".dot",FileDotExt),
							 | 
						||
| 
								 | 
							
								  name(FileExt,FileDotExt),
							 | 
						||
| 
								 | 
							
									assert(filedot(FileExt)),
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									reconsult(FileL),
							 | 
						||
| 
								 | 
							
									load_models(FileKB,DB),	
							 | 
						||
| 
								 | 
							
									statistics(walltime,[_,_]),	
							 | 
						||
| 
								 | 
							
									(file_exists(FileBG)->
							 | 
						||
| 
								 | 
							
									 set(compiling,on),
							 | 
						||
| 
								 | 
							
									 load(FileBG,_ThBG,RBG),
							 | 
						||
| 
								 | 
							
									 set(compiling,off),
							 | 
						||
| 
								 | 
							
									 generate_clauses(RBG,_RBG1,0,[],ThBG), 
							 | 
						||
| 
								 | 
							
									 assert_all(ThBG)
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 true
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
								  (file_exists(FileIn)->
							 | 
						||
| 
								 | 
							
								    set(compiling,on),
							 | 
						||
| 
								 | 
							
								    load(FileIn,_Th1,R1),
							 | 
						||
| 
								 | 
							
								    set(compiling,off)
							 | 
						||
| 
								 | 
							
								  ;
							 | 
						||
| 
								 | 
							
									 get_head_atoms(LHM,_LH0),
							 | 
						||
| 
								 | 
							
									 generate_top_cl(LHM,R1)
							 | 
						||
| 
								 | 
							
								  ),
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								%	write('Initial theory'),nl,
							 | 
						||
| 
								 | 
							
								%	write_rules(R1,user_output),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  findall(BL , modeb(_,BL), BLS0),
							 | 
						||
| 
								 | 
							
									sort(BLS0,BSL),
							 | 
						||
| 
								 | 
							
									assert(mcts_modeb(BSL)),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									assert(mcts_restart(1)),
							 | 
						||
| 
								 | 
							
									learn_struct_mcts(DB,R1,R2,CLL2),
							 | 
						||
| 
								 | 
							
									retract(mcts_restart(_)),
							 | 
						||
| 
								 | 
							
									learn_params(DB,R2,R,CLL),  
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									statistics(walltime,[_,WT]),
							 | 
						||
| 
								 | 
							
									WTS is WT/1000,
							 | 
						||
| 
								 | 
							
								  format("~nRefinement CLL  ~f - CLL after EMBLEM ~f~n",[CLL2,CLL]),
							 | 
						||
| 
								 | 
							
								  format("Total execution time ~f~n~n",[WTS]),
							 | 
						||
| 
								 | 
							
									write_rules(R,user_output),
							 | 
						||
| 
								 | 
							
									listing(setting/2),
							 | 
						||
| 
								 | 
							
									format("Model:~n",[]),
							 | 
						||
| 
								 | 
							
									open(FileOut,write,Stream),
							 | 
						||
| 
								 | 
							
									format(Stream,"/* MCTS Final CLL(da prolog) ~f~n",[CLL]),
							 | 
						||
| 
								 | 
							
									format(Stream,"Execution time ~f~n",[WTS]),
							 | 
						||
| 
								 | 
							
									tell(Stream),	
							 | 
						||
| 
								 | 
							
									listing(setting/2),
							 | 
						||
| 
								 | 
							
									format(Stream,"*/~n~n",[]),
							 | 
						||
| 
								 | 
							
									told, 
							 | 
						||
| 
								 | 
							
									open(FileOut,append,Stream1),
							 | 
						||
| 
								 | 
							
									write_rules(R,Stream1),
							 | 
						||
| 
								 | 
							
									close(Stream1).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								learn_struct_mcts(DB,R1,R,CLL1):-  
							 | 
						||
| 
								 | 
							
									generate_clauses(R1,R2,0,[],Th1), 
							 | 
						||
| 
								 | 
							
									assert_all(Th1),  
							 | 
						||
| 
								 | 
							
									assert_all(R2),
							 | 
						||
| 
								 | 
							
									!,
							 | 
						||
| 
								 | 
							
									findall(R-HN,(rule(R,HL,_BL,_Lit),length(HL,HN)),L),  
							 | 
						||
| 
								 | 
							
									keysort(L,LS),
							 | 
						||
| 
								 | 
							
									get_heads(LS,LSH),  
							 | 
						||
| 
								 | 
							
									length(LSH,NR),   
							 | 
						||
| 
								 | 
							
									init(NR,LSH),
							 | 
						||
| 
								 | 
							
									retractall(v(_,_,_)),
							 | 
						||
| 
								 | 
							
									length(DB,NEx),  
							 | 
						||
| 
								 | 
							
									(setting(examples,atoms) ->
							 | 
						||
| 
								 | 
							
									 setting(group,G),	
							 | 
						||
| 
								 | 
							
									 derive_bdd_nodes_groupatoms(DB,NEx,G,[],Nodes,0,CLL0,LE,[]),
							 | 
						||
| 
								 | 
							
									 ! 
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 derive_bdd_nodes(DB,NEx,[],Nodes,0,CLL0),
							 | 
						||
| 
								 | 
							
									 ! 
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									setting(random_restarts_number,N),
							 | 
						||
| 
								 | 
							
									format("~nInitial CLL ~f~n~n",[CLL0]),
							 | 
						||
| 
								 | 
							
									random_restarts(N,Nodes,CLL0,CLL,initial,Par,LE), 
							 | 
						||
| 
								 | 
							
								  format("CLL after EMBLEM = ~f~n",[CLL]),
							 | 
						||
| 
								 | 
							
									retract_all(Th1),
							 | 
						||
| 
								 | 
							
									retract_all(R2),
							 | 
						||
| 
								 | 
							
									!,
							 | 
						||
| 
								 | 
							
									end, 
							 | 
						||
| 
								 | 
							
									update_theory(R2,Par,R3), 
							 | 
						||
| 
								 | 
							
									write('updated Theory'),nl,
							 | 
						||
| 
								 | 
							
									write_rules(R3,user_output),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									assert(mcts_best_score(CLL)),
							 | 
						||
| 
								 | 
							
									assert(mcts_best_theory(R3)),
							 | 
						||
| 
								 | 
							
									assert(mcts_theories(0)),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									assert(mcts_best_theories_iteration([])),	
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									mcts(R3,CLL,DB),
							 | 
						||
| 
								 | 
							
								%	assert(mcts_best_by_cll(-inf)),
							 | 
						||
| 
								 | 
							
								%	assert(mcts_best_theory_by_cll([])),
							 | 
						||
| 
								 | 
							
								%	assert(mcts_best_by_visits(-inf)),
							 | 
						||
| 
								 | 
							
								%	select_the_best_bycll,
							 | 
						||
| 
								 | 
							
								%	select_the_best_byvisits,	
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									retract(mcts_best_theories_iteration(BestsIter)),
							 | 
						||
| 
								 | 
							
									format("\nBests found at : ~w",[BestsIter]),
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									retract(mcts_theories(_)),
							 | 
						||
| 
								 | 
							
									retract(mcts_best_score(CLLNew)),
							 | 
						||
| 
								 | 
							
									retract(mcts_best_theory(RNew)),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									( setting(mcts_covering,true) ->
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										setting(mcts_maxrestarts,MctsRestarts),
							 | 
						||
| 
								 | 
							
										mcts_restart(CurrentRestart),
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
										Improvement is CLLNew - CLL,
							 | 
						||
| 
								 | 
							
										( (CLLNew > CLL, Improvement > 0.1, CurrentRestart =< MctsRestarts) ->
							 | 
						||
| 
								 | 
							
									 
							 | 
						||
| 
								 | 
							
											format("\n---------------- Improvement ~w",[Improvement]),
							 | 
						||
| 
								 | 
							
											retractall(node(_, _, _, _, _, _, _)),
							 | 
						||
| 
								 | 
							
											retract(setting(max_rules,ParRules)),
							 | 
						||
| 
								 | 
							
											ParRules1 is ParRules + 1,
							 | 
						||
| 
								 | 
							
											assert(setting(max_rules,ParRules1)),
							 | 
						||
| 
								 | 
							
											retract(mcts_restart(Restart)),
							 | 
						||
| 
								 | 
							
											Restart1 is Restart + 1,
							 | 
						||
| 
								 | 
							
											assert(mcts_restart(Restart1)),	 
							 | 
						||
| 
								 | 
							
											learn_struct_mcts(DB,RNew,R,CLL1)
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
											CLL1 = CLLNew,
							 | 
						||
| 
								 | 
							
											R = RNew
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										CLL1 = CLLNew,
							 | 
						||
| 
								 | 
							
										R = RNew
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
												 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
									retract(mcts_best_by_cll(CLL1)),
							 | 
						||
| 
								 | 
							
								%	retract(mcts_best_theory_by_visits(_)),
							 | 
						||
| 
								 | 
							
									retract(mcts_best_theory_by_cll(R)).
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
								select_the_best_bycll:-
							 | 
						||
| 
								 | 
							
									node(_, _, _, CLL, Theory, VISITED, BACKSCORE),
							 | 
						||
| 
								 | 
							
									( VISITED >= 0 ->
							 | 
						||
| 
								 | 
							
										mcts_best_by_cll(BS),
							 | 
						||
| 
								 | 
							
										Score is CLL,
							 | 
						||
| 
								 | 
							
										( Score =< 0, Score >= BS ->
							 | 
						||
| 
								 | 
							
											format("\n Best Theory ~w\n\t Backscore ~w\n\t Visits ~w\n\t CLL ~w",[Theory,BACKSCORE,VISITED,CLL]),
							 | 
						||
| 
								 | 
							
											retract(mcts_best_by_cll(_)),
							 | 
						||
| 
								 | 
							
											assert(mcts_best_by_cll(Score)),
							 | 
						||
| 
								 | 
							
											retract(mcts_best_theory_by_cll(_)),
							 | 
						||
| 
								 | 
							
											assert(mcts_best_theory_by_cll(Theory))
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
											true
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										true
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									fail.
							 | 
						||
| 
								 | 
							
								select_the_best_bycll.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select_the_best_byvisits:-
							 | 
						||
| 
								 | 
							
									node(_, _, _, CLL, Theory, VISITED, BACKSCORE),
							 | 
						||
| 
								 | 
							
									( VISITED >= 0 ->
							 | 
						||
| 
								 | 
							
										mcts_best_by_visits(BS),
							 | 
						||
| 
								 | 
							
										Score is VISITED,
							 | 
						||
| 
								 | 
							
										( Score >= BS ->
							 | 
						||
| 
								 | 
							
											format("\n Best Theory ~w\n\t Backscore ~w\n\t Visits ~w\n\t CLL ~w",[Theory,BACKSCORE,VISITED,CLL]),
							 | 
						||
| 
								 | 
							
											retract(mcts_best_by_visits(_)),
							 | 
						||
| 
								 | 
							
											assert(mcts_best_by_visits(Score))
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
											true
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										true
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									fail.
							 | 
						||
| 
								 | 
							
								select_the_best_byvisits.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mcts(InitialTheory,InitialScore,DB):-
							 | 
						||
| 
								 | 
							
									% node(ID, CHILDRENS, PARENT, CLL, Theory, VISITED, BACKSCORE)
							 | 
						||
| 
								 | 
							
									assert(node(1, [], 0, InitialScore , InitialTheory, 0 , 0)),
							 | 
						||
| 
								 | 
							
									assert(lastid(1)),
							 | 
						||
| 
								 | 
							
									setting(mcts_iter,I),
							 | 
						||
| 
								 | 
							
									assert(mcts_iteration(0)),
							 | 
						||
| 
								 | 
							
									cycle_mcts(I,DB),
							 | 
						||
| 
								 | 
							
									retract(mcts_iteration(_)),
							 | 
						||
| 
								 | 
							
									retract(lastid(Nodes)),
							 | 
						||
| 
								 | 
							
									print_graph,	
							 | 
						||
| 
								 | 
							
									format("\nTree size: ~w nodes.",[Nodes]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								print_graph:-
							 | 
						||
| 
								 | 
							
									filedot(FileDot),
							 | 
						||
| 
								 | 
							
									open(FileDot,write,S),
							 | 
						||
| 
								 | 
							
									format(S,"digraph UCT{\n",[]),
							 | 
						||
| 
								 | 
							
									format(S,"graph [splines=line];\n",[]),
							 | 
						||
| 
								 | 
							
									format(S,"edge [dir=\"none\"];\n",[]),
							 | 
						||
| 
								 | 
							
									format(S,"node [style=\"filled\",label=\"\",shape=point];\n",[]),
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									print_graph([1],S),
							 | 
						||
| 
								 | 
							
									format(S,"}",[]),
							 | 
						||
| 
								 | 
							
									close(S).
							 | 
						||
| 
								 | 
							
								print_graph([],S).
							 | 
						||
| 
								 | 
							
								print_graph([ID|R],S):-
							 | 
						||
| 
								 | 
							
									node(ID, Childs, Parent , CLL, Theory, Visited, Backscore),
							 | 
						||
| 
								 | 
							
									print_edges(ID,Childs,S),
							 | 
						||
| 
								 | 
							
									print_graph(R,S),
							 | 
						||
| 
								 | 
							
									print_graph(Childs,S).
							 | 
						||
| 
								 | 
							
								print_edges(ID,[],S).
							 | 
						||
| 
								 | 
							
								print_edges(ID,[ID1|R],S):-
							 | 
						||
| 
								 | 
							
									node(ID1, Childs, Parent , CLL, Theory, Visited, Backscore),
							 | 
						||
| 
								 | 
							
									(Visited > 1 ->
							 | 
						||
| 
								 | 
							
									 format(S,"~w -> ~w;\n",[ID,ID1])
							 | 
						||
| 
								 | 
							
									 %format(S,"~w [label=\"~w,~w\"] ;\n",[ID1,ID1,Visited])
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 true
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									print_edges(ID,R,S).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								backup_transposition(1,Reward,_):-
							 | 
						||
| 
								 | 
							
									!,
							 | 
						||
| 
								 | 
							
									(retract(node(1, Childs, Parent , PSLL, MLN, Visited, Backscore)) ->
							 | 
						||
| 
								 | 
							
									 true
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 format(user_error,"\nNo node with ID ~w in backup",[NodeID]),	 
							 | 
						||
| 
								 | 
							
									 throw(no_node_id(NodeID))
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									Visited1 is Visited + 1,
							 | 
						||
| 
								 | 
							
									assert(node(1, Childs, Parent , PSLL, MLN, Visited1, Backscore)).	
							 | 
						||
| 
								 | 
							
								backup_transposition(NodeID,Reward,ParentsTranspose):-
							 | 
						||
| 
								 | 
							
									(retract(node(NodeID, Childs, Parent , PSLL, MLN, Visited, Backscore)) ->
							 | 
						||
| 
								 | 
							
									 true
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 format(user_error,"\nNo node with ID ~w in backup",[NodeID]),	 
							 | 
						||
| 
								 | 
							
									 throw(no_node_id(NodeID))
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									(member(NodeID,ParentsTranspose) -> 
							 | 
						||
| 
								 | 
							
									 Backscore1 is Backscore,
							 | 
						||
| 
								 | 
							
									 Visited1 is Visited,
							 | 
						||
| 
								 | 
							
									 format("~w- ",[NodeID])	 
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 (Visited == 1 -> Backscore1 = Reward ; Backscore1 is Backscore + Reward),	 
							 | 
						||
| 
								 | 
							
									 Visited1 is Visited + 1,
							 | 
						||
| 
								 | 
							
									 format("~w+ ",[NodeID])
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									assert(node(NodeID, Childs, Parent , PSLL, MLN, Visited1, Backscore1)),
							 | 
						||
| 
								 | 
							
									backup_transposition(Parent,Reward,ParentsTranspose).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								check_transposition(NodeID,Theory,SigmoidValue,ParentsTranspose):-
							 | 
						||
| 
								 | 
							
									lastid(Nodes),
							 | 
						||
| 
								 | 
							
									check_transposition(Nodes,NodeID,Theory,SigmoidValue,ParentsTranspose).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								check_transposition(1,NodeID,_,SigmoidValue,ParentsTranspose):-
							 | 
						||
| 
								 | 
							
									!.
							 | 
						||
| 
								 | 
							
								check_transposition(Node,NodeID,Theory,SigmoidValue,ParentsTranspose):-
							 | 
						||
| 
								 | 
							
									Node \== NodeID,
							 | 
						||
| 
								 | 
							
									!,
							 | 
						||
| 
								 | 
							
									node(Node, Childs, Parent , CLL, TheoryN, Visited, Backscore),
							 | 
						||
| 
								 | 
							
									( same_theory(Theory,TheoryN) ->
							 | 
						||
| 
								 | 
							
										format("\n\tTransposition node ~w - node ~w ~w: ",[Node,NodeID,ParentsTranspose]),
							 | 
						||
| 
								 | 
							
										backup_transposition(Node,SigmoidValue,ParentsTranspose)
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										true
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									Node1 is Node - 1,
							 | 
						||
| 
								 | 
							
									check_transposition(Node1,NodeID,Theory,SigmoidValue,ParentsTranspose).
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								check_transposition(Node,NodeID,Theory,SigmoidValue,ParentsTranspose):-
							 | 
						||
| 
								 | 
							
									Node1 is Node - 1,
							 | 
						||
| 
								 | 
							
									check_transposition(Node1,NodeID,Theory,SigmoidValue,ParentsTranspose).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								backup_amaf(1,Reward,_):-
							 | 
						||
| 
								 | 
							
									!,
							 | 
						||
| 
								 | 
							
									(retract(node(1, Childs, Parent , PSLL, MLN, Visited, Backscore)) ->
							 | 
						||
| 
								 | 
							
									 true
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 format(user_error,"\nNo node with ID ~w in backup",[NodeID]),	 
							 | 
						||
| 
								 | 
							
									 throw(no_node_id(NodeID))
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									Visited1 is Visited + 1,
							 | 
						||
| 
								 | 
							
									assert(node(1, Childs, Parent , PSLL, MLN, Visited1, Backscore)).	
							 | 
						||
| 
								 | 
							
								backup_amaf(NodeID,Reward,ParentsTranspose):-
							 | 
						||
| 
								 | 
							
									(retract(node(NodeID, Childs, Parent , PSLL, MLN, Visited, Backscore)) ->
							 | 
						||
| 
								 | 
							
									 true
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 format(user_error,"\nNo node with ID ~w in backup",[NodeID]),	 
							 | 
						||
| 
								 | 
							
									 throw(no_node_id(NodeID))
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									(member(NodeID,ParentsTranspose) -> 
							 | 
						||
| 
								 | 
							
									 Backscore1 is Backscore,
							 | 
						||
| 
								 | 
							
									 Visited1 is Visited
							 | 
						||
| 
								 | 
							
								%	 format("~w- ",[NodeID])	 
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 SigmoidValue is 1 / (1 - PSLL),
							 | 
						||
| 
								 | 
							
									 ( PSLL = 1  ->
							 | 
						||
| 
								 | 
							
										 Backscore1 is Backscore + Reward
							 | 
						||
| 
								 | 
							
									 ;
							 | 
						||
| 
								 | 
							
										 ( Reward > SigmoidValue ->
							 | 
						||
| 
								 | 
							
											 Backscore1 is Backscore + Reward
							 | 
						||
| 
								 | 
							
										 ;
							 | 
						||
| 
								 | 
							
											 Backscore1 is Backscore + SigmoidValue
							 | 
						||
| 
								 | 
							
								%			 Backscore1 is Backscore + Reward
							 | 
						||
| 
								 | 
							
										 )
							 | 
						||
| 
								 | 
							
									 ),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 Visited1 is Visited + 1
							 | 
						||
| 
								 | 
							
								%	 format("~w+ ",[NodeID])
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									assert(node(NodeID, Childs, Parent , PSLL, MLN, Visited1, Backscore1)).
							 | 
						||
| 
								 | 
							
								%%%	backup_amaf(Parent,Reward,ParentsTranspose).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								check_amaf(NodeID,Theory,SigmoidValue,ParentsTranspose):-
							 | 
						||
| 
								 | 
							
									lastid(Nodes),
							 | 
						||
| 
								 | 
							
									format("\nChecking amaf: node ~w, parents ~w: ",[NodeID,ParentsTranspose]),	
							 | 
						||
| 
								 | 
							
									check_amaf(Nodes,NodeID,Theory,SigmoidValue,ParentsTranspose).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								check_amaf(1,NodeID,_,SigmoidValue,ParentsTranspose):-
							 | 
						||
| 
								 | 
							
									retract(node(1, Childs, Parent , PSLL, MLN, Visited, Backscore)),
							 | 
						||
| 
								 | 
							
									Visited1 is Visited + 1,
							 | 
						||
| 
								 | 
							
									assert(node(1, Childs, Parent , PSLL, MLN, Visited1, Backscore)),
							 | 
						||
| 
								 | 
							
									!.
							 | 
						||
| 
								 | 
							
								check_amaf(Node,NodeID,Theory,SigmoidValue,ParentsTranspose):-
							 | 
						||
| 
								 | 
							
									Node \== NodeID,
							 | 
						||
| 
								 | 
							
									!,
							 | 
						||
| 
								 | 
							
									node(Node, Childs, Parent , CLL, TheoryN, Visited, Backscore),
							 | 
						||
| 
								 | 
							
									( subsume_theory(TheoryN,Theory) ->
							 | 
						||
| 
								 | 
							
								%%%		format("\n\t ~w ~w: ",[TheoryN,Theory]),
							 | 
						||
| 
								 | 
							
										backup_amaf(Node,SigmoidValue,ParentsTranspose)
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										true
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									Node1 is Node - 1,
							 | 
						||
| 
								 | 
							
									check_amaf(Node1,NodeID,Theory,SigmoidValue,ParentsTranspose).
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								check_amaf(Node,NodeID,Theory,SigmoidValue,ParentsTranspose):-
							 | 
						||
| 
								 | 
							
									Node1 is Node - 1,
							 | 
						||
| 
								 | 
							
									check_amaf(Node1,NodeID,Theory,SigmoidValue,ParentsTranspose).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								subsume_theory(Theory,TheoryN):-
							 | 
						||
| 
								 | 
							
									copy_term(Theory,Theory1),
							 | 
						||
| 
								 | 
							
									skolemize(TheoryN,TheoryN1),	
							 | 
						||
| 
								 | 
							
									subsume_theory1(Theory1,TheoryN1),
							 | 
						||
| 
								 | 
							
									!.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*skolemize(Theory,Theory1):-
							 | 
						||
| 
								 | 
							
									copy_term(Theory,Theory1),
							 | 
						||
| 
								 | 
							
									term_variables(Theory1,Vars),
							 | 
						||
| 
								 | 
							
									skolemize1(Vars,1).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								skolemize1([],_).
							 | 
						||
| 
								 | 
							
								skolemize1([Var|R],K):-
							 | 
						||
| 
								 | 
							
									atomic_list_concat([s,K],Skolem),
							 | 
						||
| 
								 | 
							
									Var = Skolem,
							 | 
						||
| 
								 | 
							
									K1 is K + 1,
							 | 
						||
| 
								 | 
							
									skolemize1(R,K1).
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								subsume_theory1([],_).
							 | 
						||
| 
								 | 
							
								subsume_theory1([Rule|R],TheoryN):-
							 | 
						||
| 
								 | 
							
									subsume_theory2(Rule,TheoryN,NewTheoryN),
							 | 
						||
| 
								 | 
							
									subsume_theory1(R,NewTheoryN).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								subsume_theory2(Rule,[Rule1|R],R):-
							 | 
						||
| 
								 | 
							
									Rule = rule(_,[H: _, _: _],Body,_),
							 | 
						||
| 
								 | 
							
									Rule1 = rule(_,[H1: _, _: _],Body1,_),
							 | 
						||
| 
								 | 
							
									H = H1,
							 | 
						||
| 
								 | 
							
									subsume_body(Body,Body1),
							 | 
						||
| 
								 | 
							
									!.
							 | 
						||
| 
								 | 
							
								subsume_theory2(Rule,[Rule1|R],[Rule1|R1]):-
							 | 
						||
| 
								 | 
							
									subsume_theory2(Rule,R,R1).
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								subsume_body(Body,Body1):-
							 | 
						||
| 
								 | 
							
									length(Body,L),
							 | 
						||
| 
								 | 
							
									length(Body1,L1),
							 | 
						||
| 
								 | 
							
									L =< L1,
							 | 
						||
| 
								 | 
							
									subsume_body1(Body,Body1).
							 | 
						||
| 
								 | 
							
								subsume_body1([],_).
							 | 
						||
| 
								 | 
							
								subsume_body1([L|R],Body):-
							 | 
						||
| 
								 | 
							
									nth(_,Body,L,Rest),
							 | 
						||
| 
								 | 
							
									subsume_body1(R,Rest).	
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								same_theory(Theory0,TheoryN):-
							 | 
						||
| 
								 | 
							
									copy_term(Theory0,Theory),	
							 | 
						||
| 
								 | 
							
									length(Theory,L),
							 | 
						||
| 
								 | 
							
									length(TheoryN,L),
							 | 
						||
| 
								 | 
							
									same_theory1(Theory,TheoryN),
							 | 
						||
| 
								 | 
							
									!.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								same_theory1([],[]).
							 | 
						||
| 
								 | 
							
								same_theory1([Rule|R],TheoryN):-
							 | 
						||
| 
								 | 
							
									same_theory2(Rule,TheoryN,NewTheoryN),
							 | 
						||
| 
								 | 
							
									same_theory1(R,NewTheoryN).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								same_theory2(Rule,[Rule1|R],R):-
							 | 
						||
| 
								 | 
							
									Rule = rule(_,[H: _, _: _],Body,_),
							 | 
						||
| 
								 | 
							
									Rule1 = rule(_,[H1: _, _: _],Body1,_),
							 | 
						||
| 
								 | 
							
									H = H1,
							 | 
						||
| 
								 | 
							
									same_body(Body,Body1),
							 | 
						||
| 
								 | 
							
									!.
							 | 
						||
| 
								 | 
							
								same_theory2(Rule,[Rule1|R],[Rule1|R1]):-
							 | 
						||
| 
								 | 
							
									same_theory2(Rule,R,R1).
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								same_body(Body,Body1):-
							 | 
						||
| 
								 | 
							
									length(Body,L),
							 | 
						||
| 
								 | 
							
									length(Body1,L),
							 | 
						||
| 
								 | 
							
									same_body1(Body,Body1).
							 | 
						||
| 
								 | 
							
								same_body1([],[]).
							 | 
						||
| 
								 | 
							
								same_body1([L|R],Body):-
							 | 
						||
| 
								 | 
							
									nth(_,Body,L,Rest),
							 | 
						||
| 
								 | 
							
									same_body1(R,Rest).	
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								cycle_mcts(0,_):-
							 | 
						||
| 
								 | 
							
									!.
							 | 
						||
| 
								 | 
							
								cycle_mcts(K,DB):-
							 | 
						||
| 
								 | 
							
									setting(mcts_iter,MaxI),
							 | 
						||
| 
								 | 
							
									Iteration is MaxI - K + 1,
							 | 
						||
| 
								 | 
							
									retract(mcts_iteration(_)),
							 | 
						||
| 
								 | 
							
									assert(mcts_iteration(Iteration)),
							 | 
						||
| 
								 | 
							
									format("\nIteration ~w",[Iteration]),
							 | 
						||
| 
								 | 
							
									tree_policy(1,NodeID,DB,1,Depth),
							 | 
						||
| 
								 | 
							
									( node(NodeID, Childs, Parent , CLL, Theory, Visited, Backscore) ->
							 | 
						||
| 
								 | 
							
									%% do update with the sigmoid of the Score
							 | 
						||
| 
								 | 
							
									%% SigmoidValue is ((1 / (1 + exp(-PSLL)))/0.5),
							 | 
						||
| 
								 | 
							
									%% format("\n~w: ~w ~w Sigmoid ~w",[K,MLN,PSLL,SigmoidValue]),	
							 | 
						||
| 
								 | 
							
										setting(mcts_max_depth, MaxDepth),
							 | 
						||
| 
								 | 
							
										random(1,MaxDepth,MaxDepth1),
							 | 
						||
| 
								 | 
							
										default_policy(Theory,-inf,Reward,_,BestDefaultTheory,DB,1,MaxDepth1),
							 | 
						||
| 
								 | 
							
									% do update with the sigmoid of the Score
							 | 
						||
| 
								 | 
							
								%%%	SigmoidValue is ((1 / (1 + exp(-Reward)))/0.5),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										SigmoidValue is 1 / (1 -  Reward),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										( SigmoidValue > 0 ->
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
								%	(Reward > CLL ->
							 | 
						||
| 
								 | 
							
								%	 SigmoidValue = 1
							 | 
						||
| 
								 | 
							
								%	;
							 | 
						||
| 
								 | 
							
								%	 SigmoidValue = 0
							 | 
						||
| 
								 | 
							
								%	),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%%%	format("\n~w: ~w \nReward ~w Sigmoid ~w",[K,Theory,Reward,SigmoidValue]),
							 | 
						||
| 
								 | 
							
											format("\n[Backup reward ~w]",[SigmoidValue]),
							 | 
						||
| 
								 | 
							
											backup(NodeID,SigmoidValue,Parents),
							 | 
						||
| 
								 | 
							
																								%	check_transposition(NodeID,Theory,SigmoidValue,Parents),
							 | 
						||
| 
								 | 
							
											check_amaf(NodeID,BestDefaultTheory,SigmoidValue,Parents)
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
											format("\n--> no default policy expansion",[])
							 | 
						||
| 
								 | 
							
										),
							 | 
						||
| 
								 | 
							
										K1 is K - 1,
							 | 
						||
| 
								 | 
							
								%%%	read(_),
							 | 
						||
| 
								 | 
							
										cycle_mcts(K1,DB)
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										format("\n--> tree policy end",[])
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								check_pruning(ID):-
							 | 
						||
| 
								 | 
							
									node(ID, Childs, Parent , CLL, Theory, VISITED, BACKSCORE),
							 | 
						||
| 
								 | 
							
									Childs \== [],
							 | 
						||
| 
								 | 
							
									length(Childs,NumChilds),
							 | 
						||
| 
								 | 
							
									setting(mcts_beamsize,BeamSize),
							 | 
						||
| 
								 | 
							
									NumChilds > BeamSize,
							 | 
						||
| 
								 | 
							
									!,
							 | 
						||
| 
								 | 
							
									setting(mcts_visits,NumVisits),
							 | 
						||
| 
								 | 
							
									check_pruning(Childs,ID,NumVisits,BeamSize,NewChilds),
							 | 
						||
| 
								 | 
							
									retract(node(ID, Childs, Parent , CLL, Theory, VISITED, BACKSCORE)),
							 | 
						||
| 
								 | 
							
									assert(node(ID, NewChilds, Parent , CLL, Theory, VISITED, BACKSCORE)).
							 | 
						||
| 
								 | 
							
								check_pruning(_ID).	
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								check_pruning(Childs,ID,NumVisits,BeamSize,Childs2):-
							 | 
						||
| 
								 | 
							
									check_pruning1(Childs,NumVisits,ToPrune,Childs1),
							 | 
						||
| 
								 | 
							
									length(Childs1,L1),
							 | 
						||
| 
								 | 
							
									L1 > BeamSize,
							 | 
						||
| 
								 | 
							
									ToPrune == 1,
							 | 
						||
| 
								 | 
							
									!,
							 | 
						||
| 
								 | 
							
									choose_best_childs(Childs1,BeamSize,Childs2),
							 | 
						||
| 
								 | 
							
									format("\n#Pruning tree ~w ~w",[ID,Childs2]),flush_output,
							 | 
						||
| 
								 | 
							
									prune(Childs,Childs2).
							 | 
						||
| 
								 | 
							
								check_pruning(Childs,_,_NumVisits,_BeamSize,Childs).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								choose_best_childs(Childs,BeamSize,Childs1):-
							 | 
						||
| 
								 | 
							
									add_visisted(Childs,ChildsV),
							 | 
						||
| 
								 | 
							
									keysort(ChildsV,ChildsV1),
							 | 
						||
| 
								 | 
							
									remove_visisted(ChildsV1,ChildsV2),
							 | 
						||
| 
								 | 
							
									length(Childs1,BeamSize),
							 | 
						||
| 
								 | 
							
									append(Childs1,_,ChildsV2),!.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								remove_visisted([],[]).
							 | 
						||
| 
								 | 
							
								remove_visisted([V-ID|R],[ID|R1]):-
							 | 
						||
| 
								 | 
							
									remove_visisted(R,R1).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								add_visisted([],[]).
							 | 
						||
| 
								 | 
							
								add_visisted([ID|R],[V-ID|R1]):-
							 | 
						||
| 
								 | 
							
									node(ID, Childs, Parent , CLL, Theory, VISITED, BACKSCORE),
							 | 
						||
| 
								 | 
							
									V is -1 * VISITED,
							 | 
						||
| 
								 | 
							
									add_visisted(R,R1).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								prune([],_Childs1).
							 | 
						||
| 
								 | 
							
								prune([ID|R],Childs1):-
							 | 
						||
| 
								 | 
							
									member(ID,Childs1),
							 | 
						||
| 
								 | 
							
									!,
							 | 
						||
| 
								 | 
							
									prune(R,Childs1).
							 | 
						||
| 
								 | 
							
								prune([ID|R],Childs1):-
							 | 
						||
| 
								 | 
							
									prune_sub_tree(ID),
							 | 
						||
| 
								 | 
							
									prune(R,Childs1).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								prune_sub_tree(ID):-
							 | 
						||
| 
								 | 
							
									retract(node(ID, Childs, _Parent , _CLL, _Theory, _VISITED, _BACKSCORE)),
							 | 
						||
| 
								 | 
							
									prune_sub_tree1(Childs).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								prune_sub_tree1([]).
							 | 
						||
| 
								 | 
							
								prune_sub_tree1([ID|R]):-
							 | 
						||
| 
								 | 
							
									retract(node(ID, Childs, _Parent , _CLL, _Theory, _VISITED, _BACKSCORE)),
							 | 
						||
| 
								 | 
							
									prune_sub_tree1(Childs),
							 | 
						||
| 
								 | 
							
									prune_sub_tree1(R).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								check_pruning1([],_NumVisits,1,[]).
							 | 
						||
| 
								 | 
							
								check_pruning1([ID|R],NumVisits,ToPrune,[ID|R1]):-
							 | 
						||
| 
								 | 
							
									node(ID, _Childs, _Parent , CLL, _Theory, VISITED, _BACKSCORE),
							 | 
						||
| 
								 | 
							
									(CLL == 1 ->
							 | 
						||
| 
								 | 
							
									 ToPrune = 0,
							 | 
						||
| 
								 | 
							
									 R1 = [],
							 | 
						||
| 
								 | 
							
									 !
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 VISITED >= NumVisits,
							 | 
						||
| 
								 | 
							
									 !,
							 | 
						||
| 
								 | 
							
									 check_pruning1(R,NumVisits,ToPrune,R1)
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								check_pruning1([ID|R],NumVisits,ToPrune,R1):-
							 | 
						||
| 
								 | 
							
									check_pruning1(R,NumVisits,ToPrune,R1).
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								tree_policy(ID,NodeID,DB,Od,Nd):-
							 | 
						||
| 
								 | 
							
								%	check_pruning(ID),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									(retract(node(ID, Childs, Parent , CLL, Theory, VISITED, BACKSCORE)) ->
							 | 
						||
| 
								 | 
							
									 true
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 throw(no_node_id(ID))
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
								%%%	format("\n Tree policy ~w ~w ~w",[Theory,VISITED, BACKSCORE]),
							 | 
						||
| 
								 | 
							
									format("\n[Tree Policy ~w, ~w, ~w] ",[ID,VISITED,BACKSCORE]),		flush_output,
							 | 
						||
| 
								 | 
							
								%%%	( VISITED = 0, ID \= 1 ->
							 | 
						||
| 
								 | 
							
									( CLL = 1, ID \= 1 ->
							 | 
						||
| 
								 | 
							
										score_theory(Theory,DB,CLL1,BestTheory,NewTheory),
							 | 
						||
| 
								 | 
							
										mcts_best_score(BestScore),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%			Ratio is  BestScore / CLL1,
							 | 
						||
| 
								 | 
							
								%			( Ratio > 1.001 ->
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										( setting(mcts_covering,true) ->
							 | 
						||
| 
								 | 
							
											length(NewTheory,NewTheoryL),	%lemurc
							 | 
						||
| 
								 | 
							
											length(Theory,TheoryL),
							 | 
						||
| 
								 | 
							
											( NewTheoryL = TheoryL ->
							 | 
						||
| 
								 | 
							
												LengthCondition = true
							 | 
						||
| 
								 | 
							
											;
							 | 
						||
| 
								 | 
							
												LengthCondition = false
							 | 
						||
| 
								 | 
							
											)
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
											LengthCondition = true
							 | 
						||
| 
								 | 
							
										),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										( (CLL1 > BestScore, LengthCondition = true) ->
							 | 
						||
| 
								 | 
							
											format("\n[New best score: ~w ~w]",[CLL1, BestTheory]),flush_output,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											retract(mcts_best_score(_)),
							 | 
						||
| 
								 | 
							
											retract(mcts_best_theory(_)),
							 | 
						||
| 
								 | 
							
											assert(mcts_best_score(CLL1)),
							 | 
						||
| 
								 | 
							
											assert(mcts_best_theory(NewTheory)),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											retract(mcts_best_theories_iteration(BestsIter)),
							 | 
						||
| 
								 | 
							
											mcts_iteration(Iteration),
							 | 
						||
| 
								 | 
							
											append(BestsIter,[Iteration],BestsIter1),
							 | 
						||
| 
								 | 
							
											assert(mcts_best_theories_iteration(BestsIter1)),
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											retract(mcts_theories(Mlns)),
							 | 
						||
| 
								 | 
							
											Mlns1 is Mlns + 1,
							 | 
						||
| 
								 | 
							
											assert(mcts_theories(Mlns1))
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
											true
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										CLL1 = CLL,
							 | 
						||
| 
								 | 
							
										NewTheory = Theory
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									Visited1 is VISITED + 1,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%	(CLL = 1 ->
							 | 
						||
| 
								 | 
							
								%	 Visited2 = Visited1,
							 | 
						||
| 
								 | 
							
								%	 (Visited2 == 2 -> Backscore1 = BACKSCORE ; Backscore1 = 0) % in this case the node has been visited by transposition
							 | 
						||
| 
								 | 
							
								%	;
							 | 
						||
| 
								 | 
							
								%	 Visited2 = Visited1,
							 | 
						||
| 
								 | 
							
								%	 Backscore1 = BACKSCORE
							 | 
						||
| 
								 | 
							
								%	),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 Visited2 = Visited1,
							 | 
						||
| 
								 | 
							
									 Backscore1 = BACKSCORE,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									(Childs == [] ->
							 | 
						||
| 
								 | 
							
									 Nd = Od,
							 | 
						||
| 
								 | 
							
									 expand(ID, Theory, CLL1, DB, NodeID, Childs1),
							 | 
						||
| 
								 | 
							
									 assert(node(ID, Childs1, Parent , CLL1, NewTheory, Visited2, Backscore1))
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 Od1 is Od + 1,
							 | 
						||
| 
								 | 
							
									 minmaxvalue(Childs,MinV,MaxV),
							 | 
						||
| 
								 | 
							
								%	 mean_value_level(Childs,Mvl),
							 | 
						||
| 
								 | 
							
									 once(uct(Childs, VISITED, MinV, MaxV, BestChild)),
							 | 
						||
| 
								 | 
							
								%	 once(uct(Childs, VISITED, BestChild)),	 
							 | 
						||
| 
								 | 
							
									 tree_policy(BestChild,NodeID,DB,Od1, Nd),
							 | 
						||
| 
								 | 
							
									 assert(node(ID, Childs, Parent , CLL1, NewTheory, Visited2, Backscore1))
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								default_policy(Theory, Reward, Reward, BestDefaultTheory,BestDefaultTheory,DB, Depth, MaxDepth):-
							 | 
						||
| 
								 | 
							
									Depth > MaxDepth,
							 | 
						||
| 
								 | 
							
									!.
							 | 
						||
| 
								 | 
							
								default_policy(Theory,PrevR,Reward,PrevBestDefaultTheory,BestDefaultTheory,DB,Depth,MaxDepth):-
							 | 
						||
| 
								 | 
							
								%%%	format("\nDefault policy",[]),flush_output,
							 | 
						||
| 
								 | 
							
									format("\n[Default Policy ~w]",[Depth]),
							 | 
						||
| 
								 | 
							
									theory_revisions_r(Theory,Revisions),
							 | 
						||
| 
								 | 
							
									( Revisions \== [] ->
							 | 
						||
| 
								 | 
							
										length(Revisions,L),
							 | 
						||
| 
								 | 
							
										random(0,L,K),
							 | 
						||
| 
								 | 
							
										nth0(K, Revisions,Spec),
							 | 
						||
| 
								 | 
							
										Depth1 is Depth + 1,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										score_theory(Spec,DB,Score,BestTheory,NewTheory),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										( setting(mcts_covering,true) ->
							 | 
						||
| 
								 | 
							
											length(NewTheory,NewTheoryL),	%lemurc
							 | 
						||
| 
								 | 
							
											length(Spec,TheoryL),
							 | 
						||
| 
								 | 
							
											( NewTheoryL = TheoryL ->
							 | 
						||
| 
								 | 
							
												LengthCondition = true
							 | 
						||
| 
								 | 
							
											;
							 | 
						||
| 
								 | 
							
												LengthCondition = false
							 | 
						||
| 
								 | 
							
											)
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
											LengthCondition = true
							 | 
						||
| 
								 | 
							
										),
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
										( (Score > PrevR, LengthCondition = true) ->
							 | 
						||
| 
								 | 
							
										 Reward1 = Score,
							 | 
						||
| 
								 | 
							
										 BestDefaultTheory1 = NewTheory
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
										 Reward1 = PrevR,
							 | 
						||
| 
								 | 
							
										 BestDefaultTheory1 = PrevBestDefaultTheory
							 | 
						||
| 
								 | 
							
										),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										format(" cll-reward ~w",[Reward1]),
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										mcts_best_score(BestScore),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
										( (Score > BestScore, LengthCondition = true) ->
							 | 
						||
| 
								 | 
							
											format("\n[New best score: ~w ~w]",[Score, BestTheory]),flush_output,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
											retract(mcts_best_score(_)),
							 | 
						||
| 
								 | 
							
											retract(mcts_best_theory(_)),
							 | 
						||
| 
								 | 
							
											assert(mcts_best_score(Score)),
							 | 
						||
| 
								 | 
							
											assert(mcts_best_theory(NewTheory)),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											retract(mcts_best_theories_iteration(BestsIter)),
							 | 
						||
| 
								 | 
							
											mcts_iteration(Iteration),
							 | 
						||
| 
								 | 
							
											append(BestsIter,[Iteration],BestsIter1),
							 | 
						||
| 
								 | 
							
											assert(mcts_best_theories_iteration(BestsIter1)),
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											retract(mcts_theories(Mlns)),
							 | 
						||
| 
								 | 
							
											Mlns1 is Mlns + 1,
							 | 
						||
| 
								 | 
							
											assert(mcts_theories(Mlns1))
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
											true
							 | 
						||
| 
								 | 
							
										),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										default_policy(Spec, Reward1,Reward, BestDefaultTheory1,BestDefaultTheory,DB, Depth1,MaxDepth)
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										Reward = PrevR,
							 | 
						||
| 
								 | 
							
										BestDefaultTheory = PrevBestDefaultTheory
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%%%		format("\n\t Default ~w",[Theory]),
							 | 
						||
| 
								 | 
							
										score_theory(Theory,DB,Score,BestTheory),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										(Score > PrevR ->
							 | 
						||
| 
								 | 
							
										 Reward = Score
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
										 Reward = PrevR
							 | 
						||
| 
								 | 
							
										),
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
										mcts_best_score(BestScore),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
										( Score > BestScore ->
							 | 
						||
| 
								 | 
							
											format("\n[New best score: ~w ~w]",[Score, BestTheory]),flush_output,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											retract(mcts_best_score(_)),
							 | 
						||
| 
								 | 
							
											retract(mcts_best_theory(_)),
							 | 
						||
| 
								 | 
							
											assert(mcts_best_score(Score)),
							 | 
						||
| 
								 | 
							
											assert(mcts_best_theory(BestTheory)),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											retract(mcts_best_theories_iteration(BestsIter)),
							 | 
						||
| 
								 | 
							
											mcts_iteration(Iteration),
							 | 
						||
| 
								 | 
							
											append(BestsIter,[Iteration],BestsIter1),
							 | 
						||
| 
								 | 
							
											assert(mcts_best_theories_iteration(BestsIter1)),
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											retract(mcts_theories(Mlns)),
							 | 
						||
| 
								 | 
							
											Mlns1 is Mlns + 1,
							 | 
						||
| 
								 | 
							
											assert(mcts_theories(Mlns1))
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
											true
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								minmaxvalue(Childs,MinV,MaxV):-
							 | 
						||
| 
								 | 
							
									Childs = [F|R],
							 | 
						||
| 
								 | 
							
									node(F, _, _ , _, _, Visits, Reward),
							 | 
						||
| 
								 | 
							
									V is Reward / Visits,
							 | 
						||
| 
								 | 
							
									minmaxvalue(R,V,V,MinV,MaxV).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								minmaxvalue([],Min,Max,Min,Max).
							 | 
						||
| 
								 | 
							
								minmaxvalue([C|R],PrevMin,PrevMax,MinV,MaxV):-
							 | 
						||
| 
								 | 
							
									node(C, _, _ , _, _, Visits, Reward),
							 | 
						||
| 
								 | 
							
									V is Reward / Visits,
							 | 
						||
| 
								 | 
							
									( V > PrevMax ->
							 | 
						||
| 
								 | 
							
										Max1 is V
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										Max1 is PrevMax
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									( V < PrevMin ->
							 | 
						||
| 
								 | 
							
										Min1 is V
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										Min1 is PrevMin
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									minmaxvalue(R,Min1,Max1,MinV,MaxV).
							 | 
						||
| 
								 | 
							
								mean_value_level(Cs,M):-
							 | 
						||
| 
								 | 
							
									mean_value_level1(Cs,Me),
							 | 
						||
| 
								 | 
							
									length(Me,L),
							 | 
						||
| 
								 | 
							
									sum_list(Me,S),
							 | 
						||
| 
								 | 
							
									M is S / L.
							 | 
						||
| 
								 | 
							
								mean_value_level1([],[]).
							 | 
						||
| 
								 | 
							
								mean_value_level1([C|R],M1):-
							 | 
						||
| 
								 | 
							
									node(C, _, _ , 1, _, _Visits, _Reward),
							 | 
						||
| 
								 | 
							
									!,
							 | 
						||
| 
								 | 
							
									mean_value_level1(R,M1).
							 | 
						||
| 
								 | 
							
								mean_value_level1([C|R],[M|Rm]):-
							 | 
						||
| 
								 | 
							
									node(C, _, _ , _, _, Visits, Reward),
							 | 
						||
| 
								 | 
							
									!,
							 | 
						||
| 
								 | 
							
									mean_value_level1(R,Rm),
							 | 
						||
| 
								 | 
							
									M is (Reward / Visits).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								uct(Childs, ParentVisits, BestChild):-
							 | 
						||
| 
								 | 
							
								%%%	format("\nUCT ",[]),
							 | 
						||
| 
								 | 
							
									Childs = [FirstChild|RestChilds],
							 | 
						||
| 
								 | 
							
									node(FirstChild, _, _ , _, Theory, Visits, Reward),
							 | 
						||
| 
								 | 
							
									( Visits == 0 ->
							 | 
						||
| 
								 | 
							
										BestChild = FirstChild
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										setting(mcts_c,C),
							 | 
						||
| 
								 | 
							
										UCT is Reward / Visits + 2 * C * sqrt(2 * log(ParentVisits) / Visits),
							 | 
						||
| 
								 | 
							
								%%%		format("~w ",[UCT]),
							 | 
						||
| 
								 | 
							
										uct(RestChilds, UCT, ParentVisits, FirstChild, BestChild)
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uct([], _CurrentBestUCT, _ParentVisits, BestChild, BestChild).
							 | 
						||
| 
								 | 
							
								uct([Child|RestChilds], CurrentBestUCT, ParentVisits, CurrentBestChild, BestChild) :-
							 | 
						||
| 
								 | 
							
									node(Child, _, _ , _, Theory, Visits, Reward),
							 | 
						||
| 
								 | 
							
									( Visits == 0 ->
							 | 
						||
| 
								 | 
							
										BestChild = Child
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										setting(mcts_c,C),		
							 | 
						||
| 
								 | 
							
										UCT is Reward / Visits + 2 * C * sqrt(2 * log(ParentVisits) / Visits),
							 | 
						||
| 
								 | 
							
								%%%		format("~w ",[UCT]),flush_output,
							 | 
						||
| 
								 | 
							
										(UCT > CurrentBestUCT ->
							 | 
						||
| 
								 | 
							
										 uct(RestChilds, UCT, ParentVisits, Child, BestChild)
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
										 uct(RestChilds, CurrentBestUCT, ParentVisits, CurrentBestChild, BestChild)
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uct(Childs, ParentVisits, Min, Max, BestChild):-
							 | 
						||
| 
								 | 
							
								%%%	format("\nUCT ",[]),
							 | 
						||
| 
								 | 
							
									Childs = [FirstChild|RestChilds],
							 | 
						||
| 
								 | 
							
									node(FirstChild, _, _ , Score, Theory, Visits, Reward),
							 | 
						||
| 
								 | 
							
									( Visits == 0 ->
							 | 
						||
| 
								 | 
							
										BestChild = FirstChild
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										setting(mcts_c,C),
							 | 
						||
| 
								 | 
							
								%		(Score == 1 ->
							 | 
						||
| 
								 | 
							
								%		 R is Mvl
							 | 
						||
| 
								 | 
							
								%		;
							 | 
						||
| 
								 | 
							
								%		 R is Reward
							 | 
						||
| 
								 | 
							
								%		),
							 | 
						||
| 
								 | 
							
										R is Reward,
							 | 
						||
| 
								 | 
							
										AA is ((R / Visits) - Min ) / (Max-Min),
							 | 
						||
| 
								 | 
							
										BB is 2 * C * sqrt(2 * log(ParentVisits) / Visits),
							 | 
						||
| 
								 | 
							
										UCT is ((R / Visits) - Min ) / (Max-Min) + 2 * C * sqrt(2 * log(ParentVisits) / Visits),
							 | 
						||
| 
								 | 
							
								%%%		format("\nID ~w UCT ~w ~w/~w=~w ~w",[FirstChild,UCT,R,Visits,AA,BB]),
							 | 
						||
| 
								 | 
							
								%%%		format("\n\t ~w ~w",[Score,Theory]),
							 | 
						||
| 
								 | 
							
								%%%		format("~w ",[UCT]),
							 | 
						||
| 
								 | 
							
										uct(RestChilds, UCT, ParentVisits, FirstChild, Min,Max, BestChild)
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uct([], _CurrentBestUCT, _ParentVisits, BestChild, _, _,BestChild).
							 | 
						||
| 
								 | 
							
								uct([Child|RestChilds], CurrentBestUCT, ParentVisits, CurrentBestChild, Min, Max,BestChild) :-
							 | 
						||
| 
								 | 
							
									node(Child, _, _ , Score, Theory, Visits, Reward),
							 | 
						||
| 
								 | 
							
									( Visits == 0 ->
							 | 
						||
| 
								 | 
							
										BestChild = Child
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										setting(mcts_c,C),		
							 | 
						||
| 
								 | 
							
								%		(Score == 1 ->
							 | 
						||
| 
								 | 
							
								%		 R is Mvl
							 | 
						||
| 
								 | 
							
								%		;
							 | 
						||
| 
								 | 
							
								%		 R is Reward
							 | 
						||
| 
								 | 
							
								%		),
							 | 
						||
| 
								 | 
							
										R is Reward,
							 | 
						||
| 
								 | 
							
										AA is ((R / Visits) - Min ) / (Max-Min),
							 | 
						||
| 
								 | 
							
										BB is 2 * C * sqrt(2 * log(ParentVisits) / Visits),
							 | 
						||
| 
								 | 
							
										UCT is ((R / Visits) - Min ) / (Max-Min) + 2 * C * sqrt(2 * log(ParentVisits) / Visits),
							 | 
						||
| 
								 | 
							
								%%%		format("\nID ~w UCT ~w ~w/~w=~w ~w",[Child,UCT,R,Visits,AA,BB]),
							 | 
						||
| 
								 | 
							
								%%%		format("\n\t ~w ~w",[Score,Theory]),		
							 | 
						||
| 
								 | 
							
								%%%		format("~w ",[UCT]),flush_output,
							 | 
						||
| 
								 | 
							
										(UCT > CurrentBestUCT ->
							 | 
						||
| 
								 | 
							
										 uct(RestChilds, UCT, ParentVisits, Child, Min, Max, BestChild)
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
										 uct(RestChilds, CurrentBestUCT, ParentVisits, CurrentBestChild, Min, Max, BestChild)
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								expand(ID, Theory, ParentCLL, DB, NodeID, Childs):-
							 | 
						||
| 
								 | 
							
								%%%	format("  expanding...",[]),flush_output,
							 | 
						||
| 
								 | 
							
								  theory_revisions(Theory,Revisions),
							 | 
						||
| 
								 | 
							
									!,
							 | 
						||
| 
								 | 
							
									assert_childs(Revisions,ID,ParentCLL,Childs),
							 | 
						||
| 
								 | 
							
									(Childs \= [] ->
							 | 
						||
| 
								 | 
							
									 Childs = [NodeID|_],
							 | 
						||
| 
								 | 
							
									 retract(node(NodeID, Childs1, Parent , _, Theory1, Visited, Backscore)),
							 | 
						||
| 
								 | 
							
									 format("\n[Expand ~w]",[NodeID]),	 
							 | 
						||
| 
								 | 
							
									 Visited1 is Visited + 1,
							 | 
						||
| 
								 | 
							
									 score_theory(Theory1,DB,CLL,BestTheory,NewTheory),
							 | 
						||
| 
								 | 
							
									 format(" CLL: ~w]",[CLL]),	 
							 | 
						||
| 
								 | 
							
									 %%%format("\nTree policy: ~w ~w]",[Score, Theory1]),
							 | 
						||
| 
								 | 
							
									 mcts_best_score(BestScore),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%			Ratio is BestScore / CLL,
							 | 
						||
| 
								 | 
							
								%			( Ratio > 1.001 ->
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 ( setting(mcts_covering,true) ->
							 | 
						||
| 
								 | 
							
										 length(NewTheory,NewTheoryL), %lemurc
							 | 
						||
| 
								 | 
							
										 length(Theory1,Theory1L),
							 | 
						||
| 
								 | 
							
										 ( NewTheoryL = Theory1L ->
							 | 
						||
| 
								 | 
							
											 LengthCondition = true
							 | 
						||
| 
								 | 
							
										 ;
							 | 
						||
| 
								 | 
							
											 LengthCondition = false
							 | 
						||
| 
								 | 
							
										 )
							 | 
						||
| 
								 | 
							
									 ;
							 | 
						||
| 
								 | 
							
										 LengthCondition = true
							 | 
						||
| 
								 | 
							
									 ),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 ( (CLL > BestScore, LengthCondition = true) ->
							 | 
						||
| 
								 | 
							
										 format("\n[New best score: ~w ~w]",[CLL, BestTheory]),flush_output,		 
							 | 
						||
| 
								 | 
							
										 retract(mcts_best_score(_)),
							 | 
						||
| 
								 | 
							
										 retract(mcts_best_theory(_)),
							 | 
						||
| 
								 | 
							
										 assert(mcts_best_score(CLL)),
							 | 
						||
| 
								 | 
							
										 assert(mcts_best_theory(NewTheory)),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										 retract(mcts_best_theories_iteration(BestsIter)),
							 | 
						||
| 
								 | 
							
										 mcts_iteration(Iteration),
							 | 
						||
| 
								 | 
							
										 append(BestsIter,[Iteration],BestsIter1),
							 | 
						||
| 
								 | 
							
										 assert(mcts_best_theories_iteration(BestsIter1)),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										 
							 | 
						||
| 
								 | 
							
										 retract(mcts_theories(Mlns)),
							 | 
						||
| 
								 | 
							
										 Mlns1 is Mlns + 1,
							 | 
						||
| 
								 | 
							
										 assert(mcts_theories(Mlns1))
							 | 
						||
| 
								 | 
							
									 ;
							 | 
						||
| 
								 | 
							
										 true
							 | 
						||
| 
								 | 
							
									 ),
							 | 
						||
| 
								 | 
							
									 assert(node(NodeID, Childs1, Parent , CLL, NewTheory, Visited1, Backscore))
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 NodeID = -1
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								%%%	format("  END",[]),flush_output.
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								assert_childs([],_,_,[]).
							 | 
						||
| 
								 | 
							
								assert_childs([Spec|Rest],P,PCLL,[ID1|Childs]):-
							 | 
						||
| 
								 | 
							
									% node(ID, CHILDRENS, PARENT, PSLL, MLN, VISITED, BACKSCORE)
							 | 
						||
| 
								 | 
							
									retract(lastid(ID)),
							 | 
						||
| 
								 | 
							
								%%%	format(" ~w",[ID]),flush_output,
							 | 
						||
| 
								 | 
							
									ID1 is ID + 1,
							 | 
						||
| 
								 | 
							
									assert(lastid(ID1)),
							 | 
						||
| 
								 | 
							
								%	SigmoidValue is ((1 / (1 + exp(-PCLL)))/0.5),
							 | 
						||
| 
								 | 
							
										SigmoidValue is 1 / (1 -  PCLL),	
							 | 
						||
| 
								 | 
							
									%format(" ~w",[ID1]),
							 | 
						||
| 
								 | 
							
								%%%	score_theory(Spec,DB,CLL),
							 | 
						||
| 
								 | 
							
									assert(node(ID1, [], P, 1 , Spec, 1 , SigmoidValue)),
							 | 
						||
| 
								 | 
							
								%%	assert(node(ID1, [], P, 1 , Spec, 0 , 0)),
							 | 
						||
| 
								 | 
							
									assert_childs(Rest,P,PCLL,Childs).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								theory_length([],X,X).
							 | 
						||
| 
								 | 
							
								theory_length([T|R],K,K1):-
							 | 
						||
| 
								 | 
							
									theory_length(R,K,K0),
							 | 
						||
| 
								 | 
							
									T = rule(_,_,B,_),
							 | 
						||
| 
								 | 
							
									length(B,L),
							 | 
						||
| 
								 | 
							
									( L > K0 ->
							 | 
						||
| 
								 | 
							
										K1 = L
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										K1 = K0
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								score_theory(Theory0,DB,Score,Theory,R3):-
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									( mcts_theories(0) ->
							 | 
						||
| 
								 | 
							
										Theory = Theory0
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										theory_length(Theory0,0,Le),
							 | 
						||
| 
								 | 
							
										( Le > 1 ->
							 | 
						||
| 
								 | 
							
								%			mcts_best_theory(TheoryBest),
							 | 
						||
| 
								 | 
							
								%			append(TheoryBest,Theory0,Theory)
							 | 
						||
| 
								 | 
							
											Theory = Theory0
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
											Theory = Theory0
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%%%	format("   Scoring....",[]),flush_output,
							 | 
						||
| 
								 | 
							
								%%%  write_rules(Theory,user_output),   flush_output,
							 | 
						||
| 
								 | 
							
								  generate_clauses(Theory,R2,0,[],Th1),
							 | 
						||
| 
								 | 
							
								%%%	format("\n ~w\n ~w\n ~w",[Theory,R2,Th1]),
							 | 
						||
| 
								 | 
							
								  assert_all(Th1),
							 | 
						||
| 
								 | 
							
								  assert_all(R2),!,
							 | 
						||
| 
								 | 
							
								  findall(RN-HN,(rule(RN,HL,_BL,_Lit),length(HL,HN)),L),
							 | 
						||
| 
								 | 
							
								  keysort(L,LS),
							 | 
						||
| 
								 | 
							
								  get_heads(LS,LSH),
							 | 
						||
| 
								 | 
							
								  length(LSH,NR),
							 | 
						||
| 
								 | 
							
								  init(NR,LSH),
							 | 
						||
| 
								 | 
							
								  retractall(v(_,_,_)),
							 | 
						||
| 
								 | 
							
								  length(DB,NEx),
							 | 
						||
| 
								 | 
							
								  (setting(examples,atoms)->
							 | 
						||
| 
								 | 
							
								    setting(group,G),  
							 | 
						||
| 
								 | 
							
								    derive_bdd_nodes_groupatoms(DB,NEx,G,[],Nodes,0,CLL0,LE,[]),!
							 | 
						||
| 
								 | 
							
								  ; 
							 | 
						||
| 
								 | 
							
								    derive_bdd_nodes(DB,NEx,[],Nodes,0,CLL0),!
							 | 
						||
| 
								 | 
							
								  ),
							 | 
						||
| 
								 | 
							
								  setting(random_restarts_REFnumber,N),
							 | 
						||
| 
								 | 
							
								  random_restarts(N,Nodes,-inf,CLL,initial,Par,LE),  
							 | 
						||
| 
								 | 
							
								  end,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%%%	format("\n Score ~w ~w",[CLL0,CLL]),
							 | 
						||
| 
								 | 
							
								  update_theory_par(R2,Par,R3),
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								  %%%write('Updated refinement'),nl,
							 | 
						||
| 
								 | 
							
								%%  nl,nl,write_rules(R3,user_output), 
							 | 
						||
| 
								 | 
							
								  Score = CLL,  
							 | 
						||
| 
								 | 
							
								%%%  nl,write('Score (CLL) '),write(Score),nl,nl,nl,
							 | 
						||
| 
								 | 
							
								  retract_all(Th1),
							 | 
						||
| 
								 | 
							
								  retract_all(R2),
							 | 
						||
| 
								 | 
							
								%%%	format(" End",[]),flush_output,
							 | 
						||
| 
								 | 
							
									!.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								backup(1,Reward,[]):-
							 | 
						||
| 
								 | 
							
									!.
							 | 
						||
| 
								 | 
							
								backup(NodeID,Reward,[Parent|R]):-
							 | 
						||
| 
								 | 
							
									(retract(node(NodeID, Childs, Parent , PSLL, MLN, Visited, Backscore)) ->
							 | 
						||
| 
								 | 
							
									 true
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									 format(user_error,"\nNo node with ID ~w in backup",[NodeID]),	 
							 | 
						||
| 
								 | 
							
									 throw(no_node_id(NodeID))
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									SigmoidValue is 1 / (1 -  PSLL),
							 | 
						||
| 
								 | 
							
									( Reward > SigmoidValue ->
							 | 
						||
| 
								 | 
							
										Backscore1 is Backscore + Reward,
							 | 
						||
| 
								 | 
							
										Reward1 is Reward
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										Backscore1 is Backscore + SigmoidValue,
							 | 
						||
| 
								 | 
							
										Reward1 is SigmoidValue		
							 | 
						||
| 
								 | 
							
								%		Backscore1 is Backscore + Reward,
							 | 
						||
| 
								 | 
							
								%		Reward1 is Reward
							 | 
						||
| 
								 | 
							
										),
							 | 
						||
| 
								 | 
							
								%%%	format("\n backup ~w ~w",[NodeID,MLN]),
							 | 
						||
| 
								 | 
							
									assert(node(NodeID, Childs, Parent , PSLL, MLN, Visited, Backscore1)),
							 | 
						||
| 
								 | 
							
									backup(Parent,Reward1,R).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**************************************
							 | 
						||
| 
								 | 
							
									 __END__
							 | 
						||
| 
								 | 
							
									 New source code for MCLPADS
							 | 
						||
| 
								 | 
							
								 **************************************/
							 | 
						||
| 
								 | 
							
								
							 |