% :- lib(suggests(svg)). % :- lib(suggests(mtx)). % :- lib(suggests(real)). % :- lib(stoics_lib:kv_decompose/3). % :- lib(stoics_lib:list_proportions/3). gbn_svg_legend_defaults( Defs ) :- Defs = [ adds_lines(gbn:gbn_svg_add_lines), theme(stack), placement(bottom), has_postfix(gated), has_postfix(fclr), has_postfix(fisher) ]. /** gbn_svg_legend(Opts) A simple gbn shell to svg_legend/1. Opts See svg_legend/1. == == @author nicos angelopoulos @version 0.1 2018/2/26 @see svg_legend/1 */ gbn_svg_legend( Args ) :- options_append( gbn_svg_legend, Args, Opts ), svg_legend( Opts ). gbn_svg_add_lines( stack, Xi, Yi, File, Add, MaX, MaY ) :- ( atom_concat(Stem,'fclr_gated.svg',File) -> atom_concat(Stem,'gates_best.csv',GatesF), mtx( GatesF, GatesMtx, [convert(true),match(false)] ), findall( Gate, ( member(Row,GatesMtx), arg(6,Row,RowGatesAtm), atom_to_term(RowGatesAtm,RowGates,[]), gates_term_functor(RowGates,Gate) ) , GatesNestBag ), flatten( GatesNestBag, GatesBag ), gates_sort( GatesBag, Gates ), ( Gates == [] -> Y5 = Yi, GatesAtms = [] ; svg_add_lines_gates( Gates, Xi, Yi, Y5, GatesAtms ) ) ; Y5 = Yi, GatesAtms = [] ), Xt is Xi + 30, svg_add_lines_compos( [node,pval,cooc,muex,slide], File, Xi, Xt, Y5, 0, -, MaX/MaY, CompoLnsNest ), flatten( CompoLnsNest, CompoLns ), append( GatesAtms, CompoLns, AllLns ), % maplist( atom_codes, GatesAtms, Add ). maplist( atom_codes, AllLns, Add ). svg_add_lines_gates( [], _Xi, Y, Y, [] ). svg_add_lines_gates( [G|Gs], Xi, Yi, Y5, [Ln1,Ln2,Ln3,Ln4|GatesAtms] ) :- svg_add_lines_gate( G, Xi, Yi, Ln1, Ln2, Ln3, Ln4 ), Yj is Yi - 20, svg_add_lines_gates( Gs, Xi, Yj, Y5, GatesAtms ). % svg_add_lines_gate( xor, _Xi, _Yi, _Yj, _L1, _L2, _L3, _L4 ) :- % throw( xor(ing) ). svg_add_lines_gate( xor, Xi, Yi, Lat, Mat, Nat, Oat ) :- % OR GATE T1 = '', T4 = '', OrX is Xi + 30, OrY is Yi, OrTxt = 'XOR gate', Mat = ' LegXOR', N1 = ' ', Oat = '', atomic_list_concat( [T1,OrX,T2,OrY,T3,OrTxt,T4], Lat ), atomic_list_concat( [N1,Poly,N2], Nat ). svg_add_lines_gate( not, Xi, Yi, NotL1, NotL2, NotL3, NotL4 ) :- % NOT gate NotTxX is Xi + 30, NotTxY is Yi, NotX is Xi + 17, NotY is Yi - 5, NotL1a = 'NOT gate', NotL2 = 'LegNot', NotL3a = '', NotL4 = '', atomic_list_concat( [NotL1a,NotTxX,NotL1b,NotTxY,NotL1c], NotL1 ), atomic_list_concat( [NotL3a,NotX,NotL3b,NotY,NotL3c], NotL3 ). svg_add_lines_gate( and, Xi, Yi, AndLat, AndMat, AndNat, Aat ) :- % AND GATE T1 = '', T4 = '', AndX is Xi + 30, AndY is Yi, AndTxt = 'AND gate', AndMat = ' LegAND', AndN1 = ' ', Aat = '', atomic_list_concat( [T1,AndX,T2,AndY,T3,AndTxt,T4], AndLat ), atomic_list_concat( [AndN1,AndPoly,AndN2], AndNat ). svg_add_lines_gate( or, Xi, Yi, Lat, Mat, Nat, Oat ) :- % OR GATE T1 = '', T4 = '', OrX is Xi + 30, OrY is Yi, OrTxt = 'OR gate', Mat = ' LegOR', N1 = ' ', Oat = '', atomic_list_concat( [T1,OrX,T2,OrY,T3,OrTxt,T4], Lat ), atomic_list_concat( [N1,Poly,N2], Nat ). gates_sort( GatesBag, Gates ) :- sort( GatesBag, GatesOrd ), reverse( GatesOrd, GatesInRev ), ( select(not,GatesInRev,GatesNoNot) -> Gates = [not|GatesNoNot] ; Gates = GatesInRev ). gates_term_functor( Atom, Funcs ) :- atomic( Atom ), !, Funcs = []. gates_term_functor( Term, [Token|FuncNest] ) :- Term =.. [Func|Args], gates_term_functor_atom( Func, Token ), maplist( gates_term_functor, Args, FuncNest ). gates_term_functor_atom( o, or ) :- !. gates_term_functor_atom( a, and ) :- !. gates_term_functor_atom( n, not ) :- !. gates_term_functor_atom( x, xor ) :- !. % throw( xor(ing) ). gates_term_functor_atom( Oth, _ ) :- !, throw( unknown_gate_functor(Oth) ). gbn_svg_line_segs_as( A1, A2, A3, A4 ) :- A1 = '', A4 = ''. gbn_svg_line_segs_bs( B1, B2, B3 ) :- B1 = ''. svg_add_lines_compos( [], _File, _Xi, _Xt, Yi, MaX, _Dir, MaX/Yi, [] ). svg_add_lines_compos( [C|Cs], File, Xi, Xt, Yi, CurMaX, Dir, Max, [Lns|TLns] ) :- debug( gbn(gbn), 'Adding compo: ~w', C ), ( svg_add_lines_compo( C, File, Xi, Xt, Yi, CurMaX, IncY, NxtMaX, Lns ) -> true ; debug( gbn(gbn), 'failed compo: ~w', C ), Lns = [], IncY is 0, NxtMaX is CurMaX ), Expr =.. [Dir,Yi,IncY], Yj is Expr, % Yj is Yi + IncY, svg_add_lines_compos( Cs, File, Xi, Xt, Yj, NxtMaX, Dir, Max, TLns ). svg_add_lines_compo( slide, _File, Xi, Xt, Yi, CurMaX, 20, NxtMaX, [I,J] ) :- % compo: slide gbn_svg_line_segs_as( A1, A2, A3, A4 ), L5 = 'Fisher test odds', atomic_list_concat( [A1,Xt,A2,Yi,A3,L5,A4], '', I ), J1 = '', NxtMaX is max(CurMaX,200), % fixme: atomic_list_concat( [J1,Tx1,',',Ty1,' ',Tx2,',',Ty2,' ',Tx3,',',Ty3,J1b], J ). svg_add_lines_compo( cooc, _File, Xi, Xt, Yi, CurMaX, 20, NxtMaX, [A,E] ) :- gbn_svg_line_segs_as( A1, A2, A3, A4 ), gbn_svg_line_segs_bs( B1, B2, B3 ), L1 = 'Co-occur (shown odds=4)', atomic_list_concat( [A1,Xt,A2,Yi,A3,L1,A4], '', A ), Ya is Yi - 5, NxtMaX is max(CurMaX,200), % fixme: atomic_list_concat( [B1,'35978F',B2,Xi,',',Ya,B3], E ). svg_add_lines_compo( muex, _File, Xi, Xt, Yi, CurMaX, 20, NxtMaX, [A,E] ) :- gbn_svg_line_segs_as( A1, A2, A3, A4 ), gbn_svg_line_segs_bs( B1, B2, B3 ), L2 = 'Mut.excl (shown odds=0.25)', Ya is Yi - 5, atomic_list_concat( [A1,Xt,A2,Yi,A3,L2,A4], '', A ), NxtMaX is max(CurMaX,200), % fixme: atomic_list_concat( [B1,'BF812D',B2,Xi,',',Ya,B3], E ). svg_add_lines_compo( pval, File, Xi, Xt, Yi, CurMaX, Pad, NxtMaX, Lns ) :- % ( File == 'dutch_driver_muts_min20_fisher.svg' -> trace; true ), gbn_svg_line_segs_as( A1, A2, A3, A4 ), gbn_svg_line_segs_bs( _B1, B2, _B3 ), os_ext( _, csv, File, CsvFPrv ), ( exists_file(CsvFPrv) -> CsvF = CsvFPrv ; ( os_postfix(gated,CsvF,CsvFPrv) -> true; CsvF=CsvFPrv) ), ( (exists_file(CsvF),mtx(CsvF,Mets,convert(true))) -> maplist( arg(3), Mets, Pvals ), max_list( Pvals, MaxPv ) ; % if there is not MaxPv is 0 ), % ( mtx(CsvF,Mets) -> true; throw( could_not_mtx_csv_file(CsvF) ) ), ( MaxPv < 0.05 -> % fixme: = means no significance... Pad is 0, Lns = [], NxtMaX is CurMaX ; NxtMaX is max(CurMaX,200), % fixme: Pad is 20, L3 = '0.05 < q.val', D1 = '', atomic_list_concat( [D1,'35978F',B2,Xi,',',Yim,C3], DA ), Xib is Xi + 14, atomic_list_concat( [D1,'BF812D',B2,Xib,',',Yim,C3], DB ), Lns = [C,DA,DB] ). svg_add_lines_compo( node, _File, Xi, Xt, Yi, CurMaX, 20, NxtMaX, [G,H] ) :- gbn_svg_line_segs_as( A1, A2, A3, A4 ), gbn_svg_line_segs_bs( _B1, B2, B3 ), L4 = '# events (shown med=', L3b = ',max=', L3c = ')', % svg_dat_file( File, DatFile ), gbn_res_dir_dat_file( '.', DatFile ), debug( gbn(gbn), 'dat.file(~p).', DatFile ), mtx( DatFile, DatMtx, [sep(0' ),convert(true)] ), mtx_value_column_frequencies( DatMtx, 1, Freqs ), kv_decompose( Freqs, _Lbls, Times ), TmMedian <- as.integer( median( Times ) ), TmMax <- as.integer( max( Times ) ), list_proportions( Times, Propos, to_range(r(1,4)) ), NwMedian <- median( Propos ), % Yl is Yk + 20, atomic_list_concat( [A1,Xt,A2,Yi,A3,L4,TmMedian,L3b,TmMax,L3c,A4], '', G ), G1 = '