(*test file*)(*NDBM database*)(*creation d'une base de donnes "*)

open Definitions
open Chessrules
open Unix

(*construire une base d'apprentissage: King sur les bords*)
(* 28(0à27)exemples  x 128(0à63) soient 2 echiquier ********)       (*? voir Ocaml-lib sur Sourceforge ?*)

(**********************************BASE-VECTEURS D'ENTREES******************************)

(*bords de l'echiquier*)
let edges = [(0,0);(0,1);(0,2);(0,3);(0,4);(0,5);(0,6);(0,7);
             (1,0);(2,0);(3,0);(4,0);(5,0);(6,0);(7,0);
             (7,1);(7,2);(7,3);(7,4);(7,5);(7,6);(7,7);
             (6,7);(5,7);(4,7);(3,7);(2,7);(1,7)] ;;               (*0<i<27*** 28 x 64 *)

let dataIn k  = let temp = Array.create_matrix 8 8 0 in
   temp.(fst (List.nth edges k)).(snd (List.nth edges k)) <- 1;temp;;
 
let dataIn64 = vect64 (dataIn 1);;

let exin = "";;
let rec strin exin i j = if j=63 then exin else
 strin (exin^(string_of_int (vect64 (dataIn i)).(j))) i (j+1);;

let exStrin k = strin exin k 0;;
exStrin 0;;

(*let resultin = ";;
*let rec learnIn resultin k   = if k=27 then resultin else 
 *  learnIn (resultin^(string_of_char (exStrin k))^") (k+1);;                        (*  " pour JOONE *)
*
*learnIn resultin 0;;
 *)




let resultin = "";;
let rec format resultin i k = if i=63 then resultin else
    format (resultin^(string_of_char (exStrin k).[i])^".0;") (i+1) k ;;

let exformat k = let temp = format resultin 0 k in
 String.sub temp 0 ((String.length temp)-1) ;;

(*exformat 0;;*)

let res = "";;
let rec learnIn1 res k   = if k=27 then res else 
   learnIn1 (res^(exformat k)^"/") (k+1);;                (*retour chariot ? " ?*)

let learnIn = learnIn1 res 0;;


let copylearnIn ()=
let mode = [Unix.O_WRONLY;Unix.O_CREAT;Unix.O_TRUNC;Unix.O_APPENDin
let file = Unix.openfile "donneesJooIn" mode  0o777 in 
let ch = learnIn in
let n = Unix.write file ch 0 (String.length ch) in
if n=0 then print_endline "no output";Unix.close file;;

copylearnIn ();;

(**********************************BASE-VECTEURS DE SORTIES*****************************)


(*format java: double[][]?  - copier-coller <-> Ocaml*)    (*   28 x 64 *)


let data = let temp = Array.create 30 [] in 
 for i=0 to (List.length edges)-1 do
  temp.(i)<-Ensemble.elements (voisK (fst (List.nth edges i)) (snd (List.nth edges i)))
done;temp;; 

(*diagramme de deplacement affichage d'une liste de couples*)

let diagDepl ldiag = let temp = Array.create_matrix 8 8 0 in
  for k=0 to (List.length ldiag)-1 do
    temp.(fst (List.nth ldiag k)).(snd (List.nth ldiag k))<- 1
  done;temp;;

let affDiagDepl ldiag =
for j=7 downto 0 do
  for i=0 to 7 do
    print_int (diagDepl ldiag).(i).(j)
  done;
print_newline ()
done;;

affDiagDepl data.(1);;

(*le tableau au format Ocaml*)

vect64 (diagDepl data.(1));;

let dataExample k = vect64 (diagDepl data.(k));; 

(*sortie standard / standard output*)

for i=0 to (List.length edges)-1 do
  for j=0 to 63 do
    print_int (vect64 (diagDepl data.(i))).(j)
  done;
print_newline ()
done;;


(*Cf(fr) http://www.pps.jussieu.fr/Livres/ora/DA-OCAML/book-ora167.html#@fonctions409*)

(* let mode = [Unix.O_WRONLY;Unix.O_CREAT;Unix.O_TRUNC] in
 *let file = Unix.openfile " mode 0o644 in
 *)


(***********imprimer dans un fichier au format tableau Java*********************)


let ex = "";;
let rec str ex i j = if j=63 then ex else
 str (ex^(string_of_int (vect64 (diagDepl data.(i))).(j))^".0D, ") (i) (j+1);;

(*str ex 1 0 ******* 0<i<28 exemples; 0<j<63 echiquier*)

let exLearn k = let temp = str ex k 0 in
 "{"^(String.sub temp 0 ((String.length temp)-2))^"}";;        
                 
(*exLearn 1;;*)



(*copier un exemple d'apprrentissage dans un fichier *********************** 
*let copyinfile k =
*let mode = [Unix.O_WRONLY;Unix.O_CREAT;Unix.O_TRUNC;Unix.O_APPEND] in
*let file = Unix.openfile " mode  0o777 in 
*let chaine = exLearn k in
*let n = Unix.write file chaine 0 (String.length chaine) in
*if n=0 then print_endline ";;
 ***********************************************************************)


let result = "";;
let rec learnData1 result k   = if k=27 then result else 
   learnData1 (result^(exLearn k)^",") (k+1);;                  (*?? inclure retour ligne ??*)
  
let learnData = learnData1 result 0;;

(*let learnData = let temp = learnData1 result 0 in
 *for k=0 to (String.length temp)-1 do
  *    if temp.[k]='/' then print_newline ()
*done;temp;;  
 *)


let copylearnData ()=
let mode = [Unix.O_WRONLY;Unix.O_CREAT;Unix.O_TRUNC;Unix.O_APPENDin
let file = Unix.openfile "donnees" mode  0o777 in 
let chaine = learnData in
let n = Unix.write file chaine 0 (String.length chaine) in
if n=0 then print_endline "no output";Unix.close file;;

copylearnData ();;

(************************************************************************)

(*In & Out pour le format JOONE*)

(*let joone1 =*) 

(*test hors du champ d'apprentissage*************************************)
(* roi au centre de l'echiquier*)(*resume*)(*exemple*)

let center = [(4,4)];;

let dataInC  = let temp = Array.create_matrix 8 8 0 in
    temp.(fst (List.nth center 0)).(snd (List.nth center 0)) <- 1;temp;;

let dataInC64 = vect64 dataInC;;

let exinC = "";;
let rec strinC exinC j = if j=63 then exinC else
 strinC (exinC^(string_of_int (vect64 (dataInC)).(j))) (j+1);;

let exStrinC = strinC exinC 0;;

let resultinC = "";;
let rec formatC resultinC i = if i=63 then resultinC else
    formatC (resultinC^(string_of_char (exStrinC).[i])^".0;") (i+1) ;;

let exformatC = let temp = formatC resultinC 0 in
 String.sub temp 0 ((String.length temp)-1) ;;

let copylearnInC ()=
let mode = [Unix.O_WRONLY;Unix.O_CREAT;Unix.O_TRUNC;Unix.O_APPENDin
let file = Unix.openfile "donneesCenter" mode  0o777 in 
let ch = exformatC in
let n = Unix.write file ch 0 (String.length ch) in
if n=0 then print_endline "no output";Unix.close file;;

copylearnInC ();;
















(**********NOTES**********************NOTES********************NOTES****************)

 
(*let mode = [Unix.O_WRONLY;Unix.O_CREAT;Unix.O_TRUNC] in
 *let fic = Unix.openfile " mode 0o644 in
 *let str = " in
 *let n = Unix.write fic str 4 5 
 *in Printf.printf " (String.sub str 4 n) ;
 *   Unix.close fic ;;
*On a Ã©crit 45678 dans le fichier
*- : unit = ()
 *)


(*let copyinfile () = let file_out = open_out_bin " in
*for i=0 to (List.length edges)-1 do
 * for j=0 to 63 do
  *  output_char file_out (Char.chr ((vect64 (diagDepl data.(i))).(j)+48))
  *done;
*done;;
*copyinfile ();;
 *)


(*let copystd () =
*for i=0 to (List.length edges)-1 do
*  for j=0 to 63 do
 *   print_char (Char.chr ((vect64 (diagDepl data.(i))).(j)+48))
  *done;
*print_newline ()
*done;;
*copystd ();;
 *)