From a2b9ff1da101368358b4f3a05bdcf6f6668cb69b Mon Sep 17 00:00:00 2001 From: Alexandre Date: Wed, 12 Jun 2024 22:36:28 +0200 Subject: [PATCH] Now ABR stream display should be fixed --- a.out | Bin 283377 -> 287217 bytes trees.cmi | Bin 11283 -> 12494 bytes trees.cmo | Bin 26498 -> 30941 bytes trees.ml | 165 ++++++++++++++++++++++++++++++++++++++++++++++-------- 4 files changed, 142 insertions(+), 23 deletions(-) diff --git a/a.out b/a.out index 4c7d6a4c633d99d28d2b94668e926417731e20a5..6a07ba2a43be7adf6686938526449c47dda930a4 100755 GIT binary patch delta 4281 zcmbVPeQ;FO72o^LTeAzhahFY8LkL+QAs+?^Q9e=&*^o#;TeTEy%V4J~%Y?KsiD+kH z$7!^t)@i4<@J5a>+9nlRQVk{uU5Ftc1uV26rv1l`?M#>!rJ;s|$vFH`yFI_R`!>6o z0Ma-4<=%Vl`MT$xd+y!w{oe5t-e+4?t9FB?t;^96BvLy*0LjWbOCX^@-cb+A`6V%rd)Kt}m3j6qr-4x*94>g^?B|TY= z_l($kk#}}e1?!!3XTDEVU{x@FO_t zQGxvt;kcjA^-#96P`dEx7d+lWKD$%8#N!?0%bF?O?SfeX^sD22r?Irg=e9;z>Fs=> zSHfA}M;Tn&OL~5;5M2U?01TEI^esVCjTgIOQKnPHfj-imt-^(`!0^`iR()G~mPYuC zpa%rH0ApB(E?9@-b%F%{O`V^#i0v*iEv9G?>MdK$NnT^NXh7m%&l&{{9O|Q7Gjc{o zjpvrvml6-G&zZ2sA#BV*9~Bx0TrMu{A>A1E>uzig+?X$L8><>~TfEXM5n$0kh9nXa z3#sx=0s3nNaQr?2_$@OCG!}zQK_4=A#rqh8&)S&uI2{`Ve&~^e<$rvrd5vDTV^Kf| zy5M>O5JHAyM?FSpsm~dZ9wgFv@DTa)VF4*%S%M-6!E*?j;WE6>_>5;ha^z1nV{ym* ziX{)XHz=PyAi}z#(tP|uA9;*RpSX`(z7z}jxmF@}xP5^Lf#W zAR>o^!}R4%?(Ub3?&Nd*w7`ya>-_jt@@Ivm3uiXRg*HpSP>{xonMV6oUkk$UwKydw-ddsS7Qf+z<^G|hv1FfF`>-A8C+orH!-A#f?Ibz4cX)D~ zX2#`+#xEV!X7j`HNO4-4SDNlFE{`ii37=}HEIx-*2*tnC`1_~mjvQoJwZLk@hh-y? zH6Hvx^DVU2JX=Wc)tr(R>%|!AA~AL4mKv)~QI{lxI3>#;HMhYy`h>?@B2(}l-$87$ z;VqS-+~i7nux#e`9=c0Yir?#@+0GvcE4(;nYEe$!Dfe6D8lfPrNOAa%^v8ii3Zqoi z3PgW&yR_C(0UbUE1Ujo;TJq@iL?AXxkRl@E>+w%-V%~9DQ3;XH>*=&+O;49W&5ag0 zy(m10hb(J#k|TFYAEAQQFkkpk^SKj|5mLHo(`~JGl51HqSIV?V!G-I)Q4V%15GnR= zBr0<;XNo?*wVdO0ujxCI83~eSzUY$OgR<$Cg8g;~aCB4n@y6n>%cE-Y&6YC%|LDua z*|f3@=ekJ{e^{UGqdCU4&pgJn)h^ci$y2oZztLz|80rMLPAud}ABh3CaZY;7bHeNT z$)(Oxx8TICM!!r%h61<-h2xKFdE6jV7P>$`QU} zloo1V9pTlZv{(y|aKk7)V($<>8>?mVYW>?N?Nev?xhwRL_Ja}r^A&nM<(Qes-C6jM04U)62Yjj263B{5u-OYZTuLJTxZ1rvAtm$0#@R9huoG z)JFxag5`og!Jxmzb~PGBURZ+P8&4hA${2Zp8#396$S2~zeE4maOy4s)=|pgfuCll; zEUH)_Ht#j>mw%4Mj9Q9h&X#v2X22zVtI*)ehoji};w#)RP7Br9*p8mV!)b{s=D&|q zRaT)e1Ozw>ND*9aSoC}5@RbF03Q?YLRJm}y9AuWTi{g^yvvAA2<@Zsu4A6L+M zc27{QdOxygf-V=#DiNP_d3R<0M4t7F9JZO&k>WY}a8b*eU|VHy;e(-uxcMrZ}6=nA|Jhg2{Ak+}3lTNL4 zztDCv7!1C7e{ey5cm{7>tA9Daa8pCLG4xpdwl-TdD3;B?O8hrH%3t^0?SYC&*IGSI zc}q=K7FRXa*VjE+*Vs_Tks5uu8j6h8=*>zNT)SR(Y3e*b^??4gXCk=!p&jRI%6FBt gK7C|U%Z12i59r;uk*=NO?hX1}tt7xh8}z{c0Hwa}Y5)KL delta 1738 zcmchYT})h65Pb7sz+AJpg1>Bm|{tJ(vV9coj$@pK2Mn(a{~F)HYx;V*6A5Ls9^1>TfxBxxX0 zG296bPZqtF5d%U|Bt3J9UBpRMQPQyLdvN)W(v-AHD)AVxgGid4S~K&kH+y{5EI>~y zA@Q3jaA7nIS}3YX{Ot<(Le+=t;u2=|!yYV;2o1F<&{8zA=J3+6y$f=M)d=^)pzxfg z@7PGpu+vRMJyAk@h{vyjOMHaI5pZNaN0LgSn%GY~PwgenhPPn-uS zbZj1ieDMS7-Qe~#lONvKIdaSgSV-_GZ6&NYIRp+Ti#8Lrgp1%%8bei84xNv(f@mV# z#B10-0{M8Y8>D5;3VViOXIxgi-V3L_k>F${OM&MbWT=loQG9L4S0McxbgQ--WEdWX z(zrd|90I$3Z|Ib*+p5FKasNl`{4LD8t=a`uchcei8ho?|WI;0D$xNmFOQzOjC`LI` zPYL;6ku2b(tf|%|YQ2nmfDg}&;T{N_=%bz*uE?MUnjZy+Q>XBJ|CkBQ7-dWSkPq?~6u#ZK zZ+J}x!M?cP&XS%(;70DFeX}3GqTrGVx-b%F(%0sfMIx`QO76?dA-#{_8^}sjyZ$(+Xv2s9$Hvug8FkC0I)%@!?Stose1Dp$* Axc~qF diff --git a/trees.cmi b/trees.cmi index 362a8c97d8407c9d57ace793aec7e6a87e2ed0d5..fcd6e871884a8d1a9936344794c2b57abf373016 100644 GIT binary patch literal 12494 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 delta 4850 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 failwith "Not possible" | fst::t -> begin - let rec aux t pth isf = match t with + let rec aux t pth isf sign = match t with | Empty -> Empty | Node (x, p, l, r) -> begin match pth with - | [] -> if isf then Node (x, {x = p.x; y = p.y}, aux l [] false, aux r [] false) else Node (x, {x = p.x + v; y = p.y}, aux l [] false, aux r [] false) - | Left::[] -> if isf then Node (x, {x = p.x; y = p.y}, aux l [] false, aux r [] false) else Node (x, {x = p.x + v; y = p.y}, aux l [] false, aux r [] false) - | Right::[] -> if isf then Node (x, {x = p.x; y = p.y}, aux l [] false, aux r [] false) else Node (x, {x = p.x + v; y = p.y}, aux l [] false, aux r [] false) - | Left::t -> if isf then Node (x, {x = p.x + v/2; y = p.y}, aux l t false, r) else Node (x, {x = p.x + v; y = p.y}, aux l t false, r) - | Right::t -> if isf then Node (x, {x = p.x + v/2; y = p.y}, l, aux r t false) else Node (x, {x = p.x + v; y = p.y}, l, aux r t false) + | [] -> if isf then Node (x, {x = p.x; y = p.y}, aux l [] false sign, aux r [] false sign) else Node (x, {x = p.x + v*sign; y = p.y}, aux l [] false sign, aux r [] false sign) + | Left::[] -> if isf then Node (x, {x = p.x; y = p.y}, aux l [] false (-1), r) else Node (x, {x = p.x + v; y = p.y}, aux l [] false (-1), r) + | Right::[] -> if isf then Node (x, {x = p.x; y = p.y}, l, aux r [] false 1) else Node (x, {x = p.x + v; y = p.y}, l, aux r [] false 1) + | Left::t -> if isf then Node (x, {x = p.x ; y = p.y}, aux l t false (-1), r) else Node (x, {x = p.x + v; y = p.y}, aux l t false (-1), aux r [] false (-1)) + | Right::t -> if isf then Node (x, {x = p.x ; y = p.y}, l, aux r t false 1) else Node (x, {x = p.x + v; y = p.y}, aux l [] false 1, aux r t false 1) | _ -> failwith "Not possible" end - in aux tr path true + in aux tr path true 1 end ;; exception CollisionPath of (bal list) ;; -let rec detect_collision (tr : int abr2) haschanged = +let rec detect_collision (tr : int abr2) haschanged (side : int ref) = let hash = Hashtbl.create 48 in let rec aux t d path = match t with | Empty -> () @@ -575,8 +575,14 @@ let rec detect_collision (tr : int abr2) haschanged = let smth = Hashtbl.find_opt hash (p.x, d) in if smth = None then begin Hashtbl.add hash (p.x, d) 1; + if !side = (-1) then begin aux l (d+1) (path@[Left]); aux r (d+1) (path@[Right]); + end + else begin + aux r (d+1) (path@[Right]); + aux l (d+1) (path@[Left]); + end end else raise (CollisionPath path) @@ -587,11 +593,92 @@ let rec detect_collision (tr : int abr2) haschanged = haschanged := false; tr; with - | CollisionPath pth -> haschanged := true; update_col tr pth 4 ;; + | CollisionPath pth -> haschanged := true; side := (-1) * !side; update_col tr pth 4 ;; +exception Collision2 of (bal list * bal list) ;; +let youngest_dad path1 path2 = + let rec aux l1 l2 c = match (l1, l2) with + | ([], []) -> c + | ([], h::t) -> c + | (h::t, []) -> c + | (Left::t1, Right::t2) -> c + | (Right::t1, Left::t2) -> c + | (Left::t1, Left::t2) -> aux t1 t2 (c@[Left]) + | (Right::t1, Right::t2) -> aux t1 t2 (c@[Right]) + | _ -> failwith "Huh ?" + in aux path1 path2 [] ;; + +let get_first_offset p1 p2 = match (p1, p2) with + | (Left::t1, Left::t2) -> (-1, 0) + | (Right::t1, Right::t2) -> (0, 1) + | (Left::t1, Right::t2) -> (0, 0) + | (Right::t1, Left::t2) -> (0, 0) + | _ -> (0, 0) ;; + +let remove_first l = match l with + | [] -> failwith "Undoable" + | h::t -> t ;; + +let rec update_col2 tr p1 p2 v = + let dadpath = youngest_dad p1 p2 in + let (left_add, right_add) = get_first_offset p1 p2 in + (*Printf.printf "%d, %d\n" left_add right_add ; + print_path dadpath;*) + let rec aux t remain_path where offs = match t with + | Empty -> Empty + | Node (x, p, l, r) -> begin + match remain_path with + | Left::rem -> Node (x, {x = p.x + offs ; y = p.y}, aux l rem Root offs, r) + | Right::rem -> Node (x, {x = p.x + offs ; y = p.y}, l, aux r rem Root offs) + | [] -> begin + if where = Root then + Node (x, {x = p.x + offs; y = p.y}, aux l [] Left offs, aux r [] Right offs) + else if where = Left then + Node (x, {x = p.x - v + offs; y = p.y}, aux l [] Left offs, aux r [] Left offs) + else + Node (x, {x = p.x + v + offs; y = p.y}, aux l [] Right offs, aux r [] Right offs) + end + | _ -> failwith "Nani ?" + end + in match tr with + | Empty -> Empty + | Node (x, p, l, r) -> match dadpath with + | h::remdad -> Node (x, p, aux l remdad Root (v*left_add), aux r remdad Root (v*right_add)) + | [] -> Node (x, p, aux l [] Left (v*left_add), aux r [] Right (v*right_add)) ;; + +let rec detect_collision2 (tr : int abr2) haschanged (side : int ref) = + let hash = Hashtbl.create 48 in + let rec aux t d path = match t with + | Empty -> () + | Node (x, p, l, r) -> begin + let smth = Hashtbl.find_opt hash (p.x, d) in + if smth = None then begin + Hashtbl.add hash (p.x, d) path; + if !side = (-1) then begin + aux l (d+1) (path@[Left]); + aux r (d+1) (path@[Right]); + end + else begin + aux r (d+1) (path@[Right]); + aux l (d+1) (path@[Left]); + end + end + else match smth with + | None -> () + | Some opath -> raise (Collision2 (path, opath)) + end + in + try + aux tr 0 []; + haschanged := false; + tr; + with + | Collision2 (p1, p2) -> haschanged := true; update_col2 tr p1 p2 4 ;; + + let decode2 (p : pt) r width height = - (width/3 + p.x * r, height - r - (2*r)*p.y) ;; + (width/2 + p.x * r, height - r - (2*r)*p.y) ;; let raw_print (tr : int abr2) = let rec aux t d = match t with @@ -654,30 +741,62 @@ let rec insert_abr2 (tr : int abr2) e = | Node (x, p, g, d) when e < x -> Node (x, p, aux g p Left, d) | Node (x, p, g, d) -> Node (x, p, g, aux d p Right) in aux tr {x = 0; y = 0} Root ;; - -let successive_insert2 () = + +let successive_insert_semiauto () = let cur_tree = ref Empty in open_graph " 1400x1000" ; set_window_title "Trees" ; + + let radius = 20 in + + let period = 10 in + let sided = ref 1 in + let ct = ref 0 in + + let elt_to_add = ref 500 in + + cur_tree := insert_abr2 !cur_tree !elt_to_add; try while true do - Stdlib.print_endline "What element would you like to insert ?"; - let elt = Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity in + for i = 0 to period-1 do + elt_to_add := Random.int 1000 ; + (*Stdlib.print_endline "Enter an integer :"; + elt_to_add := Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity;*) - open_graph " 1200x1000" ; - set_window_title "Trees" ; + open_graph " 1200x1000" ; + set_window_title "Trees" ; - cur_tree := insert_abr2 !cur_tree elt; + ct := 0; - let changed = ref true in + cur_tree := insert_abr2 !cur_tree !elt_to_add; - while !changed do - cur_tree := detect_collision !cur_tree changed; + let changed = ref true in + + while !changed do + cur_tree := detect_collision2 !cur_tree changed sided; + (*print_int !ct; + Stdlib.print_endline "[]";*) + incr ct; + + open_graph " 1200x1000" ; + set_window_title "Trees" ; + + print_tree2 !cur_tree radius 1400 1000 ; + + if !changed then + Unix.sleepf 0.5; + done; + + print_tree2 !cur_tree radius 1400 1000 ; + Unix.sleepf 0.1; done; + Stdlib.print_endline "Enter an integer :"; + elt_to_add := Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity; + + print_int 0; + (*raw_print !cur_tree ;*) - - print_tree2 !cur_tree 30 1400 1000 ; done; () with @@ -693,7 +812,7 @@ ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; close_graph () ;; failwith "E" ;; *) -successive_insert2 () ;; +successive_insert_semiauto () ;; open_graph " 1800x1000" ;; set_window_title "Trees" ;;