// préambule asymptote usepackage("amsmath,amssymb"); usepackage("inputenc","utf8"); usepackage("icomma"); import lib_jl; // code figure real treeNodeStep = 0.3cm; real treeLevelStep = 2.2cm; real treeMinNodeHeight = 0.6cm; struct TreeNode { TreeNode parent; TreeNode[] children; frame content; string prob; pair pos; real adjust; bool labelpos; } void add( TreeNode child, TreeNode parent ) { child.parent = parent; parent.children.push( child ); } TreeNode makeNode( TreeNode parent = null, frame f, string p, bool l ) { TreeNode child = new TreeNode; child.content = f; child.prob = p; child.labelpos=l; if( parent != null ) {add( child, parent );} return child; } TreeNode makeNode( TreeNode parent = null, Label label, string p, bool l ) { frame f; label(f,label); return makeNode( parent, f,p,l ); } real layout( int level, TreeNode node ) { real maxp=0; real minp=1e10; if( node.children.length > 0 ) { real height[] = new real[node.children.length]; real curHeight = 0; for( int i=node.children.length-1;i>=0; --i ) { height[i] = layout( level+1, node.children[i] ); node.children[i].pos = (level*treeLevelStep,curHeight + height[i]/2); maxp=max(maxp,node.children[i].pos.y); minp=min(minp,node.children[i].pos.y); curHeight += height[i] + treeNodeStep; } real midPoint=(maxp+minp)/2; for( int i=node.children.length-1;i>=0; --i ) { node.children[i].adjust = - midPoint; } return max( (max(node.content)-min(node.content)).y,sum(height)+treeNodeStep*(height.length-1) ); } else {return max( treeMinNodeHeight, (max(node.content)-min(node.content)).y );} } void drawAll( TreeNode node, frame f ) { pair pos; if( node.parent != null ) pos = (0,node.parent.pos.y+node.adjust); else pos = (0,node.adjust); node.pos += pos; node.content = shift(node.pos)*node.content; add( f, node.content ); string proba=node.prob; bool arrow=(find(proba,"@",0)!=-1); if (arrow) proba=replace(proba,"@",""); if( node.parent != null ) { path p = point(node.content, W)--point(node.parent.content,E); if (arrow) draw(p, currentpen,BeginArrow(2mm) ); else draw(p, currentpen); if( node.prob != "" ) { if (node.labelpos) draw(Label(scale(.5)*proba),p,N); else draw(Label(scale(.5)*proba),p,S); } else { if (arrow) draw(p, currentpen,BeginArrow(2mm) ); else draw(p, currentpen); } } for( int i = 0; i < node.children.length; ++i ) drawAll( node.children[i], f ); } void draw( TreeNode root, pair pos ) { frame f; root.pos = (0,0); layout( 1, root ); drawAll( root, f ); add(f,pos); } TreeNode root = makeNode("","",true); TreeNode noeud1=makeNode(root,"$L$","$P(L)$",true); TreeNode noeud5=makeNode(noeud1,"$F$","$P_L(F)$",true); TreeNode noeud6=makeNode(noeud1,"$G$","$P_L(G)$",false); TreeNode noeud2=makeNode(root,"$E$","$P(E)$",true); TreeNode noeud7=makeNode(noeud2,"$F$","$P_E(F)$",true); TreeNode noeud8=makeNode(noeud2,"$G$","$P_E(G)$",false); TreeNode noeud3=makeNode(root,"$S$","$P(S)$",false); TreeNode noeud9=makeNode(noeud3,"$F$","$P_S(F)$",true); TreeNode noeud10=makeNode(noeud3,"$G$","$P_S(G)$",false); draw(root,(0,0)); transform t=shift(1cm,0); label("$p(R_n\cap R_{n+1})=\dots$",t*noeud2,align=E); label("$p(\overline{R_n}\cap R_{n+1})=\dots$",t*noeud3,align=E);