From b7c9178ae7d63965e02a4730dd9b1780d8505a6d Mon Sep 17 00:00:00 2001 From: Douglas R Miles Date: Sat, 15 Apr 2023 05:49:30 -0700 Subject: [PATCH] almost_a61ba2ce_A --- .../swipl/library/dialect/sicstus/arrays.pl | 12 +- logicmoo_workspace.vpj | 78785 +++++++++++++++- .../docs/_build/doctrees/environment.pickle | Bin 66276 -> 81748 bytes .../cplint/docs/_build/doctrees/index.doctree | Bin 503061 -> 482211 bytes packs_lib/cplint/docs/_build/html/.buildinfo | 2 +- .../docs/_build/html/_sources/index.rst.txt | 105 +- .../cplint/docs/_build/html/_static/basic.css | 322 +- .../docs/_build/html/_static/classic.css | 13 +- .../docs/_build/html/_static/doctools.js | 24 +- .../html/_static/documentation_options.js | 4 +- .../cplint/docs/_build/html/_static/jquery.js | 6 +- .../docs/_build/html/_static/language_data.js | 6 +- .../docs/_build/html/_static/pygments.css | 7 +- .../docs/_build/html/_static/searchtools.js | 115 +- .../docs/_build/html/_static/sidebar.js | 2 +- .../docs/_build/html/_static/underscore.js | 37 +- .../cplint/docs/_build/html/genindex.html | 33 +- packs_lib/cplint/docs/_build/html/index.html | 1629 +- packs_lib/cplint/docs/_build/html/objects.inv | Bin 1463 -> 1121 bytes packs_lib/cplint/docs/_build/html/search.html | 62 +- .../cplint/docs/_build/html/searchindex.js | 2 +- .../docs/_build/latex/LICRlatin2utf8.xdy | 2 +- packs_lib/cplint/docs/_build/latex/Makefile | 8 +- packs_lib/cplint/docs/_build/latex/cplint.pdf | Bin 305653 -> 351727 bytes packs_lib/cplint/docs/_build/latex/cplint.tex | 1816 +- .../cplint/docs/_build/latex/latexmkjarc | 4 +- packs_lib/cplint/docs/_build/latex/sphinx.sty | 1670 +- packs_lib/cplint/docs/_build/latex/sphinx.xdy | 99 +- .../docs/_build/latex/sphinxhighlight.sty | 135 +- .../cplint/docs/_build/latex/sphinxhowto.cls | 30 +- .../cplint/docs/_build/latex/sphinxmanual.cls | 30 +- packs_lib/cplint/docs/conf.py | 2 +- packs_lib/cplint/docs/index.rst | 107 +- .../cplint/prolog/cplint_test/cplint_test.pl | 4 +- .../cplint/prolog/cplint_test/test_mc.pl | 4 +- .../cplint/prolog/cplint_test/test_pita.pl | 37 +- packs_lib/cplint/prolog/examples/abd3.pl | 2 - .../cplint/prolog/examples/bitcoin_attack.pl | 8 +- .../cplint/prolog/examples/eruption_mpe.pl | 3 +- packs_lib/cplint/prolog/examples/pcfg.cpl | 24 +- packs_lib/cplint/prolog/examples/pcfg.pl | 5 +- packs_lib/cplint/prolog/examples/pcfglr.pl | 9 +- packs_lib/cplint/prolog/examples/pcfglrdb.pl | 18 +- packs_lib/cplint/prolog/examples/widget.pl | 4 +- packs_lib/cplint/prolog/examples/widgetmsw.pl | 2 +- packs_lib/cplint/prolog/lemur.pl | 1 - packs_lib/cplint/prolog/mcintyre.pl | 83 +- packs_lib/cplint/prolog/pita.pl | 220 +- packs_lib/cplint/prolog/pitaind.pl | 45 +- packs_lib/cplint/prolog/slipcover.pl | 71 +- packs_lib/cplint/prolog/viterbi.pl | 38 +- packs_lib/phil/buildenv.sh | 13 +- .../docs/_build/doctrees/environment.pickle | Bin 43713 -> 54247 bytes .../phil/docs/_build/doctrees/index.doctree | Bin 163203 -> 165210 bytes packs_lib/phil/docs/_build/html/.buildinfo | 2 +- .../docs/_build/html/_sources/index.rst.txt | 6 +- .../phil/docs/_build/html/_static/basic.css | 32 +- .../phil/docs/_build/html/_static/classic.css | 2 +- .../phil/docs/_build/html/_static/doctools.js | 12 +- .../phil/docs/_build/html/_static/jquery.js | 798 +- .../docs/_build/html/_static/searchtools.js | 352 +- .../phil/docs/_build/html/_static/sidebar.js | 2 +- .../docs/_build/html/_static/underscore.js | 723 +- packs_lib/phil/docs/_build/html/genindex.html | 21 +- packs_lib/phil/docs/_build/html/index.html | 325 +- packs_lib/phil/docs/_build/html/objects.inv | Bin 805 -> 808 bytes packs_lib/phil/docs/_build/html/search.html | 22 +- .../phil/docs/_build/html/searchindex.js | 2 +- .../_build/latex/footnotehyper-sphinx.sty | 9 +- packs_lib/phil/docs/_build/latex/latexmkjarc | 17 +- packs_lib/phil/docs/_build/latex/phil.aux | 114 +- .../phil/docs/_build/latex/phil.fdb_latexmk | 328 +- packs_lib/phil/docs/_build/latex/phil.fls | 112 +- packs_lib/phil/docs/_build/latex/phil.log | 1390 +- packs_lib/phil/docs/_build/latex/phil.out | 2 +- packs_lib/phil/docs/_build/latex/phil.pdf | Bin 178910 -> 177240 bytes packs_lib/phil/docs/_build/latex/phil.tex | 311 +- packs_lib/phil/docs/_build/latex/phil.toc | 50 +- packs_lib/phil/docs/_build/latex/python.ist | 9 +- packs_lib/phil/docs/_build/latex/sphinx.sty | 762 +- .../phil/docs/_build/latex/sphinxhowto.cls | 16 +- .../phil/docs/_build/latex/sphinxmanual.cls | 12 +- packs_lib/phil/docs/index.rst | 6 +- packs_lib/phil/docs/newbib.bib | 9 + packs_lib/phil/lib/x86_64-linux/phil.so | Bin 141464 -> 113416 bytes packs_lib/phil/phil.c | 51 +- packs_lib/phil/phil.o | Bin 191320 -> 166376 bytes packs_lib/phil/phil.so | Bin 141464 -> 113416 bytes packs_lib/phil/prolog/phil.pl | 157 +- .../prolog/episodic_memory/adv_spider.pl | 10 + .../prolog/kaggle_arc/arc-dsl/solvers.pl | 5 +- .../kaggle_arc/induction/h_muarc_aleph.pl | 413 +- .../kaggle_arc/induction/h_muarc_alephlib.pl | 906 +- .../kaggle_arc/induction/h_muarc_metagol.pl | 257 + .../prolog/kaggle_arc/kaggle_arc.pl | 50 +- .../prolog/kaggle_arc/kaggle_arc_boards.pl | 152 +- .../prolog/kaggle_arc/kaggle_arc_db.pl | 2 +- .../kaggle_arc/kaggle_arc_domaintypes.pl | 4 +- .../kaggle_arc/kaggle_arc_explaination.pl | 1 + .../prolog/kaggle_arc/kaggle_arc_grid_size.pl | 47 +- .../kaggle_arc/kaggle_arc_heuristics.pl | 171 + .../prolog/kaggle_arc/kaggle_arc_imageproc.pl | 68 +- .../kaggle_arc/kaggle_arc_individuation.pl | 576 +- .../kaggle_arc_individuation_pbox.pl | 2 +- .../kaggle_arc/kaggle_arc_interpreter.pl | 21 +- .../prolog/kaggle_arc/kaggle_arc_learning.pl | 33 +- .../prolog/kaggle_arc/kaggle_arc_object.pl | 192 +- .../prolog/kaggle_arc/kaggle_arc_physics.pl | 101 +- .../kaggle_arc/kaggle_arc_precompiler.pl | 9 +- .../kaggle_arc/kaggle_arc_prior_groups.pl | 1204 +- .../prolog/kaggle_arc/kaggle_arc_recognise.pl | 4 +- .../prolog/kaggle_arc/kaggle_arc_reduce.pl | 68 +- .../prolog/kaggle_arc/kaggle_arc_symmetry.pl | 2 +- .../prolog/kaggle_arc/kaggle_arc_test_favs.pl | 67 +- .../kaggle_arc/kaggle_arc_test_iface.pl | 78 +- .../kaggle_arc/kaggle_arc_test_loader.pl | 2 + .../prolog/kaggle_arc/kaggle_arc_two.pl | 6 +- .../prolog/kaggle_arc/kaggle_arc_ui_ansi.pl | 47 +- .../kaggle_arc/kaggle_arc_uniqueness.pl | 452 + .../prolog/kaggle_arc/kaggle_arc_utils.pl | 4 +- .../logicmoo_utils/prolog/debuggery/first.pl | 10 +- .../logicmoo_utils/prolog/debuggery/rtrace.pl | 18 +- .../prolog/logicmoo/no_repeats.pl | 18 +- 123 files changed, 87697 insertions(+), 8617 deletions(-) diff --git a/docker/rootfs/usr/local/lib/swipl/library/dialect/sicstus/arrays.pl b/docker/rootfs/usr/local/lib/swipl/library/dialect/sicstus/arrays.pl index af3c7f7598..6125d8390a 100644 --- a/docker/rootfs/usr/local/lib/swipl/library/dialect/sicstus/arrays.pl +++ b/docker/rootfs/usr/local/lib/swipl/library/dialect/sicstus/arrays.pl @@ -59,6 +59,12 @@ new_array(array(Array)) :- rb_empty(Array). + +arb_lookup(Index, array(Tree), ListElement):- + catch(rb_lookup(Index, array(Tree), ListElement),_,fail),!. +arb_lookup(Index, array(Tree), ListElement):- + catch(rb_lookup(Index, Tree, ListElement),_,fail),!. + %% is_array(@Term) is semidet. % % True if Term is an array @@ -77,7 +83,7 @@ % @compat SICStus-3 aref(Index, array(Tree), Element) :- - rb_lookup(Index, array(Tree), Element). + arb_lookup(Index, array(Tree), Element). %% arefa(+Index, +Array, -ArrayElement) is det. % @@ -87,7 +93,7 @@ % @compat SICStus-3 arefa(Index, array(Tree), ArrayElement) :- - rb_lookup(Index, array(Tree), ArrayElement), !. + arb_lookup(Index, array(Tree), ArrayElement), !. arefa(_, _, Array) :- new_array(Array). @@ -99,7 +105,7 @@ % @compat SICStus-3 arefl(Index, array(Tree), ListElement) :- - rb_lookup(Index, array(Tree), ListElement), !. + arb_lookup(Index, array(Tree), ListElement), !. arefl(_, _, []). %% array_to_list(+Array, -Pairs) is det. diff --git a/logicmoo_workspace.vpj b/logicmoo_workspace.vpj index 3aa17780ca..e48da9806c 100644 --- a/logicmoo_workspace.vpj +++ b/logicmoo_workspace.vpj @@ -1277,7 +1277,108 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -8239,6 +8340,1898 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -10499,7 +12492,6 @@ - @@ -11020,509 +13012,75896 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12928,15 +90307,12 @@ - - - @@ -135117,6 +212493,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -136674,161 +214315,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -170609,7 +248095,6 @@ - diff --git a/packs_lib/cplint/docs/_build/doctrees/environment.pickle b/packs_lib/cplint/docs/_build/doctrees/environment.pickle index 81d89a4e9e5ceb495a73ab6e0ab3944c47cc4804..8e4045e57e9c12dac189010e6665f764cbadee20 100644 GIT binary patch literal 81748 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 i_bCMPr6`i!2pV2YQLadO>J&z7hyD*$WdN7} literal 66276 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 My8>ycywv~y0Kno;!~g&Q diff --git a/packs_lib/cplint/docs/_build/doctrees/index.doctree b/packs_lib/cplint/docs/_build/doctrees/index.doctree index 6d8b6610fa4d4f7c1d8d1217b827616c0a4bd772..53327a801b73e84bb3a51beab680d07d3b132968 100644 GIT binary patch literal 482211 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 F{y%kLJWv1t diff --git a/packs_lib/cplint/docs/_build/html/.buildinfo b/packs_lib/cplint/docs/_build/html/.buildinfo index 0bd7442377..02e86168a5 100644 --- a/packs_lib/cplint/docs/_build/html/.buildinfo +++ b/packs_lib/cplint/docs/_build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 413f96db706aaf7e6532df4eafb507d2 +config: bef0088245ccd71558ea9f5194c58bcb tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/packs_lib/cplint/docs/_build/html/_sources/index.rst.txt b/packs_lib/cplint/docs/_build/html/_sources/index.rst.txt index 38597e9edc..e2a80e5639 100644 --- a/packs_lib/cplint/docs/_build/html/_sources/index.rst.txt +++ b/packs_lib/cplint/docs/_build/html/_sources/index.rst.txt @@ -9,7 +9,7 @@ cplint on SWISH Manual - SWI-Prolog Version .. toctree:: :maxdepth: 2 - +.. highlight:: cplint Introduction ============ @@ -39,7 +39,9 @@ It requires the packs * `auc `_ * `matrix `_ -They are installed automatically when installing pack `cplint` or can installed manually as :: +They are installed automatically when installing pack `cplint` or can installed manually as + +.. code-block:: console $ swipl ?- pack_install(bddem). @@ -52,7 +54,9 @@ They are installed automatically when installing pack `cplint` or can installed On 32 and 64 bits Linux this should work out of the box. On 64 bits Windows the library must be rebuilt by hand, see the pack page ``_. -You can upgrade the pack with :: +You can upgrade the pack with + +.. code-block:: console $ swipl ?- pack_upgrade(cplint). @@ -61,7 +65,8 @@ Note that the packs on which `cplint` depends are not upgraded automatically in Example of use --------------- -:: + +.. code-block:: console $ cd /cplint/prolog/examples $ swipl @@ -70,7 +75,8 @@ Example of use Testing the installation ------------------------ -:: + +.. code-block:: console $ swipl ?- [library(cplint_test/test)]. @@ -234,6 +240,7 @@ where :code:`Density` is a special atom identifying a probability density on var - :code:`geometric(Var,P)` :code:`Var` follows a geometric distribution with parameter :code:`P` (success probability). - :code:`exponential(Var,Lambda)` :code:`Var` follows an exponential distribution with parameter :code:`Lambda` (rate, or inverse scale). - :code:`pascal(Var,R,P)` :code:`Var` follows an exponential distribution with parameters :code:`R` (number of failures) and :code:`P` (success probability). +- :code:`multinomial(Var,N,P)` :code:`Var` (vector/list of event numbers) follows a multinomial distribution with parameters :code:`N` (number of trials) and :code:`P` (vector/list of event probabilities). For example :: @@ -320,9 +327,9 @@ Distributional Clauses Syntax You can also use the syntax of Distributional Clauses (DC) :cite:`Nitti2016`. Continuous random variables are represented in this case by term whose distribution can be specified with density atoms as in :: - T~Density' := Body. + T~Density := Body. -Here :code:`:=` replaces the implication symbol, :code:`T` is a term and :code:`Density'` is one of the density atoms above without the :code:`Var` argument, because :code:`T` itself represents a random variables. +Here :code:`:=` replaces the implication symbol, :code:`T` is a term and :code:`Density` is one of the density atoms above without the :code:`Var` argument, because :code:`T` itself represents a random variables. In the body of clauses you can use the infix operator :code:`~=` to equate a term representing a random variable with a logical variable or a constant as in :code:`T ~= X`. Internally :code:`cplint` transforms the terms representing random variables into atoms with an extra argument for holding the variable. @@ -337,57 +344,22 @@ If :code:`Body` is empty, as in regular Prolog, the implication symbol :code:`:= The Indian GPA problem from ``_ in distributional clauses syntax (``_) takes the form (`indian_gpadc.pl `_): :: - is_density_A:0.95;is_discrete_A:0.05. - % the probability distribution of GPA scores for American students is - % continuous with probability 0.95 and discrete with probability 0.05 + coin ~ finite([0.95:true,0.05:false]). + agpa ~ beta(8,2) := coin~=true. + american_gpa ~ finite([0.85:4.0,0.15:0.0]) := coin~=false. - agpa(A): beta(A,8,2) :- is_density_A. - % the GPA of American students follows a beta distribution if the - % distribution is continuous + american_gpa ~ val(V) := agpa ~=A, V is A*4.0. - american_gpa(G) : finite(G,[4.0:0.85,0.0:0.15]) :- is_discrete_A. - % the GPA of American students is 4.0 with probability 0.85 and 0.0 - % with - % probability 0.15 if the - % distribution is discrete - - american_gpa(A):- agpa(A0), A is A0*4.0. - % the GPA of American students is obtained by rescaling the value of - % agpa - % to the (0.0,4.0) interval - - is_density_I : 0.99; is_discrete_I:0.01. - % the probability distribution of GPA scores for Indian students is - % continuous with probability 0.99 and discrete with probability - % 0.01 - - igpa(I): beta(I,5,5) :- is_density_I. - % the GPA of Indian students follows a beta distribution if the - % distribution is continuous - - indian_gpa(I): finite(I,[0.0:0.1,10.0:0.9]):- is_discrete_I. - % the GPA of Indian students is 10.0 with probability 0.9 and 0.0 - % with - % probability 0.1 if the - % distribution is discrete - - indian_gpa(I) :- igpa(I0), I is I0*10.0. - % the GPA of Indian students is obtained by rescaling the value - % of igpa - % to the (0.0,4.0) interval - - nation(N) : finite(N,[a:0.25,i:0.75]). - % the nation is America with probability 0.25 and India with - % probability 0.75 - - student_gpa(G):- nation(a),american_gpa(G). - % the GPA of the student is given by american_gpa if the nation is - % America - - student_gpa(G) :- nation(i),indian_gpa(G). - % the GPA of the student is given by indian_gpa if the nation - % is India + coin2 ~ finite([0.99:true,0.01:false]). + igpa ~ beta(5,5) := coin2~=true. + indian_gpa ~ finite([0.1:0.0,0.9:10.0]) := coin2~=false. + + indian_gpa ~ val(V) := igpa ~=A, V is A*10.0. + nation ~ finite([0.25:a,0.75:i]). + + student_gpa ~ val(A) := nation~=a,american_gpa~=A. + student_gpa ~ val(I) := nation~=i,indian_gpa~=I. Semantics ================== @@ -490,7 +462,9 @@ To run a query, you can simply load the Prolog file, for example `coin.pl `_. For example, the :code:`swish-ask.sh` client can be used with bash to download the results for a query in CSV. -The call below downloads a CSV file for the coin example. :: +The call below downloads a CSV file for the coin example + +.. code-block:: console $ bash swish-ask.sh --server=http://cplint.eu e/coin.pl Prob "prob(heads(coin),Prob)" The script can ask queries against Prolog scripts stored in `http://cplint.eu `_ by specifying the script on the commandline. -User defined files stored in :code:`cplint` on SWISH (locations of type `http://cplint.eu/p/coin_user.pl `_) can be directly used, for example: :: +User defined files stored in :code:`cplint` on SWISH (locations of type `http://cplint.eu/p/coin_user.pl `_) can be directly used, for example: + +.. code-block:: console $ bash swish-ask.sh --server=http://cplint.eu coin_user.pl Prob "prob(heads(coin),Prob)" Example programs can be used by specifying the folder portion of the url of the example, as in the first coin example above where the url for the program is ``__. -You can also use an url for the program as in :: +You can also use an url for the program as in + +.. code-block:: console $ bash swish-ask.sh --server=http://cplint.eu \ https://raw.githubusercontent.com/friguzzi/swish/\ master/e/coin.pl Prob "prob(heads(coin),Prob)" Results can be downloaded in JSON using the option :code:`--json-s` or :code:`--json-html`. With the first the output is in a simple string format where Prolog terms are sent using quoted write, the latter serialize responses as HTML strings. -E.g. :: +E.g. + +.. code-block:: console $ bash swish-ask.sh --json-s --server=http://cplint.eu \ coin_user.pl Prob "prob(heads(coin),Prob)" diff --git a/packs_lib/cplint/docs/_build/html/_static/basic.css b/packs_lib/cplint/docs/_build/html/_static/basic.css index 104f076ae8..912859b55d 100644 --- a/packs_lib/cplint/docs/_build/html/_static/basic.css +++ b/packs_lib/cplint/docs/_build/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -15,6 +15,12 @@ div.clearer { clear: both; } +div.section::after { + display: block; + content: ''; + clear: left; +} + /* -- relbar ---------------------------------------------------------------- */ div.related { @@ -124,7 +130,7 @@ ul.search li a { font-weight: bold; } -ul.search li div.context { +ul.search li p.context { color: #888; margin: 2px 0 0 30px; text-align: left; @@ -231,6 +237,16 @@ a.headerlink { visibility: hidden; } +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -261,19 +277,25 @@ p.rubric { font-weight: bold; } -img.align-left, .figure.align-left, object.align-left { +img.align-left, figure.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } -img.align-right, .figure.align-right, object.align-right { +img.align-right, figure.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } -img.align-center, .figure.align-center, object.align-center { +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { display: block; margin-left: auto; margin-right: auto; @@ -287,30 +309,41 @@ img.align-center, .figure.align-center, object.align-center { text-align: center; } +.align-default { + text-align: center; +} + .align-right { text-align: right; } /* -- sidebars -------------------------------------------------------------- */ -div.sidebar { +div.sidebar, +aside.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; - padding: 7px 7px 0 7px; + padding: 7px; background-color: #ffe; width: 40%; float: right; + clear: right; + overflow-x: auto; } p.sidebar-title { font-weight: bold; } +div.admonition, div.topic, blockquote { + clear: left; +} + /* -- topics ---------------------------------------------------------------- */ div.topic { border: 1px solid #ccc; - padding: 7px 7px 0 7px; + padding: 7px; margin: 10px 0 10px 0; } @@ -332,10 +365,6 @@ div.admonition dt { font-weight: bold; } -div.admonition dl { - margin-bottom: 0; -} - p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; @@ -346,9 +375,30 @@ div.body p.centered { margin-top: 25px; } +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + /* -- tables ---------------------------------------------------------------- */ table.docutils { + margin-top: 10px; + margin-bottom: 10px; border: 0; border-collapse: collapse; } @@ -358,6 +408,11 @@ table.align-center { margin-right: auto; } +table.align-default { + margin-left: auto; + margin-right: auto; +} + table caption span.caption-number { font-style: italic; } @@ -391,22 +446,34 @@ table.citation td { border-bottom: none; } +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + /* -- figures --------------------------------------------------------------- */ -div.figure { +div.figure, figure { margin: 0.5em; padding: 0.5em; } -div.figure p.caption { +div.figure p.caption, figcaption { padding: 0.3em; } -div.figure p.caption span.caption-number { +div.figure p.caption span.caption-number, +figcaption span.caption-number { font-style: italic; } -div.figure p.caption span.caption-text { +div.figure p.caption span.caption-text, +figcaption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ @@ -433,10 +500,71 @@ table.field-list td, table.field-list th { /* -- hlist styles ---------------------------------------------------------- */ +table.hlist { + margin: 1em 0; +} + table.hlist td { vertical-align: top; } +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + /* -- other body styles ----------------------------------------------------- */ @@ -460,11 +588,78 @@ ol.upperroman { list-style: upper-roman; } +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + dl { margin-bottom: 15px; } -dd p { +dd > :first-child { margin-top: 0px; } @@ -478,6 +673,11 @@ dd { margin-left: 30px; } +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + dt:target, span.highlighted { background-color: #fbe54e; } @@ -491,14 +691,6 @@ dl.glossary dt { font-size: 1.1em; } -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - .versionmodified { font-style: italic; } @@ -537,6 +729,12 @@ dl.glossary dt { font-style: oblique; } +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + abbr, acronym { border-bottom: dotted 1px; cursor: help; @@ -549,6 +747,10 @@ pre { overflow-y: hidden; /* fixes display issues on Chrome browsers */ } +pre, div[class*="highlight-"] { + clear: both; +} + span.pre { -moz-hyphens: none; -ms-hyphens: none; @@ -556,22 +758,57 @@ span.pre { hyphens: none; } +div[class*="highlight-"] { + margin: 1em 0; +} + td.linenos pre { - padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { - margin-left: 0.5em; + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; } table.highlighttable td { - padding: 0 0.5em 0 0.5em; + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; } div.code-block-caption { + margin-top: 1em; padding: 2px 5px; font-size: small; } @@ -580,8 +817,14 @@ div.code-block-caption code { background-color: transparent; } -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ } div.code-block-caption span.caption-number { @@ -593,21 +836,7 @@ div.code-block-caption span.caption-text { } div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; + margin: 1em 0; } code.xref, a code { @@ -648,8 +877,7 @@ span.eqno { } span.eqno a.headerlink { - position: relative; - left: 0px; + position: absolute; z-index: 1; } diff --git a/packs_lib/cplint/docs/_build/html/_static/classic.css b/packs_lib/cplint/docs/_build/html/_static/classic.css index 1f9c20bcdc..9d965bf9f7 100644 --- a/packs_lib/cplint/docs/_build/html/_static/classic.css +++ b/packs_lib/cplint/docs/_build/html/_static/classic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- classic theme. * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -13,6 +13,11 @@ /* -- page layout ----------------------------------------------------------- */ +html { + /* CSS hack for macOS's scrollbar (see #1125) */ + background-color: #FFFFFF; +} + body { font-family: sans-serif; font-size: 100%; @@ -236,8 +241,8 @@ p.admonition-title:after { pre { padding: 5px; - background-color: #eeffcc; - color: #333333; + background-color: unset; + color: unset; line-height: 120%; border: 1px solid #ac9; border-left: none; @@ -250,7 +255,7 @@ code { font-size: 0.95em; } -th { +th, dl.field-list > dt { background-color: #ede; } diff --git a/packs_lib/cplint/docs/_build/html/_static/doctools.js b/packs_lib/cplint/docs/_build/html/_static/doctools.js index ffadbec11f..8cbf1b161a 100644 --- a/packs_lib/cplint/docs/_build/html/_static/doctools.js +++ b/packs_lib/cplint/docs/_build/html/_static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -29,9 +29,14 @@ if (!window.console || !console.firebug) { /** * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL */ jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); }; /** @@ -87,14 +92,13 @@ jQuery.fn.highlightText = function(text, className) { node.nextSibling)); node.nodeValue = val.substr(0, pos); if (isInSVG) { - var bbox = span.getBBox(); var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - rect.x.baseVal.value = bbox.x; + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; rect.y.baseVal.value = bbox.y; rect.width.baseVal.value = bbox.width; rect.height.baseVal.value = bbox.height; rect.setAttribute('class', className); - var parentOfText = node.parentNode.parentNode; addItems.push({ "parent": node.parentNode, "target": rect}); @@ -284,10 +288,12 @@ var Documentation = { }, initOnKeyListeners: function() { - $(document).keyup(function(event) { + $(document).keydown(function(event) { var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { + // don't navigate when in search box, textarea, dropdown or button + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' + && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey + && !event.shiftKey) { switch (event.keyCode) { case 37: // left var prevHref = $('link[rel="prev"]').prop('href'); @@ -295,12 +301,14 @@ var Documentation = { window.location.href = prevHref; return false; } + break; case 39: // right var nextHref = $('link[rel="next"]').prop('href'); if (nextHref) { window.location.href = nextHref; return false; } + break; } } }); diff --git a/packs_lib/cplint/docs/_build/html/_static/documentation_options.js b/packs_lib/cplint/docs/_build/html/_static/documentation_options.js index 92d7c067f6..b88a9689a7 100644 --- a/packs_lib/cplint/docs/_build/html/_static/documentation_options.js +++ b/packs_lib/cplint/docs/_build/html/_static/documentation_options.js @@ -3,8 +3,10 @@ var DOCUMENTATION_OPTIONS = { VERSION: '4.5', LANGUAGE: 'None', COLLAPSE_INDEX: false, + BUILDER: 'html', FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, + NAVIGATION_WITH_KEYS: false }; \ No newline at end of file diff --git a/packs_lib/cplint/docs/_build/html/_static/jquery.js b/packs_lib/cplint/docs/_build/html/_static/jquery.js index 644d35e274..b0614034ad 100644 --- a/packs_lib/cplint/docs/_build/html/_static/jquery.js +++ b/packs_lib/cplint/docs/_build/html/_static/jquery.js @@ -1,4 +1,2 @@ -/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), -a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), -null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" - - - - - + + + + @@ -28,7 +24,8 @@

Navigation

  • index
  • - + + @@ -45,6 +42,7 @@

    Index

    +
    @@ -60,12 +58,13 @@

    Navigation

  • index
  • - + + \ No newline at end of file diff --git a/packs_lib/cplint/docs/_build/html/index.html b/packs_lib/cplint/docs/_build/html/index.html index 8671ed1e77..6864caf216 100644 --- a/packs_lib/cplint/docs/_build/html/index.html +++ b/packs_lib/cplint/docs/_build/html/index.html @@ -1,21 +1,20 @@ - + - + - - + + + cplint on SWISH Manual - SWI-Prolog Version — cplint 4.5 documentation - - + + - - - - - - + + + + + @@ -27,7 +26,8 @@

    Navigation

  • index
  • - + + @@ -36,13 +36,13 @@

    Navigation

    -
    +

    cplint on SWISH Manual - SWI-Prolog Version

    -
    +

    Introduction

    -

    cplint is a suite of programs for reasoning with LPADs/CP-logic programs [VV03][VVB04][VDB06][VDB09]. +

    cplint is a suite of programs for reasoning with LPADs/CP-logic programs [VDB06, VDB09, VV03, VVB04]. It contains modules for both inference and learning.

    cplint is available in three versions, one for Yap Prolog, one for XSB and one for SWI-Prolog. They differ slightly in the features offered. @@ -50,79 +50,79 @@

    Introductionhttp://ds.ing.unife.it/~friguzzi/software/cplint/manual.html and for the XSB version at http://xsb.sourceforge.net/manual2/manual2.pdf.

    cplint on SWISH is a web application for using cplint available at http://cplint.eu.

    -

    -
    +
    +

    Installation

    cplint is distributed as a pack of SWI-Prolog. To install it, use

    -
    ?- pack_install(cplint).
    +
    ?- pack_install(cplint).
     
    -
    +

    Requirements

    It requires the packs

    They are installed automatically when installing pack cplint or can installed manually as

    -
    $ swipl
    -?- pack_install(bddem).
    -?- pack_install(auc).
    -?- pack_install(matrix).
    +
    $ swipl
    +?- pack_install(bddem).
    +?- pack_install(auc).
    +?- pack_install(matrix).
     

    bddem uses a foreign library and contains the library binaries for 32 and 64 bits Linux, MacOs and 64 bits Windows. If you want to recompile the foreign library you can use

    -
    ?- pack_rebuild(bdeem).
    +
    ?- pack_rebuild(bdeem).
     

    On 32 and 64 bits Linux this should work out of the box. On 64 bits Windows the library must be rebuilt by hand, see the pack page https://github.com/friguzzi/bddem.

    You can upgrade the pack with

    -
    $ swipl
    -?- pack_upgrade(cplint).
    +
    $ swipl
    +?- pack_upgrade(cplint).
     

    Note that the packs on which cplint depends are not upgraded automatically in this case so they need to be upgraded manually.

    -
    -
    +
    +

    Example of use

    -
    $ cd <pack>/cplint/prolog/examples
    -$ swipl
    -?- [coin].
    -?- prob(heads(coin),P).
    +
    $ cd <pack>/cplint/prolog/examples
    +$ swipl
    +?- [coin].
    +?- prob(heads(coin),P).
     
    -
    -
    +
    +

    Testing the installation

    -
    $ swipl
    -?- [library(cplint_test/test)].
    -?- test.
    +
    $ swipl
    +?- [library(cplint_test/test)].
    +?- test.
     
    -
    -
    +
    +

    Datasets

    Other machine learning datasets are available in pack cplint_datasets.

    -
    -
    +
    +

    Support

    Use the Google group https://groups.google.com/forum/#!forum/cplint.

    -
    -
    -
    + + +

    Syntax

    cplint allows the definition of discrete probability distributions and continuous probability densities.

    -
    +

    Discrete Probability Distributions

    LPAD and CP-logic programs consist of a set of annotated disjunctive clauses. Disjunction in the head is represented with a semicolon and atoms in the head are separated from probabilities by a colon. For the rest, the usual syntax of Prolog is used. A general CP-logic clause has the form:

    -
    h1:p1 ; ... ; hn:pn :- Body.
    +
    h1:p1 ; ... ; hn:pn :- Body.
     

    where Body is a conjunction of goals as in Prolog. @@ -130,28 +130,28 @@

    Discrete Probability Distributionspi are numeric expressions. It is up to the user to ensure that the numeric expressions are legal, i.e. that they sum up to less than one. If the clause has an empty body, it can be represented like this:

    -
    h1:p1 ; ... ; hn:pn.
    +
    h1:p1 ; ... ; hn:pn.
     

    If the clause has a single head with probability 1, the annotation can be omitted and the clause takes the form of a normal prolog clause, i.e.:

    -
    h1 :- Body.
    +
    h1 :- Body.
     

    stands for:

    -
    h1:1 :- Body.
    +
    h1:1 :- Body.
     
    -

    The coin example [VVB04] is represented as (file coin.pl)

    -
    heads(Coin):1/2 ; tails(Coin):1/2 :-
    -    toss(Coin),\+biased(Coin).
    +

    The coin example [VVB04] is represented as (file coin.pl)

    +
    heads(Coin):1/2 ; tails(Coin):1/2 :-
    +    toss(Coin),\+biased(Coin).
     
    -heads(Coin):0.6 ; tails(Coin):0.4 :-
    -    toss(Coin),biased(Coin).
    +heads(Coin):0.6 ; tails(Coin):0.4 :-
    +    toss(Coin),biased(Coin).
     
    -fair(Coin):0.9 ; biased(Coin):0.1.
    +fair(Coin):0.9 ; biased(Coin):0.1.
     
    -toss(coin).
    +toss(coin).
     

    The first clause states that if we toss a coin that is not biased it has equal probability of landing heads and @@ -165,55 +165,55 @@

    Discrete Probability Distributionsprob/2 that computes the probability of an atom, thus allowing nested probability computations. For example (meta.pl)

    -
    a:0.2:-
    -    prob(b,P),
    -    P > 0.2.
    +
    a:0.2:-
    +    prob(b,P),
    +    P > 0.2.
     

    is a valid rule.

    Moreover, the probabilistic annotations can be variables, as in (flexprob.pl)

    -
    red(Prob):Prob.
    +
    red(Prob):Prob.
     
    -draw_red(R, G):-
    -    Prob is R/(R + G),
    -    red(Prob).
    +draw_red(R, G):-
    +    Prob is R/(R + G),
    +    red(Prob).
     

    Variables in probabilistic annotations must be ground when resolution reaches the end of the body, otherwise an exception is raised.

    Alternative ways of specifying probability distribution include

    -
    A:discrete(Var,D):-Body.
    +
    A:discrete(Var,D):-Body.
     

    or

    -
    A:finite(Var,D):-Body.
    +
    A:finite(Var,D):-Body.
     

    where A is an atom containing variable Var and D is a list of couples Value:Prob assigning probability Prob to Value.

    Moreover, you can use

    -
    A:uniform(Var,D):-Body.
    +
    A:uniform(Var,D):-Body.
     

    where A is an atom containing variable Var and D is a list of values each taking the same probability (1 over the length of D).

    -
    +

    ProbLog Syntax

    -

    You can also use ProbLog [DRKT07] syntax, so a general clause takes the form

    -
    p1::h1 ; ... ; pn::hn :- body
    +

    You can also use ProbLog [DRKT07] syntax, so a general clause takes the form

    +
    p1::h1 ; ... ; pn::hn :- body
     

    where the \(pi\) are numeric expressions.

    -
    -
    +
    +

    PRISM Syntax

    -

    You can also use PRISM [SK97] syntax, so a program is composed of a set of regular Prolog rules whose body may contain calls to the msw/2 predicate (multi-ary switch). +

    You can also use PRISM [SK97] syntax, so a program is composed of a set of regular Prolog rules whose body may contain calls to the msw/2 predicate (multi-ary switch). A call msw(term,value) means that a random variable associated to term assumes value value.

    The admissible values for a discrete random variable are specified using facts for the values/2 predicate of the form

    -
    values(T,L).
    +
    values(T,L).
     

    where T is a term (possibly containing variables) and L is a list of values. The distribution over values is specified using directives for set_sw/2 of the form

    -
    :- set_sw(T,LP).
    +
    :- set_sw(T,LP).
     

    where T is a term (possibly containing variables) and LP is a list of probability values. @@ -221,274 +221,241 @@

    PRISM Syntaxprism_memoization: if set to true then memoization is performed. Its default value is false, i.e., no memoization.

    For example, the coin example above in PRISM syntax becomes (coinmsw.pl)

    -
    values(throw(_),[heads,tails]).
    -:- set_sw(throw(fair),[0.5,0.5]).
    -:- set_sw(throw(biased),[0.6,0.4]).
    -values(fairness,[fair,biased]).
    -:- set_sw(fairness,[0.9,0.1]).
    -res(Coin,R):- toss(Coin),fairness(Coin,Fairness),msw(throw(Fairness),R).
    -fairness(_Coin,Fairness) :- msw(fairness,Fairness).
    -toss(coin).
    -
    -
    -

    -
    -
    +
    values(throw(_),[heads,tails]).
    +:- set_sw(throw(fair),[0.5,0.5]).
    +:- set_sw(throw(biased),[0.6,0.4]).
    +values(fairness,[fair,biased]).
    +:- set_sw(fairness,[0.9,0.1]).
    +res(Coin,R):- toss(Coin),fairness(Coin,Fairness),msw(throw(Fairness),R).
    +fairness(_Coin,Fairness) :- msw(fairness,Fairness).
    +toss(coin).
    +
    +
    +
    +

    +

    Continuous Probability Densities

    cplint handles continuous or integer random variables as well with its sampling inference module. To specify a probability density on an argument Var of an atom A you can used rules of the form

    -
    A:Density:- Body
    +
    A:Density:- Body
     

    where Density is a special atom identifying a probability density on variable Var and Body (optional) is a regular clause body. Allowed Density atoms are

      -
    • uniform_dens(Var,L,U): Var is uniformly distributed in [L,U].
    • -
    • gaussian(Var,Mean,Variance): Var follows a Gaussian distribution with mean Mean and variance Variance. The distribution can be multivariate if Mean is a list and Variance a list of lists representing the mean vector and the covariance matrix. In this case the values of Var are lists of real values with the same length as that of Mean.
    • -
    • dirichlet(Var,Par): Var is a list of real numbers following a Dirichlet distribution with \(\alpha\) parameters specified by the list Par.
    • -
    • gamma(Var,Shape,Scale) Var follows a gamma distribution with shape parameter Shape and scale parameter Scale.
    • -
    • beta(Var,Alpha,Beta) Var follows a beta distribution with parameters Alpha and Beta.
    • -
    • poisson(Var,Lambda) Var follows a Poisson distribution with parameter Lambda (rate).
    • -
    • binomial(Var,N,P) Var follows a binomial distribution with parameters N (number of trials) and P (success probability).
    • -
    • geometric(Var,P) Var follows a geometric distribution with parameter P (success probability).
    • -
    • exponential(Var,Lambda) Var follows an exponential distribution with parameter Lambda (rate, or inverse scale).
    • -
    • pascal(Var,R,P) Var follows an exponential distribution with parameters R (number of failures) and P (success probability).
    • +
    • uniform_dens(Var,L,U): Var is uniformly distributed in [L,U].

    • +
    • gaussian(Var,Mean,Variance): Var follows a Gaussian distribution with mean Mean and variance Variance. The distribution can be multivariate if Mean is a list and Variance a list of lists representing the mean vector and the covariance matrix. In this case the values of Var are lists of real values with the same length as that of Mean.

    • +
    • dirichlet(Var,Par): Var is a list of real numbers following a Dirichlet distribution with \(\alpha\) parameters specified by the list Par.

    • +
    • gamma(Var,Shape,Scale) Var follows a gamma distribution with shape parameter Shape and scale parameter Scale.

    • +
    • beta(Var,Alpha,Beta) Var follows a beta distribution with parameters Alpha and Beta.

    • +
    • poisson(Var,Lambda) Var follows a Poisson distribution with parameter Lambda (rate).

    • +
    • binomial(Var,N,P) Var follows a binomial distribution with parameters N (number of trials) and P (success probability).

    • +
    • geometric(Var,P) Var follows a geometric distribution with parameter P (success probability).

    • +
    • exponential(Var,Lambda) Var follows an exponential distribution with parameter Lambda (rate, or inverse scale).

    • +
    • pascal(Var,R,P) Var follows an exponential distribution with parameters R (number of failures) and P (success probability).

    • +
    • multinomial(Var,N,P) Var (vector/list of event numbers) follows a multinomial distribution with parameters N (number of trials) and P (vector/list of event probabilities).

    For example

    -
    g(X): gaussian(X,0, 1).
    +
    g(X): gaussian(X,0, 1).
     

    states that argument X of g(X) follows a Gaussian distribution with mean 0 and variance 1, while

    -
    g(X): gaussian(X,[0,0], [[1,0],[0,1]]).
    +
    g(X): gaussian(X,[0,0], [[1,0],[0,1]]).
     

    states that argument X of g(X) follows a Gaussian multivariate distribution with mean vector [0,0] and covariance matrix \(\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}\)

    For example, gaussian_mixture.pl defines a mixture of two Gaussians:

    -
    heads:0.6;tails:0.4.
    -g(X): gaussian(X,0, 1).
    -h(X): gaussian(X,5, 2).
    -mix(X) :- heads, g(X).
    -mix(X) :- tails, h(X).
    +
    heads:0.6;tails:0.4.
    +g(X): gaussian(X,0, 1).
    +h(X): gaussian(X,5, 2).
    +mix(X) :- heads, g(X).
    +mix(X) :- tails, h(X).
     

    The argument X of mix(X) follows a distribution that is a mixture of two Gaussian, one with mean 0 and variance 1 with probability 0.6 and one with mean 5 and variance 2 with probability 0.4. The parameters of the distribution atoms can be taken from the probabilistic atom, the example (gauss_mean_est.pl)

    -
    val(I,X) :-
    -    mean(M),
    -    val(I,M,X).
    -mean(M): gaussian(M,1.0, 5.0).
    -val(_,M,X): gaussian(X,M, 2.0).
    +
    val(I,X) :-
    +    mean(M),
    +    val(I,M,X).
    +mean(M): gaussian(M,1.0, 5.0).
    +val(_,M,X): gaussian(X,M, 2.0).
     

    states that for an index I the continuous variable X is sampled from a Gaussian whose variance is 2 and whose mean is sampled from a Gaussian with mean 1 and variance 5. Any operation is allowed on continuous random variables. The example below (kalman_filter.pl) encodes a Kalman filter:

    -
    kf(N,O, T) :-
    -    init(S),
    -    kf_part(0, N, S,O,T).
    +
    kf(N,O, T) :-
    +    init(S),
    +    kf_part(0, N, S,O,T).
     
    -kf_part(I, N, S,[V|RO], T) :-
    -    I < N,
    -    NextI is I+1,
    -    trans(S,I,NextS),
    -    emit(NextS,I,V),
    -    kf_part(NextI, N, NextS,RO, T).
    -kf_part(N, N, S, [],S).
    +kf_part(I, N, S,[V|RO], T) :-
    +    I < N,
    +    NextI is I+1,
    +    trans(S,I,NextS),
    +    emit(NextS,I,V),
    +    kf_part(NextI, N, NextS,RO, T).
    +kf_part(N, N, S, [],S).
     
    -trans(S,I,NextS) :-
    -    {NextS =:= E + S},
    -    trans_err(I,E).
    +trans(S,I,NextS) :-
    +    {NextS =:= E + S},
    +    trans_err(I,E).
     
    -emit(NextS,I,V) :-
    -    {NextS =:= V+X},
    -    obs_err(I,X).
    +emit(NextS,I,V) :-
    +    {NextS =:= V+X},
    +    obs_err(I,X).
     
    -init(S):gaussian(S,0,1).
    -trans_err(_,E):gaussian(E,0,2).
    -obs_err(_,E):gaussian(E,0,1).
    +init(S):gaussian(S,0,1).
    +trans_err(_,E):gaussian(E,0,2).
    +obs_err(_,E):gaussian(E,0,1).
     

    Continuous random variables are involved in arithmetic expressions (in trans/3 and emit/3). It is often convenient, as in this case, to use CLP(R) constraints (by including the directive :- use_module(library(clpr)).) as in this way the expressions can be used in multiple directions and the same clauses can be used both to sample and to evaluate the weight of the sample on the basis of evidence, otherwise different clauses have to be written. In case random variables are not sufficiently instantiated to exploit expressions for inferring the values of other variables, inference will return an error.

    Moreover, user defined distributions are allowed with the syntax:

    -
    A:user(Var,Density):-Body.
    +
    A:user(Var,Density):-Body.
     

    where Var appears in A and will contain the sampled value and Density is an atom of the form predicate(Parameters). If predicate in predicate(Parameters) has arity n, then the user has to define predicate predicate/n+1 such that

    -
    predicate(Parameters,Var)
    +
    predicate(Parameters,Var)
     

    called with Parameters instantiated, returns in Var a value sampled from the user defined density. The definition of predicate/n+1 should appear after :- end_lpad.

    If likelihood weighting or particle filtering will be used for inference, then the user has to define also predicate predicate/n+2 such that predicate(Parameters,Var,Dens), when called with Parameters and Var instantiated, returns in Dens the value of the probability density of Var. The definition of predicate/n+2 should appear after :- end_lpad.

    Moreover, if the density is discrete, the program must include the fact

    -
    disc(predicate).
    +
    disc(predicate).
     

    also after :- end_lpad. See for example gauss_mean_est_user.pl and binomial.pl

    -
    +

    Distributional Clauses Syntax

    -

    You can also use the syntax of Distributional Clauses (DC) [NDLDR16]. +

    You can also use the syntax of Distributional Clauses (DC) [NDLDR16]. Continuous random variables are represented in this case by term whose distribution can be specified with density atoms as in

    -
    T~Density' := Body.
    +
    T~Density := Body.
     
    -

    Here := replaces the implication symbol, T is a term and Density' is one of the density atoms above without the Var argument, because T itself represents a random variables. +

    Here := replaces the implication symbol, T is a term and Density is one of the density atoms above without the Var argument, because T itself represents a random variables. In the body of clauses you can use the infix operator ~= to equate a term representing a random variable with a logical variable or a constant as in T ~= X. Internally cplint transforms the terms representing random variables into atoms with an extra argument for holding the variable.

    DC can be used to represent also discrete distributions using

    -
    T~uniform(L) := Body.
    -T~finite(D) := Body.
    +
    T~uniform(L) := Body.
    +T~finite(D) := Body.
     

    where L is a list of values and D is a list of couples P:V with P a probability and V a value. If Body is empty, as in regular Prolog, the implication symbol := can be omitted.

    The Indian GPA problem from http://www.robots.ox.ac.uk/~fwood/anglican/examples/viewer/?worksheet=indian-gpa in distributional clauses syntax (https://github.com/davidenitti/DC/blob/master/examples/indian-gpa.pl) takes the form (indian_gpadc.pl):

    -
    is_density_A:0.95;is_discrete_A:0.05.
    -% the probability distribution of GPA scores for American students is
    -% continuous with probability 0.95 and discrete with probability 0.05
    -
    -agpa(A): beta(A,8,2) :- is_density_A.
    -% the GPA of American students follows a beta distribution if the
    -% distribution is continuous
    +
    coin ~ finite([0.95:true,0.05:false]).
    +agpa ~ beta(8,2) := coin~=true.
    +american_gpa ~ finite([0.85:4.0,0.15:0.0]) := coin~=false.
     
    -american_gpa(G) : finite(G,[4.0:0.85,0.0:0.15]) :- is_discrete_A.
    -% the GPA of American students is 4.0 with probability 0.85 and 0.0
    -% with
    -% probability 0.15 if the
    -% distribution is discrete
    +american_gpa ~ val(V) := agpa ~=A, V is A*4.0.
     
    -american_gpa(A):- agpa(A0), A is A0*4.0.
    -% the GPA of American students is obtained by rescaling the value of
    -% agpa
    -% to the (0.0,4.0) interval
    +coin2 ~ finite([0.99:true,0.01:false]).
    +igpa ~ beta(5,5) := coin2~=true.
    +indian_gpa ~ finite([0.1:0.0,0.9:10.0]) := coin2~=false.
     
    -is_density_I : 0.99; is_discrete_I:0.01.
    -% the probability distribution of GPA scores for Indian students is
    -% continuous with probability 0.99 and discrete with probability
    -% 0.01
    +indian_gpa ~ val(V) := igpa ~=A, V is A*10.0.
     
    -igpa(I): beta(I,5,5) :- is_density_I.
    -% the GPA of Indian students follows a beta distribution if the
    -% distribution is continuous
    +nation ~ finite([0.25:a,0.75:i]).
     
    -indian_gpa(I): finite(I,[0.0:0.1,10.0:0.9]):-  is_discrete_I.
    -% the GPA of Indian students is 10.0 with probability 0.9 and 0.0
    -% with
    -% probability 0.1 if the
    -% distribution is discrete
    -
    -indian_gpa(I) :- igpa(I0), I is I0*10.0.
    -% the GPA of Indian students is obtained by rescaling the value
    -% of igpa
    -% to the (0.0,4.0) interval
    -
    -nation(N) : finite(N,[a:0.25,i:0.75]).
    -% the nation is America with probability 0.25 and India with
    -% probability 0.75
    -
    -student_gpa(G):- nation(a),american_gpa(G).
    -% the GPA of the student is given by american_gpa if the nation is
    -% America
    -
    -student_gpa(G) :- nation(i),indian_gpa(G).
    -% the GPA of the student is given by indian_gpa if the nation
    -% is India
    +student_gpa ~ val(A) := nation~=a,american_gpa~=A.
    +student_gpa ~ val(I) := nation~=i,indian_gpa~=I.
     
    -
    -
    -
    -
    +
    +
    +
    +

    Semantics

    The semantics of LPADs for the case of programs without functions symbols can be given as follows. An LPAD defines a probability distribution over normal logic programs called worlds. A world is obtained from an LPAD by first grounding it, by selecting a single head atom for each ground clause and by including in the world the clause with the selected head atom and the body. The probability of a world is the product of the probabilities associated to the heads selected. The probability of a ground atom (the query) is given by the sum of the probabilities of the worlds where the query is true.

    -

    If the LPAD contains function symbols, the definition is more complex, see [Poo97][SK01]. -For the semantics of programs with continuous random variables, see [IRR12] that defines the probability space for \(N\) continuous random variables by considering the Borel \(\sigma\)-algebra over \(\mathbb{R}^N\) and defines a Lebesgue measure on this set as the probability measure. +

    If the LPAD contains function symbols, the definition is more complex, see [Poo97, SK01]. +For the semantics of programs with continuous random variables, see [IRR12] that defines the probability space for \(N\) continuous random variables by considering the Borel \(\sigma\)-algebra over \(\mathbb{R}^N\) and defines a Lebesgue measure on this set as the probability measure. The probability space is lifted to cover the entire program using the least model semantics of constraint logic programs. -Alternatively, [NDLDR16] defines the semantics of distributional clauses by resorting to a stochastic \(Tp\) operator.

    +Alternatively, [NDLDR16] defines the semantics of distributional clauses by resorting to a stochastic \(Tp\) operator.

    cplint allows more freedom than distributional clauses in the use of continuous random variables in expressions, for example kalman_filter.pl would not be allowed by distributional clauses.

    -
    -
    + +

    Inference

    cplint answers queries using the module pita or mcintyre. -The first performs the program transformation technique of [RS10]. -The latter performs approximate inference by sampling using a different program transformation technique and is described in [Rig13]. +The first performs the program transformation technique of [RS10]. +The latter performs approximate inference by sampling using a different program transformation technique and is described in [Rig13]. Only mcintyre is able to handle continuous random variables.

    For answering queries, you have to prepare a Prolog file where you first load the inference module (for example pita), initialize it with a directive (for example :- pita) and then enclose the LPAD clauses in :-begin_lpad. or :-begin_plp. and :-end_lpad. or :-end_plp. For example, the coin program above can be stored in coin.pl for performing inference with pita as follows

    -
    :- use_module(library(pita)).
    -:- pita.
    -:- begin_lpad.
    -heads(Coin):1/2 ; tails(Coin):1/2:-
    -toss(Coin),\+biased(Coin).
    +
    :- use_module(library(pita)).
    +:- pita.
    +:- begin_lpad.
    +heads(Coin):1/2 ; tails(Coin):1/2:-
    +toss(Coin),\+biased(Coin).
     
    -heads(Coin):0.6 ; tails(Coin):0.4:-
    -toss(Coin),biased(Coin).
    +heads(Coin):0.6 ; tails(Coin):0.4:-
    +toss(Coin),biased(Coin).
     
    -fair(Coin):0.9 ; biased(Coin):0.1.
    +fair(Coin):0.9 ; biased(Coin):0.1.
     
    -toss(coin).
    -:- end_lpad.
    +toss(coin).
    +:- end_lpad.
     

    The same program for mcintyre is

    -
    :- use_module(library(mcintyre)).
    -:- mc.
    -:- begin_lpad.
    -heads(Coin):1/2 ; tails(Coin):1/2:-
    -toss(Coin),\+biased(Coin).
    +
    :- use_module(library(mcintyre)).
    +:- mc.
    +:- begin_lpad.
    +heads(Coin):1/2 ; tails(Coin):1/2:-
    +toss(Coin),\+biased(Coin).
     
    -heads(Coin):0.6 ; tails(Coin):0.4:-
    -toss(Coin),biased(Coin).
    +heads(Coin):0.6 ; tails(Coin):0.4:-
    +toss(Coin),biased(Coin).
     
    -fair(Coin):0.9 ; biased(Coin):0.1.
    +fair(Coin):0.9 ; biased(Coin):0.1.
     
    -toss(coin).
    -:- end_lpad.
    +toss(coin).
    +:- end_lpad.
     

    You can have also (non-probabilistic) clauses outside :-begin/end_lpad. These are considered as database clauses. In pita subgoals in the body of probabilistic clauses can query them by enclosing the query in db/1. For example (testdb.pl)

    -
    :- use_module(library(pita)).
    -:- pita.
    -:- begin_lpad.
    -sampled_male(X):0.5:-
    -db(male(X)).
    -:- end_lpad.
    -male(john).
    -male(david).
    +
    :- use_module(library(pita)).
    +:- pita.
    +:- begin_lpad.
    +sampled_male(X):0.5:-
    +db(male(X)).
    +:- end_lpad.
    +male(john).
    +male(david).
     

    You can also use findall/3 on subgoals defined by database clauses (persons.pl)

    -
    :- use_module(library(pita)).
    -:- pita.
    -:- begin_lpad.
    +
    :- use_module(library(pita)).
    +:- pita.
    +:- begin_lpad.
     
    -male:M/P; female:F/P:-
    -findall(Male,male(Male),LM),
    -findall(Female,female(Female),LF),
    -length(LM,M),
    -length(LF,F),
    -P is F+M.
    +male:M/P; female:F/P:-
    +findall(Male,male(Male),LM),
    +findall(Female,female(Female),LF),
    +length(LM,M),
    +length(LF,F),
    +P is F+M.
     
    -:- end_lpad.
    +:- end_lpad.
     
    -male(john).
    -male(david).
    -female(anna).
    -female(elen).
    -female(cathy).
    +male(john).
    +male(david).
    +female(anna).
    +female(elen).
    +female(cathy).
     

    Aggregate predicates on probabilistic subgoals are not implemented due to their high computational cost (if the aggregation is over \(n\) atoms, the values of the aggregation are potentially \(2^n\)). @@ -496,149 +463,149 @@

    Inferencemcintyre you can query database clauses in the body of probabilistic clauses without any special syntax. You can also use findall/3.

    To run a query, you can simply load the Prolog file, for example coin.pl, as:

    -
    ?- [coin].
    +
    ?- [coin].
     
    -

    or:

    -
    $ swipl coin.pl
    +

    or

    +
    $ swipl coin.pl
     
    -
    +

    Unconditional Queries

    The unconditional probability of an atom can be asked using pita with the predicate

    -
    prob(:Query:atom,-Probability:float) is nondet
    +
    prob(:Query:atom,-Probability:float) is nondet
     

    as in

    -
    ?- prob(heads(coin),P).
    +
    ?- prob(heads(coin),P).
     

    If the query is non-ground, prob/2 returns in backtracking the successful instantiations together with their probability. When using mcintyre, the predicate for querying is

    -
    mc_prob(:Query:atom,-Probability:float,+Options:list) is det
    +
    mc_prob(:Query:atom,-Probability:float,+Options:list) is det
     

    where Options is a list of options, the following are recognised by mc_prob/3:

      -
    • bar(-BarChar:dict) BarChart is a dict for rendering with c3 as a bar chart with a bar for the number of successes and a bar for the number of failures.
    • +
    • bar(-BarChar:dict) BarChart is a dict for rendering with c3 as a bar chart with a bar for the number of successes and a bar for the number of failures.

    For example

    -
    ?- mc_prob(heads(coin),P,[]).
    +
    ?- mc_prob(heads(coin),P,[]).
     

    You can also use

    -
    mc_prob(:Query:atom,-Probability:float) is det
    +
    mc_prob(:Query:atom,-Probability:float) is det
     

    which is equivalent to mc_prob/3 with an empty option list. In general, all the predicates that admit a list of options as an argument have a corresponding version without the list of options that is equivalent to calling the first with an empty option list.

    With mcintyre, you can also take a given number of samples with

    -
    mc_sample(:Query:atom,+Samples:int,-Probability:float, Options:list) is det
    +
    mc_sample(:Query:atom,+Samples:int,-Probability:float, Options:list) is det
     

    where Options is a list of options, the following are recognised by mc_sample/4:

      -
    • successes(-Successes:int) Number of successes
    • -
    • failures(-Failures:int) Number of failures
    • -
    • bar(-BarChar:dict) BarChart is a dict for rendering with c3 as a bar chart with a bar for the number of successes and a bar for the number of failures.
    • +
    • successes(-Successes:int) Number of successes

    • +
    • failures(-Failures:int) Number of failures

    • +
    • bar(-BarChar:dict) BarChart is a dict for rendering with c3 as a bar chart with a bar for the number of successes and a bar for the number of failures.

    For example (coinmc.pl)

    -
    ?- mc_sample(heads(coin),1000,P,[successes(S),failures(F)]).
    +
    ?- mc_sample(heads(coin),1000,P,[successes(S),failures(F)]).
     

    that samples heads(coin) 1000 times and returns in S the number of successes, in F the number of failures and in P the estimated probability (S/1000).

    As another example, the call

    -
    ?- mc_sample(heads(coin),1000,Prob).
    +
    ?- mc_sample(heads(coin),1000,Prob).
     

    samples heads(coin) 1000 times and returns the estimated probability that a sample is true.

    You can also sample using Gibbs sampling with

    -
    mc_gibbs_sample(:Query:atom,+Samples:int,-Probability:float,+Options:list) is det
    +
    mc_gibbs_sample(:Query:atom,+Samples:int,-Probability:float,+Options:list) is det
     

    where Options is a list of options, the following are recognised by mc_gibbs_sample/4:

      -
    • block(+Block:int) Perform blocked Gibbs: Block variables are sampled together, default value 1
    • -
    • mix(+Mix:int) The first Mix samples are discarded (mixing time), default value 0
    • -
    • successes(-Successes:int) Number of successes
    • -
    • failures(-Failures:int) Number of failures
    • +
    • block(+Block:int) Perform blocked Gibbs: Block variables are sampled together, default value 1

    • +
    • mix(+Mix:int) The first Mix samples are discarded (mixing time), default value 0

    • +
    • successes(-Successes:int) Number of successes

    • +
    • failures(-Failures:int) Number of failures

    mc_gibbs_sample/3 is equivalent to mc_gibbs_sample/4 with an empty option list.

    Moreover, you can sample arguments of queries with

    -
    mc_sample_arg(:Query:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
    +
    mc_sample_arg(:Query:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
     

    The predicate samples Query a number of Samples times. Arg should be a variable in Query. The predicate returns in Values a list of couples L-N where L is the list of values of Arg for which Query succeeds in a world sampled at random and N is the number of samples returning that list of values. If L is the empty list, it means that for that sample the query failed. If L is a list with a single element, it means that for that sample the query is determinate. If, in all couples L-N, L is a list with a single element, it means that the clauses in the program are mutually exclusive, i.e., that in every sample, only one clause for each subgoal has the body true. -This is one of the assumptions taken for programs of the PRISM system [SK01]. +This is one of the assumptions taken for programs of the PRISM system [SK01]. For example pcfglr.pl and plcg.pl satisfy this constraint while markov_chain.pl and var_obj.pl doesn’t.

    Options is a list of options, the following are recognised by mc_sample_arg/5:

      -
    • successes(-Successes:int) Number of successes
    • -
    • failures(-Failures:int) Number of failures
    • -
    • bar(-BarChar:dict) BarChart is a dict for rendering with c3 as a bar chart with with a bar for each possible value of L, the list of values of Arg for which the query succeeds in a world sampled at random. The size of the bar is the number of samples returning that list of values.
    • +
    • successes(-Successes:int) Number of successes

    • +
    • failures(-Failures:int) Number of failures

    • +
    • bar(-BarChar:dict) BarChart is a dict for rendering with c3 as a bar chart with with a bar for each possible value of L, the list of values of Arg for which the query succeeds in a world sampled at random. The size of the bar is the number of samples returning that list of values.

    An example of use of mc_sample_arg/4 is

    -
    ?- mc_sample_arg(reach(s0,0,S),50,S,Values).
    +
    ?- mc_sample_arg(reach(s0,0,S),50,S,Values).
     

    of markov_chain.pl that takes 50 samples of L in findall(S,(reach(s0,0,S),L).

    You can sample arguments of queries also with

    -
    mc_sample_arg_raw(:Query:atom,+Samples:int,?Arg:var,-Values:list) is det
    +
    mc_sample_arg_raw(:Query:atom,+Samples:int,?Arg:var,-Values:list) is det
     

    that samples Query a number of Samples times. The predicate returns in Values a list of values of Arg returned as the first answer by Query in a world sampled at random. The value is failure if the query fails.

    The predicate

    -
    mc_sample_arg_first(:Query:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
    +
    mc_sample_arg_first(:Query:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
     

    samples Query a number of Samples times and returns in Values a list of couples V-N where V is the value of Arg returned as the first answer by Query in a world sampled at random and N is the number of samples returning that value. V is failure if the query fails. mc_sample_arg_first/5 differs from mc_sample_arg/5 because the first just computes the first answer of the query for each sampled world.

    Options is a list of options, the following are recognised by mc_sample_arg_first/5:

      -
    • bar(-BarChar:dict) BarChart has a bar for each value of Arg returned as a first answer for the query in a world sampled at random. The size of the bar is the number of samples that returned that value.
    • +
    • bar(-BarChar:dict) BarChart has a bar for each value of Arg returned as a first answer for the query in a world sampled at random. The size of the bar is the number of samples that returned that value.

    The predicate

    -
    mc_sample_arg_one(:Query:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
    +
    mc_sample_arg_one(:Query:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
     

    samples Query a number of Samples times and returns in Values a list of couples V-N where V is a value sampled with uniform probability from those returned by Query in a world sampled at random and N is the number of samples returning that value. V is failure if the query fails.

    Options is a list of options, the following are recognised by mc_sample_arg_one/5:

      -
    • bar(-BarChar:dict) BarChart has a bar for each value of Arg returned by sampling with uniform probability one answer from those returned by the query in a world sampled at random. The size of the bar is the number of samples.
    • +
    • bar(-BarChar:dict) BarChart has a bar for each value of Arg returned by sampling with uniform probability one answer from those returned by the query in a world sampled at random. The size of the bar is the number of samples.

    The predicate

    -
    mc_gibbs_sample_arg(:Query:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
    +
    mc_gibbs_sample_arg(:Query:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
     

    samples an argument of the query using Gibbs sampling. The same options as those of mc_gibbs_sample/4 are recognized.

    Finally, you can compute expectations with

    -
    mc_expectation(:Query:atom,+N:int,?Arg:var,-Exp:float) is det
    +
    mc_expectation(:Query:atom,+N:int,?Arg:var,-Exp:float) is det
     

    that computes the expected value of Arg in Query by sampling. It takes N samples of Query and sums up the value of Arg for each sample. The overall sum is divided by N to give Exp.

    An example of use of the above predicate is

    -
    ?- mc_expectation(eventually(elect,T),1000,T,E).
    +
    ?- mc_expectation(eventually(elect,T),1000,T,E).
     

    of pctl_slep.pl that returns in E the expected value of T by taking 1000 samples.

    The predicate

    -
    mc_gibbs_expectation(:Query:atom,+N:int,?Arg:var,-Exp:float) is det
    +
    mc_gibbs_expectation(:Query:atom,+N:int,?Arg:var,-Exp:float) is det
     

    computes an expectation with Gibbs sampling.

    -
    +

    Drawing BDDs

    With pita, you can obtain the BDD for a query with the predicates

    -
    bdd_dot_file(:Query:atom,+FileName:string,-Var:list) is nondet
    -bdd_dot_string(:Query:atom,-DotString:string,-Var:list) is nondet
    +
    bdd_dot_file(:Query:atom,+FileName:string,-Var:list) is nondet
    +bdd_dot_string(:Query:atom,-DotString:string,-Var:list) is nondet
     

    The first write the BDD to a file, the latter returns it as a string. @@ -649,49 +616,49 @@

    Drawing BDDsVar contains the associations between the rule groundings and the multivalued variables: the first column contains contains the multivalued variable index, the second column contains the rule index, corresponding to its position in the program, and the last column contains the list of constants grounding the rule, each replacing a variable in the order of appearance in the rule.

    The BDD can be drawn in cplint on SWISH by using the graphviz renderer by including

    -
    :- use_rendering(graphviz).
    +
    :- use_rendering(graphviz).
     

    before :- pita.

    For example (coin.pl)

    -
    ?- bdd_dot_string(heads(coin),BDD,Var).
    +
    ?- bdd_dot_string(heads(coin),BDD,Var).
     

    returns the BDD for the query heads(coin) and the list of associations between rule groundings and multivalued variables.

    -
    -
    -
    +

    +
    +

    Conditional Queries on Discrete Variables

    The conditional probability of an atom query given another atom evidence can be asked using pita with the predicate

    -
    prob(:Query:atom,:Evidence:atom,-Probability:float) is nondet
    +
    prob(:Query:atom,:Evidence:atom,-Probability:float) is nondet
     

    as in

    -
    ?- prob(heads(coin),biased(coin),P).
    +
    ?- prob(heads(coin),biased(coin),P).
     

    If the query/evidence are non-ground, prob/3 returns in backtracking ground instantiations together with their probability. The query and the evidence can be conjunctions of literals (positive or negative).

    You also have

    -
    prob(:Query:atom,:Evidence:atom,-Probability:float,+Options:list) is nondet
    +
    prob(:Query:atom,:Evidence:atom,-Probability:float,+Options:list) is nondet
     

    where Options is a list of options, the following are recognised by prob/4:

      -
    • bar(-BarChar:dict) BarChart is a dict for rendering with c3 as a bar chart with a bar for the number of successes and a bar for the number of failures.
    • +
    • bar(-BarChar:dict) BarChart is a dict for rendering with c3 as a bar chart with a bar for the number of successes and a bar for the number of failures.

    as in

    -
    ?- prob(heads(coin),biased(coin),P,[bar(Chart)}).
    +
    ?- prob(heads(coin),biased(coin),P,[bar(Chart)}).
     

    prob/3 is equivalent to prob/4 with an empty option list. When using mcintyre, you can ask conditional queries with rejection sampling, Metropolis-Hastings Markov Chain Monte Carlo or Gibbs sampling. -In rejection sampling [VN51], you first query the evidence and, if the query is successful, query the goal in the same sample, otherwise the sample is discarded. -In Metropolis-Hastings MCMC, mcintyre follows the algorithm proposed in [NR14] (the non adaptive version). +In rejection sampling [VN51], you first query the evidence and, if the query is successful, query the goal in the same sample, otherwise the sample is discarded. +In Metropolis-Hastings MCMC, mcintyre follows the algorithm proposed in [NR14] (the non adaptive version). A Markov chain is built by building an initial sample and by generating successor samples.

    The initial sample is built by randomly sampling choices so that the evidence is true. This is done with a backtracking meta-interpreter that starts with the goal and randomizes the order in which clauses are selected during the search so that the initial sample is unbiased. @@ -701,102 +668,102 @@

    Conditional Queries on Discrete Variables\(\min\{1,\frac{N_0}{N_1}\) where \(N_0\) is the number of choices sampled in the previous sample and \(N_1\) is the number of choices sampled in the current sample. -In [NR14] the lag is always 1 but the proof in [NR14] that the above acceptance probability yields a valid Metropolis-Hastings algorithm holds also when forgetting more than one sampled choice, so the lag is user defined in cplint.

    +In [NR14] the lag is always 1 but the proof in [NR14] that the above acceptance probability yields a valid Metropolis-Hastings algorithm holds also when forgetting more than one sampled choice, so the lag is user defined in cplint.

    Then the number of successes of the query is increased by 1 if the query succeeded in the last accepted sample. The final probability is given by the number of successes over the total number of samples.

    You can take a given number of sample with rejection sampling using

    -
    mc_rejection_sample(:Query:atom,:Evidence:atom,+Samples:int,-Probability:float,+Options:list) is det
    +
    mc_rejection_sample(:Query:atom,:Evidence:atom,+Samples:int,-Probability:float,+Options:list) is det
     

    where Options is a list of options, the following are recognised by mc_sample_arg/5:

      -
    • successes(-Successes:int) Number of successes
    • -
    • failures(-Failures:int) Number of failures
    • +
    • successes(-Successes:int) Number of successes

    • +
    • failures(-Failures:int) Number of failures

    as in (coinmc.pl)

    -
    ?- mc_rejection_sample(heads(coin),biased(coin),1000,P,[successes(S),failures(F)]).
    +
    ?- mc_rejection_sample(heads(coin),biased(coin),1000,P,[successes(S),failures(F)]).
     

    that takes 1000 samples where biased(coin) is true and returns in S the number of samples where heads(coin) is true, in F the number of samples where heads(coin) is false and in P the estimated probability (S/1000).

    The query and the evidence can be conjunctions of literals.

    You can take a given number of sample with Metropolis-Hastings MCMC using

    -
    mc_mh_sample(:Query:atom,:Evidence:atom,+Samples:int,-Probability:float,+Options:list) is det
    +
    mc_mh_sample(:Query:atom,:Evidence:atom,+Samples:int,-Probability:float,+Options:list) is det
     

    where Lag (that is set with the options, default value 1) is the number of sampled choices to forget before taking a new sample.

    Options is a list of options, the following are recognised by mc_mh_sample/5:

      -
    • mix(+Mix:int) The first Mix samples are discarded (mixing time), default value 0
    • -
    • lag(+Lag:int) lag between each sample, Lag sampled choices are forgotten, default value 1
    • -
    • successes(-Successes:int) Number of successes
    • -
    • failures(-Failures:int) Number of failures
    • -
    • bar(-BarChar:dict) BarChart is a dict for rendering with c3 as a bar chart with a bar for the number of successes and a bar for the number of failures.
    • +
    • mix(+Mix:int) The first Mix samples are discarded (mixing time), default value 0

    • +
    • lag(+Lag:int) lag between each sample, Lag sampled choices are forgotten, default value 1

    • +
    • successes(-Successes:int) Number of successes

    • +
    • failures(-Failures:int) Number of failures

    • +
    • bar(-BarChar:dict) BarChart is a dict for rendering with c3 as a bar chart with a bar for the number of successes and a bar for the number of failures.

    With Mix specified it takes Mix+Samples samples and discards the first Mix. For example (arithm.pl)

    -
    ?- mc_mh_sample(eval(2,4),eval(1,3),10000,P,[successes(T), failures(F)]).
    +
    ?- mc_mh_sample(eval(2,4),eval(1,3),10000,P,[successes(T), failures(F)]).
     

    takes 10000 accepted samples and returns in T the number of samples where eval(2,4) is true, in F the number of samples where eval(2,4) is false and in P the estimated probability (T/10000).

    The predicate

    -
    mc_gibbs_sample(:Query:atom,:Evidence:atom,+Samples:int,-Probability:float,+Options:list) is det
    +
    mc_gibbs_sample(:Query:atom,:Evidence:atom,+Samples:int,-Probability:float,+Options:list) is det
     

    performs Gibbs sampling. Options is a list of options, the following are recognised by mc_gibbs_sample/5:

      -
    • block(+Block:int) Perform blocked Gibbs: Block variables are sampled together, default value 1
    • -
    • mix(+Mix:int) The first Mix samples are discarded (mixing time), default value 0
    • -
    • successes(-Successes:int) Number of successes
    • -
    • failures(-Failures:int) Number of failures
    • +
    • block(+Block:int) Perform blocked Gibbs: Block variables are sampled together, default value 1

    • +
    • mix(+Mix:int) The first Mix samples are discarded (mixing time), default value 0

    • +
    • successes(-Successes:int) Number of successes

    • +
    • failures(-Failures:int) Number of failures

    Moreover, you can sample arguments of queries with rejection sampling, Metropolis-Hastings MCMC or Gibbs sampling using

    -
    mc_rejection_sample_arg(:Query:atom,:Evidence:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
    -mc_mh_sample_arg(:Query:atom,:Evidence:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
    -mc_gibbs_sample_arg(:Query:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
    +
    mc_rejection_sample_arg(:Query:atom,:Evidence:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
    +mc_mh_sample_arg(:Query:atom,:Evidence:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
    +mc_gibbs_sample_arg(:Query:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
     

    that return the distribution of values for Arg in Query in Samples of Query given that Evidence is true. Options is a list of options, the following are recognised:

      -
    • mix(+Mix:int) The first Mix samples are discarded (mixing time), default value 0 (only MH and GIbbs)
    • -
    • lag(+Lag:int) lag between each sample, Lag sampled choices are forgotten, default value 1 (only MH)
    • -
    • block(+Block:int) Perform blocked Gibbs: Block variables are sampled together, default value 1 (only Gibbs)
    • -
    • bar(-BarChar:dict) BarChart is a bar chart of the possible values
    • +
    • mix(+Mix:int) The first Mix samples are discarded (mixing time), default value 0 (only MH and GIbbs)

    • +
    • lag(+Lag:int) lag between each sample, Lag sampled choices are forgotten, default value 1 (only MH)

    • +
    • block(+Block:int) Perform blocked Gibbs: Block variables are sampled together, default value 1 (only Gibbs)

    • +
    • bar(-BarChar:dict) BarChart is a bar chart of the possible values

    The predicates return in Values a list of couples L-N where L is the list of values of Arg for which Query succeeds in a world sampled at random where Evidence is true and N is the number of samples returning that list of values.

    -
    mc_gibbs_sample_arg(:Query:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
    +
    mc_gibbs_sample_arg(:Query:atom,+Samples:int,?Arg:var,-Values:list,+Options:list) is det
     

    An example of use of the above predicates is

    -
    ?- mc_mh_sample_arg(eval(2,Y),eval(1,3),1000,Y,V,[]).
    +
    ?- mc_mh_sample_arg(eval(2,Y),eval(1,3),1000,Y,V,[]).
     

    of (arithm.pl).

    To compute conditional expectations, use

    -
    mc_rejection_expectation(:Query:atom,:Evidence:atom,+N:int,?Arg:var,-Exp:float) is det
    -mc_mh_expectation(:Query:atom,:Evidence:atom,+N:int,?Arg:var,-Exp:float,+Options:list) is det
    -mc_gibbs_expectation(:Query:atom,:Evidence:atom,+N:int,?Arg:var,-Exp:float,+Options:list) is det
    +
    mc_rejection_expectation(:Query:atom,:Evidence:atom,+N:int,?Arg:var,-Exp:float) is det
    +mc_mh_expectation(:Query:atom,:Evidence:atom,+N:int,?Arg:var,-Exp:float,+Options:list) is det
    +mc_gibbs_expectation(:Query:atom,:Evidence:atom,+N:int,?Arg:var,-Exp:float,+Options:list) is det
     

    where Options is a list of options, the same as those of the predicates for conditional argument sampling are recognised. For example

    -
    ?- mc_mh_expectation(eval(2,Y),eval(1,3),1000,Y,E,[]).
    +
    ?- mc_mh_expectation(eval(2,Y),eval(1,3),1000,Y,E,[]).
     

    of (arithm.pl) computes the expectation of argument Y of eval(2,Y) given that eval(1,3) is true by taking 1000 samples using Metropolis-Hastings MCMC.

    Note that conditional inference is not allowed for PRISM programs with the setting prism_memoization set to false, as sampled values are not stored in that case and conditioning would have no effect.

    -
    -
    +

    +

    Conditional Queries on Continuous Variables

    When you have continuous random variables, you may be interested in sampling arguments of goals representing continuous random variables. In this way you can build a probability density of the sampled argument. When you do not have evidence or you have evidence on atoms not depending on continuous random variables, you can use the above predicates for sampling arguments.

    For example

    -
    ?- mc_sample_arg(val(0,X),1000,X,L).
    +
    ?- mc_sample_arg(val(0,X),1000,X,L).
     

    from (gauss_mean_est.pl) samples 1000 values for X in value(0,X) and returns them in L.

    When you have evidence on ground atoms that have continuous values as arguments, you cannot use rejection sampling or Metropolis-Hastings, as the probability of the evidence is 0. For example, the probability of sampling a specific value from a Gaussian is 0. -Continuous variables have probability densities instead of distributions as discrete variables. In this case, you can use likelihood weighting or particle filtering [FC90],:cite:koller2009probabilistic,:cite:Nitti2016 to obtain samples of continuous arguments of a goal.

    +Continuous variables have probability densities instead of distributions as discrete variables. In this case, you can use likelihood weighting or particle filtering [FC90],:cite:koller2009probabilistic,:cite:Nitti2016 to obtain samples of continuous arguments of a goal.

    For each sample to be taken, likelihood weighting uses a meta-interpreter to find a sample where the goal is true, randomizing the choice of clauses when more than one resolves with the goal in order to obtain an unbiased sample. This meta-interpreter is similar to the one used to generate the first sample in Metropolis-Hastings. Then a different meta-interpreter is used to evaluate the weight of the sample. @@ -808,35 +775,35 @@

    Conditional Queries on Continuous Variables
    mc_lw_sample(:Query:atom,:Evidence:atom,+Samples:int,-Prob:float) is det
    +
    mc_lw_sample(:Query:atom,:Evidence:atom,+Samples:int,-Prob:float) is det
     

    samples Query a number of Samples times given that Evidence (a conjunction of atoms is allowed here) is true. The predicate returns in Prob the probability that the query is true. It performs likelihood weighting: each sample is weighted by the likelihood of evidence in the sample.

    For example

    -
    ?- mc_lw_sample(nation(a),student_gpa(4.0),1000,P).
    +
    ?- mc_lw_sample(nation(a),student_gpa(4.0),1000,P).
     

    from indian_gpa.pl samples 1000 times the query nation(a) given that student_gpa(4.0) has been observed.

    The predicate

    -
    mc_lw_sample_arg(:Query:atom,:Evidence:atom,+N:int,?Arg:var,-ValList) is det
    +
    mc_lw_sample_arg(:Query:atom,:Evidence:atom,+N:int,?Arg:var,-ValList) is det
     

    returns in ValList a list of couples V-W where V is a value of Arg for which Query succeeds and W is the weight computed by likelihood weighting according to Evidence (a conjunction of atoms is allowed here). For example

    -
    ?- mc_lw_sample_arg(val(0,X),(val(1,9),val(2,8)),100,X,L).
    +
    ?- mc_lw_sample_arg(val(0,X),(val(1,9),val(2,8)),100,X,L).
     

    from gauss_mean_est.pl samples 100 values for X in val(0,X) given that val(1,9) and val(2,8) have been observed.

    You can compute conditional expectations using likelihood weighting with

    -
    mc_lw_expectation(:Query:atom,Evidence:atom,+N:int,?Arg:var,-Exp:float) is det
    +
    mc_lw_expectation(:Query:atom,Evidence:atom,+N:int,?Arg:var,-Exp:float) is det
     

    that computes the expected value of Arg in Query given that Evidence is true. It takes N samples of Arg in Query, weighting each according to the evidence, and returns their weighted average.

    The predicate

    -
    mc_particle_sample_arg(:Query:atom,+Evidence:list,+Samples:int,?Arg:var,-Values:list) is det
    +
    mc_particle_sample_arg(:Query:atom,+Evidence:list,+Samples:int,?Arg:var,-Values:list) is det
     

    samples argument Arg of Query using particle filtering given that Evidence is true. Evidence is a list of goals and Query can be either a single goal or a list of goals. @@ -846,135 +813,135 @@

    Conditional Queries on Continuous VariablesValues is then list of the same length of Evidence and each of its elements is a list of couples V-W where V is a value of the corresponding element of Arg for which the corresponding element of Query succeeds in a particle and W is the weight of the particle. For each element of Evidence, the particles are obtained by sampling the corresponding element of Query in each current particle and weighting the particle by the likelihood of the evidence element.

    For example

    -
    ?-[O1,O2,O3,O4]=[-0.133, -1.183, -3.212, -4.586],
    -mc_particle_sample_arg([kf_fin(1,T1),kf_fin(2,T2),kf_fin(3,T3),
    -kf_fin(4,T4)],
    -[kf_o(1,O1),kf_o(2,O2),kf_o(3,O3),kf_o(4,O4)],100,
    -[T1,T2,T3,T4],[F1,F2,F3,F4]).
    +
    ?-[O1,O2,O3,O4]=[-0.133, -1.183, -3.212, -4.586],
    +mc_particle_sample_arg([kf_fin(1,T1),kf_fin(2,T2),kf_fin(3,T3),
    +kf_fin(4,T4)],
    +[kf_o(1,O1),kf_o(2,O2),kf_o(3,O3),kf_o(4,O4)],100,
    +[T1,T2,T3,T4],[F1,F2,F3,F4]).
     

    from kalman_filter.pl performs particle filtering for a Kalman filter with four observations. For each observation, the value of the state at the same time point is sampled. The list of samples is returned in [F1,F2,F3,F4], with each element being the sample for a time point.

    The predicate

    -
    mc_particle_sample(:Query:atom,:Evidence:list,+Samples:int,-Prob:float) is det
    +
    mc_particle_sample(:Query:atom,:Evidence:list,+Samples:int,-Prob:float) is det
     

    samples Query a number of Samples times given that Evidence is true using particle filtering. Evidence is a list of goals. The predicate returns in Prob the probability that the query is true.

    You can compute conditional expectations using particle filtering with

    -
    mc_particle_expectation(:Query:atom,Evidence:atom,+N:int,?Arg:var,-Exp:float) is det
    +
    mc_particle_expectation(:Query:atom,Evidence:atom,+N:int,?Arg:var,-Exp:float) is det
     

    that computes the expected value of Arg in Query given that Evidence is true. It uses N particles.

    -
    -
    +

    +

    MPE, MAP and Viterbi Inference

    -

    pita supports MPE (Most Probable Explanation) and MAP (Maximum A Posteriori) inference. [SRV+15][BARZ20].

    +

    pita supports MPE (Most Probable Explanation) and MAP (Maximum A Posteriori) inference. [BARZ20, SRV+15].

    In MAP inference we look for the choices of head atoms of some clauses that lead to the probability of a query being maximal. The rules for which we want the choices, called query, are indicated in the input file by prepending the text map_query to each query rule. For example, in the program bag_1.pl

    -
    0.6::red(b1); 0.3::green(b1); 0.1::blue(b1) :- pick(b1).
    -map_query 0.6::pick(b1); 0.4::no_pick(b1).
    +
    0.6::red(b1); 0.3::green(b1); 0.1::blue(b1) :- pick(b1).
    +map_query 0.6::pick(b1); 0.4::no_pick(b1).
     
    -ev:- \+ blue(b1).
    +ev:- \+ blue(b1).
     

    we are asking for the choice for the second rule. The predicate to use is

    -
    map(:Query:atom,-Probability:float,-Exp:list) is nondet
    +
    map(:Query:atom,-Probability:float,-Exp:list) is nondet
     

    For example, the query on the program above

    -
    ?- map(ev,P,Exp).
    +
    ?- map(ev,P,Exp).
     

    asks for the chocie for the second rule that yelds the highest probability for ev. The query returns

    -
    P = 0.5399999999999999,
    -Exp = [rule(1, pick(b1), [pick(b1):0.6, no_pick(b1):0.4], true)].
    +
    P = 0.5399999999999999,
    +Exp = [rule(1, pick(b1), [pick(b1):0.6, no_pick(b1):0.4], true)].
     

    In MPE inference we are interested in the choices for all rules. To perform MPE inference, we need to prepend map_query to each rule and use predicate map/3.

    For example, on program bag_game_mpe.pl

    -
    win :- red, green.
    -win :- blue, yellow.
    +
    win :- red, green.
    +win :- blue, yellow.
     
    -map_query 0.4::red.
    -map_query 0.9::green.
    -map_query 0.5::blue.
    -map_query 0.6::yellow.
    +map_query 0.4::red.
    +map_query 0.9::green.
    +map_query 0.5::blue.
    +map_query 0.6::yellow.
     

    the query

    -
    ?- map(win,P,Exp).
    +
    ?- map(win,P,Exp).
     

    returns

    -
    Exp = [
    -        rule(0, '', [red:0.4, '' : 0.6], true),
    -        rule(1, green, [green:0.9, '' : 0.09999999999999998], true),
    -        rule(2, blue, [blue:0.5, '' : 0.5], true),
    -        rule(3, yellow, [yellow:0.6, '' : 0.4], true)],
    -P = 0.162,
    +
    Exp = [
    +        rule(0, '', [red:0.4, '' : 0.6], true),
    +        rule(1, green, [green:0.9, '' : 0.09999999999999998], true),
    +        rule(2, blue, [blue:0.5, '' : 0.5], true),
    +        rule(3, yellow, [yellow:0.6, '' : 0.4], true)],
    +P = 0.162,
     
    -

    In Viterbi inference we are interested in the most probable proof of a query. See [SRV+15] +

    In Viterbi inference we are interested in the most probable proof of a query. See [SRV+15] for the difference between the most probable proof and the most probable explanation. Module viterbi looks for the most probable proof by using a meta interpreter that performs branch and bound.

    The predicate

    -
    viterbi(:Query:conjunction,+K:int,-Exp:list) is nondet
    +
    viterbi(:Query:conjunction,+K:int,-Exp:list) is nondet
     

    computes the most probable proof of the conjunction of literals Query. It returns the proof as explanation in Exp.

    In example bag_game_vit.pl:

    -
    :- use_module(library(viterbi)).
    +
    :- use_module(library(viterbi)).
     
    -:- viterbi.
    +:- viterbi.
     
    -:- begin_lpad.
    +:- begin_lpad.
     
    -win :- red, green.
    -win :- blue, yellow.
    +win :- red, green.
    +win :- blue, yellow.
     
    -0.4::red.
    -0.9::green.
    -0.5::blue.
    -0.6::yellow.
    +0.4::red.
    +0.9::green.
    +0.5::blue.
    +0.6::yellow.
     
    -:- end_lpad.
    +:- end_lpad.
     

    the query

    -
    ?- viterbi(win,P,Exp).
    +
    ?- viterbi(win,P,Exp).
     

    returns

    -
    P=0.36,
    -Exp=[
    -        rule(0, red, [red:0.4, '':0.6], []),
    -        rule(1, green, [green:0.9, '':0.09999999999999998], [])])).
    +
    P=0.36,
    +Exp=[
    +        rule(0, red, [red:0.4, '':0.6], []),
    +        rule(1, green, [green:0.9, '':0.09999999999999998], [])])).
     

    As you can see the Viterbi explanation is different from the MPE one presented above.

    Note that viterbi/3, in case the query contains variables, returns their instantiation leading to the highest probability of the grounding of the query. For example, in hmm_vit.pl, the query

    -
    ?-viterbi(hmm1(S,[a,g,g]),_P,_E).
    +
    ?-viterbi(hmm1(S,[a,g,g]),_P,_E).
     

    returns

    -
    S = [q2, q2, q1],
    +
    S = [q2, q2, q1],
     
    -
    +

    Drawing BDDs for MAP/MPE

    With pita, you can obtain the BDD for a MAP/MPE query with the predicate

    -
    map_bdd_dot_string(:Query:atom,-DotString:string,-LV:list,-LAV:list,
    -        -Probability:float,-Delta:list) is nondet
    +
    map_bdd_dot_string(:Query:atom,-DotString:string,-LV:list,-LAV:list,
    +        -Probability:float,-Delta:list) is nondet
     

    The BDD is represented in the dot format of graphviz and returned in DotString. See Drawing BDDs @@ -985,310 +952,310 @@

    Drawing BDDs for MAP/MPELV and LAV are lists of list, each sublist has three elements: the multivalued variable number, the rule number and the grounding substitution.

    -

    -
    -
    +
    +
    +

    Causal Inference

    -

    pita and mcintyre support causal reasoning, i.e., computing the effect of actions using the do-calculus [Pea00].

    +

    pita and mcintyre support causal reasoning, i.e., computing the effect of actions using the do-calculus [Pea00].

    Actions in this setting are represented as literals of action predicates, that must be declared as such with the directive

    -
    :- action predicate1/arity1,...,predicaten/arityn.
    +
    :- action predicate1/arity1,...,predicaten/arityn.
     

    When performing causal reasoning, action literals must be enclosed in the do/1 functor and included in the evidence conjunction. More than one action can be included (each with in a separate do/1 term) and actions and observations can be freely mixed. All conditional inference goals can be used except those for particle filtering.

    For example

    -
    ?- prob(recovery,do(drug),P).
    +
    ?- prob(recovery,do(drug),P).
     

    from simpson.swinb computes the probability of recovery of a patient given that the action of administering a drug has been performed.

    -
    -
    +
    +

    Graphing the Results

    In cplint on SWISH you can draw graphs for visualizing the results either with C3.js or with R. Similar predicates are available for the two methods. There are two types of graphs: those that represent individual probability values with a bar chart and those that visualize the results of sampling arguments.

    -
    +

    Using C3.js

    You can draw the probability of a query being true and being false as a bar chart using the predicates

    -
    bar1(+Probability:float,-Chart:dict) is det
    -bar(+Probability:float,-Chart:dict) is det
    -bar(+Successes:int,+Failures:int,-Chart:dict) is det
    -argbar(+Values:list,-Chart:dict) is det
    +
    bar1(+Probability:float,-Chart:dict) is det
    +bar(+Probability:float,-Chart:dict) is det
    +bar(+Successes:int,+Failures:int,-Chart:dict) is det
    +argbar(+Values:list,-Chart:dict) is det
     

    They return a dict for rendering with C3.js as a bar chart: the first returns bar chart with a single bar for the probability, the second a chart with bar for the probability and a bar for one minus the probability, the third a chart with a bar for the number of successes and a bar for the number of failures, and the fourth a chart with a for bar each value, where Values is a list of couples V-N where V is the value and N is the number of samples returning that value.

    To render C3.js charts you have to include

    -
    :- use_rendering(c3).
    +
    :- use_rendering(c3).
     

    before :- pita.

    You can also use the bar(-Chart:dict) option of many predicates as in

    -
    ?- prob(heads(coin),biased(coin),P,[bar(Chart)]).
    +
    ?- prob(heads(coin),biased(coin),P,[bar(Chart)]).
     

    P will be instantiated with a chart with a bar for the probability of heads(coin) true and a bar for the probability of heads(coin) false, given that biased(coin) is true.

    Another example is

    -
    ?- mc_prob(heads(coin),P,[bar(Chart)]).
    +
    ?- mc_prob(heads(coin),P,[bar(Chart)]).
     

    that returns a chart representation of the probability.

    -
    ?- mc_sample(heads(coin),1000,P,[bar(Chart)]).
    +
    ?- mc_sample(heads(coin),1000,P,[bar(Chart)]).
     

    returns in Chart a diagram with one bar for the number of successes and one bar for the number of failures.

    The options of mc_sample_arg/5, mc_sample_arg_first/5, mc_mh_sample_arg/6, mc_rejection_sample_arg/6, can be used for visualizing the results of sampling arguments.

    An example is

    -
    ?- mc_sample_arg(reach(s0,0,S),50,S,ValList,[bar(Chart)]).
    +
    ?- mc_sample_arg(reach(s0,0,S),50,S,ValList,[bar(Chart)]).
     

    of markov_chain.pl.

    The same result can be achieved with

    -
    ?- mc_sample_arg(reach(s0,0,S),50,S,ValList),argbar(ValList,Chart)
    +
    ?- mc_sample_arg(reach(s0,0,S),50,S,ValList),argbar(ValList,Chart)
     

    Drawing a graph is particularly interesting when sampling values for continuous arguments of goals. In this case, you can use the samples to draw the probability density function of the argument.

    The predicate

    -
    histogram(+List:list,-Chart:dict,+Options:list) is det
    +
    histogram(+List:list,-Chart:dict,+Options:list) is det
     

    draws a histogram of the samples in List that must be a list of couples of the form [V]-W or V-W where V is a sampled value and W is its weight. This is the format of the list of samples returned by argument sampling predicates.

    The predicate

    -
    density(+List:list,-Chart:dict,+Options:list) is det
    +
    density(+List:list,-Chart:dict,+Options:list) is det
     

    draws a line chart of the density of the samples in List that must take the same form as for histogram/3.

    In histogram/3 and density/3 Options is a list of options, the following are recognised:

      -
    • min(+Min:float) the minimum value of domain, default value the minimum in List
    • -
    • max(+Max:float) the maximum value of domain, default value the maximum in List
    • -
    • nbins(+NBins:int) the number of bins for dividing the domain, default value 40
    • +
    • min(+Min:float) the minimum value of domain, default value the minimum in List

    • +
    • max(+Max:float) the maximum value of domain, default value the maximum in List

    • +
    • nbins(+NBins:int) the number of bins for dividing the domain, default value 40

    In this way you can specify the limits and the number of intervals of the \(X\).

    The predicate

    -
    densities(+PriorList:list,+PostList:list,-Chart:dict,+Options:list) is det
    +
    densities(+PriorList:list,+PostList:list,-Chart:dict,+Options:list) is det
     

    draws a line chart of the density of two sets of samples, usually prior and post observations. The samples in PriorList and PostList can be either couples [V]-W or V-W where V is a value and W its weight. The same options as for histogram/3 and density/3 are recognized.

    For example, the query

    -
    ?-  mc_sample_arg(value(0,X),1000,X,L0,[]),histogram(L0,Chart,[]).
    +
    ?-  mc_sample_arg(value(0,X),1000,X,L0,[]),histogram(L0,Chart,[]).
     

    from gauss_mean_est.pl, takes 1000 samples of argument X of value(0,X) and draws the density of the samples using an histogram.

    Instead

    -
    ?- mc_sample_arg(value(0,Y),1000,Y,L0,[]),
    -mc_lw_sample_arg(value(0,X),
    -(value(1,9),value(2,8)),1000,X,L),
    -densities(L0,L,Chart).
    +
    ?- mc_sample_arg(value(0,Y),1000,Y,L0,[]),
    +mc_lw_sample_arg(value(0,X),
    +(value(1,9),value(2,8)),1000,X,L),
    +densities(L0,L,Chart).
     

    from gauss_mean_est.pl takes 1000 amples of argument X of value(0,X) before and after observing (value(1,9),value(2,8) and draws the prior and posterior densities of the samples using a line chart.

    Predicates histogram/3, density/3 and densities/4 each have a version with one argument less that is equivalent to the predicate called with an empty option list.

    -
    -
    +
    +

    Using R

    You have to load library cplint_r (a SWI-Prolog pack) with

    -
    :- use_module(library(cplint_r)).
    +
    :- use_module(library(cplint_r)).
     

    Then you can use predicates

    -
    bar_r/1
    -bar_r/2
    -argbar_r/1
    +
    bar_r/1
    +bar_r/2
    +argbar_r/1
     

    that work as their C3.js counterpart but do not return the graph as an argument as the graph is printed with a different mechanism.

    You also have

    -
    histogram_r(+List:list,+Options:list) is det
    +
    histogram_r(+List:list,+Options:list) is det
     

    that works as histogram/3.

    -
    density_r(+List:list) is det
    +
    density_r(+List:list) is det
     

    is like density/3 with the number of bins is determined by R.

    -
    densities_r(+PriorList:list,+PostList:list) is det
    +
    densities_r(+PriorList:list,+PostList:list) is det
     

    is like densities/3 with the number of bins is determined by R.

    See gauss_mean_est_R.pl for an example of use of these predicates.

    -
    -
    -
    +
    +
    +

    Parameters for Inference

    The inference modules have a number of parameters in order to control their behavior. They can be set with the directive

    -
    :- set_pita(<parameter>,<value>).
    +
    :- set_pita(<parameter>,<value>).
     

    or

    -
    :- set_mc(<parameter>,<value>).
    +
    :- set_mc(<parameter>,<value>).
     

    after initialization (:-pita. or :-mc.) but outside :-begin/end_lpad. The current value can be read with

    -
    ?- setting_pita(<parameter>,Value).
    +
    ?- setting_pita(<parameter>,Value).
     

    or

    -
    ?- setting_mc(<parameter>,Value).
    +
    ?- setting_mc(<parameter>,Value).
     

    from the top-level. The available parameters common to both pita and mcintyre are:

      -
    • epsilon_parsing: if (1 - the sum of the probabilities of all the head atoms) is larger than epsilon_parsing, then pita adds the null event to the head. Default value 0.00001.
    • -
    • single_var: determines how non ground clauses are treated: if true, a single random variable is assigned to the whole non ground clause, if false, a different random variable is assigned to every grounding of the clause. Default value false.
    • +
    • epsilon_parsing: if (1 - the sum of the probabilities of all the head atoms) is larger than epsilon_parsing, then pita adds the null event to the head. Default value 0.00001.

    • +
    • single_var: determines how non ground clauses are treated: if true, a single random variable is assigned to the whole non ground clause, if false, a different random variable is assigned to every grounding of the clause. Default value false.

    Moreover, pita has the parameters

      -
    • depth_bound: if true, the depth of the derivation of the goal is limited to the value of the depth parameter. Default value false.
    • -
    • depth: maximum depth of derivations when depth_bound is set to true. Default value 5.
    • -
    • prism_memoization: false: original prism semantics, true: semantics with memoization
    • +
    • depth_bound: if true, the depth of the derivation of the goal is limited to the value of the depth parameter. Default value false.

    • +
    • depth: maximum depth of derivations when depth_bound is set to true. Default value 5.

    • +
    • prism_memoization: false: original prism semantics, true: semantics with memoization

    If depth_bound is set to true, derivations are depth-bounded so you can query also programs containing infinite loops, for example programs where queries have an infinite number of explanations. However the probability that is returned is guaranteed only to be a lower bound, see for example markov_chaindb.pl

    mcintyre has the parameters

      -
    • min_error: minimal width of the binomial proportion confidence interval for the probability of the query. When the confidence interval for the probability of the query is below min_error, the computation stops. Default value 0.01.
    • -
    • k: the number of samples to take before checking whether the the binomial proportion confidence interval is below min_error. Default value 1000. max_samples: the maximum number of samples to take. This is used when the probability of the query is very close to 0 or 1. In fact mcintyre also checks for the validity of the the binomial proportion confidence interval: if less than 5 failures or successes are sampled, even if the width of the confidence interval is less than min_error, the computation continues. This would lead to non-termination in cases where the probability is 0 or 1. max_samples ensures termination. Default value 10e4.
    • -
    • prism_memoization: false: original prism semantics, true: semantics with memoization
    • +
    • min_error: minimal width of the binomial proportion confidence interval for the probability of the query. When the confidence interval for the probability of the query is below min_error, the computation stops. Default value 0.01.

    • +
    • k: the number of samples to take before checking whether the the binomial proportion confidence interval is below min_error. Default value 1000. max_samples: the maximum number of samples to take. This is used when the probability of the query is very close to 0 or 1. In fact mcintyre also checks for the validity of the the binomial proportion confidence interval: if less than 5 failures or successes are sampled, even if the width of the confidence interval is less than min_error, the computation continues. This would lead to non-termination in cases where the probability is 0 or 1. max_samples ensures termination. Default value 10e4.

    • +
    • prism_memoization: false: original prism semantics, true: semantics with memoization

    The example markov_chain.pl shows that mcintyre can perform inference in presence of an infinite number of explanations for the goal. Differently from pita, no depth bound is necessary, as the probability of selecting the infinite computation branch is 0. However, also mcintyre may not terminate if loops not involving probabilistic predicates are present.

    If you want to set the seed of the random number generator, you can use SWI-Prolog predicates setrand/1 and getrand/1, see SWI-Prolog manual.

    -
    -
    +
    +

    Decision Theory

    -

    cplint allows also to represent decision theory problem following the syntax of Dtproblog [VdBTVODR10].

    +

    cplint allows also to represent decision theory problem following the syntax of Dtproblog [VdBTVODR10].

    Decision facts can be expressed with the operator ?::

    -
    ? :: umbrella.
    +
    ? :: umbrella.
     

    Utility facts can be expressed with utility/2 where the first parameter is the fact and the second its utility

    -
    utility(broken_umbrella,-40).
    +
    utility(broken_umbrella,-40).
     

    In order to compute the best strategy, you can use dt_solve/2

    -
    dt_solve(Strategy,Value).
    +
    dt_solve(Strategy,Value).
     

    which returns in Strategy a set of decision facts and in Value the value of the computed best strategy.

    -
    -
    -
    +
    +

    +

    Learning

    The following learning algorithms are available:

      -
    • EMBLEM (EM over Bdds for probabilistic Logic programs Efficient Mining): an implementation of EM for learning parameters that computes expectations directly on BDDs [BR13b][BR13a][BR11]
    • -
    • SLIPCOVER (Structure LearnIng of Probabilistic logic programs by searChing OVER the clause space): an algorithm for learning the structure of programs by searching the clause space and the theory space separately [BR15]
    • -
    • LEMUR (LEarning with a Monte carlo Upgrade of tRee search): an algorithm for learning the structure of programs by searching the clase space using Monte-Carlo tree search [DMBR15]
    • +
    • EMBLEM (EM over Bdds for probabilistic Logic programs Efficient Mining): an implementation of EM for learning parameters that computes expectations directly on BDDs [BR11, BR13a, BR13b]

    • +
    • SLIPCOVER (Structure LearnIng of Probabilistic logic programs by searChing OVER the clause space): an algorithm for learning the structure of programs by searching the clause space and the theory space separately [BR15]

    • +
    • LEMUR (LEarning with a Monte carlo Upgrade of tRee search): an algorithm for learning the structure of programs by searching the clase space using Monte-Carlo tree search [DMBR15]

    -
    +

    Input

    To execute the learning algorithms, prepare a Prolog file divided in five parts

      -
    • preamble
    • -
    • background knowledge, i.e., knowledge valid for all interpretations
    • -
    • LPAD/CPL-program for you which you want to learn the parameters (optional)
    • -
    • language bias information
    • -
    • example interpretations
    • +
    • preamble

    • +
    • background knowledge, i.e., knowledge valid for all interpretations

    • +
    • LPAD/CPL-program for you which you want to learn the parameters (optional)

    • +
    • language bias information

    • +
    • example interpretations

    The preamble must come first, the order of the other parts can be changed.

    -

    For example, consider the Bongard problems of [DRVL95]. bongard.pl and bongardkeys.pl represent a Bongard problem for SLIPCOVER. +

    For example, consider the Bongard problems of [DRVL95]. bongard.pl and bongardkeys.pl represent a Bongard problem for SLIPCOVER. bongard.pl and bongardkeys.pl represent a Bongard problem for LEMUR.

    -
    +

    Preamble

    In the preamble, the SLIPCOVER library is loaded with (bongard.pl):

    -
    :- use_module(library(slipcover)).
    +
    :- use_module(library(slipcover)).
     

    Now you can initialize SLIPCOVER with

    -
    :- sc.
    +
    :- sc.
     

    At this point you can start setting parameters for SLIPCOVER such as for example

    -
    :- set_sc(megaex_bottom,20).
    -:- set_sc(max_iter,2).
    -:- set_sc(max_iter_structure,5).
    -:- set_sc(verbosity,1).
    +
    :- set_sc(megaex_bottom,20).
    +:- set_sc(max_iter,2).
    +:- set_sc(max_iter_structure,5).
    +:- set_sc(verbosity,1).
     

    We will see later the list of available parameters.

    In the preamble, the LEMUR library is loaded with (bongard.pl):

    -
    :- use_module(library(lemur)).
    +
    :- use_module(library(lemur)).
     

    Now you can initialize LEMUR with

    -
    :- lemur.
    +
    :- lemur.
     

    At this point you can start setting parameters for LEMUR such as for example

    -
    :- set_lm(verbosity,1).
    +
    :- set_lm(verbosity,1).
     

    A parameter that is particularly important for both SLIPCOVER and LEMUR is verbosity: if set to 1, nothing is printed and learning is fastest, if set to 3 much information is printed and learning is slowest, 2 is in between. This ends the preamble.

    -
    -
    +
    +

    Background and Initial LPAD/CPL-program

    Now you can specify the background knowledge with a fact of the form

    -
    bg(<list of terms representing clauses>).
    +
    bg(<list of terms representing clauses>).
     

    where the clauses must be deterministic. Alternatively, you can specify a set of clauses by including them in a section between :- begin_bg. and :- end_bg. For example

    -
    :- begin_bg.
    +
    :- begin_bg.
     
    -replaceable(gear).
    -replaceable(wheel).
    -replaceable(chain).
    -not_replaceable(engine).
    -not_replaceable(control_unit).
    -component(C):- replaceable(C).
    -component(C):- not_replaceable(C).
    +replaceable(gear).
    +replaceable(wheel).
    +replaceable(chain).
    +not_replaceable(engine).
    +not_replaceable(control_unit).
    +component(C):- replaceable(C).
    +component(C):- not_replaceable(C).
     
    -:- end_bg.
    +:- end_bg.
     

    from the mach.pl example. If you specify both a bg/1 fact and a section, the clauses of the two will be combined.

    Moreover, you can specify an initial program with a fact of the form

    -
    in(<list of terms representing clauses>).
    +
    in(<list of terms representing clauses>).
     

    The initial program is used in parameter learning for providing the structure. Remember to enclose each clause in parentheses because :- has the highest precedence.

    For example, bongard.pl has the initial program

    -
        in([(pos:0.197575 :-
    -   circle(A),
    -   in(B,A)),
    -(pos:0.000303421 :-
    -   circle(A),
    -   triangle(B)),
    -(pos:0.000448807 :-
    -   triangle(A),
    -   circle(B))]).
    +
        in([(pos:0.197575 :-
    +   circle(A),
    +   in(B,A)),
    +(pos:0.000303421 :-
    +   circle(A),
    +   triangle(B)),
    +(pos:0.000448807 :-
    +   triangle(A),
    +   circle(B))]).
     

    Alternatively, you can specify an input program in a section between :- begin_in. and :- end_in., as for example

    -
    :- begin_in.
    +
    :- begin_in.
     
    -pos:0.197575 :-
    -        circle(A),
    -        in(B,A).
    -pos:0.000303421 :-
    -        circle(A),
    -        triangle(B).
    -pos:0.000448807 :-
    -        triangle(A),
    -        circle(B).
    +pos:0.197575 :-
    +        circle(A),
    +        in(B,A).
    +pos:0.000303421 :-
    +        circle(A),
    +        triangle(B).
    +pos:0.000448807 :-
    +        triangle(A),
    +        circle(B).
     
    -:- end_in.
    +:- end_in.
     

    If you specify both a in/1 fact and a section, the clauses of the two will be combined.

    @@ -1296,40 +1263,40 @@

    Background and Initial LPAD/CPL-program\([0,1]\).

    If it takes a value \(\geq 0\), the parameters are sampled from a symmetric Dirichlet distribution, i.e. a Dirichlet distribution with vector of parameters ((alpha,ldots,alpha)).

    The annotations of the head atoms of the initial program can also be p(<prob>) with <prob> a probability, in this case the parameter is fixed so it is not tuned by learning, as in

    -
    in([(pos:0.5 :-
    -        circle(A),
    -        in(B,A)),
    -        (pos:p(0.5) :-
    -        circle(A),
    -        triangle(B))]).
    +
    in([(pos:0.5 :-
    +        circle(A),
    +        in(B,A)),
    +        (pos:p(0.5) :-
    +        circle(A),
    +        triangle(B))]).
     

    The annotations of the head atoms of the initial program can also be t(<prob>,<args>) with <prob> either a probability, in this case it is the initial value of the parameter, or a variable, in this case the parameter is initially randomized, and <args> a tuple of variables that also appear in the clause. In this case a different parameter is learned for every grounding of <args> that make the body true.

    For example, we can set the initial value of the parameter of the second clause to 0.9 with

    -
    in([(pos:0.5 :-
    -        circle(A),
    -        in(B,A)),
    -        (pos:t(0.9) :-
    -        circle(A),
    -        triangle(B))]).
    +
    in([(pos:0.5 :-
    +        circle(A),
    +        in(B,A)),
    +        (pos:t(0.9) :-
    +        circle(A),
    +        triangle(B))]).
     

    With the program below we learn a different parameter for every instantiation of C in the second clause:

    -
    in([(pos:0.5 :-
    -        circle(A),
    -        in(_B,A)),
    -        (pos:t(_,C) :-
    -        triangle(A),
    -        config(A,C))]).
    +
    in([(pos:0.5 :-
    +        circle(A),
    +        in(_B,A)),
    +        (pos:t(_,C) :-
    +        triangle(A),
    +        config(A,C))]).
     
    -
    -
    +

    +

    Language Bias

    The language bias part contains the declarations of the input and output predicates. Output predicates are declared as

    -
    output(<predicate>/<arity>).
    +
    output(<predicate>/<arity>).
     

    and indicate the predicate whose atoms you want to predict. @@ -1337,166 +1304,166 @@

    Language Bias
    input_cw(<predicate>/<arity>).
    +
    input_cw(<predicate>/<arity>).
     

    For these predicates, the only true atoms are those in the interpretations and those derivable from them using the background knowledge, the clauses in the input or in the hypothesized program are not used to derive atoms for these predicates. Moreover, clauses of the background knowledge that define closed world input predicates and that call an output predicate in the body will not be used for deriving examples.

    Open world input predicates are declared with

    -
    input(<predicate>/<arity>).
    +
    input(<predicate>/<arity>).
     

    In this case, if a subgoal for such a predicate is encountered when deriving a subgoal for the output predicates, both the facts in the interpretations, those derivable from them and the background knowledge, the background clauses and the clauses of the input program are used.

    Then, you have to specify the language bias by means of mode declarations in the style of Progol.

    -
    modeh(<recall>,<predicate>(<arg1>,...)).
    +
    modeh(<recall>,<predicate>(<arg1>,...)).
     

    specifies the atoms that can appear in the head of clauses, while

    -
    modeb(<recall>,<predicate>(<arg1>,...)).
    +
    modeb(<recall>,<predicate>(<arg1>,...)).
     

    specifies the atoms that can appear in the body of clauses. <recall> can be an integer or *. <recall> indicates how many atoms for the predicate specification are retained in the bottom clause during a saturation step. * stands for all those that are found. Otherwise the indicated number is randomly chosen.

    For SLIPCOVER, two specialization modes are available: bottom and mode. In the first, a bottom clause is built and the literals to be added during refinement are taken from it. In the latter, no bottom clause is built and the literals to be added during refinement are generated directly from the mode declarations. LEMUR has only specialization mode.

    Arguments of the form

    -
    +<type>
    +
    +<type>
     

    specifies that the argument should be an input variable of type <type>, i.e., a variable replacing a +<type> argument in the head or a -<type> argument in a preceding literal in the current hypothesized clause.

    Another argument form is

    -
    -<type>
    +
    -<type>
     

    for specifying that the argument should be a output variable of type <type>. Any variable can replace this argument, either input or output. The only constraint on output variables is that those in the head of the current hypothesized clause must appear as output variables in an atom of the body.

    Other forms are

    -
    #<type>
    +
    #<type>
     

    for specifying an argument which should be replaced by a constant of type <type> in the bottom clause but should not be used for replacing input variables of the following literals when building the bottom clause or

    -
    -#<type>
    +
    -#<type>
     

    for specifying an argument which should be replaced by a constant of type <type> in the bottom clause and that should be used for replacing input variables of the following literals when building the bottom clause.

    -
    <constant>
    +
    <constant>
     

    for specifying a constant.

    Note that arguments of the form #<type> -#<type> are not available in specialization mode mode, if you want constants to appear in the literals you have to indicate them one by one in the mode declarations.

    An example of language bias for the Bongard domain is

    -
    output(pos/0).
    +
    output(pos/0).
     
    -input_cw(triangle/1).
    -input_cw(square/1).
    -input_cw(circle/1).
    -input_cw(in/2).
    -input_cw(config/2).
    +input_cw(triangle/1).
    +input_cw(square/1).
    +input_cw(circle/1).
    +input_cw(in/2).
    +input_cw(config/2).
     
    -modeh(*,pos).
    -modeb(*,triangle(-obj)).
    -modeb(*,square(-obj)).
    -modeb(*,circle(-obj)).
    -modeb(*,in(+obj,-obj)).
    -modeb(*,in(-obj,+obj)).
    -modeb(*,config(+obj,-#dir)).
    +modeh(*,pos).
    +modeb(*,triangle(-obj)).
    +modeb(*,square(-obj)).
    +modeb(*,circle(-obj)).
    +modeb(*,in(+obj,-obj)).
    +modeb(*,in(-obj,+obj)).
    +modeb(*,config(+obj,-#dir)).
     

    SLIPCOVER and LEMUR also require facts for the determination/2 Aleph-style predicate that indicate which predicates can appear in the body of clauses. For example

    -
    determination(pos/0,triangle/1).
    -determination(pos/0,square/1).
    -determination(pos/0,circle/1).
    -determination(pos/0,in/2).
    -determination(pos/0,config/2).
    -state that :code:`triangle/1` can appear in the body of clauses for :code:`pos/0`.
    +
    determination(pos/0,triangle/1).
    +determination(pos/0,square/1).
    +determination(pos/0,circle/1).
    +determination(pos/0,in/2).
    +determination(pos/0,config/2).
     
    +

    state that triangle/1 can appear in the body of clauses for pos/0.

    SLIPCOVER and LEMUR also allow mode declarations of the form

    -
    modeh(<r>,[<s1>,...,<sn>],[<a1>,...,<an>],[<P1/Ar1>,...,<Pk/Ark>]).
    +
    modeh(<r>,[<s1>,...,<sn>],[<a1>,...,<an>],[<P1/Ar1>,...,<Pk/Ark>]).
     

    These mode declarations are used to generate clauses with more than two head atoms. In them, <s1>,...,<sn> are schemas, <a1>,...,<an> are atoms such that <ai> is obtained from <si> by replacing placemarkers with variables, <Pi/Ari> are the predicates admitted in the body. <a1>,...,<an> are used to indicate which variables should be shared by the atoms in the head. An example of such a mode declaration (from uwcselearn.pl) is

    -
    modeh(*,
    -[advisedby(+person,+person),tempadvisedby(+person,+person)],
    -[advisedby(A,B),tempadvisedby(A,B)],
    -[professor/1,student/1,hasposition/2,inphase/2,
    -publication/2,taughtby/3,ta/3,courselevel/2,yearsinprogram/2]).
    +
    modeh(*,
    +[advisedby(+person,+person),tempadvisedby(+person,+person)],
    +[advisedby(A,B),tempadvisedby(A,B)],
    +[professor/1,student/1,hasposition/2,inphase/2,
    +publication/2,taughtby/3,ta/3,courselevel/2,yearsinprogram/2]).
     

    If you want to specify negative literals for addition in the body of clauses, you should define a new predicate in the background as in

    -
    not_worn(C):-
    -        component(C),
    -        \+ worn(C).
    -one_worn:-
    -worn(_).
    -none_worn:-
    -\+ one_worn.
    +
    not_worn(C):-
    +        component(C),
    +        \+ worn(C).
    +one_worn:-
    +worn(_).
    +none_worn:-
    +\+ one_worn.
     

    from mach.pl and add the new predicate in a modeb/2 fact

    -
    modeb(*,not_worn(-comp)).
    -modeb(*,none_worn).
    +
    modeb(*,not_worn(-comp)).
    +modeb(*,none_worn).
     

    Note that successful negative literals do not instantiate the variables, so if you want a variable appearing in a negative literal to be an output variable you must instantiate before calling the negative literals. The new predicates must also be declared as input

    -
    input_cw(not_worn/1).
    -input_cw(none_worn/0).
    +
    input_cw(not_worn/1).
    +input_cw(none_worn/0).
     

    Lookahead can also be specified with facts of the form

    -
    lookahead(<literal>,<list of literals>).
    +
    lookahead(<literal>,<list of literals>).
     

    In this case when a literal matching <literal> is added to the body of clause during refinement, then also the literals matching <list of literals> will be added. An example of such declaration (from muta.pl) is

    -
    lookahead(logp(_),[(_=_))]).
    +
    lookahead(logp(_),[(_=_))]).
     

    Note that <list of literals> is copied with copy_term/2 before matching, so variables in common between <literal> and <list of literals> may not be in common in the refined clause.

    It is also possible to specify that a literal can only be added together with other literals with facts of the form

    -
    lookahead_cons(<literal>,<list of literals>).
    +
    lookahead_cons(<literal>,<list of literals>).
     

    In this case <literal> is added to the body of clause during refinement only together with literals matching <list of literals>. An example of such declaration is

    -
    lookahead_cons(logp(_),[(_=_))]).
    +
    lookahead_cons(logp(_),[(_=_))]).
     

    Also here <list of literals> is copied with copy_term/2 before matching, so variables in common between <literal> and <list of literals> may not be in common in the refined clause.

    Moreover, we can specify lookahead with

    -
    lookahead_cons_var(<literal>,<list of literals>).
    +
    lookahead_cons_var(<literal>,<list of literals>).
     

    In this case <literal> is added to the body of clause during refinement only together with literals matching <list of literals> and <list of literals> is not copied before matching, so variables in common between <literal> and <list of literals> are in common also in the refined clause. This is allowed only with specialization set to bottom. An example of such declaration is

    -
    lookahead_cons_var(logp(B),[(B=_))]).
    +
    lookahead_cons_var(logp(B),[(B=_))]).
     
    -
    -
    +

    +

    Example Interpretations

    The last part of the file contains the data. You can specify data with two modalities: models and keys. In the models type, you specify an example model (or interpretation or megaexample) as a list of Prolog facts initiated by begin(model(<name>)). and terminated by end(model(<name>)). as in

    -
    begin(model(2)).
    -pos.
    -triangle(o5).
    -config(o5,up).
    -square(o4).
    -in(o4,o5).
    -circle(o3).
    -triangle(o2).
    -config(o2,up).
    -in(o2,o3).
    -triangle(o1).
    -config(o1,up).
    -end(model(2)).
    +
    begin(model(2)).
    +pos.
    +triangle(o5).
    +config(o5,up).
    +square(o4).
    +in(o4,o5).
    +circle(o3).
    +triangle(o2).
    +config(o2,up).
    +in(o2,o3).
    +triangle(o1).
    +config(o1,up).
    +end(model(2)).
     

    The interpretations may contain a fact of the form

    -
    prob(0.3).
    +
    prob(0.3).
     

    assigning a probability (0.3 in this case) to the interpretations. @@ -1506,17 +1473,17 @@

    Example Interpretations

    Alternatively, with the keys modality, you can directly write the facts and the first argument will be interpreted as a model identifier. The above interpretation in the keys modality is

    -
    pos(2).
    -triangle(2,o5).
    -config(2,o5,up).
    -square(2,o4).
    -in(2,o4,o5).
    -circle(2,o3).
    -triangle(2,o2).
    -config(2,o2,up).
    -in(2,o2,o3).
    -triangle(2,o1).
    -config(2,o1,up).
    +
    pos(2).
    +triangle(2,o5).
    +config(2,o5,up).
    +square(2,o4).
    +in(2,o4,o5).
    +circle(2,o3).
    +triangle(2,o2).
    +config(2,o2,up).
    +in(2,o2,o3).
    +triangle(2,o1).
    +config(2,o1,up).
     

    which is contained in the bongardkeys.pl. @@ -1525,230 +1492,230 @@

    Example Interpretationsint/1 are not asserted for interpretations in the key modality but can be added by the user explicitly.

    Note that you can add background knowledge that is not probabilistic directly to the file writing the clauses taking into account the model argument. For example (carc.pl) contains

    -
    connected(_M,Ring1,Ring2):-
    -        Ring1 \= Ring2,
    -        member(A,Ring1),
    -        member(A,Ring2), !.
    +
    connected(_M,Ring1,Ring2):-
    +        Ring1 \= Ring2,
    +        member(A,Ring1),
    +        member(A,Ring2), !.
     
    -symbond(Mod,A,B,T):- bond(Mod,A,B,T).
    -symbond(Mod,A,B,T):- bond(Mod,B,A,T).
    +symbond(Mod,A,B,T):- bond(Mod,A,B,T).
    +symbond(Mod,A,B,T):- bond(Mod,B,A,T).
     

    where the first argument of all the atoms is the model.

    Example registration.pl contains for example

    -
    party(M,P):-
    -participant(M,_, _, P, _).
    +
    party(M,P):-
    +participant(M,_, _, P, _).
     

    that defines intensionally the target predicate party/1. Here M is the model and participant/4 is defined in the interpretations. You can also define intensionally the negative examples with

    -
    neg(party(M,yes)):- party(M,no).
    -neg(party(M,no)):- party(M,yes).
    +
    neg(party(M,yes)):- party(M,no).
    +neg(party(M,no)):- party(M,yes).
     

    Then you must indicate how the examples are divided in folds with facts of the form: fold(<fold_name>,<list of model identifiers>), as for example

    -
    fold(train,[2,3,...]).
    -fold(test,[490,491,...]).
    +
    fold(train,[2,3,...]).
    +fold(test,[490,491,...]).
     

    As the input file is a Prolog program, you can define intensionally the folds as in

    -
    fold(all,F):-
    -findall(I,int(I),F).
    +
    fold(all,F):-
    +findall(I,int(I),F).
     

    fold/2 is dynamic so you can also write (registration.pl)

    -
    :- fold(all,F),
    -        sample(4,F,FTr,FTe),
    -assert(fold(rand_train,FTr)),
    -assert(fold(rand_test,FTe)).
    +
    :- fold(all,F),
    +        sample(4,F,FTr,FTe),
    +assert(fold(rand_train,FTr)),
    +assert(fold(rand_test,FTe)).
     

    which however must be inserted after the input interpretations otherwise the facts for int/1 will not be available and the fold all would be empty. This command uses sample(N,List,Sampled,Rest) exported from slipcover that samples N elements from List and returns the sampled elements in Sampled and the rest in Rest. If List has N elements or less, Sampled is equal to List and Rest is empty.

    -
    -
    -
    +

    +
    +

    Commands

    -
    +

    Parameter Learning

    To execute EMBLEM, prepare an input file in the editor panel as indicated above and call

    -
    ?- induce_par(<list of folds>,P).
    +
    ?- induce_par(<list of folds>,P).
     

    where <list of folds> is a list of the folds for training and P will contain the input program with updated parameters.

    For example bongard.pl, you can perform parameter learning on the train fold with

    -
    ?- induce_par([train],P).
    +
    ?- induce_par([train],P).
     
    -
    -
    +
    +

    Structure Learning

    To execute SLIPCOVER, prepare an input file in the editor panel as indicated above and call

    -
    induce(+List_of_folds:list,-P:list) is det
    +
    induce(+List_of_folds:list,-P:list) is det
     

    where List_of_folds is a list of the folds for training and P will contain the learned program.

    For example bongard.pl, you can perform structure learning on the train fold with

    -
    ?- induce([train],P).
    +
    ?- induce([train],P).
     

    A program can also be tested on a test set with test/7 or test_prob/6 as described below.

    Between two executions of induce/2 you should exit SWI-Prolog to have a clean database.

    To execute LEMUR, prepare an input file in the editor panel as indicated above and call

    -
    induce_lm(+List_of_folds:list,-P:list) is det
    +
    induce_lm(+List_of_folds:list,-P:list) is det
     

    where List_of_folds is a list of the folds for training and P will contain the learned program.

    For example bongard.pl, you can perform structure learning on the train fold with

    -
    ?- induce_lm([train],P).
    +
    ?- induce_lm([train],P).
     

    Between two executions of induce_lm/2 you should exit SWI-Prolog to have a clean database.

    -
    -
    +
    +

    Testing

    A program can also be tested on a test set in SLIPCOVER and LEMUR with

    -
    test(+Program:list,+List_of_folds:list,-LL:float,-AUCROC:float,-ROC:list,-AUCPR:float,-PR:list) is det
    +
    test(+Program:list,+List_of_folds:list,-LL:float,-AUCROC:float,-ROC:list,-AUCPR:float,-PR:list) is det
     

    or

    -
    test(+Program:list,+List_of_folds:list,-NPos:int,-NNeg:int,-LL:float,-ExampleList:list) is det
    +
    test(+Program:list,+List_of_folds:list,-NPos:int,-NNeg:int,-LL:float,-ExampleList:list) is det
     

    where Program is a list of terms representing clauses and List_of_folds is a list of folds.

    test/7 returns the log likelihood of the test examples in LL, the Area Under the ROC curve in AUCROC, a dictionary containing the list of points (in the form of Prolog pairs x-y) of the ROC curve in ROC, the Area Under the PR curve in AUCPR, a dictionary containing the list of points of the PR curve in PR.

    test_prob/6 returns the log likelihood of the test examples in LL, the numbers of positive and negative examples in NPos and NNeg and the list ExampleList containing couples Prob-Ex where Ex is a for a a positive example and \+(a) for a a negative example and Prob is the probability of example a.

    Then you can draw the curves in cplint on SWISH using C3.js using

    -
    compute_areas_diagrams(+ExampleList:list,-AUCROC:float,-ROC:dict,-AUCPR:float,-PR:dict) is det
    +
    compute_areas_diagrams(+ExampleList:list,-AUCROC:float,-ROC:dict,-AUCPR:float,-PR:dict) is det
     

    (from pack auc.pl) that takes as input a list ExampleList of pairs probability-literal of the form that is returned by test_prob/6.

    For example, to test on fold test the program learned on fold train you can run the query

    -
    ?- induce_par([train],P),
    -test(P,[test],LL,AUCROC,ROC,AUCPR,PR).
    +
    ?- induce_par([train],P),
    +test(P,[test],LL,AUCROC,ROC,AUCPR,PR).
     

    Or you can test the input program on the fold test with

    -
    ?- in(P),test(P,[test],LL,AUCROC,ROC,AUCPR,PR).
    +
    ?- in(P),test(P,[test],LL,AUCROC,ROC,AUCPR,PR).
     

    In cplint on SWISH, by including

    -
    :- use_rendering(c3).
    -:- use_rendering(lpad).
    +
    :- use_rendering(c3).
    +:- use_rendering(lpad).
     

    in the code before :- sc. the curves will be shown as graphs using C3.js and the output program will be pretty printed.

    You can also draw the curves in cplint on SWISH using R by loading library cplint_r with

    -
    :- use_module(library(cplint_r)).
    +
    :- use_module(library(cplint_r)).
     

    and using

    -
    test_r(+Program:list,+List_of_folds:list,-LL:float,-AUCROC:float,-AUCPR:float) is det
    +
    test_r(+Program:list,+List_of_folds:list,-LL:float,-AUCROC:float,-AUCPR:float) is det
     

    or predicate

    -
    compute_areas_diagrams_r(+ExampleList:list,-AUCROC:float,-AUCPR:float) is det
    +
    compute_areas_diagrams_r(+ExampleList:list,-AUCROC:float,-AUCPR:float) is det
     

    that takes as input a list ExampleList of pairs probability-literal of the form that is returned by test_prob/6.

    -
    -
    -
    +
    +
    +

    Parameters for Learning

    Parameters are set with commands of the form

    -
    :- set_sc(<parameter>,<value>).
    +
    :- set_sc(<parameter>,<value>).
     

    The available parameters are:

      -
    • specialization: (values: {bottom,mode}, default value: bottom, valid for SLIPCOVER) specialization mode.
    • -
    • depth_bound: (values: {true,false}, default value: true) if true, the depth of the derivation of the goal is limited to the value of the depth parameter.
    • -
    • depth (values: integer, default value: 2): depth of derivations if depth_bound is set to true
    • -
    • single_var (values: {true,false}, default value: false): if set to true, there is a random variable for each clause, instead of a different random variable for each grounding of each clause
    • -
    • epsilon_em (values: real, default value: 0.1): if the difference in the log likelihood in two successive parameter EM iteration is smaller than epsilon_em, then EM stops
    • -
    • epsilon_em_fraction (values: real, default value: 0.01): if the difference in the log likelihood in two successive parameter EM iteration is smaller than epsilon_em_fraction*(-current log likelihood), then EM stops
    • -
    • iter (values: integer, defualt value: 1): maximum number of iteration of EM parameter learning. If set to -1, no maximum number of iterations is imposed
    • -
    • iterREF (values: integer, defualt value: 1, valid for SLIPCOVER and LEMUR): maximum number of iteration of EM parameter learning for refinements. If set to -1, no maximum number of iterations is imposed.
    • -
    • random_restarts_number (values: integer, default value: 1, valid for EMBLEM, SLIPCOVER and LEMUR): number of random restarts of parameter EM learning
    • -
    • random_restarts_REFnumber (values: integer, default value: 1, valid for SLIPCOVER and LEMUR): number of random restarts of parameter EM learning for refinements
    • -
    • seed (values: seed(integer) or seed(random), default value seed(3032)): seed for the Prolog random functions, see SWI-Prolog manual
    • -
    • c_seed (values: unsigned integer, default value 21344)): seed for the C random functions
    • -
    • logzero (values: negative real, default value \(\log(0.000001)\): value assigned to \(\log(0)\)
    • -
    • max_iter (values: integer, default value: 10, valid for SLIPCOVER): number of interations of beam search
    • -
    • max_var (values: integer, default value: 4, valid for SLIPCOVER and LEMUR): maximum number of distinct variables in a clause
    • -
    • beamsize (values: integer, default value: 100, valid for SLIPCOVER): size of the beam
    • -
    • megaex_bottom (values: integer, default value: 1, valid for SLIPCOVER): number of mega-examples on which to build the bottom clauses
    • -
    • initial_clauses_per_megaex (values: integer, default value: 1, valid for SLIPCOVER): number of bottom clauses to build for each mega-example (or model or interpretation)
    • -
    • d (values: integer, default value: 1, valid for SLIPCOVER): number of saturation steps when building the bottom clause
    • -
    • mcts_beamsize (values: integer, default value: 3, valid for LEMUR): size of the Monte-Carlo tree search beam
    • -
    • mcts_visits (values: integer, default value: +1e20, valid for LEMUR): maximum number of visits
    • -
    • max_iter_structure (values: integer, default value: 10000, valid for SLIPCOVER): maximum number of theory search iterations
    • -
    • background_clauses (values: integer, default value: 50, valid for SLIPCOVER): maximum numbers of background clauses
    • -
    • maxdepth_var (values: integer, default value: 2, valid for SLIPCOVER and LEMUR): maximum depth of variables in clauses (as defined in [Coh95]).
    • -
    • mcts_max_depth (values: integer, default value: 8, valid for LEMUR): maximum depth of default policy search
    • -
    • mcts_c (values: real, default value: 0.7, valid for LEMUR): value of parameter \(C\) in the computation of UCT
    • -
    • mcts_iter (values: integer, default value: 20, valid for LEMUR): number of Monte-Carlo tree search iterations
    • -
    • mcts_maxrestarts (values: integer, default value: 20, valid for LEMUR): maximum number of Monte-Carlo tree search restarts
    • -
    • neg_ex (values: given, cw, default value: cw): if set to given, the negative examples in training and testing are taken from the test folds interpretations, i.e., those examples ex stored as neg(ex); if set to cw, the negative examples in training and testing are generated according to the closed world assumption, i.e., all atoms for target predicates that are not positive examples. The set of all atoms is obtained by collecting the set of constants for each type of the arguments of the target predicate, so the target predicates must have at least one fact for modeh/2 or modebb/2 also for parameter learning.
    • -
    • alpha (values: floating point \(\geq 0\), default value: 0): parameter of the symmetric Dirichlet distribution used to initialize the parameters. If it takes value 0, a truncated Dirichlet process is used to sample parameters: the probability of being true of each Boolean random variable used to represent multivalued random variables is sampled uniformly and independently in [0,1]. If it takes a value \(\geq 0\), the parameters are sampled from a symmetric Dirichlet distribution, i.e. a Dirichlet distribution with vector of parameters \(\alpha,\ldots,\alpha\).
    • -
    • verbosity (values: integer in [1,3], default value: 1): level of verbosity of the algorithms.
    • +
    • specialization: (values: {bottom,mode}, default value: bottom, valid for SLIPCOVER) specialization mode.

    • +
    • depth_bound: (values: {true,false}, default value: true) if true, the depth of the derivation of the goal is limited to the value of the depth parameter.

    • +
    • depth (values: integer, default value: 2): depth of derivations if depth_bound is set to true

    • +
    • single_var (values: {true,false}, default value: false): if set to true, there is a random variable for each clause, instead of a different random variable for each grounding of each clause

    • +
    • epsilon_em (values: real, default value: 0.1): if the difference in the log likelihood in two successive parameter EM iteration is smaller than epsilon_em, then EM stops

    • +
    • epsilon_em_fraction (values: real, default value: 0.01): if the difference in the log likelihood in two successive parameter EM iteration is smaller than epsilon_em_fraction*(-current log likelihood), then EM stops

    • +
    • iter (values: integer, defualt value: 1): maximum number of iteration of EM parameter learning. If set to -1, no maximum number of iterations is imposed

    • +
    • iterREF (values: integer, defualt value: 1, valid for SLIPCOVER and LEMUR): maximum number of iteration of EM parameter learning for refinements. If set to -1, no maximum number of iterations is imposed.

    • +
    • random_restarts_number (values: integer, default value: 1, valid for EMBLEM, SLIPCOVER and LEMUR): number of random restarts of parameter EM learning

    • +
    • random_restarts_REFnumber (values: integer, default value: 1, valid for SLIPCOVER and LEMUR): number of random restarts of parameter EM learning for refinements

    • +
    • seed (values: seed(integer) or seed(random), default value seed(3032)): seed for the Prolog random functions, see SWI-Prolog manual

    • +
    • c_seed (values: unsigned integer, default value 21344)): seed for the C random functions

    • +
    • logzero (values: negative real, default value \(\log(0.000001)\): value assigned to \(\log(0)\)

    • +
    • max_iter (values: integer, default value: 10, valid for SLIPCOVER): number of interations of beam search

    • +
    • max_var (values: integer, default value: 4, valid for SLIPCOVER and LEMUR): maximum number of distinct variables in a clause

    • +
    • beamsize (values: integer, default value: 100, valid for SLIPCOVER): size of the beam

    • +
    • megaex_bottom (values: integer, default value: 1, valid for SLIPCOVER): number of mega-examples on which to build the bottom clauses

    • +
    • initial_clauses_per_megaex (values: integer, default value: 1, valid for SLIPCOVER): number of bottom clauses to build for each mega-example (or model or interpretation)

    • +
    • d (values: integer, default value: 1, valid for SLIPCOVER): number of saturation steps when building the bottom clause

    • +
    • mcts_beamsize (values: integer, default value: 3, valid for LEMUR): size of the Monte-Carlo tree search beam

    • +
    • mcts_visits (values: integer, default value: +1e20, valid for LEMUR): maximum number of visits

    • +
    • max_iter_structure (values: integer, default value: 10000, valid for SLIPCOVER): maximum number of theory search iterations

    • +
    • background_clauses (values: integer, default value: 50, valid for SLIPCOVER): maximum numbers of background clauses

    • +
    • maxdepth_var (values: integer, default value: 2, valid for SLIPCOVER and LEMUR): maximum depth of variables in clauses (as defined in [Coh95]).

    • +
    • mcts_max_depth (values: integer, default value: 8, valid for LEMUR): maximum depth of default policy search

    • +
    • mcts_c (values: real, default value: 0.7, valid for LEMUR): value of parameter \(C\) in the computation of UCT

    • +
    • mcts_iter (values: integer, default value: 20, valid for LEMUR): number of Monte-Carlo tree search iterations

    • +
    • mcts_maxrestarts (values: integer, default value: 20, valid for LEMUR): maximum number of Monte-Carlo tree search restarts

    • +
    • neg_ex (values: given, cw, default value: cw): if set to given, the negative examples in training and testing are taken from the test folds interpretations, i.e., those examples ex stored as neg(ex); if set to cw, the negative examples in training and testing are generated according to the closed world assumption, i.e., all atoms for target predicates that are not positive examples. The set of all atoms is obtained by collecting the set of constants for each type of the arguments of the target predicate, so the target predicates must have at least one fact for modeh/2 or modebb/2 also for parameter learning.

    • +
    • alpha (values: floating point \(\geq 0\), default value: 0): parameter of the symmetric Dirichlet distribution used to initialize the parameters. If it takes value 0, a truncated Dirichlet process is used to sample parameters: the probability of being true of each Boolean random variable used to represent multivalued random variables is sampled uniformly and independently in [0,1]. If it takes a value \(\geq 0\), the parameters are sampled from a symmetric Dirichlet distribution, i.e. a Dirichlet distribution with vector of parameters \(\alpha,\ldots,\alpha\).

    • +
    • verbosity (values: integer in [1,3], default value: 1): level of verbosity of the algorithms.

    -
    -
    -
    +
    +
    +

    Download Query Results through an API

    In cplint on SWISH the results of queries can also be downloaded programmatically by directly approaching the Pengine API. Example client code is available. For example, the swish-ask.sh client can be used with bash to download the results for a query in CSV.

    -

    The call below downloads a CSV file for the coin example.

    -
    $ bash swish-ask.sh --server=http://cplint.eu e/coin.pl Prob "prob(heads(coin),Prob)"
    +

    The call below downloads a CSV file for the coin example

    +
    $ bash swish-ask.sh --server=http://cplint.eu e/coin.pl Prob "prob(heads(coin),Prob)"
     

    The script can ask queries against Prolog scripts stored in http://cplint.eu by specifying the script on the commandline. User defined files stored in cplint on SWISH (locations of type http://cplint.eu/p/coin_user.pl) can be directly used, for example:

    -
    $ bash swish-ask.sh --server=http://cplint.eu coin_user.pl Prob "prob(heads(coin),Prob)"
    +
    $ bash swish-ask.sh --server=http://cplint.eu coin_user.pl Prob "prob(heads(coin),Prob)"
     

    Example programs can be used by specifying the folder portion of the url of the example, as in the first coin example above where the url for the program is http://cplint.eu/e/coin.pl.

    You can also use an url for the program as in

    -
    $ bash swish-ask.sh --server=http://cplint.eu \
    -https://raw.githubusercontent.com/friguzzi/swish/\
    -master/e/coin.pl Prob "prob(heads(coin),Prob)"
    +
    $ bash swish-ask.sh --server=http://cplint.eu \
    +https://raw.githubusercontent.com/friguzzi/swish/\
    +master/e/coin.pl Prob "prob(heads(coin),Prob)"
     

    Results can be downloaded in JSON using the option --json-s or --json-html. With the first the output is in a simple string format where Prolog terms are sent using quoted write, the latter serialize responses as HTML strings. E.g.

    -
    $ bash swish-ask.sh --json-s --server=http://cplint.eu \
    -        coin_user.pl Prob "prob(heads(coin),Prob)"
    +
    $ bash swish-ask.sh --json-s --server=http://cplint.eu \
    +        coin_user.pl Prob "prob(heads(coin),Prob)"
     

    The JSON format can also be modified. See http://www.swi-prolog.org/pldoc/doc_for?object=pengines%3Aevent_to_json/4.

    Prolog can exploit the Pengine API directly. For example, the above can be called as:

    -
    ?- [library(pengines)].
    -?- pengine_rpc('http://cplint.eu',
    -        prob(heads(coin),Prob),
    -        [ src_url('https://raw.githubusercontent.com/friguzzi/swish/\
    -                master/e/coin.pl'),
    -                application(swish)
    -]).
    +
    ?- [library(pengines)].
    +?- pengine_rpc('http://cplint.eu',
    +        prob(heads(coin),Prob),
    +        [ src_url('https://raw.githubusercontent.com/friguzzi/swish/\
    +                master/e/coin.pl'),
    +                application(swish)
    +]).
     
    -Prob = 0.51.
    +Prob = 0.51.
     
    -
    -
    +
    +

    Example Files

    The pack/cplint/prolog/examples folder in SWI-Prolog home contains some example programs. The subfolder learning contains some learning examples. The pack/cplint/docs folder contains this manual in latex, html and pdf.

    -
    -
    + +

    Manual in PDF

    A PDF version of the manual is available at http://friguzzi.github.io/cplint/_build/latex/cplint.pdf.

    -
    -
    + +

    License

    cplint follows the Artistic License 2.0 that you can find in cplint root folder. The copyright is by Fabrizio Riguzzi.

    @@ -1759,9 +1726,9 @@

    License -
  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • -
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • -
  • Neither the name of the University of Colorado nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
  • +
  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

  • +
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

  • +
  • Neither the name of the University of Colorado nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

  • THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRAN-TIES, INCLUDING, BUT NOT @@ -1776,170 +1743,95 @@

    License +

    +

    References

    -

    - - - - -
    [BARZ20]Elena Bellodi, Marco Alberti, Fabrizio Riguzzi, and Riccardo Zese. MAP inference for probabilistic logic programming. Theory and Practice of Logic Programming, 20(5):641–655, 2020. URL: https://arxiv.org/abs/2008.01394, doi:10.1017/S1471068420000174.
    - - - - - -
    [BR11]Elena Bellodi and Fabrizio Riguzzi. EM over binary decision diagrams for probabilistic logic programs. Technical Report CS-2011-01, Dipartimento di Ingegneria, Università di Ferrara, Italy, 2011. URL: http://ml.unife.it/wp-content/uploads/Papers/BelRig-CILC11.pdf.
    - - - - - -
    [BR13a]Elena Bellodi and Fabrizio Riguzzi. Expectation maximization over binary decision diagrams for probabilistic logic programs. Intelligent Data Analysis, 17(2):343–363, 2013.
    - - - - - -
    [BR13b]Elena Bellodi and Fabrizio Riguzzi. Expectation Maximization over binary decision diagrams for probabilistic logic programs. Intelligent Data Analysis, 17(2):343–363, 2013. URL: http://ds.ing.unife.it/~friguzzi/Papers/BelRig13-IDA-IJ.pdf.
    - - - - - -
    [BR15]Elena Bellodi and Fabrizio Riguzzi. Structure learning of probabilistic logic programs by searching the clause space. Theory and Practice of Logic Programming, 15(2):169–212, 2015. URL: http://arxiv.org/abs/1309.2080, doi:10.1017/S1471068413000689.
    - - - - - -
    [Coh95]William W. Cohen. Pac-learning non-recursive prolog clauses. Artif. Intell., 79(1):1–38, 1995.
    - - - - - -
    [DRKT07]L. De Raedt, A. Kimmig, and H. Toivonen. ProbLog: a probabilistic Prolog and its application in link discovery. In International Joint Conference on Artificial Intelligence, 2462–2467. 2007.
    - - - - - -
    [DRVL95]L. De Raedt and W. Van Laer. Inductive constraint logic. In Proceedings of the 6th Conference on Algorithmic Learning Theory (ALT 1995), volume 997 of LNAI, 80–94. Fukuoka, Japan, 1995. Springer.
    - - - - - -
    [DMBR15]Nicola Di Mauro, Elena Bellodi, and Fabrizio Riguzzi. Bandit-based Monte-Carlo structure learning of probabilistic logic programs. Mach. Learn., 100(1):127–156, July 2015. URL: http://ds.ing.unife.it/~friguzzi/Papers/DiMBelRig-ML15.pdf, doi:10.1007/s10994-015-5510-3.
    - - - - - -
    [FC90]Robert M Fung and Kuo-Chu Chang. Weighing and integrating evidence for stochastic simulation in bayesian networks. In Fifth Annual Conference on Uncertainty in Artificial Intelligence, 209–220. North-Holland Publishing Co., 1990.
    - - - - - -
    [IRR12]Muhammad Asiful Islam, CR Ramakrishnan, and IV Ramakrishnan. Inference in probabilistic logic programs with continuous random variables. Theory and Practice of Logic Programming, 12:505–523, 7 2012. doi:10.1017/S1471068412000154.
    - - - - - -
    [NR14](1, 2, 3) Arun Nampally and CR Ramakrishnan. Adaptive mcmc-based inference in probabilistic logic programs. arXiv preprint arXiv:1403.6036, 2014. URL: http://arxiv.org/pdf/1403.6036.pdf.
    - - - - - -
    [NDLDR16](1, 2) Davide Nitti, Tinne De Laet, and Luc De Raedt. Probabilistic logic programming for hybrid relational domains. Mach. Learn., 103(3):407–449, 2016. URL: http://dx.doi.org/10.1007/s10994-016-5558-8, doi:10.1007/s10994-016-5558-8.
    - - - - - -
    [Pea00]J. Pearl. Causality. Cambridge University Press, 2000.
    - - - - - -
    [Poo97]David Poole. The independent choice logic for modelling multiple agents under uncertainty. Artificial Intelligence, 94(1-2):7–56, 1997.
    - - - - - -
    [Rig13]Fabrizio Riguzzi. MCINTYRE: a Monte Carlo system for probabilistic logic programming. Fundamenta Informaticae, 124(4):521–541, 2013. URL: http://ds.ing.unife.it/~friguzzi/Papers/Rig13-FI-IJ.pdf, doi:10.3233/FI-2013-847.
    - - - - - -
    [RS10]Fabrizio Riguzzi and Terrance Swift. Tabling and Answer Subsumption for Reasoning on Logic Programs with Annotated Disjunctions. In Technical Communications of the International Conference on Logic Programming, volume 7 of Leibniz International Proceedings in Informatics (LIPIcs), 162–171. Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik, 2010. doi:10.4230/LIPIcs.ICLP.2010.162.
    - - - - - -
    [SK97]Taisuke Sato and Yoshitaka Kameya. Prism: a language for symbolic-statistical modeling. In International Joint Conference on Artificial Intelligence, 1330–1339. 1997.
    - - - - - -
    [SK01](1, 2) Taisuke Sato and Yoshitaka Kameya. Parameter learning of logic programs for symbolic-statistical modeling. J. Artif. Intell. Res., 15:391–454, 2001.
    - - - - - -
    [SRV+15](1, 2) Dimitar Sht. Shterionov, Joris Renkens, Jonas Vlasselaer, Angelika Kimmig, Wannes Meert, and Gerda Janssens. The most probable explanation for probabilistic logic programs with annotated disjunctions. In Jesse Davis and Jan Ramon, editors, International Conference on Inductive Logic Programming, volume 9046 of LNCS, 139–153. Berlin, Heidelberg, 2015. Springer. doi:10.1007/978-3-319-23708-4_10.
    - - - - - -
    [VdBTVODR10]Guy Van den Broeck, Ingo Thon, Martijn Van Otterlo, and Luc De Raedt. Dtproblog: a decision-theoretic probabilistic prolog. In Twenty-Fourth AAAI Conference on Artificial Intelligence. 2010.
    - - - - - -
    [VDB06]J. Vennekens, M. Denecker, and M. Bruynooghe. Representing causal information about a probabilistic process. In Proceedings of the 10th European Conference on Logics in Artificial Intelligence, LNAI. Springer, September 2006.
    - - - - - -
    [VDB09]J. Vennekens, Marc Denecker, and Maurice Bruynooghe. CP-logic: a language of causal probabilistic events and its relation to logic programming. Theory Pract. Log. Program., 9(3):245–308, 2009.
    - - - - - -
    [VV03]J. Vennekens and S. Verbaeten. Logic programs with annotated disjunctions. Technical Report CW386, K. U. Leuven, 2003.
    - - - - - -
    [VVB04](1, 2) J. Vennekens, S. Verbaeten, and M. Bruynooghe. Logic programs with annotated disjunctions. In International Conference on Logic Programming, volume 3131 of LNCS, 195–209. Springer, 2004.
    - - - - - -
    [VN51]John Von Neumann. Various techniques used in connection with random digits. Nat. Bureau Stand. Appl. Math. Ser., 12:36–38, 1951.
    +

    +
    BARZ20
    +

    Elena Bellodi, Marco Alberti, Fabrizio Riguzzi, and Riccardo Zese. MAP inference for probabilistic logic programming. Theory and Practice of Logic Programming, 20(5):641–655, 2020. URL: https://arxiv.org/abs/2008.01394, doi:10.1017/S1471068420000174.

    +
    +
    BR11
    +

    Elena Bellodi and Fabrizio Riguzzi. EM over binary decision diagrams for probabilistic logic programs. Technical Report CS-2011-01, Dipartimento di Ingegneria, Università di Ferrara, Italy, 2011. URL: http://ml.unife.it/wp-content/uploads/Papers/BelRig-CILC11.pdf.

    +
    +
    BR13a
    +

    Elena Bellodi and Fabrizio Riguzzi. Expectation maximization over binary decision diagrams for probabilistic logic programs. Intelligent Data Analysis, 17(2):343–363, 2013.

    +
    +
    BR13b
    +

    Elena Bellodi and Fabrizio Riguzzi. Expectation Maximization over binary decision diagrams for probabilistic logic programs. Intelligent Data Analysis, 17(2):343–363, 2013. URL: http://ds.ing.unife.it/~friguzzi/Papers/BelRig13-IDA-IJ.pdf.

    +
    +
    BR15
    +

    Elena Bellodi and Fabrizio Riguzzi. Structure learning of probabilistic logic programs by searching the clause space. Theory and Practice of Logic Programming, 15(2):169–212, 2015. URL: http://arxiv.org/abs/1309.2080, doi:10.1017/S1471068413000689.

    +
    +
    Coh95
    +

    William W. Cohen. Pac-learning non-recursive prolog clauses. Artif. Intell., 79(1):1–38, 1995.

    +
    +
    DRKT07
    +

    L. De Raedt, A. Kimmig, and H. Toivonen. ProbLog: a probabilistic Prolog and its application in link discovery. In International Joint Conference on Artificial Intelligence, 2462–2467. 2007.

    +
    +
    DRVL95
    +

    L. De Raedt and W. Van Laer. Inductive constraint logic. In Proceedings of the 6th Conference on Algorithmic Learning Theory (ALT 1995), volume 997 of LNAI, 80–94. Fukuoka, Japan, 1995. Springer.

    +
    +
    DMBR15
    +

    Nicola Di Mauro, Elena Bellodi, and Fabrizio Riguzzi. Bandit-based Monte-Carlo structure learning of probabilistic logic programs. Mach. Learn., 100(1):127–156, July 2015. URL: http://ds.ing.unife.it/~friguzzi/Papers/DiMBelRig-ML15.pdf, doi:10.1007/s10994-015-5510-3.

    +
    +
    FC90
    +

    Robert M Fung and Kuo-Chu Chang. Weighing and integrating evidence for stochastic simulation in bayesian networks. In Fifth Annual Conference on Uncertainty in Artificial Intelligence, 209–220. North-Holland Publishing Co., 1990.

    +
    +
    IRR12
    +

    Muhammad Asiful Islam, CR Ramakrishnan, and IV Ramakrishnan. Inference in probabilistic logic programs with continuous random variables. Theory and Practice of Logic Programming, 12:505–523, 7 2012. doi:10.1017/S1471068412000154.

    +
    +
    NR14(1,2,3)
    +

    Arun Nampally and CR Ramakrishnan. Adaptive mcmc-based inference in probabilistic logic programs. arXiv preprint arXiv:1403.6036, 2014. URL: http://arxiv.org/pdf/1403.6036.pdf.

    +
    +
    NDLDR16(1,2)
    +

    Davide Nitti, Tinne De Laet, and Luc De Raedt. Probabilistic logic programming for hybrid relational domains. Mach. Learn., 103(3):407–449, 2016. URL: http://dx.doi.org/10.1007/s10994-016-5558-8, doi:10.1007/s10994-016-5558-8.

    +
    +
    Pea00
    +

    J. Pearl. Causality. Cambridge University Press, 2000.

    +
    +
    Poo97
    +

    David Poole. The independent choice logic for modelling multiple agents under uncertainty. Artificial Intelligence, 94(1-2):7–56, 1997.

    +
    +
    Rig13
    +

    Fabrizio Riguzzi. MCINTYRE: a Monte Carlo system for probabilistic logic programming. Fundamenta Informaticae, 124(4):521–541, 2013. URL: http://ds.ing.unife.it/~friguzzi/Papers/Rig13-FI-IJ.pdf, doi:10.3233/FI-2013-847.

    +
    +
    RS10
    +

    Fabrizio Riguzzi and Terrance Swift. Tabling and Answer Subsumption for Reasoning on Logic Programs with Annotated Disjunctions. In Technical Communications of the International Conference on Logic Programming, volume 7 of Leibniz International Proceedings in Informatics (LIPIcs), 162–171. Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik, 2010. doi:10.4230/LIPIcs.ICLP.2010.162.

    +
    +
    SK97
    +

    Taisuke Sato and Yoshitaka Kameya. Prism: a language for symbolic-statistical modeling. In International Joint Conference on Artificial Intelligence, 1330–1339. 1997.

    +
    +
    SK01(1,2)
    +

    Taisuke Sato and Yoshitaka Kameya. Parameter learning of logic programs for symbolic-statistical modeling. J. Artif. Intell. Res., 15:391–454, 2001.

    +
    +
    SRV+15(1,2)
    +

    Dimitar Sht. Shterionov, Joris Renkens, Jonas Vlasselaer, Angelika Kimmig, Wannes Meert, and Gerda Janssens. The most probable explanation for probabilistic logic programs with annotated disjunctions. In Jesse Davis and Jan Ramon, editors, International Conference on Inductive Logic Programming, volume 9046 of LNCS, 139–153. Berlin, Heidelberg, 2015. Springer. doi:10.1007/978-3-319-23708-4_10.

    +
    +
    VdBTVODR10
    +

    Guy Van den Broeck, Ingo Thon, Martijn Van Otterlo, and Luc De Raedt. Dtproblog: a decision-theoretic probabilistic prolog. In Twenty-Fourth AAAI Conference on Artificial Intelligence. 2010.

    +
    +
    VDB06
    +

    J. Vennekens, M. Denecker, and M. Bruynooghe. Representing causal information about a probabilistic process. In Proceedings of the 10th European Conference on Logics in Artificial Intelligence, LNAI. Springer, September 2006.

    +
    +
    VDB09
    +

    J. Vennekens, Marc Denecker, and Maurice Bruynooghe. CP-logic: a language of causal probabilistic events and its relation to logic programming. Theory Pract. Log. Program., 9(3):245–308, 2009.

    +
    +
    VV03
    +

    J. Vennekens and S. Verbaeten. Logic programs with annotated disjunctions. Technical Report CW386, K. U. Leuven, 2003.

    +
    +
    VVB04(1,2)
    +

    J. Vennekens, S. Verbaeten, and M. Bruynooghe. Logic programs with annotated disjunctions. In International Conference on Logic Programming, volume 3131 of LNCS, 195–209. Springer, 2004.

    +
    +
    VN51
    +

    John Von Neumann. Various techniques used in connection with random digits. Nat. Bureau Stand. Appl. Math. Ser., 12:36–38, 1951.

    +
    +

    -
    -
    + + +
    @@ -2027,12 +1919,13 @@

    Navigation

  • index
  • - + + \ No newline at end of file diff --git a/packs_lib/cplint/docs/_build/html/objects.inv b/packs_lib/cplint/docs/_build/html/objects.inv index 59711b080d71f6e68b5e4b1f4c38d10ee16e8584..20ff5edd4d641ae68c73340c3eba122b9c66be85 100644 GIT binary patch delta 1015 zcmV5oZ`(K!hVT3p1UARA!6LWb5-V*D*nk?R*)t{4Hn$R~kW>=? z`yEpJ5Vw((-9vy#dfs;?!x@sPX#MM?=d7d~~7e}U;sM&1b z5hMxRjLL0zfoj=x5KGTmT;YvJfE5j7Bn3D;4@_~Uu@o3y8!iSpX#7GIr&Y`5?Is?? zdk`r|@*v4$Gl};j#oMHKPl27wt>L;>%&`BTS#Vg-s|c~OtU{`=b``C7%gqHhOlUAz zPA1f2A|y#TDStvaaV`RYps%U4$4vT#Sd` zW89Wo)F}GO#R*r)(8E-RAG3zdT}C_U>l`33{EFb1>Cd)QFi){{=7I*;4qxaL{B7#s8v~{2jjVH*|FngypL|!7 zGmeXXFpDI72TB{-wyxfbaKb=ilx&82Rg*B(Qh#w8=!xNq)A^bPia2T)GTU92PC$aR;hklDcZ8-O7tO!*pg{r`i21W)A1Y2d#zg0DX)1z{{V>GL?0e%1+D-9 delta 1360 zcmV-W1+V(y2)7H6cz>8pbK5o$hVT3poN12PNQz@O$}N$SRx|btV>#&=Bq0eh2rwWh zTmQZb5a5R$f@%*Qo7D5Z3jw zHz0K2s!?wIizt&tf%91f;;kHltjL*}9d!6rQ^jZ%<5b~m%|tEhDn1d#NXqHBUC#rY z2S@>(2Xr2*UVpsrUA$En@26+S#+I`xQ&iLcKQiwyJ+8HnH5ip2D&}WOQpTA+$2k=h z8iWVq=c6ZtPS~4-r02Z$K!ml!gf`=+B=aS3Z2FPKN;$>lyiQB{SKz40)!U_GGm zfX)HDLlFF)aA>}Kqk5jInV=K4|3 z{~Q$?g-NF!SOs(nc;!|REgzScdwG7~#LHQA(3k~M$dfuf7RSYhOC0f!*E;8Xl(oX_ zs%ALIOdhCMUWYBc0C1FE@EfmEN=~P~aNo-dUV0q~Q_b|v7Z?KOi^XO&hg ztxdZa&-k{<42pdqZM(~$-1|t>7hv&a9GkuAF=wI4b0~IC1x^J{wH|t|oafel8s+jy za7l98a?i1%Rn4)m^#M2P{Q)=Xn3QZhvQyi3dw&L}2B*g302uY!$M|kz+`o?TIoU+H zB2P^0<1`QKWex%ht)1e_dR-0WJE^c;mb0Ry7g+%cus4=q1btiUboV)#-6dZm`b>(F z(|E^1yO5)xp}soJH}ljwV5g<3#AG1htnywjdGERzzHj~IF2+Tkw3RzB*w=w7+SOve zSbr|(Pn7KsW+Fl*v!}wo8AAT8<#3evXM|_F(%NCEws|&Y?O{{bKCR-v`VKCOqAq$a zv!Tm>+S8_wVsCnfE+)!a2TA-KsY(;hr_Q6B9)=pNWL{^JnhuLN5&N3#X`C`LKBt}n zOWk_S7kr91B}#2)LpAd*59H65B9Iq zt2~4MpjqfUoC;eGCeg5l-&6VXQNR(Mtp-B+MwK8IAw$MDoCN(wx}2cX0u$g--K+GQ=|H`U~R zv%T|ssM+#OE15K~SZjfgx2SR^c*^C3F0X-b9XKnRucoM*>(BxGzJ-wgRWn5kDs))U zVNr9H-La`76LNT&Sj>TCytKc9cz=bfm>q^l^R6l6ZS#48jR{%o44P%3F>gH+;UNdR zVXf$N#KCG>fJHmXGs{yt^k=I zmR}j(Y1M>IIn8}^A_Cj)JlAd22GSL;C3s;^RSieV8JXWq(RiDlUrqg|$Z;QR&DdXI ST#Ci=da<|)QvU+?{R5Gb*sHw& diff --git a/packs_lib/cplint/docs/_build/html/search.html b/packs_lib/cplint/docs/_build/html/search.html index 0fd5dcf342..c454e3ccbb 100644 --- a/packs_lib/cplint/docs/_build/html/search.html +++ b/packs_lib/cplint/docs/_build/html/search.html @@ -1,32 +1,26 @@ - + - + - - + + Search — cplint 4.5 documentation - - + + - - - - - - + + + + - + + - - - + @@ -36,7 +30,8 @@

    Navigation

  • index
  • - + + @@ -46,29 +41,37 @@

    Navigation

    Search

    -
    - + + + +

    - From here you can search these documents. Enter your search - words into the box below and click "search". Note that the search - function will automatically search for all of the words. Pages - containing fewer words won't appear in the result list. + Searching for multiple words only shows matches that contain + all words.

    + +
    - +
    + +
    + +
    @@ -84,12 +87,13 @@

    Navigation

  • index
  • - + + \ No newline at end of file diff --git a/packs_lib/cplint/docs/_build/html/searchindex.js b/packs_lib/cplint/docs/_build/html/searchindex.js index e78908e7cb..dd381bf71b 100644 --- a/packs_lib/cplint/docs/_build/html/searchindex.js +++ b/packs_lib/cplint/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},filenames:["index.rst"],objects:{},objnames:{},objtypes:{},terms:{"10e4":0,"10th":0,"1e20":0,"3aevent_to_json":0,"4_10":0,"641\u00e2":0,"6th":0,"boolean":0,"case":0,"default":0,"export":0,"final":0,"float":0,"function":0,"import":0,"int":0,"new":0,"null":0,"public":0,"return":0,"switch":0,"throw":0,"true":0,"universit\u00e0":0,"var":0,"while":0,AND:0,ARE:0,BUT:0,FOR:0,For:0,Its:0,NOT:0,Res:0,SUCH:0,THE:0,TIES:0,The:0,Then:0,There:0,These:0,USE:0,Use:0,With:0,_build:0,_coin:0,aaai:0,abl:0,about:0,abov:0,abs:0,accept:0,accord:0,account:0,achiev:0,action:0,adapt:0,add:0,added:0,adding:0,addit:0,address:0,administ:0,admiss:0,admit:0,advis:0,advisedbi:0,after:0,against:0,agent:0,aggreg:0,agpa:0,alberti:0,aleph:0,algebra:0,algorithm:0,all:0,allow:0,alpha:0,alreadi:0,also:0,alt:0,altern:0,alwai:0,america:0,american:0,american_gpa:0,ampl:0,analysi:0,angelika:0,anglican:0,ani:0,anna:0,annot:0,annual:0,anoth:0,answer:0,appear:0,appl:0,appli:0,applic:0,approach:0,approxim:0,ar1:0,arc:[],area:0,arg1:0,arg:0,argbar:0,argbar_r:0,argument:0,ari:0,aris:0,arithm:0,arithmet:0,ariti:0,arity1:0,arityn:0,ark:0,artif:0,artifici:0,artist:0,arun:0,arxiv:0,asi:0,ask:0,assert:0,assign:0,associ:0,assum:0,assumpt:0,atom:0,auc:0,aucpr:0,aucroc:0,automat:0,avail:0,averag:0,avoid:[],background_claus:0,backtrack:0,bag_1:0,bag_gam:[],bag_game_mp:0,bag_game_vit:0,bandit:0,bar1:0,bar:0,bar_r:0,barchar:0,barchart:0,barz20:0,base:0,bash:0,basi:0,bayesian:0,bdd_dot_fil:0,bdd_dot_str:0,bddem:0,bdeem:0,beam:0,beamsiz:0,becaus:0,becom:0,been:0,befor:0,begin:0,begin_bg:0,begin_in:0,begin_lpad:0,begin_plp:0,behavior:0,being:0,belalbrig20:[],bellodi:0,below:0,belrig13:0,belrig:0,berlin:0,best:0,beta:0,between:0,bias:0,bin:0,binari:0,binomi:0,bit:0,blob:0,block:0,blue:0,bmatrix:0,bodi:0,bond:0,bongard:0,bongardkei:0,borel:0,both:0,bottom:0,bound:0,box:0,br11:0,br13a:0,br13b:0,br15:0,branch:0,broeck:0,broken_umbrella:0,bruynoogh:0,build:0,built:0,bureau:0,busi:0,c_seed:0,calculu:0,call:0,cambridg:0,can:0,cannot:0,carc:0,carlo:0,cathi:0,caus:0,certainti:0,chain:0,chang:0,chart:0,check:0,children:0,choci:0,choic:0,chosen:0,chosenhead:[],chu:0,cilc11:0,circl:0,cite:0,clase:0,clean:0,client:0,close:0,clp:0,clpr:0,code:0,coh95:0,cohen:0,coin:0,coin_us:0,coinmc:0,coinmsw:0,collect:0,colon:0,colorado:0,column:0,com:0,combin:0,come:0,commandlin:0,common:0,commun:0,comp:0,complet:[],complex:0,compon:0,compos:0,comput:0,compute_areas_diagram:0,compute_areas_diagrams_r:0,confer:0,confid:0,config:0,conjunct:0,connect:0,consequenti:0,consid:0,consist:0,constant:0,constitut:0,constraint:0,contain:0,content:0,contract:0,contributor:0,control:0,control_unit:0,conveni:0,copi:0,copy_term:0,copyright:0,correspond:0,cost:0,counterpart:0,coupl:0,courselevel:0,covari:0,cover:0,cplint_dataset:0,cplint_r:0,cplint_test:0,csv:0,cudd:0,current:0,curv:0,cw386:0,dagstuhl:0,damag:0,dash:0,data:0,databas:0,davi:0,david:0,davidenitti:0,declar:0,defin:0,definit:0,defualt:0,delet:0,delta:0,den:0,deneck:0,densities_r:0,density_r:0,depend:0,depth:0,depth_bound:0,deriv:0,describ:0,det:0,determin:0,determinist:0,diagram:0,dict:0,dictionari:0,differ:0,digit:0,dimbelrig:0,dimitar:0,dipartimento:0,dir:0,direct:0,directli:0,dirichlet:0,disc:0,discard:0,disclaim:0,discoveri:0,disjunct:0,distinct:0,divid:0,dmbr15:0,doc:0,doc_for:0,document:0,doe:[],doesn:0,doi:0,domain:0,done:0,dot:0,dotstr:0,draw_r:0,drawn:0,drkt07:0,drug:0,drvl95:0,dt_solv:0,dtproblog:0,due:0,dure:0,dynam:0,each:0,eason:0,edg:0,editor:0,effect:0,effici:0,either:0,elect:0,element:0,elen:0,elena:0,emblem:0,emit:0,empti:0,enclos:0,encod:0,encount:0,end:0,end_bg:0,end_in:0,end_lpad:0,end_plp:0,endors:0,engin:0,ensur:0,entir:0,epsilon_em:0,epsilon_em_fract:0,epsilon_pars:0,equal:0,equat:0,equival:0,error:0,estim:0,european:0,eval:0,evalu:0,even:0,event:0,eventu:0,everi:0,evid:0,exactli:[],examplelist:0,except:0,exclus:0,execut:0,exemplari:0,exit:0,exp:0,expand:[],expect:0,explan:0,explicitli:0,exploit:0,exponenti:0,express:0,extra:0,fabrizio:0,fact:0,fail:0,failur:0,fair:0,fals:0,fastest:0,fc90:0,featur:0,femal:0,ferrara:0,fifth:0,filenam:0,filter:0,find:0,findal:0,finit:0,first:0,fit:0,five:0,fix:0,flexprob:0,fold:0,fold_nam:0,folder:0,follow:0,foreign:0,forev:[],forget:0,forgotten:0,form:0,format:0,forum:0,found:0,four:0,fourth:0,frac:0,freedom:0,freeli:0,friguzzi:0,from:0,fte:0,ftr:0,fuer:0,fukuoka:0,functor:0,fundamenta:0,fung:0,fwood:0,gamma:0,gauss_mean_est:0,gauss_mean_est_r:0,gauss_mean_est_us:0,gaussian:0,gaussian_mixtur:0,gear:0,gener:0,geometr:0,geq:0,gerda:0,get:[],getrand:0,gibb:0,github:0,githubusercont:0,give:0,given:0,goal:0,good:0,googl:0,gpa:0,graphviz:0,green:0,ground:0,group:0,guarante:0,gui:0,hand:0,handl:0,has:0,hasposit:0,hast:0,have:0,head:0,heidelberg:0,here:0,hexadecim:0,high:0,higher:0,highest:0,histogram:0,histogram_r:0,hmm1:0,hmm_vit:0,hold:0,holder:0,holland:0,home:0,how:0,howev:0,html:0,http:0,hybrid:0,hypothes:0,iclp:0,ida:0,identifi:0,igpa:0,implement:0,impli:0,implic:0,impos:0,incident:0,includ:0,increas:0,independ:0,index:0,india:0,indian:0,indian_gpa:0,indian_gpadc:0,indic:0,indirect:0,individu:0,induc:0,induce_lm:0,induce_par:0,induct:0,infinit:0,infix:0,influenc:0,inform:0,informat:0,informatica:0,informatik:0,ing:0,ingegneria:0,ingo:0,init:0,initial_clauses_per_megaex:0,inphas:0,input_cw:0,insert:0,instanti:0,instead:0,instruct:0,integ:0,integr:0,intel:0,intellig:0,intension:0,inter:0,interest:0,intern:0,interrupt:0,interv:0,invers:0,involv:0,irr12:0,is_density_a:0,is_density_i:0,is_discrete_a:0,is_discrete_i:0,isjunct:0,islam:0,itali:0,iter:0,iterref:0,its:0,itself:0,jan:0,janssen:0,japan:0,jess:0,john:0,joint:0,jona:0,jori:0,json:0,juli:0,just:0,kalman:0,kalman_filt:0,kameya:0,kei:0,kf_fin:0,kf_o:0,kf_part:0,kimmig:0,knowledg:0,koller2009probabilist:0,kuo:0,laer:0,laet:0,lag:0,lambda:0,land:0,larger:0,last:0,later:0,latex:0,latter:0,lav:0,ldot:0,lead:0,least:0,leav:0,lebesgu:0,left:0,legal:0,leibniz:0,lemur:0,length:0,less:0,leuven:0,level:0,liabil:0,liabl:0,librari:0,lift:0,like:0,likelihood:0,limit:0,line:0,link:0,linux:0,lipic:0,list:0,list_of_fold:0,liter:0,lnai:0,lnc:0,load:0,locat:0,log:0,logic:0,logp:0,logzero:0,look:0,lookahead:0,lookahead_con:0,lookahead_cons_var:0,loop:0,loss:0,lower:0,luc:0,mach:0,machin:0,maco:0,mai:0,make:0,male:0,mani:0,manipul:0,manual2:0,map_bdd_dot_str:0,map_queri:0,marc:0,marco:0,markov:0,markov_chain:0,markov_chaindb:0,martijn:0,master:0,match:0,materi:0,math:0,mathbb:0,matrix:0,matter:0,mauric:0,mauro:0,max:0,max_it:0,max_iter_structur:0,max_sampl:0,max_var:0,maxdepth_var:0,maxim:0,maximum:0,mc_expect:0,mc_gibbs_expect:0,mc_gibbs_sampl:0,mc_gibbs_sample_arg:0,mc_lw_expect:0,mc_lw_sampl:0,mc_lw_sample_arg:0,mc_mh_expect:0,mc_mh_sampl:0,mc_mh_sample_arg:0,mc_particle_expect:0,mc_particle_sampl:0,mc_particle_sample_arg:0,mc_prob:0,mc_rejection_expect:0,mc_rejection_sampl:0,mc_rejection_sample_arg:0,mc_sampl:0,mc_sample_arg:0,mc_sample_arg_first:0,mc_sample_arg_on:0,mc_sample_arg_raw:0,mcintyr:0,mcmc:0,mcts_beamsiz:0,mcts_c:0,mcts_iter:0,mcts_max_depth:0,mcts_maxrestart:0,mcts_visit:0,mean:0,measur:0,mechan:0,meert:0,mega:0,megaex_bottom:0,megaexampl:0,member:0,memo:0,memoiz:0,memori:0,merchant:0,met:0,meta:0,method:0,metropoli:0,min:0,min_error:0,mine:0,minim:0,minimum:0,minu:0,mix:0,mixtur:0,ml15:0,mod:0,modal:0,mode:0,modeb:0,modebb:0,modeh:0,model:0,modif:0,modifi:0,modul:0,mont:0,more:0,moreov:0,most:0,mpe_al:[],mpe_all_prob:[],mpe_prob:[],msw:0,much:0,muhammad:0,multi:0,multipl:0,multipli:0,multivalu:0,multivari:0,must:0,muta:0,mutual:0,n_0:0,n_1:0,name:0,nampal:0,nat:0,nation:0,nbin:0,ndldr16:0,necessari:0,need:0,neg:0,neg_ex:0,negat:0,neglig:0,neither:0,nest:0,net:0,network:0,neumann:0,next:0,nexti:0,nf_r:0,nicola:0,nitti2016:0,nitti:0,nneg:0,nnotat:0,no_pick:0,node:0,non:0,nondet:0,none_worn:0,nonground:[],nor:0,normal:0,north:0,not_replac:0,not_worn:0,note:0,noth:0,notic:0,now:0,npo:0,nr14:0,nswer:0,number:0,numer:0,obj:0,object:0,obs_err:0,observ:0,obtain:0,offer:0,often:0,ogic:0,omit:0,one:0,one_worn:0,onli:0,open:0,oper:0,option:0,order:0,org:0,origin:0,other:0,otherwis:0,otterlo:0,out:0,output:0,outsid:0,over:0,overal:0,owner:0,pac:0,pack:0,pack_instal:0,pack_rebuild:0,pack_upgrad:0,page:0,pair:0,panel:0,paper:0,par:0,parenthes:0,part:0,parti:0,particip:0,particl:0,particular:0,particularli:0,pascal:0,path:[],patient:0,pcfglr:0,pctl_slep:0,pea00:0,pearl:0,pengin:0,pengine_rpc:0,perform:0,permiss:0,permit:0,person:0,pick:0,pita:0,placemark:0,plcg:0,pldoc:0,plu:0,point:0,poisson:0,polici:0,poo97:0,pool:0,portion:0,pos:0,posit:0,possibl:0,post:0,posterior:0,posteriori:0,postlist:0,potenti:0,pract:0,practic:0,preced:0,predic:0,predicate1:0,predicaten:0,predict:0,prepar:0,prepend:0,preprint:0,presenc:0,present:0,press:0,pretti:0,previou:0,print:0,prior:0,priorlist:0,prism_memo:0,prob:0,probabilist:0,problem:0,proceed:0,process:0,procur:0,product:0,professor:0,profit:0,progol:0,programmat:0,promot:0,proof:0,proport:0,propos:0,provid:0,publish:0,purpos:0,quot:0,raedt:0,rais:0,ramakrishnan:0,ramon:0,rand_test:0,rand_train:0,random:0,random_restarts_numb:0,random_restarts_refnumb:0,randomli:0,rate:0,raw:0,reach:0,read:0,real:0,reason:0,rebuilt:0,recal:0,recogn:0,recognis:0,recompil:0,record:0,recoveri:0,recurs:0,red:0,redistribut:0,refin:0,reflect:0,regent:0,registr:0,regular:0,reject:0,rel:[],relat:0,rememb:0,render:0,renken:0,replac:0,report:0,repres:0,represent:0,reproduc:0,res:0,resampl:0,rescal:0,reserv:0,resolut:0,resolv:0,resort:0,respect:0,respons:0,rest:0,restart:0,retain:0,retriev:0,riccardo:0,rig13:0,right:0,riguzzi:0,ring1:0,ring2:0,robert:0,robot:0,roc:0,rogram:0,rolog:0,root:0,rs10:0,rule:0,rulenumb:[],run:0,s10994:0,s1471068412000154:0,s1471068413000689:0,s1471068420000174:0,same:0,sampl:0,sampled_mal:0,satisfi:0,sato:0,satur:0,scale:0,schema:0,schloss:0,score:0,script:0,search:0,second:0,section:0,see:0,seed:0,select:0,semicolon:0,sent:0,separ:0,septemb:0,ser:0,serial:0,server:0,servic:0,set:0,set_lm:0,set_mc:0,set_pita:0,set_sc:0,set_sw:0,setrand:0,setting_mc:0,setting_pita:0,shall:0,shape:0,share:0,should:0,show:0,shown:0,sht:0,shterionov:0,sigma:0,signific:0,similar:0,simpl:0,simpli:0,simpson:0,simul:0,singl:0,single_var:0,size:0,sk01:0,sk97:0,slightli:0,slipcov:0,slowest:0,smaller:0,softwar:0,solid:0,some:0,sourc:0,sourceforg:0,space:0,special:0,specif:0,specifi:0,speed:[],springer:0,squar:0,src_url:0,srv:0,stand:0,start:0,state:0,statist:0,step:0,stochast:0,stop:0,store:0,strategi:0,strict:0,string:0,student:0,student_gpa:0,style:0,sub:0,subfold:0,subgoal:0,sublist:0,substitut:0,subsumpt:[],succe:0,succeed:0,success:0,successor:0,suffici:0,suit:0,sum:0,swift:0,swinb:0,swipl:0,symbol:0,symbond:0,symmetr:0,system:0,tabl:0,tail:0,taisuk:0,take:0,taken:0,target:0,taughtbi:0,technic:0,techniqu:0,tempadvisedbi:0,term:0,termin:0,terranc:0,test_prob:0,test_r:0,testdb:0,text:0,than:0,thei:0,them:0,theoret:0,thi:0,third:0,thon:0,those:0,three:0,thu:0,time:0,tinn:0,togeth:0,toivonen:0,top:0,tort:0,toss:0,total:0,tplp:[],train:0,tran:0,trans_err:0,transform:0,treat:0,tree:0,trial:0,triangl:0,truncat:0,tune:0,tupl:0,twenti:0,two:0,type:0,ubsumpt:0,uct:0,umbrella:0,unbias:0,uncertainti:0,unchang:0,undelet:0,under:0,undirect:[],unif:0,uniform:0,uniform_den:0,uniformli:0,univers:0,unsign:0,updat:0,upgrad:0,upload:0,url:0,use_modul:0,use_rend:0,used:0,user:0,uses:0,using:0,usual:0,util:0,uwcselearn:0,val:0,valid:0,vallist:0,valu:0,van:0,var_obj:0,varianc:0,variou:0,vdb06:0,vdb09:0,vdbtvodr10:0,vector:0,venneken:0,verbaeten:0,verbos:0,veri:0,viewer:0,visit:0,visual:0,vlassela:0,vn51:0,volum:0,von:0,vv03:0,vvb04:0,wai:0,wann:0,want:0,warran:0,warranti:0,web:0,weigh:0,weight:0,well:0,wheel:0,when:0,where:0,whether:0,which:0,whole:0,whose:0,width:0,william:0,win:0,window:0,without:0,work:0,worksheet:0,world:0,worn:0,would:0,write:0,written:0,www:0,xi_j:0,xsb:0,yap:0,yearsinprogram:0,yeld:0,yellow:0,yes:0,yield:0,yoshitaka:0,you:0,zentrum:0,zese:0},titles:["cplint on SWISH Manual - SWI-Prolog Version"],titleterms:{Using:0,api:0,background:0,bdd:0,bia:0,causal:0,claus:0,command:0,condit:0,continu:0,cpl:0,cplint:0,dataset:0,decis:0,densiti:0,discret:0,distribut:0,download:0,draw:0,exampl:0,file:0,graph:0,infer:0,initi:0,input:0,instal:0,interpret:0,introduct:0,languag:0,learn:0,licens:0,lpad:0,manual:0,map:0,mpe:0,paramet:0,pdf:0,preambl:0,prism:0,probabl:0,problog:0,program:0,prolog:0,queri:0,refer:0,requir:0,result:0,semant:0,structur:0,support:0,swi:0,swish:0,syntax:0,tabl:[],test:0,theori:0,through:0,uncondit:0,use:0,variabl:0,version:0,viterbi:0}}) \ No newline at end of file +Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinxcontrib.bibtex":9,sphinx:56},filenames:["index.rst"],objects:{},objnames:{},objtypes:{},terms:{"0":0,"000001":0,"00001":0,"000303421":0,"000448807":0,"01":0,"01394":0,"015":0,"016":0,"05":0,"09999999999999998":0,"1":0,"10":0,"100":0,"1000":0,"10000":0,"1007":0,"1017":0,"103":0,"10e4":0,"10th":0,"12":0,"124":0,"127":0,"1309":0,"133":0,"1330":0,"1339":0,"139":0,"1403":0,"15":0,"153":0,"156":0,"162":0,"169":0,"17":0,"171":0,"183":0,"195":0,"1951":0,"197575":0,"1990":0,"1995":0,"1997":0,"1e20":0,"2":0,"20":0,"2000":0,"2001":0,"2003":0,"2004":0,"2006":0,"2007":0,"2008":0,"2009":0,"2010":0,"2011":0,"2012":0,"2013":0,"2014":0,"2015":0,"2016":0,"2020":0,"2080":0,"209":0,"212":0,"21344":0,"220":0,"23708":0,"245":0,"2462":0,"2467":0,"25":0,"3":0,"3032":0,"308":0,"3131":0,"319":0,"32":0,"3233":0,"343":0,"36":0,"363":0,"38":0,"391":0,"3aevent_to_json":0,"4":0,"40":0,"407":0,"4230":0,"449":0,"454":0,"490":0,"491":0,"4_10":0,"5":0,"50":0,"505":0,"51":0,"521":0,"523":0,"5399999999999999":0,"541":0,"5510":0,"5558":0,"56":0,"586":0,"6":0,"6036":0,"64":0,"641\u00e2":0,"655":0,"6th":0,"7":0,"75":0,"79":0,"8":0,"80":0,"847":0,"85":0,"9":0,"9046":0,"94":0,"95":0,"978":0,"99":0,"997":0,"boolean":0,"case":0,"default":0,"do":0,"export":0,"final":0,"float":0,"function":0,"import":0,"int":0,"new":0,"null":0,"public":0,"return":0,"switch":0,"throw":0,"true":0,"universit\u00e0":0,"var":0,"while":0,A:0,AND:0,AS:0,As:0,At:0,BE:0,BUT:0,BY:0,FOR:0,For:0,IF:0,IN:0,IS:0,If:0,In:0,It:0,Its:0,NO:0,NOT:0,No:0,OF:0,ON:0,OR:0,On:0,Or:0,SUCH:0,THE:0,TO:0,The:0,Then:0,There:0,These:0,To:0,With:0,_:0,_b:0,_build:0,_coin:0,_e:0,_m:0,_p:0,a0:[],a1:0,aaai:0,ab:0,abl:0,about:0,abov:0,ac:0,accept:0,accord:0,account:0,achiev:0,action:0,ad:0,adapt:0,add:0,addit:0,address:0,administ:0,admiss:0,admit:0,advis:0,advisedbi:0,after:0,against:0,agent:0,aggreg:0,agpa:0,ai:0,alberti:0,aleph:0,algebra:0,algorithm:0,all:0,allow:0,alpha:0,alreadi:0,also:0,alt:0,altern:0,alwai:0,america:[],american:[],american_gpa:0,ampl:0,analysi:0,angelika:0,anglican:0,ani:0,anna:0,annot:0,annual:0,anoth:0,answer:0,appear:0,appl:0,appli:0,applic:0,approach:0,approxim:0,ar1:0,ar:0,area:0,arg1:0,arg:0,argbar:0,argbar_r:0,argument:0,ari:0,aris:0,arithm:0,arithmet:0,ariti:0,arity1:0,arityn:0,ark:0,artif:0,artifici:0,artist:0,arun:0,arxiv:0,asi:0,ask:0,assert:0,assign:0,associ:0,assum:0,assumpt:0,atom:0,auc:0,aucpr:0,aucroc:0,automat:0,avail:0,averag:0,b1:0,b:0,background_claus:0,backtrack:0,bag_1:0,bag_game_mp:0,bag_game_vit:0,bandit:0,bar1:0,bar:0,bar_r:0,barchar:0,barchart:0,barz20:0,base:0,bash:0,basi:0,bayesian:0,bdd_dot_fil:0,bdd_dot_str:0,bddem:0,bdeem:0,beam:0,beamsiz:0,becaus:0,becom:0,been:0,befor:0,begin:0,begin_bg:0,begin_in:0,begin_lpad:0,begin_plp:0,behavior:0,being:0,bellodi:0,below:0,belrig13:0,belrig:0,berlin:0,best:0,beta:0,between:0,bg:0,bias:0,bin:0,binari:0,binomi:0,bit:0,blob:0,block:0,blue:0,bmatrix:0,bodi:0,bond:0,bongard:0,bongardkei:0,borel:0,both:0,bottom:0,bound:0,box:0,br11:0,br13a:0,br13b:0,br15:0,branch:0,broeck:0,broken_umbrella:0,bruynoogh:0,build:0,built:0,bureau:0,busi:0,c:0,c_seed:0,calculu:0,call:0,cambridg:0,can:0,cannot:0,carc:0,carlo:0,cathi:0,caus:0,cd:0,certainti:0,chain:0,chang:0,chart:0,check:0,children:0,choci:0,choic:0,chosen:0,chu:0,cilc11:0,circl:0,cite:0,clase:0,clean:0,client:0,close:0,clp:0,clpr:0,co:0,code:0,coh95:0,cohen:0,coin2:0,coin:0,coin_us:0,coinmc:0,coinmsw:0,collect:0,colon:0,colorado:0,column:0,com:0,combin:0,come:0,commandlin:0,common:0,commun:0,comp:0,complex:0,compon:0,compos:0,comput:0,compute_areas_diagram:0,compute_areas_diagrams_r:0,confer:0,confid:0,config:0,conjunct:0,connect:0,consequenti:0,consid:0,consist:0,consol:[],constant:0,constitut:0,constraint:0,contain:0,content:0,contract:0,contributor:0,control:0,control_unit:0,conveni:0,copi:0,copy_term:0,copyright:0,correspond:0,cost:0,counterpart:0,coupl:0,courselevel:0,covari:0,cover:0,cp:0,cplint_dataset:0,cplint_r:0,cplint_test:0,cr:0,cs:0,csv:0,cudd:0,current:0,curv:0,cw386:0,cw:0,d:0,dagstuhl:0,damag:0,dash:0,data:0,databas:0,davi:0,david:0,davidenitti:0,db:0,dc:0,de:0,declar:0,defin:0,definit:0,defualt:0,delet:0,delta:0,den:0,deneck:0,densities_r:0,density_r:0,depend:0,depth:0,depth_bound:0,deriv:0,describ:0,det:0,determin:0,determinist:0,di:0,diagram:0,dict:0,dictionari:0,differ:0,digit:0,dimbelrig:0,dimitar:0,dipartimento:0,dir:0,direct:0,directli:0,dirichlet:0,disc:0,discard:0,disclaim:0,discoveri:0,disjunct:0,distinct:0,divid:0,dmbr15:0,doc:0,doc_for:0,document:0,doesn:0,doi:0,domain:0,done:0,dot:0,dotstr:0,draw_r:0,drawn:0,drkt07:0,drug:0,drvl95:0,ds:0,dt_solv:0,dtproblog:0,due:0,dure:0,dx:0,dynam:0,e:0,each:0,eason:0,edg:0,editor:0,effect:0,effici:0,either:0,elect:0,element:0,elen:0,elena:0,em:0,emblem:0,emit:0,empti:0,enclos:0,encod:0,encount:0,end:0,end_bg:0,end_in:0,end_lpad:0,end_plp:0,endors:0,engin:0,ensur:0,entir:0,epsilon_em:0,epsilon_em_fract:0,epsilon_pars:0,equal:0,equat:0,equival:0,error:0,estim:0,eu:0,european:0,ev:0,eval:0,evalu:0,even:0,event:0,eventu:0,everi:0,evid:0,ex:0,examplelist:0,except:0,exclus:0,execut:0,exemplari:0,exit:0,exp:0,expect:0,explan:0,explicitli:0,exploit:0,exponenti:0,express:0,extra:0,f1:0,f2:0,f3:0,f4:0,f:0,fabrizio:0,fact:0,fail:0,failur:0,fair:0,fals:0,fastest:0,fc90:0,featur:0,femal:0,ferrara:0,fi:0,fifth:0,filenam:0,filter:0,find:0,findal:0,finit:0,first:0,fit:0,five:0,fix:0,flexprob:0,fold:0,fold_nam:0,folder:0,follow:0,foreign:0,forget:0,forgotten:0,form:0,format:0,forum:0,found:0,four:0,fourth:0,frac:0,freedom:0,freeli:0,friguzzi:0,from:0,fte:0,ftr:0,fuer:0,fukuoka:0,functor:0,fundamenta:0,fung:0,fwood:0,g:0,gamma:0,gauss_mean_est:0,gauss_mean_est_r:0,gauss_mean_est_us:0,gaussian:0,gaussian_mixtur:0,gear:0,gener:0,geometr:0,geq:0,gerda:0,getrand:0,gibb:0,github:0,githubusercont:0,give:0,given:0,goal:0,good:0,googl:0,gpa:0,graphviz:0,green:0,ground:0,group:0,guarante:0,gui:0,h1:0,h:0,ha:0,hand:0,handl:0,hasposit:0,hast:0,have:0,head:0,heidelberg:0,here:0,hexadecim:0,high:0,higher:0,highest:0,histogram:0,histogram_r:0,hmm1:0,hmm_vit:0,hn:0,hold:0,holder:0,holland:0,home:0,how:0,howev:0,html:0,http:0,hybrid:0,hypothes:0,i0:[],i:0,iclp:0,id:0,ida:0,identifi:0,igpa:0,ij:0,implement:0,impli:0,implic:0,impos:0,incident:0,includ:0,increas:0,independ:0,index:0,india:[],indian:0,indian_gpa:0,indian_gpadc:0,indic:0,indirect:0,individu:0,induc:0,induce_lm:0,induce_par:0,induct:0,infinit:0,infix:0,influenc:0,inform:0,informat:0,informatica:0,informatik:0,ing:0,ingegneria:0,ingo:0,init:0,initial_clauses_per_megaex:0,inphas:0,input_cw:0,insert:0,instanti:0,instead:0,instruct:0,integ:0,integr:0,intel:0,intellig:0,intension:0,inter:0,interest:0,intern:0,interrupt:0,interv:0,invers:0,involv:0,io:0,irr12:0,is_density_a:[],is_density_i:[],is_discrete_a:[],is_discrete_i:[],isjunct:0,islam:0,itali:0,iter:0,iterref:0,its:0,itself:0,iv:0,j:0,jan:0,janssen:0,japan:0,jess:0,john:0,joint:0,jona:0,jori:0,json:0,juli:0,just:0,k:0,kalman:0,kalman_filt:0,kameya:0,kei:0,kf:0,kf_fin:0,kf_o:0,kf_part:0,kimmig:0,knowledg:0,koller2009probabilist:0,kuo:0,l0:0,l:0,laer:0,laet:0,lag:0,lambda:0,land:0,larger:0,last:0,later:0,latex:0,latter:0,lav:0,ldot:0,lead:0,least:0,leav:0,lebesgu:0,left:0,legal:0,leibniz:0,lemur:0,length:0,less:0,leuven:0,level:0,lf:0,liabil:0,liabl:0,librari:0,lift:0,like:0,likelihood:0,limit:0,line:0,link:0,linux:0,lipic:0,list:0,list_of_fold:0,liter:0,ll:0,lm:0,lnai:0,lnc:0,load:0,locat:0,log:0,logic:0,logp:0,logzero:0,look:0,lookahead:0,lookahead_con:0,lookahead_cons_var:0,loop:0,loss:0,lower:0,lp:0,luc:0,lv:0,m:0,mach:0,machin:0,maco:0,mai:0,make:0,male:0,mani:0,manipul:0,manual2:0,map_bdd_dot_str:0,map_queri:0,marc:0,marco:0,markov:0,markov_chain:0,markov_chaindb:0,martijn:0,master:0,match:0,materi:0,math:0,mathbb:0,matrix:0,matter:0,mauric:0,mauro:0,max:0,max_it:0,max_iter_structur:0,max_sampl:0,max_var:0,maxdepth_var:0,maxim:0,maximum:0,mc:0,mc_expect:0,mc_gibbs_expect:0,mc_gibbs_sampl:0,mc_gibbs_sample_arg:0,mc_lw_expect:0,mc_lw_sampl:0,mc_lw_sample_arg:0,mc_mh_expect:0,mc_mh_sampl:0,mc_mh_sample_arg:0,mc_particle_expect:0,mc_particle_sampl:0,mc_particle_sample_arg:0,mc_prob:0,mc_rejection_expect:0,mc_rejection_sampl:0,mc_rejection_sample_arg:0,mc_sampl:0,mc_sample_arg:0,mc_sample_arg_first:0,mc_sample_arg_on:0,mc_sample_arg_raw:0,mcintyr:0,mcmc:0,mcts_beamsiz:0,mcts_c:0,mcts_iter:0,mcts_max_depth:0,mcts_maxrestart:0,mcts_visit:0,mean:0,measur:0,mechan:0,meert:0,mega:0,megaex_bottom:0,megaexampl:0,member:0,memo:0,memoiz:0,memori:0,merchant:0,met:0,meta:0,method:0,metropoli:0,mh:0,min:0,min_error:0,mine:0,minim:0,minimum:0,minu:0,mix:0,mixtur:0,ml15:0,ml:0,mod:0,modal:0,mode:0,modeb:0,modebb:0,modeh:0,model:0,modif:0,modifi:0,modul:0,mont:0,more:0,moreov:0,most:0,msw:0,much:0,muhammad:0,multi:0,multinomi:0,multipl:0,multipli:0,multivalu:0,multivari:0,must:0,muta:0,mutual:0,n:0,n_0:0,n_1:0,name:0,nampal:0,nat:0,nation:0,nbin:0,ndldr16:0,necessari:0,need:0,neg:0,neg_ex:0,negat:0,neglig:0,neither:0,nest:0,net:0,network:0,neumann:0,next:0,nexti:0,nf_r:0,nicola:0,nitti2016:0,nitti:0,nneg:0,nnotat:0,no_pick:0,node:0,non:0,nondet:0,none_worn:0,nor:0,normal:0,north:0,not_replac:0,not_worn:0,note:0,noth:0,notic:0,now:0,npo:0,nr14:0,nswer:0,number:0,numer:0,o1:0,o2:0,o3:0,o4:0,o5:0,o:0,obj:0,object:0,obs_err:0,observ:0,obtain:0,offer:0,often:0,ogic:0,omit:0,one:0,one_worn:0,onli:0,open:0,oper:0,option:0,order:0,org:0,origin:0,other:0,otherwis:0,otterlo:0,out:0,output:0,outsid:0,over:0,overal:0,owner:0,ox:0,p1:0,p:0,pac:0,pack:0,pack_instal:0,pack_rebuild:0,pack_upgrad:0,page:0,pair:0,panel:0,paper:0,par:0,parenthes:0,part:0,parti:0,particip:0,particl:0,particular:0,particularli:0,pascal:0,patient:0,pcfglr:0,pctl_slep:0,pea00:0,pearl:0,pengin:0,pengine_rpc:0,perform:0,permiss:0,permit:0,person:0,pi:0,pick:0,pita:0,pk:0,pl:0,placemark:0,plcg:0,pldoc:0,plu:0,pn:0,po:0,point:0,poisson:0,polici:0,poo97:0,pool:0,portion:0,posit:0,possibl:0,post:0,posterior:0,posteriori:0,postlist:0,potenti:0,pr:0,pract:0,practic:0,preced:0,predic:0,predicate1:0,predicaten:0,predict:0,prepar:0,prepend:0,preprint:0,presenc:0,present:0,press:0,pretti:0,previou:0,print:0,prior:0,priorlist:0,prism_memo:0,prob:0,probabilist:0,problem:0,proceed:0,process:0,procur:0,product:0,professor:0,profit:0,progol:0,programmat:0,promot:0,proof:0,proport:0,propos:0,provid:0,publish:0,purpos:0,q1:0,q2:0,quot:0,raedt:0,rais:0,ramakrishnan:0,ramon:0,rand_test:0,rand_train:0,random:0,random_restarts_numb:0,random_restarts_refnumb:0,randomli:0,rate:0,raw:0,re:0,reach:0,read:0,real:0,reason:0,rebuilt:0,recal:0,recogn:0,recognis:0,recompil:0,record:0,recoveri:0,recurs:0,red:0,redistribut:0,refin:0,reflect:0,regent:0,registr:0,regular:0,reject:0,relat:0,rememb:0,render:0,renken:0,replac:0,report:0,repres:0,represent:0,reproduc:0,resampl:0,rescal:[],reserv:0,resolut:0,resolv:0,resort:0,respect:0,respons:0,rest:0,restart:0,retain:0,retriev:0,riccardo:0,rig13:0,right:0,riguzzi:0,ring1:0,ring2:0,ro:0,robert:0,robot:0,roc:0,rogram:0,rolog:0,root:0,rs10:0,rule:0,run:0,s0:0,s10994:0,s1471068412000154:0,s1471068413000689:0,s1471068420000174:0,s1:0,s:0,same:0,sampl:0,sampled_mal:0,satisfi:0,sato:0,satur:0,sc:0,scale:0,schema:0,schloss:0,score:[],script:0,search:0,second:0,section:0,see:0,seed:0,select:0,semicolon:0,sent:0,separ:0,septemb:0,ser:0,serial:0,server:0,servic:0,set:0,set_lm:0,set_mc:0,set_pita:0,set_sc:0,set_sw:0,setrand:0,setting_mc:0,setting_pita:0,sh:0,shall:0,shape:0,share:0,should:0,show:0,shown:0,sht:0,shterionov:0,si:0,sigma:0,signific:0,similar:0,simpl:0,simpli:0,simpson:0,simul:0,singl:0,single_var:0,size:0,sk01:0,sk97:0,slightli:0,slipcov:0,slowest:0,smaller:0,sn:0,so:0,softwar:0,solid:0,some:0,sourc:0,sourceforg:0,space:0,special:0,specif:0,specifi:0,springer:0,squar:0,src_url:0,srv:0,stand:0,start:0,state:0,statist:0,step:0,stochast:0,stop:0,store:0,strategi:0,strict:0,string:0,student:0,student_gpa:0,style:0,sub:0,subfold:0,subgoal:0,sublist:0,substitut:0,succe:0,succeed:0,success:0,successor:0,suffici:0,suit:0,sum:0,swift:0,swinb:0,swipl:0,symbol:0,symbond:0,symmetr:0,system:0,t1:0,t2:0,t3:0,t4:0,t:0,ta:0,tabl:0,tail:0,taisuk:0,take:0,taken:0,target:0,taughtbi:0,technic:0,techniqu:0,tempadvisedbi:0,term:0,termin:0,terranc:0,test_prob:0,test_r:0,testdb:0,text:0,than:0,thei:0,them:0,theoret:0,thi:0,third:0,thon:0,those:0,three:0,thu:0,ti:0,time:0,tinn:0,togeth:0,toivonen:0,top:0,tort:0,toss:0,total:0,tp:0,train:0,tran:0,trans_err:0,transform:0,treat:0,tree:0,trial:0,triangl:0,truncat:0,tune:0,tupl:0,twenti:0,two:0,type:0,u:0,ubsumpt:0,uct:0,uk:0,umbrella:0,unbias:0,uncertainti:0,unchang:0,undelet:0,under:0,unif:0,uniform:0,uniform_den:0,uniformli:0,univers:0,unsign:0,up:0,updat:0,upgrad:0,upload:0,url:0,use_modul:0,use_rend:0,user:0,usual:0,util:0,uwcselearn:0,v:0,val:0,valid:0,vallist:0,valu:0,van:0,var_obj:0,varianc:0,variou:0,vdb06:0,vdb09:0,vdbtvodr10:0,vector:0,venneken:0,verbaeten:0,verbos:0,veri:0,viewer:0,visit:0,visual:0,vlassela:0,vn51:0,volum:0,von:0,vv03:0,vvb04:0,w:0,wai:0,wann:0,want:0,warran:0,warranti:0,we:0,web:0,weigh:0,weight:0,well:0,wheel:0,when:0,where:0,whether:0,which:0,whole:0,whose:0,width:0,william:0,win:0,window:0,without:0,work:0,worksheet:0,world:0,worn:0,would:0,wp:0,write:0,written:0,www:0,x:0,xi_j:0,xsb:0,y:0,yap:0,ye:0,yearsinprogram:0,yeld:0,yellow:0,yield:0,yoshitaka:0,you:0,zentrum:0,zese:0},titles:["cplint on SWISH Manual - SWI-Prolog Version"],titleterms:{an:0,api:0,background:0,bdd:0,bia:0,c3:0,causal:0,claus:0,command:0,condit:0,continu:0,cpl:0,cplint:0,dataset:0,decis:0,densiti:0,discret:0,distribut:0,download:0,draw:0,exampl:0,file:0,graph:0,infer:0,initi:0,input:0,instal:0,interpret:0,introduct:0,js:0,languag:0,learn:0,licens:0,lpad:0,manual:0,map:0,mpe:0,paramet:0,pdf:0,preambl:0,prism:0,probabl:0,problog:0,program:0,prolog:0,queri:0,r:0,refer:0,requir:0,result:0,semant:0,structur:0,support:0,swi:0,swish:0,syntax:0,test:0,theori:0,through:0,uncondit:0,us:0,variabl:0,version:0,viterbi:0}}) \ No newline at end of file diff --git a/packs_lib/cplint/docs/_build/latex/LICRlatin2utf8.xdy b/packs_lib/cplint/docs/_build/latex/LICRlatin2utf8.xdy index 31c80f97ce..1d768259cd 100644 --- a/packs_lib/cplint/docs/_build/latex/LICRlatin2utf8.xdy +++ b/packs_lib/cplint/docs/_build/latex/LICRlatin2utf8.xdy @@ -24,7 +24,7 @@ ;; covered by original tex/inputenc/utf8.xdy. ;; ;; - There is a problem that ȷ is not supported out-of-the box by LaTeX -;; with inputenc, one must add explicitely +;; with inputenc, one must add explicitly ;; \DeclareUnicodeCharacter{0237}{\j} ;; to preamble of LaTeX document. However this character is not supported ;; by the TeX "times" font used by default by Sphinx for pdflatex engine. diff --git a/packs_lib/cplint/docs/_build/latex/Makefile b/packs_lib/cplint/docs/_build/latex/Makefile index c561680ad7..e4653f2364 100644 --- a/packs_lib/cplint/docs/_build/latex/Makefile +++ b/packs_lib/cplint/docs/_build/latex/Makefile @@ -5,14 +5,13 @@ ALLPDF = $(addsuffix .pdf,$(ALLDOCS)) ALLDVI = $(addsuffix .dvi,$(ALLDOCS)) ALLXDV = ALLPS = $(addsuffix .ps,$(ALLDOCS)) -ALLIMGS = $(wildcard *.png *.gif *.jpg *.jpeg) # Prefix for archive names ARCHIVEPREFIX = # Additional LaTeX options (passed via variables in latexmkrc/latexmkjarc file) -export LATEXOPTS = +export LATEXOPTS ?= # Additional latexmk options -LATEXMKOPTS = +LATEXMKOPTS ?= # format: pdf or dvi (used only by archive targets) FMT = pdf @@ -20,9 +19,6 @@ LATEX = latexmk -dvi PDFLATEX = latexmk -pdf -dvi- -ps- -%.png %.gif %.jpg %.jpeg: FORCE_MAKE - extractbb '$@' - %.dvi: %.tex FORCE_MAKE $(LATEX) $(LATEXMKOPTS) '$<' diff --git a/packs_lib/cplint/docs/_build/latex/cplint.pdf b/packs_lib/cplint/docs/_build/latex/cplint.pdf index fc5df2038af0e59d7532317bbd135043ae44ae90..96606818bd7f20d4c57c522c97ce31011deb4808 100644 GIT binary patch delta 271134 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 delta 224824 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 z%0A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�||3pZL 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 z%0A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\linewidth\hsize\linewidth\else\hsize\@tempdima\fi -% longtable ignores \abovecaptionskip/\belowcaptionskip, so do the same here - \abovecaptionskip\sphinxabovecaptionskip % \z@skip - \belowcaptionskip\sphinxbelowcaptionskip % \z@skip - \caption[{#1}]% - {\strut\ignorespaces#2\ifhmode\unskip\@finalstrut\strutbox\fi}% - }\hss}% - \par\prevdepth\dp\strutbox -}% -\def\sphinxabovecaptionskip{\z@skip}% Do not use! Flagged for removal -\def\sphinxbelowcaptionskip{\z@skip}% Do not use! Flagged for removal -% This wrapper of \abovecaptionskip is used in sphinxVerbatim for top -% caption, and with another value in sphinxVerbatimintable -% TODO: To unify space above caption of a code-block with the one above -% caption of a table/longtable, \abovecaptionskip must not be used -% This auxiliary will get renamed and receive a different meaning -% in future. -\def\spx@abovecaptionskip{\abovecaptionskip}% -% Achieve \sphinxbelowcaptionspace below a caption located above a tabular -% or a tabulary -\newcommand\sphinxaftertopcaption -{% - \spx@ifcaptionpackage - {\par\prevdepth\dp\strutbox\nobreak\vskip-\abovecaptionskip}{\nobreak}% - \vskip\dimexpr\sphinxbelowcaptionspace\relax - \vskip-\baselineskip\vskip-\parskip -}% -% varwidth is crucial for our handling of general contents in merged cells -\RequirePackage{varwidth} -% but addition of a compatibility patch with hyperref is needed -% (tested with varwidth v 0.92 Mar 2009) -\AtBeginDocument {% - \let\@@vwid@Hy@raisedlink\Hy@raisedlink - \long\def\@vwid@Hy@raisedlink#1{\@vwid@wrap{\@@vwid@Hy@raisedlink{#1}}}% - \edef\@vwid@setup{% - \let\noexpand\Hy@raisedlink\noexpand\@vwid@Hy@raisedlink % HYPERREF ! - \unexpanded\expandafter{\@vwid@setup}}% -}% -% Homemade package to handle merged cells -\RequirePackage{sphinxmulticell} -\RequirePackage{makeidx} -% For framing code-blocks and warning type notices, and shadowing topics -\RequirePackage{framed} + +% We first handle options then load packages, but we need \definecolor from +% xcolor/color. + +% FIXME: we should \RequirePackage{xcolor} always now % The xcolor package draws better fcolorboxes around verbatim code \IfFileExists{xcolor.sty}{ \RequirePackage{xcolor} }{ \RequirePackage{color} } -% For highlighted code. -\RequirePackage{fancyvrb} -\define@key{FV}{hllines}{\def\sphinx@verbatim@checkifhl##1{\in@{, ##1,}{#1}}} -% sphinxVerbatim must be usable by third party without requiring hllines set-up -\def\sphinxresetverbatimhllines{\def\sphinx@verbatim@checkifhl##1{\in@false}} -\sphinxresetverbatimhllines -% For hyperlinked footnotes in tables; also for gathering footnotes from -% topic and warning blocks. Also to allow code-blocks in footnotes. -\RequirePackage{footnotehyper-sphinx} -% For the H specifier. Do not \restylefloat{figure}, it breaks Sphinx code -% for allowing figures in tables. -\RequirePackage{float} -% For floating figures in the text. Better to load after float. -\RequirePackage{wrapfig} -% Separate paragraphs by space by default. -\RequirePackage{parskip} -% For parsed-literal blocks. -\RequirePackage{alltt} -% Display "real" single quotes in literal blocks. -\RequirePackage{upquote} -% control caption around literal-block -\RequirePackage{capt-of} -\RequirePackage{needspace} -% LaTeX 2018-04-01 and later provides \@removefromreset -\ltx@ifundefined{@removefromreset} - {\RequirePackage{remreset}} - {}% avoid warning -% to make pdf with correct encoded bookmarks in Japanese -% this should precede the hyperref package -\ifx\kanjiskip\@undefined -% for non-Japanese: make sure bookmarks are ok also with lualatex - \PassOptionsToPackage{pdfencoding=unicode}{hyperref} -\else - \RequirePackage{atbegshi} - \ifx\ucs\@undefined - \ifnum 42146=\euc"A4A2 - \AtBeginShipoutFirst{\special{pdf:tounicode EUC-UCS2}} - \else - \AtBeginShipoutFirst{\special{pdf:tounicode 90ms-RKSJ-UCS2}} - \fi - \else - \AtBeginShipoutFirst{\special{pdf:tounicode UTF8-UCS2}} - \fi -\fi - -\ifx\@jsc@uplatextrue\@undefined\else - \PassOptionsToPackage{setpagesize=false}{hyperref} -\fi - -% These options can be overriden inside 'hyperref' key -% or by later use of \hypersetup. -\PassOptionsToPackage{colorlinks,breaklinks,% - linkcolor=InnerLinkColor,filecolor=OuterLinkColor,% - menucolor=OuterLinkColor,urlcolor=OuterLinkColor,% - citecolor=InnerLinkColor}{hyperref} - -% stylesheet for highlighting with pygments -\RequirePackage{sphinxhighlight} -% fix baseline increase from Pygments latex formatter in case of error tokens -% and keep \fboxsep's scope local via added braces -\def\PYG@tok@err{% - \def\PYG@bc##1{{\setlength{\fboxsep}{-\fboxrule}% - \fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}% -} -\def\PYG@tok@cs{% - \def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}% - \def\PYG@bc##1{{\setlength{\fboxsep}{0pt}% - \colorbox[rgb]{1.00,0.94,0.94}{\strut ##1}}}% -}% - -%% OPTIONS -% % Handle options via "kvoptions" (later loaded by hyperref anyhow) \RequirePackage{kvoptions} \SetupKeyvalOptions{prefix=spx@opt@} % use \spx@opt@ prefix @@ -298,6 +65,8 @@ \DeclareStringOption[-1]{numfigreset} \DeclareBoolOption[false]{nonumfigreset} \DeclareBoolOption[false]{mathnumfig} +\define@key{sphinx}{bookmarksdepth}{\AtBeginDocument{\hypersetup{bookmarksdepth=#1}}} +\AtBeginDocument{\define@key{sphinx}{bookmarksdepth}{\hypersetup{bookmarksdepth=#1}}} % \DeclareBoolOption[false]{usespart}% not used % dimensions, we declare the \dimen registers here. \newdimen\sphinxverbatimsep @@ -308,7 +77,7 @@ % \DeclareStringOption is not convenient for the handling of these dimensions % because we want to assign the values to the corresponding registers. Even if % we added the code to the key handler it would be too late for the initial -% set-up and we would need to do initial assignments explicitely. We end up +% set-up and we would need to do initial assignments explicitly. We end up % using \define@key directly. % verbatim \sphinxverbatimsep=\fboxsep @@ -325,6 +94,9 @@ % verbatim \DeclareBoolOption[true]{verbatimwithframe} \DeclareBoolOption[true]{verbatimwrapslines} +\DeclareBoolOption[false]{verbatimforcewraps} +\DeclareStringOption[3]{verbatimmaxoverfull} +\DeclareStringOption[100]{verbatimmaxunderfull} \DeclareBoolOption[true]{verbatimhintsturnover} \DeclareBoolOption[true]{inlineliteralwraps} \DeclareStringOption[t]{literalblockcappos} @@ -403,332 +175,31 @@ \DisableKeyvalOption{sphinx}{numfigreset} \DisableKeyvalOption{sphinx}{nonumfigreset} \DisableKeyvalOption{sphinx}{mathnumfig} +% FIXME: this is unrelated to an option, move this elsewhere +% To allow hyphenation of first word in narrow contexts; no option, +% customization to be done via 'preamble' key +\newcommand*\sphinxAtStartPar{\leavevmode\nobreak\hskip\z@skip} +% No need for the \hspace{0pt} trick (\hskip\z@skip) with luatex +\ifdefined\directlua\let\sphinxAtStartPar\@empty\fi % user interface: options can be changed midway in a document! \newcommand\sphinxsetup[1]{\setkeys{sphinx}{#1}} -%% MAXLISTDEPTH -% -% remove LaTeX's cap on nesting depth if 'maxlistdepth' key used. -% This is a hack, which works with the standard classes: it assumes \@toodeep -% is always used in "true" branches: "\if ... \@toodeep \else .. \fi." - -% will force use the "false" branch (if there is one) -\def\spx@toodeep@hack{\fi\iffalse} - -% do nothing if 'maxlistdepth' key not used or if package enumitem loaded. -\ifnum\spx@opt@maxlistdepth=\z@\expandafter\@gobbletwo\fi -\AtBeginDocument{% -\@ifpackageloaded{enumitem}{\remove@to@nnil}{}% - \let\spx@toodeepORI\@toodeep - \def\@toodeep{% - \ifnum\@listdepth<\spx@opt@maxlistdepth\relax - \expandafter\spx@toodeep@hack - \else - \expandafter\spx@toodeepORI - \fi}% -% define all missing \@list... macros - \count@\@ne - \loop - \ltx@ifundefined{@list\romannumeral\the\count@} - {\iffalse}{\iftrue\advance\count@\@ne}% - \repeat - \loop - \ifnum\count@>\spx@opt@maxlistdepth\relax\else - \expandafter\let - \csname @list\romannumeral\the\count@\expandafter\endcsname - \csname @list\romannumeral\the\numexpr\count@-\@ne\endcsname - % workaround 2.6--3.2d babel-french issue (fixed in 3.2e; no change needed) - \ltx@ifundefined{leftmargin\romannumeral\the\count@} - {\expandafter\let - \csname leftmargin\romannumeral\the\count@\expandafter\endcsname - \csname leftmargin\romannumeral\the\numexpr\count@-\@ne\endcsname}{}% - \advance\count@\@ne - \repeat -% define all missing enum... counters and \labelenum... macros and \p@enum.. - \count@\@ne - \loop - \ltx@ifundefined{c@enum\romannumeral\the\count@} - {\iffalse}{\iftrue\advance\count@\@ne}% - \repeat - \loop - \ifnum\count@>\spx@opt@maxlistdepth\relax\else - \newcounter{enum\romannumeral\the\count@}% - \expandafter\def - \csname labelenum\romannumeral\the\count@\expandafter\endcsname - \expandafter - {\csname theenum\romannumeral\the\numexpr\count@\endcsname.}% - \expandafter\def - \csname p@enum\romannumeral\the\count@\expandafter\endcsname - \expandafter - {\csname p@enum\romannumeral\the\numexpr\count@-\@ne\expandafter - \endcsname\csname theenum\romannumeral\the\numexpr\count@-\@ne\endcsname.}% - \advance\count@\@ne - \repeat -% define all missing labelitem... macros - \count@\@ne - \loop - \ltx@ifundefined{labelitem\romannumeral\the\count@} - {\iffalse}{\iftrue\advance\count@\@ne}% - \repeat - \loop - \ifnum\count@>\spx@opt@maxlistdepth\relax\else - \expandafter\let - \csname labelitem\romannumeral\the\count@\expandafter\endcsname - \csname labelitem\romannumeral\the\numexpr\count@-\@ne\endcsname - \advance\count@\@ne - \repeat - \PackageInfo{sphinx}{maximal list depth extended to \spx@opt@maxlistdepth}% -\@gobble\@nnil -} - - -%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS -% -% fix the double index and bibliography on the table of contents -% in jsclasses (Japanese standard document classes) -\ifx\@jsc@uplatextrue\@undefined\else - \renewenvironment{sphinxtheindex} - {\cleardoublepage\phantomsection - \begin{theindex}} - {\end{theindex}} - - \renewenvironment{sphinxthebibliography}[1] - {\cleardoublepage% \phantomsection % not needed here since TeXLive 2010's hyperref - \begin{thebibliography}{#1}} - {\end{thebibliography}} -\fi - -% disable \@chappos in Appendix in pTeX -\ifx\kanjiskip\@undefined\else - \let\py@OldAppendix=\appendix - \renewcommand{\appendix}{ - \py@OldAppendix - \gdef\@chappos{} - } -\fi - -% make commands known to non-Sphinx document classes -\providecommand*{\sphinxtableofcontents}{\tableofcontents} -\ltx@ifundefined{sphinxthebibliography} - {\newenvironment - {sphinxthebibliography}{\begin{thebibliography}}{\end{thebibliography}}% - } - {}% else clause of \ltx@ifundefined -\ltx@ifundefined{sphinxtheindex} - {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}% - {}% else clause of \ltx@ifundefined - -% for usage with xindy: this string gets internationalized in preamble -\newcommand*{\sphinxnonalphabeticalgroupname}{} -% redefined in preamble, headings for makeindex produced index -\newcommand*{\sphinxsymbolsname}{} -\newcommand*{\sphinxnumbersname}{} - -%% COLOR (general) -% -% FIXME: \normalcolor should probably be used in place of \py@NormalColor -% elsewhere, and \py@NormalColor should never be defined. \normalcolor -% switches to the colour from last \color call in preamble. -\def\py@NormalColor{\color{black}} -% FIXME: it is probably better to use \color{TitleColor}, as TitleColor -% can be customized from 'sphinxsetup', and drop usage of \py@TitleColor -\def\py@TitleColor{\color{TitleColor}} -% FIXME: this line should be dropped, as "9" is default anyhow. -\ifdefined\pdfcompresslevel\pdfcompresslevel = 9 \fi - - -%% PAGE STYLING -% -% Style parameters and macros used by most documents here -\raggedbottom -\sloppy -\hbadness = 5000 % don't print trivial gripes - -% Use \pagestyle{normal} as the primary pagestyle for text. -% Redefine the 'normal' header/footer style when using "fancyhdr" package: -\@ifpackageloaded{fancyhdr}{% - \ltx@ifundefined{c@chapter} - {% no \chapter, "howto" (non-Japanese) docclass - \fancypagestyle{plain}{ - \fancyhf{} - \fancyfoot[C]{{\py@HeaderFamily\thepage}} - \renewcommand{\headrulewidth}{0pt} - \renewcommand{\footrulewidth}{0pt} - } - % Same as 'plain', this way we can use it in template - % FIXME: shouldn't this have a running header with Name and Release like 'manual'? - \fancypagestyle{normal}{ - \fancyhf{} - \fancyfoot[C]{{\py@HeaderFamily\thepage}} - \renewcommand{\headrulewidth}{0pt} - \renewcommand{\footrulewidth}{0pt} - } - }% - {% classes with \chapter command - \fancypagestyle{normal}{ - \fancyhf{} - % FIXME: this presupposes "twoside". - % If "oneside" class option, there are warnings in LaTeX log. - \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}} - \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}} - \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}} - \fancyhead[LE,RO]{{\py@HeaderFamily \@title\sphinxheadercomma\py@release}} - \renewcommand{\headrulewidth}{0.4pt} - \renewcommand{\footrulewidth}{0.4pt} - % define chaptermark with \@chappos when \@chappos is available for Japanese - \ltx@ifundefined{@chappos}{} - {\def\chaptermark##1{\markboth{\@chapapp\space\thechapter\space\@chappos\space ##1}{}}} - } - % Update the plain style so we get the page number & footer line, - % but not a chapter or section title. This is to keep the first - % page of a chapter `clean.' - \fancypagestyle{plain}{ - \fancyhf{} - \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}} - \renewcommand{\headrulewidth}{0pt} - \renewcommand{\footrulewidth}{0.4pt} - } - } - } - {% no fancyhdr: memoir class - % Provide default for 'normal' style simply as an alias of 'plain' style - % This way we can use \pagestyle{normal} in LaTeX template - \def\ps@normal{\ps@plain} - % Users of memoir class are invited to redefine 'normal' style in preamble - } - -% geometry -\ifx\kanjiskip\@undefined - \PassOptionsToPackage{% - hmargin={\unexpanded{\spx@opt@hmargin}},% - vmargin={\unexpanded{\spx@opt@vmargin}},% - marginpar=\unexpanded{\spx@opt@marginpar}} - {geometry} -\else - % set text width for Japanese documents to be integer multiple of 1zw - % and text height to be integer multiple of \baselineskip - % the execution is delayed to \sphinxsetup then geometry.sty - \normalsize\normalfont - \newcommand*\sphinxtextwidthja[1]{% - \if@twocolumn\tw@\fi - \dimexpr - \numexpr\dimexpr\paperwidth-\tw@\dimexpr#1\relax\relax/ - \dimexpr\if@twocolumn\tw@\else\@ne\fi zw\relax - zw\relax}% - \newcommand*\sphinxmarginparwidthja[1]{% - \dimexpr\numexpr\dimexpr#1\relax/\dimexpr1zw\relax zw\relax}% - \newcommand*\sphinxtextlinesja[1]{% - \numexpr\@ne+\dimexpr\paperheight-\topskip-\tw@\dimexpr#1\relax\relax/ - \baselineskip\relax}% - \ifx\@jsc@uplatextrue\@undefined\else - % the way we found in order for the papersize special written by - % geometry in the dvi file to be correct in case of jsbook class - \ifnum\mag=\@m\else % do nothing special if nomag class option or 10pt - \PassOptionsToPackage{truedimen}{geometry}% - \fi - \fi - \PassOptionsToPackage{% - hmarginratio={1:1},% - textwidth=\unexpanded{\sphinxtextwidthja{\spx@opt@hmargin}},% - vmarginratio={1:1},% - lines=\unexpanded{\sphinxtextlinesja{\spx@opt@vmargin}},% - marginpar=\unexpanded{\sphinxmarginparwidthja{\spx@opt@marginpar}},% - footskip=2\baselineskip,% - }{geometry}% - \AtBeginDocument - {% update a dimension used by the jsclasses - \ifx\@jsc@uplatextrue\@undefined\else\fullwidth\textwidth\fi - % for some reason, jreport normalizes all dimensions with \@settopoint - \@ifclassloaded{jreport} - {\@settopoint\textwidth\@settopoint\textheight\@settopoint\marginparwidth} - {}% <-- "false" clause of \@ifclassloaded - }% -\fi - -% fix fncychap's bug which uses prematurely the \textwidth value -\@ifpackagewith{fncychap}{Bjornstrup} - {\AtBeginDocument{\mylen\textwidth\advance\mylen-2\myhi}}% - {}% <-- "false" clause of \@ifpackagewith - - -%% TITLES +%% MISCELLANEOUS CONTEXT % -% Since Sphinx 1.5, users should use HeaderFamily key to 'sphinxsetup' rather -% than defining their own \py@HeaderFamily command (which is still possible). -% Memo: \py@HeaderFamily is also used by \maketitle as defined in -% sphinxmanual.cls/sphinxhowto.cls -\newcommand{\py@HeaderFamily}{\spx@opt@HeaderFamily} - -% This sets up the fancy chapter headings that make the documents look -% at least a little better than the usual LaTeX output. -\@ifpackagewith{fncychap}{Bjarne}{ - \ChNameVar {\raggedleft\normalsize \py@HeaderFamily} - \ChNumVar {\raggedleft\Large \py@HeaderFamily} - \ChTitleVar{\raggedleft\Large \py@HeaderFamily} - % This creates (numbered) chapter heads without the leading \vspace*{}: - \def\@makechapterhead#1{% - {\parindent \z@ \raggedright \normalfont - \ifnum \c@secnumdepth >\m@ne - \if@mainmatter - \DOCH - \fi - \fi - \interlinepenalty\@M - \if@mainmatter - \DOTI{#1}% - \else% - \DOTIS{#1}% - \fi - }} -}{}% <-- "false" clause of \@ifpackagewith - -% Augment the sectioning commands used to get our own font family in place, -% and reset some internal data items (\titleformat from titlesec package) -\titleformat{\section}{\Large\py@HeaderFamily}% - {\py@TitleColor\thesection}{0.5em}{\py@TitleColor}{\py@NormalColor} -\titleformat{\subsection}{\large\py@HeaderFamily}% - {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor}{\py@NormalColor} -\titleformat{\subsubsection}{\py@HeaderFamily}% - {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor}{\py@NormalColor} -% By default paragraphs (and subsubsections) will not be numbered because -% sphinxmanual.cls and sphinxhowto.cls set secnumdepth to 2 -\titleformat{\paragraph}{\py@HeaderFamily}% - {\py@TitleColor\theparagraph}{0.5em}{\py@TitleColor}{\py@NormalColor} -\titleformat{\subparagraph}{\py@HeaderFamily}% - {\py@TitleColor\thesubparagraph}{0.5em}{\py@TitleColor}{\py@NormalColor} - - -%% GRAPHICS +% flag to be set in a framed environment +% (defined here as currently needed by three sphinxlatex....sty files and +% even if not needed if such files are replaced, the definition does no harm) +\newif\ifspx@inframed % -% \sphinxincludegraphics defined to resize images larger than the line width, -% except if height or width option present. +% \spx@ifcaptionpackage (defined at begin document) +% is needed currently in macros from: +% sphinxlatexliterals.sty (sphinxVerbatim) +% sphinxlatextables.sty (for some macros used in the table templates) % -% If scale is present, rescale before fitting to line width. (since 1.5) -\newbox\spx@image@box -\newcommand*{\sphinxincludegraphics}[2][]{% - \in@{height}{#1}\ifin@\else\in@{width}{#1}\fi - \ifin@ % height or width present - \includegraphics[#1]{#2}% - \else % no height nor width (but #1 may be "scale=...") - \setbox\spx@image@box\hbox{\includegraphics[#1,draft]{#2}}% - \ifdim \wd\spx@image@box>\linewidth - \setbox\spx@image@box\box\voidb@x % clear memory - \includegraphics[#1,width=\linewidth]{#2}% - \else - \includegraphics[#1]{#2}% - \fi - \fi -} - - -%% FIGURE IN TABLE +% \sphinxcaption is mark-up injected by the tabular and tabulary templates +% it is defined in sphinxlatextables.sty % -\newenvironment{sphinxfigure-in-table}[1][\linewidth]{% - \def\@captype{figure}% - \sphinxsetvskipsforfigintablecaption - \begin{minipage}{#1}% -}{\end{minipage}} % store the original \caption macro for usage with figures inside longtable % and tabulary cells. Make sure we get the final \caption in presence of % caption package, whether the latter was loaded before or after sphinx. @@ -744,1038 +215,137 @@ }% {\let\spx@ifcaptionpackage\@secondoftwo}% } -% tabulary expands twice contents, we need to prevent double counter stepping -\newcommand*\sphinxfigcaption - {\ifx\equation$%$% this is trick to identify tabulary first pass - \firstchoice@false\else\firstchoice@true\fi - \spx@originalcaption } -\newcommand*\sphinxsetvskipsforfigintablecaption - {\abovecaptionskip\smallskipamount - \belowcaptionskip\smallskipamount} - -%% CITATIONS -% -\protected\def\sphinxcite{\cite} - -%% FOOTNOTES +%% PASS OPTIONS % -% Support large numbered footnotes in minipage -% But now obsolete due to systematic use of \savenotes/\spewnotes -% when minipages are in use in the various macro definitions next. -\def\thempfootnote{\arabic{mpfootnote}} - - -%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS -\ltx@ifundefined{c@chapter} - {\newcounter{literalblock}}% - {\newcounter{literalblock}[chapter]% - \def\theliteralblock{\ifnum\c@chapter>\z@\arabic{chapter}.\fi - \arabic{literalblock}}% - }% -\ifspx@opt@nonumfigreset - \ltx@ifundefined{c@chapter}{}{% - \@removefromreset{figure}{chapter}% - \@removefromreset{table}{chapter}% - \@removefromreset{literalblock}{chapter}% - \ifspx@opt@mathnumfig - \@removefromreset{equation}{chapter}% - \fi - }% - \def\thefigure{\arabic{figure}}% - \def\thetable {\arabic{table}}% - \def\theliteralblock{\arabic{literalblock}}% - \ifspx@opt@mathnumfig - \def\theequation{\arabic{equation}}% - \fi -\else -\let\spx@preAthefigure\@empty -\let\spx@preBthefigure\@empty -% \ifspx@opt@usespart % <-- LaTeX writer could pass such a 'usespart' boolean -% % as sphinx.sty package option -% If document uses \part, (triggered in Sphinx by latex_toplevel_sectioning) -% LaTeX core per default does not reset chapter or section -% counters at each part. -% But if we modify this, we need to redefine \thechapter, \thesection to -% include the part number and this will cause problems in table of contents -% because of too wide numbering. Simplest is to do nothing. -% \fi -\ifnum\spx@opt@numfigreset>0 - \ltx@ifundefined{c@chapter} - {} - {\g@addto@macro\spx@preAthefigure{\ifnum\c@chapter>\z@\arabic{chapter}.}% - \g@addto@macro\spx@preBthefigure{\fi}}% -\fi -\ifnum\spx@opt@numfigreset>1 - \@addtoreset{figure}{section}% - \@addtoreset{table}{section}% - \@addtoreset{literalblock}{section}% - \ifspx@opt@mathnumfig - \@addtoreset{equation}{section}% - \fi - \g@addto@macro\spx@preAthefigure{\ifnum\c@section>\z@\arabic{section}.}% - \g@addto@macro\spx@preBthefigure{\fi}% -\fi -\ifnum\spx@opt@numfigreset>2 - \@addtoreset{figure}{subsection}% - \@addtoreset{table}{subsection}% - \@addtoreset{literalblock}{subsection}% - \ifspx@opt@mathnumfig - \@addtoreset{equation}{subsection}% - \fi - \g@addto@macro\spx@preAthefigure{\ifnum\c@subsection>\z@\arabic{subsection}.}% - \g@addto@macro\spx@preBthefigure{\fi}% -\fi -\ifnum\spx@opt@numfigreset>3 - \@addtoreset{figure}{subsubsection}% - \@addtoreset{table}{subsubsection}% - \@addtoreset{literalblock}{subsubsection}% - \ifspx@opt@mathnumfig - \@addtoreset{equation}{subsubsection}% - \fi - \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubsection>\z@\arabic{subsubsection}.}% - \g@addto@macro\spx@preBthefigure{\fi}% -\fi -\ifnum\spx@opt@numfigreset>4 - \@addtoreset{figure}{paragraph}% - \@addtoreset{table}{paragraph}% - \@addtoreset{literalblock}{paragraph}% - \ifspx@opt@mathnumfig - \@addtoreset{equation}{paragraph}% - \fi - \g@addto@macro\spx@preAthefigure{\ifnum\c@subparagraph>\z@\arabic{subparagraph}.}% - \g@addto@macro\spx@preBthefigure{\fi}% -\fi -\ifnum\spx@opt@numfigreset>5 - \@addtoreset{figure}{subparagraph}% - \@addtoreset{table}{subparagraph}% - \@addtoreset{literalblock}{subparagraph}% - \ifspx@opt@mathnumfig - \@addtoreset{equation}{subparagraph}% - \fi - \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubparagraph>\z@\arabic{subsubparagraph}.}% - \g@addto@macro\spx@preBthefigure{\fi}% -\fi -\expandafter\g@addto@macro -\expandafter\spx@preAthefigure\expandafter{\spx@preBthefigure}% -\let\thefigure\spx@preAthefigure -\let\thetable\spx@preAthefigure -\let\theliteralblock\spx@preAthefigure -\g@addto@macro\thefigure{\arabic{figure}}% -\g@addto@macro\thetable{\arabic{table}}% -\g@addto@macro\theliteralblock{\arabic{literalblock}}% - \ifspx@opt@mathnumfig - \let\theequation\spx@preAthefigure - \g@addto@macro\theequation{\arabic{equation}}% - \fi -\fi +% pass options to hyperref; it must not have been loaded already +\input{sphinxoptionshyperref.sty} +% pass options to geometry; it must not have been loaded already +\input{sphinxoptionsgeometry.sty} -%% LITERAL BLOCKS +%% COLOR (general) % -% Based on use of "fancyvrb.sty"'s Verbatim. -% - with framing allowing page breaks ("framed.sty") -% - with breaking of long lines (exploits Pygments mark-up), -% - with possibly of a top caption, non-separable by pagebreak. -% - and usable inside tables or footnotes ("footnotehyper-sphinx"). - -% For extensions which use \OriginalVerbatim and compatibility with Sphinx < -% 1.5, we define and use these when (unmodified) Verbatim will be needed. But -% Sphinx >= 1.5 does not modify the \Verbatim macro anymore. -\let\OriginalVerbatim \Verbatim -\let\endOriginalVerbatim\endVerbatim - -% for captions of literal blocks -% at start of caption title -\newcommand*{\fnum@literalblock}{\literalblockname\nobreakspace\theliteralblock} -% this will be overwritten in document preamble by Babel translation -\newcommand*{\literalblockname}{Listing } -% file extension needed for \caption's good functioning, the file is created -% only if a \listof{literalblock}{foo} command is encountered, which is -% analogous to \listoffigures, but for the code listings (foo = chosen title.) -\newcommand*{\ext@literalblock}{lol} +% FIXME: these two should be deprecated +% +% FIXME: \normalcolor should be used and \py@NormalColor never defined +\def\py@NormalColor{\color{black}} +% FIXME: \color{TitleColor} should be used directly and \py@TitleColor +% should never get defined. +\def\py@TitleColor{\color{TitleColor}} -\newif\ifspx@inframed % flag set if we are already in a framed environment -% if forced use of minipage encapsulation is needed (e.g. table cells) -\newif\ifsphinxverbatimwithminipage \sphinxverbatimwithminipagefalse -% Framing macro for use with framed.sty's \FrameCommand -% - it obeys current indentation, -% - frame is \fboxsep separated from the contents, -% - the contents use the full available text width, -% - #1 = color of frame, #2 = color of background, -% - #3 = above frame, #4 = below frame, #5 = within frame, -% - #3 and #4 must be already typeset boxes; they must issue \normalcolor -% or similar, else, they are under scope of color #1 -\long\def\spx@fcolorbox #1#2#3#4#5{% - \hskip\@totalleftmargin - \hskip-\fboxsep\hskip-\fboxrule - % use of \color@b@x here is compatible with both xcolor.sty and color.sty - \color@b@x {\color{#1}\spx@CustomFBox{#3}{#4}}{\color{#2}}{#5}% - \hskip-\fboxsep\hskip-\fboxrule - \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth -}% -% #1 = for material above frame, such as a caption or a "continued" hint -% #2 = for material below frame, such as a caption or "continues on next page" -% #3 = actual contents, which will be typeset with a background color -\long\def\spx@CustomFBox#1#2#3{% - \begingroup - \setbox\@tempboxa\hbox{{#3}}% inner braces to avoid color leaks - \vbox{#1% above frame - % draw frame border _latest_ to avoid pdf viewer issue - \kern\fboxrule - \hbox{\kern\fboxrule - \copy\@tempboxa - \kern-\wd\@tempboxa\kern-\fboxrule - \vrule\@width\fboxrule - \kern\wd\@tempboxa - \vrule\@width\fboxrule}% - \kern-\dimexpr\ht\@tempboxa+\dp\@tempboxa+\fboxrule\relax - \hrule\@height\fboxrule - \kern\dimexpr\ht\@tempboxa+\dp\@tempboxa\relax - \hrule\@height\fboxrule - #2% below frame - }% - \endgroup -}% -\def\spx@fcolorbox@put@c#1{% hide width from framed.sty measuring - \moveright\dimexpr\fboxrule+.5\wd\@tempboxa\hb@xt@\z@{\hss#1\hss}% -}% -\def\spx@fcolorbox@put@r#1{% right align with contents, width hidden - \moveright\dimexpr\fboxrule+\wd\@tempboxa-\fboxsep\hb@xt@\z@{\hss#1}% -}% -\def\spx@fcolorbox@put@l#1{% left align with contents, width hidden - \moveright\dimexpr\fboxrule+\fboxsep\hb@xt@\z@{#1\hss}% -}% +%% PACKAGES % -\def\sphinxVerbatim@Continued - {\csname spx@fcolorbox@put@\spx@opt@verbatimcontinuedalign\endcsname - {\normalcolor\sphinxstylecodecontinued\literalblockcontinuedname}}% -\def\sphinxVerbatim@Continues - {\csname spx@fcolorbox@put@\spx@opt@verbatimcontinuesalign\endcsname - {\normalcolor\sphinxstylecodecontinues\literalblockcontinuesname}}% -\def\sphinxVerbatim@Title - {\spx@fcolorbox@put@c{\unhcopy\sphinxVerbatim@TitleBox}}% -\let\sphinxVerbatim@Before\@empty -\let\sphinxVerbatim@After\@empty -% Defaults are redefined in document preamble according to language -\newcommand*\literalblockcontinuedname{continued from previous page}% -\newcommand*\literalblockcontinuesname{continues on next page}% +% as will be indicated below, secondary style files load some more packages % -\def\spx@verbatimfcolorbox{\spx@fcolorbox{VerbatimBorderColor}{VerbatimColor}}% -\def\sphinxVerbatim@FrameCommand - {\spx@verbatimfcolorbox\sphinxVerbatim@Before\sphinxVerbatim@After}% -\def\sphinxVerbatim@FirstFrameCommand - {\spx@verbatimfcolorbox\sphinxVerbatim@Before\sphinxVerbatim@Continues}% -\def\sphinxVerbatim@MidFrameCommand - {\spx@verbatimfcolorbox\sphinxVerbatim@Continued\sphinxVerbatim@Continues}% -\def\sphinxVerbatim@LastFrameCommand - {\spx@verbatimfcolorbox\sphinxVerbatim@Continued\sphinxVerbatim@After}% - -% For linebreaks inside Verbatim environment from package fancyvrb. -\newbox\sphinxcontinuationbox -\newbox\sphinxvisiblespacebox -\newcommand*\sphinxafterbreak {\copy\sphinxcontinuationbox} - -% Take advantage of the already applied Pygments mark-up to insert -% potential linebreaks for TeX processing. -% {, <, #, %, $, ' and ": go to next line. -% _, }, ^, &, >, - and ~: stay at end of broken line. -% Use of \textquotesingle for straight quote. -% FIXME: convert this to package options ? -\newcommand*\sphinxbreaksbeforelist {% - \do\PYGZob\{\do\PYGZlt\<\do\PYGZsh\#\do\PYGZpc\%% {, <, #, %, - \do\PYGZdl\$\do\PYGZdq\"% $, " - \def\PYGZsq - {\discretionary{}{\sphinxafterbreak\textquotesingle}{\textquotesingle}}% ' -} -\newcommand*\sphinxbreaksafterlist {% - \do\PYGZus\_\do\PYGZcb\}\do\PYGZca\^\do\PYGZam\&% _, }, ^, &, - \do\PYGZgt\>\do\PYGZhy\-\do\PYGZti\~% >, -, ~ -} -\newcommand*\sphinxbreaksatspecials {% - \def\do##1##2% - {\def##1{\discretionary{}{\sphinxafterbreak\char`##2}{\char`##2}}}% - \sphinxbreaksbeforelist - \def\do##1##2% - {\def##1{\discretionary{\char`##2}{\sphinxafterbreak}{\char`##2}}}% - \sphinxbreaksafterlist -} - -\def\sphinx@verbatim@nolig@list {\do \`}% -% Some characters . , ; ? ! / are not pygmentized. -% This macro makes them "active" and they will insert potential linebreaks. -% Not compatible with math mode (cf \sphinxunactivateextras). -\newcommand*\sphinxbreaksbeforeactivelist {}% none -\newcommand*\sphinxbreaksafteractivelist {\do\.\do\,\do\;\do\?\do\!\do\/} -\newcommand*\sphinxbreaksviaactive {% - \def\do##1{\lccode`\~`##1% - \lowercase{\def~}{\discretionary{}{\sphinxafterbreak\char`##1}{\char`##1}}% - \catcode`##1\active}% - \sphinxbreaksbeforeactivelist - \def\do##1{\lccode`\~`##1% - \lowercase{\def~}{\discretionary{\char`##1}{\sphinxafterbreak}{\char`##1}}% - \catcode`##1\active}% - \sphinxbreaksafteractivelist - \lccode`\~`\~ -} - -% If the linebreak is at a space, the latter will be displayed as visible -% space at end of first line, and a continuation symbol starts next line. -\def\spx@verbatim@space {% - \nobreak\hskip\z@skip - \discretionary{\copy\sphinxvisiblespacebox}{\sphinxafterbreak} - {\kern\fontdimen2\font}% -}% - -% if the available space on page is less than \literalblockneedspace, insert pagebreak -\newcommand{\sphinxliteralblockneedspace}{5\baselineskip} -\newcommand{\sphinxliteralblockwithoutcaptionneedspace}{1.5\baselineskip} -% The title (caption) is specified from outside as macro \sphinxVerbatimTitle. -% \sphinxVerbatimTitle is reset to empty after each use of Verbatim. -\newcommand*\sphinxVerbatimTitle {} -% This box to typeset the caption before framed.sty multiple passes for framing. -\newbox\sphinxVerbatim@TitleBox -% This is a workaround to a "feature" of French lists, when literal block -% follows immediately; usable generally (does only \par then), a priori... -\newcommand*\sphinxvspacefixafterfrenchlists{% - \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi -} -% Holder macro for labels of literal blocks. Set-up by LaTeX writer. -\newcommand*\sphinxLiteralBlockLabel {} -\newcommand*\sphinxSetupCaptionForVerbatim [1] -{% - \sphinxvspacefixafterfrenchlists - \needspace{\sphinxliteralblockneedspace}% -% insert a \label via \sphinxLiteralBlockLabel -% reset to normal the color for the literal block caption - \def\sphinxVerbatimTitle - {\py@NormalColor\sphinxcaption{\sphinxLiteralBlockLabel #1}}% -} -\newcommand*\sphinxSetupCodeBlockInFootnote {% - \fvset{fontsize=\footnotesize}\let\caption\sphinxfigcaption - \sphinxverbatimwithminipagetrue % reduces vertical spaces - % we counteract (this is in a group) the \@normalsize from \caption - \let\normalsize\footnotesize\let\@parboxrestore\relax - \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}% -} -% needed to create wrapper environments of fancyvrb's Verbatim -\newcommand*{\sphinxVerbatimEnvironment}{\gdef\FV@EnvironName{sphinxVerbatim}} -\newcommand*{\sphinxverbatimsmallskipamount}{\smallskipamount} -% serves to implement line highlighting and line wrapping -\newcommand\sphinxFancyVerbFormatLine[1]{% - \expandafter\sphinx@verbatim@checkifhl\expandafter{\the\FV@CodeLineNo}% - \ifin@ - \sphinxVerbatimHighlightLine{#1}% - \else - \sphinxVerbatimFormatLine{#1}% - \fi -}% -\newcommand\sphinxVerbatimHighlightLine[1]{% - \edef\sphinxrestorefboxsep{\fboxsep\the\fboxsep\relax}% - \fboxsep0pt\relax % cf LaTeX bug graphics/4524 - \colorbox{sphinxVerbatimHighlightColor}% - {\sphinxrestorefboxsep\sphinxVerbatimFormatLine{#1}}% - % no need to restore \fboxsep here, as this ends up in a \hbox from fancyvrb -}% -% \sphinxVerbatimFormatLine will be set locally to one of those two: -\newcommand\sphinxVerbatimFormatLineWrap[1]{% - \hsize\linewidth - \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ - \doublehyphendemerits\z@\finalhyphendemerits\z@ - \strut #1\strut}% -}% -\newcommand\sphinxVerbatimFormatLineNoWrap[1]{\hb@xt@\linewidth{\strut #1\hss}}% -\g@addto@macro\FV@SetupFont{% - \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}% - \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}% -}% -\newenvironment{sphinxVerbatim}{% - % first, let's check if there is a caption - \ifx\sphinxVerbatimTitle\empty - \sphinxvspacefixafterfrenchlists - \parskip\z@skip - \vskip\sphinxverbatimsmallskipamount - % there was no caption. Check if nevertheless a label was set. - \ifx\sphinxLiteralBlockLabel\empty\else - % we require some space to be sure hyperlink target from \phantomsection - % will not be separated from upcoming verbatim by a page break - \needspace{\sphinxliteralblockwithoutcaptionneedspace}% - \phantomsection\sphinxLiteralBlockLabel - \fi - \else - \parskip\z@skip - \if t\spx@opt@literalblockcappos - \vskip\spx@abovecaptionskip - \def\sphinxVerbatim@Before - {\sphinxVerbatim@Title\nointerlineskip - \kern\dimexpr-\dp\strutbox+\sphinxbelowcaptionspace - % if no frame (code-blocks inside table cells), remove - % the "verbatimsep" whitespace from the top (better visually) - \ifspx@opt@verbatimwithframe\else-\sphinxverbatimsep\fi - % caption package adds \abovecaptionskip vspace, remove it - \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax}% - \else - \vskip\sphinxverbatimsmallskipamount - \def\sphinxVerbatim@After - {\nointerlineskip\kern\dimexpr\dp\strutbox - \ifspx@opt@verbatimwithframe\else-\sphinxverbatimsep\fi - \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax - \sphinxVerbatim@Title}% - \fi - \def\@captype{literalblock}% - \capstart - % \sphinxVerbatimTitle must reset color - \setbox\sphinxVerbatim@TitleBox - \hbox{\begin{minipage}{\linewidth}% - % caption package may detect wrongly if top or bottom, so we help it - \spx@ifcaptionpackage - {\caption@setposition{\spx@opt@literalblockcappos}}{}% - \sphinxVerbatimTitle - \end{minipage}}% - \fi - \global\let\sphinxLiteralBlockLabel\empty - \global\let\sphinxVerbatimTitle\empty - \fboxsep\sphinxverbatimsep \fboxrule\sphinxverbatimborder - \ifspx@opt@verbatimwithframe\else\fboxrule\z@\fi - \let\FrameCommand \sphinxVerbatim@FrameCommand - \let\FirstFrameCommand\sphinxVerbatim@FirstFrameCommand - \let\MidFrameCommand \sphinxVerbatim@MidFrameCommand - \let\LastFrameCommand \sphinxVerbatim@LastFrameCommand - \ifspx@opt@verbatimhintsturnover\else - \let\sphinxVerbatim@Continued\@empty - \let\sphinxVerbatim@Continues\@empty - \fi - \ifspx@opt@verbatimwrapslines - % fancyvrb's Verbatim puts each input line in (unbreakable) horizontal boxes. - % This customization wraps each line from the input in a \vtop, thus - % allowing it to wrap and display on two or more lines in the latex output. - % - The codeline counter will be increased only once. - % - The wrapped material will not break across pages, it is impossible - % to achieve this without extensive rewrite of fancyvrb. - % - The (not used in sphinx) obeytabs option to Verbatim is - % broken by this change (showtabs and tabspace work). - \let\sphinxVerbatimFormatLine\sphinxVerbatimFormatLineWrap - \let\FV@Space\spx@verbatim@space - % Allow breaks at special characters using \PYG... macros. - \sphinxbreaksatspecials - % Breaks at punctuation characters . , ; ? ! and / (needs catcode activation) - \fvset{codes*=\sphinxbreaksviaactive}% - \else % end of conditional code for wrapping long code lines - \let\sphinxVerbatimFormatLine\sphinxVerbatimFormatLineNoWrap - \fi - \let\FancyVerbFormatLine\sphinxFancyVerbFormatLine - % workaround to fancyvrb's check of \@currenvir - \let\VerbatimEnvironment\sphinxVerbatimEnvironment - % workaround to fancyvrb's check of current list depth - \def\@toodeep {\advance\@listdepth\@ne}% - % The list environment is needed to control perfectly the vertical space. - % Note: \OuterFrameSep used by framed.sty is later set to \topsep hence 0pt. - % - if caption: distance from last text baseline to caption baseline is - % A+(B-F)+\ht\strutbox, A = \abovecaptionskip (default 10pt), B = - % \baselineskip, F is the framed.sty \FrameHeightAdjust macro, default 6pt. - % Formula valid for F < 10pt. - % - distance of baseline of caption to top of frame is like for tables: - % \sphinxbelowcaptionspace (=0.5\baselineskip) - % - if no caption: distance of last text baseline to code frame is S+(B-F), - % with S = \sphinxverbatimtopskip (=\smallskip) - % - and distance from bottom of frame to next text baseline is - % \baselineskip+\parskip. - % The \trivlist is used to avoid possible "too deeply nested" error. - \itemsep \z@skip - \topsep \z@skip - \partopsep \z@skip - % trivlist will set \parsep to \parskip = zero - % \leftmargin will be set to zero by trivlist - \rightmargin\z@ - \parindent \z@% becomes \itemindent. Default zero, but perhaps overwritten. - \trivlist\item\relax - \ifsphinxverbatimwithminipage\spx@inframedtrue\fi - % use a minipage if we are already inside a framed environment - \ifspx@inframed\noindent\begin{minipage}{\linewidth}\fi - \MakeFramed {% adapted over from framed.sty's snugshade environment - \advance\hsize-\width\@totalleftmargin\z@\linewidth\hsize\@setminipage - }% - % For grid placement from \strut's in \FancyVerbFormatLine - \lineskip\z@skip - % active comma should not be overwritten by \@noligs - \ifspx@opt@verbatimwrapslines - \let\verbatim@nolig@list \sphinx@verbatim@nolig@list - \fi - % will fetch its optional arguments if any - \OriginalVerbatim -} -{% - \endOriginalVerbatim - \par\unskip\@minipagefalse\endMakeFramed % from framed.sty snugshade - \ifspx@inframed\end{minipage}\fi - \endtrivlist -} -\newenvironment {sphinxVerbatimNoFrame} - {\spx@opt@verbatimwithframefalse - % needed for fancyvrb as literal code will end in \end{sphinxVerbatimNoFrame} - \def\sphinxVerbatimEnvironment{\gdef\FV@EnvironName{sphinxVerbatimNoFrame}}% - \begin{sphinxVerbatim}} - {\end{sphinxVerbatim}} -\newenvironment {sphinxVerbatimintable} - {% don't use a frame if in a table cell - \spx@opt@verbatimwithframefalse - \sphinxverbatimwithminipagetrue - % the literal block caption uses \sphinxcaption which is wrapper of \caption, - % but \caption must be modified because longtable redefines it to work only - % for the own table caption, and tabulary has multiple passes - \let\caption\sphinxfigcaption - % reduce above caption skip - \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}% - \def\sphinxVerbatimEnvironment{\gdef\FV@EnvironName{sphinxVerbatimintable}}% - \begin{sphinxVerbatim}} - {\end{sphinxVerbatim}} - - -%% PARSED LITERALS -% allow long lines to wrap like they do in code-blocks - -% this should be kept in sync with definitions in sphinx.util.texescape -\newcommand*\sphinxbreaksattexescapedchars{% - \def\do##1##2% put potential break point before character - {\def##1{\discretionary{}{\sphinxafterbreak\char`##2}{\char`##2}}}% - \do\{\{\do\textless\<\do\#\#\do\%\%\do\$\$% {, <, #, %, $ - \def\do##1##2% put potential break point after character - {\def##1{\discretionary{\char`##2}{\sphinxafterbreak}{\char`##2}}}% - \do\_\_\do\}\}\do\textasciicircum\^\do\&\&% _, }, ^, &, - \do\textgreater\>\do\textasciitilde\~% >, ~ -} -\newcommand*\sphinxbreaksviaactiveinparsedliteral{% - \sphinxbreaksviaactive % by default handles . , ; ? ! / - \do\-% we need also the hyphen character (ends up "as is" in parsed-literal) - \lccode`\~`\~ % - % update \dospecials as it is used by \url - % but deactivation will already have been done hence this is unneeded: - % \expandafter\def\expandafter\dospecials\expandafter{\dospecials - % \sphinxbreaksbeforeactivelist\sphinxbreaksafteractivelist\do\-}% -} -\newcommand*\sphinxbreaksatspaceinparsedliteral{% - \lccode`~32 \lowercase{\let~}\spx@verbatim@space\lccode`\~`\~ -} -\newcommand*{\sphinxunactivateextras}{\let\do\@makeother - \sphinxbreaksbeforeactivelist\sphinxbreaksafteractivelist\do\-}% -% the \catcode13=5\relax (deactivate end of input lines) is left to callers -\newcommand*{\sphinxunactivateextrasandspace}{\catcode32=10\relax - \sphinxunactivateextras}% -% now for the modified alltt environment -\newenvironment{sphinxalltt} -{% at start of next line to workaround Emacs/AUCTeX issue with this file -\begin{alltt}% - \ifspx@opt@parsedliteralwraps - \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}% - \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}% - \sphinxbreaksattexescapedchars - \sphinxbreaksviaactiveinparsedliteral - \sphinxbreaksatspaceinparsedliteral -% alltt takes care of the ' as derivative ("prime") in math mode - \everymath\expandafter{\the\everymath\sphinxunactivateextrasandspace - \catcode`\<=12\catcode`\>=12\catcode`\^=7\catcode`\_=8 }% -% not sure if displayed math (align,...) can end up in parsed-literal, anyway - \everydisplay\expandafter{\the\everydisplay - \catcode13=5 \sphinxunactivateextrasandspace - \catcode`\<=12\catcode`\>=12\catcode`\^=7\catcode`\_=8 }% - \fi } -{\end{alltt}} - -% Protect \href's first argument in contexts such as sphinxalltt (or -% \sphinxcode). Sphinx uses \#, \%, \& ... always inside \sphinxhref. -\protected\def\sphinxhref#1#2{{% - \sphinxunactivateextrasandspace % never do \scantokens with active space! - \endlinechar\m@ne\everyeof{{#2}}% keep catcode regime for #2 - \scantokens{\href{#1}}% normalise it for #1 during \href expansion -}} -% Same for \url. And also \nolinkurl for coherence. -\protected\def\sphinxurl#1{{% - \sphinxunactivateextrasandspace\everyeof{}% (<- precaution for \scantokens) - \endlinechar\m@ne\scantokens{\url{#1}}% -}} -\protected\def\sphinxnolinkurl#1{{% - \sphinxunactivateextrasandspace\everyeof{}% - \endlinechar\m@ne\scantokens{\nolinkurl{#1}}% -}} +% For \text macro (sphinx.util.texescape) +% also for usage of \firstchoice@true(false) in sphinxlatexgraphics.sty +\RequirePackage{amstext} +% It was passed "warn" option from latex template in case it is already loaded +% via some other package before \usepackage{sphinx} in preamble +\RequirePackage{textcomp} +% For the H specifier. Do not \restylefloat{figure}, it breaks Sphinx code +% for allowing figures in tables. +\RequirePackage{float} +% For floating figures in the text. Better to load after float. +\RequirePackage{wrapfig} +% Provides \captionof, used once by latex writer (\captionof{figure}) +\RequirePackage{capt-of} +% Support hlist directive +\RequirePackage{multicol} -%% TOPIC AND CONTENTS BOXES +%% GRAPHICS % -% Again based on use of "framed.sty", this allows breakable framed boxes. -\long\def\spx@ShadowFBox#1{% - \leavevmode\begingroup - % first we frame the box #1 - \setbox\@tempboxa - \hbox{\vrule\@width\sphinxshadowrule - \vbox{\hrule\@height\sphinxshadowrule - \kern\sphinxshadowsep - \hbox{\kern\sphinxshadowsep #1\kern\sphinxshadowsep}% - \kern\sphinxshadowsep - \hrule\@height\sphinxshadowrule}% - \vrule\@width\sphinxshadowrule}% - % Now we add the shadow, like \shadowbox from fancybox.sty would do - \dimen@\dimexpr.5\sphinxshadowrule+\sphinxshadowsize\relax - \hbox{\vbox{\offinterlineskip - \hbox{\copy\@tempboxa\kern-.5\sphinxshadowrule - % add shadow on right side - \lower\sphinxshadowsize - \hbox{\vrule\@height\ht\@tempboxa \@width\dimen@}% - }% - \kern-\dimen@ % shift back vertically to bottom of frame - % and add shadow at bottom - \moveright\sphinxshadowsize - \vbox{\hrule\@width\wd\@tempboxa \@height\dimen@}% - }% - % move left by the size of right shadow so shadow adds no width - \kern-\sphinxshadowsize - }% - \endgroup -} - -% use framed.sty to allow page breaks in frame+shadow -% works well inside Lists and Quote-like environments -% produced by ``topic'' directive (or local contents) -% could nest if LaTeX writer authorized it -\newenvironment{sphinxShadowBox} - {\def\FrameCommand {\spx@ShadowFBox }% - % configure framed.sty not to add extra vertical spacing - \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}% - % the \trivlist will add the vertical spacing on top and bottom which is - % typical of center environment as used in Sphinx <= 1.4.1 - % the \noindent has the effet of an extra blank line on top, to - % imitate closely the layout from Sphinx <= 1.4.1; the \FrameHeightAdjust - % will put top part of frame on this baseline. - \def\FrameHeightAdjust {\baselineskip}% - % use package footnote to handle footnotes - \savenotes - \trivlist\item\noindent - % use a minipage if we are already inside a framed environment - \ifspx@inframed\begin{minipage}{\linewidth}\fi - \MakeFramed {\spx@inframedtrue - % framed.sty puts into "\width" the added width (=2shadowsep+2shadowrule) - % adjust \hsize to what the contents must use - \advance\hsize-\width - % adjust LaTeX parameters to behave properly in indented/quoted contexts - \FrameRestore - % typeset the contents as in a minipage (Sphinx <= 1.4.1 used a minipage and - % itemize/enumerate are therein typeset more tightly, we want to keep - % that). We copy-paste from LaTeX source code but don't do a real minipage. - \@pboxswfalse - \let\@listdepth\@mplistdepth \@mplistdepth\z@ - \@minipagerestore - \@setminipage - }% - }% - {% insert the "endminipage" code - \par\unskip - \@minipagefalse - \endMakeFramed - \ifspx@inframed\end{minipage}\fi - \endtrivlist - % output the stored footnotes - \spewnotes - } +% It will always be needed, so let's load it here +\RequirePackage{graphicx} +\input{sphinxlatexgraphics.sty} -%% NOTICES AND ADMONITIONS +%% FRAMED ENVIRONMENTS % -% Some are quite plain -% the spx@notice@bordercolor etc are set in the sphinxadmonition environment -\newenvironment{sphinxlightbox}{% - \par\allowbreak - \noindent{\color{spx@notice@bordercolor}% - \rule{\linewidth}{\spx@notice@border}}\par\nobreak - {\parskip\z@skip\noindent}% - } - {% - % counteract previous possible negative skip (French lists!): - % (we can't cancel that any earlier \vskip introduced a potential pagebreak) - \sphinxvspacefixafterfrenchlists - \nobreak\vbox{\noindent\kern\@totalleftmargin - {\color{spx@notice@bordercolor}% - \rule[\dimexpr.4\baselineskip-\spx@notice@border\relax] - {\linewidth}{\spx@notice@border}}\hss}\allowbreak - }% end of sphinxlightbox environment definition -% may be renewenvironment'd by user for complete customization -\newenvironment{sphinxnote}[1] - {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} -\newenvironment{sphinxhint}[1] - {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} -\newenvironment{sphinximportant}[1] - {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} -\newenvironment{sphinxtip}[1] - {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} -% or just use the package options -% these are needed for common handling by notice environment of lightbox -% and heavybox but they are currently not used by lightbox environment -% and there is consequently no corresponding package option -\definecolor{sphinxnoteBgColor}{rgb}{1,1,1} -\definecolor{sphinxhintBgColor}{rgb}{1,1,1} -\definecolor{sphinximportantBgColor}{rgb}{1,1,1} -\definecolor{sphinxtipBgColor}{rgb}{1,1,1} - -% Others get more distinction -% Code adapted from framed.sty's "snugshade" environment. -% Nesting works (inner frames do not allow page breaks). -\newenvironment{sphinxheavybox}{\par - \setlength{\FrameRule}{\spx@notice@border}% - \setlength{\FrameSep}{\dimexpr.6\baselineskip-\FrameRule\relax} - % configure framed.sty's parameters to obtain same vertical spacing - % as for "light" boxes. We need for this to manually insert parskip glue and - % revert a skip done by framed before the frame. - \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}% - \vspace{\FrameHeightAdjust} - % copied/adapted from framed.sty's snugshade - \def\FrameCommand##1{\hskip\@totalleftmargin - \fboxsep\FrameSep \fboxrule\FrameRule - \fcolorbox{spx@notice@bordercolor}{spx@notice@bgcolor}{##1}% - \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% - \savenotes - % use a minipage if we are already inside a framed environment - \ifspx@inframed - \noindent\begin{minipage}{\linewidth} - \else - % handle case where notice is first thing in a list item (or is quoted) - \if@inlabel - \noindent\par\vspace{-\baselineskip} - \else - \vspace{\parskip} - \fi - \fi - \MakeFramed {\spx@inframedtrue - \advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize - % minipage initialization copied from LaTeX source code. - \@pboxswfalse - \let\@listdepth\@mplistdepth \@mplistdepth\z@ - \@minipagerestore - \@setminipage }% - } - {% - \par\unskip - \@minipagefalse - \endMakeFramed - \ifspx@inframed\end{minipage}\fi - % set footnotes at bottom of page - \spewnotes - % arrange for similar spacing below frame as for "light" boxes. - \vskip .4\baselineskip - }% end of sphinxheavybox environment definition -% may be renewenvironment'd by user for complete customization -\newenvironment{sphinxwarning}[1] - {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} -\newenvironment{sphinxcaution}[1] - {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} -\newenvironment{sphinxattention}[1] - {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} -\newenvironment{sphinxdanger}[1] - {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} -\newenvironment{sphinxerror}[1] - {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} -% or just use package options - -% the \colorlet of xcolor (if at all loaded) is overkill for our use case -\newcommand{\sphinxcolorlet}[2] - {\expandafter\let\csname\@backslashchar color@#1\expandafter\endcsname - \csname\@backslashchar color@#2\endcsname } +\input{sphinxlatexadmonitions.sty} +\input{sphinxlatexliterals.sty} +\input{sphinxlatexshadowbox.sty} -% the main dispatch for all types of notices -\newenvironment{sphinxadmonition}[2]{% #1=type, #2=heading - % can't use #1 directly in definition of end part - \def\spx@noticetype {#1}% - % set parameters of heavybox/lightbox - \sphinxcolorlet{spx@notice@bordercolor}{sphinx#1BorderColor}% - \sphinxcolorlet{spx@notice@bgcolor}{sphinx#1BgColor}% - \spx@notice@border \dimexpr\csname spx@opt@#1border\endcsname\relax - % start specific environment, passing the heading as argument - \begin{sphinx#1}{#2}} - % workaround some LaTeX "feature" of \end command - {\edef\spx@temp{\noexpand\end{sphinx\spx@noticetype}}\spx@temp} +%% CONTAINERS +% +\input{sphinxlatexcontainers.sty} -%% PYTHON DOCS MACROS AND ENVIRONMENTS -% (some macros here used by \maketitle in sphinxmanual.cls and sphinxhowto.cls) -% \moduleauthor{name}{email} -\newcommand{\moduleauthor}[2]{} +%% PYGMENTS +% stylesheet for highlighting with pygments +\RequirePackage{sphinxhighlight} -% \sectionauthor{name}{email} -\newcommand{\sectionauthor}[2]{} -% Allow the release number to be specified independently of the -% \date{}. This allows the date to reflect the document's date and -% release to specify the release that is documented. +%% TABLES % -\newcommand{\py@release}{\releasename\space\version} -\newcommand{\version}{}% part of \py@release, used by title page and headers -% \releaseinfo is used on titlepage (sphinxmanual.cls, sphinxhowto.cls) -\newcommand{\releaseinfo}{} -\newcommand{\setreleaseinfo}[1]{\renewcommand{\releaseinfo}{#1}} -% this is inserted via template and #1=release config variable -\newcommand{\release}[1]{\renewcommand{\version}{#1}} -% this is defined by template to 'releasename' latex_elements key -\newcommand{\releasename}{} -% Fix issue in case release and releasename deliberately left blank -\newcommand{\sphinxheadercomma}{, }% used in fancyhdr header definition -\newcommand{\sphinxifemptyorblank}[1]{% -% test after one expansion of macro #1 if contents is empty or spaces - \if&\expandafter\@firstofone\detokenize\expandafter{#1}&% - \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}% -\AtBeginDocument {% - \sphinxifemptyorblank{\releasename} - {\sphinxifemptyorblank{\version}{\let\sphinxheadercomma\empty}{}} - {}% -}% +\input{sphinxlatextables.sty} -% Allow specification of the author's address separately from the -% author's name. This can be used to format them differently, which -% is a good thing. -% -\newcommand{\py@authoraddress}{} -\newcommand{\authoraddress}[1]{\renewcommand{\py@authoraddress}{#1}} -% {fulllineitems} is the main environment for object descriptions. +%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS % -\newcommand{\py@itemnewline}[1]{% - \kern\labelsep - \@tempdima\linewidth - \advance\@tempdima \labelwidth\makebox[\@tempdima][l]{#1}% - \kern-\labelsep -} +\input{sphinxlatexnumfig.sty} -\newenvironment{fulllineitems}{% - \begin{list}{}{\labelwidth \leftmargin - \rightmargin \z@ \topsep -\parskip \partopsep \parskip - \itemsep -\parsep - \let\makelabel=\py@itemnewline}% -}{\end{list}} -% Signatures, possibly multi-line +%% LISTS % -\newlength{\py@argswidth} -\newcommand{\py@sigparams}[2]{% - \parbox[t]{\py@argswidth}{#1\sphinxcode{)}#2}} -\newcommand{\pysigline}[1]{\item[{#1}]} -\newcommand{\pysiglinewithargsret}[3]{% - \settowidth{\py@argswidth}{#1\sphinxcode{(}}% - \addtolength{\py@argswidth}{-2\py@argswidth}% - \addtolength{\py@argswidth}{\linewidth}% - \item[{#1\sphinxcode{(}\py@sigparams{#2}{#3}}]} -\newcommand{\pysigstartmultiline}{% - \def\pysigstartmultiline{\vskip\smallskipamount\parskip\z@skip\itemsep\z@skip}% - \edef\pysigstopmultiline - {\noexpand\leavevmode\parskip\the\parskip\relax\itemsep\the\itemsep\relax}% - \parskip\z@skip\itemsep\z@skip -} +\input{sphinxlatexlists.sty} -% Production lists -% -\newenvironment{productionlist}{% -% \def\sphinxoptional##1{{\Large[}##1{\Large]}} - \def\production##1##2{\\\sphinxcode{\sphinxupquote{##1}}&::=&\sphinxcode{\sphinxupquote{##2}}}% - \def\productioncont##1{\\& &\sphinxcode{\sphinxupquote{##1}}}% - \parindent=2em - \indent - \setlength{\LTpre}{0pt}% - \setlength{\LTpost}{0pt}% - \begin{longtable}[l]{lcl} -}{% - \end{longtable} -} -% Definition lists; requested by AMK for HOWTO documents. Probably useful -% elsewhere as well, so keep in in the general style support. +%% FOOTNOTES % -\newenvironment{definitions}{% - \begin{description}% - \def\term##1{\item[{##1}]\mbox{}\\*[0mm]}% -}{% - \end{description}% +% Support scopes for footnote numbering +\newcounter{sphinxscope} +\newcommand{\sphinxstepscope}{\stepcounter{sphinxscope}} +% Explicitly numbered footnotes may be referred to, and for this to be +% clickable we need to have only one target. So we will step this at each +% explicit footnote and let \thesphinxscope take it into account +\newcounter{sphinxexplicit} +\newcommand{\sphinxstepexplicit}{\stepcounter{sphinxexplicit}} +% Some babel/polyglossia languages fiddle with \@arabic, so let's be extra +% cautious and redefine \thesphinxscope with \number not \@arabic. +% Memo: we expect some subtle redefinition of \thesphinxscope to be a part of page +% scoping for footnotes, when we shall implement it. +\renewcommand{\thesphinxscope}{\number\value{sphinxscope}.\number\value{sphinxexplicit}} +\newcommand\sphinxthefootnotemark[2]{% + % this is used to make reference to an explicitly numbered footnote not on same page + % #1=label of footnote text, #2=page number where footnote text was printed + \ifdefined\pagename + \pagename\space#2, % <- space + \else + p. #2, % <- space + \fi #1% no space } +% support large numbered footnotes in minipage; but this is now obsolete +% from systematic use of savenotes environment around minipages +\def\thempfootnote{\arabic{mpfootnote}} +% This package is needed to support hyperlinked footnotes in tables and +% framed contents, and to allow code-blocks in footnotes. +\RequirePackage{sphinxpackagefootnote} -%% FROM DOCTUTILS LATEX WRITER -% -% The following is stuff copied from docutils' latex writer. -% -\newcommand{\optionlistlabel}[1]{\normalfont\bfseries #1 \hfill}% \bf deprecated -\newenvironment{optionlist}[1] -{\begin{list}{} - {\setlength{\labelwidth}{#1} - \setlength{\rightmargin}{1cm} - \setlength{\leftmargin}{\rightmargin} - \addtolength{\leftmargin}{\labelwidth} - \addtolength{\leftmargin}{\labelsep} - \renewcommand{\makelabel}{\optionlistlabel}} -}{\end{list}} -\newlength{\lineblockindentation} -\setlength{\lineblockindentation}{2.5em} -\newenvironment{lineblock}[1] -{\begin{list}{} - {\setlength{\partopsep}{\parskip} - \addtolength{\partopsep}{\baselineskip} - \topsep0pt\itemsep0.15\baselineskip\parsep0pt - \leftmargin#1\relax} - \raggedright} -{\end{list}} +%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS +% +\input{sphinxlatexindbibtoc.sty} -% From docutils.writers.latex2e -% inline markup (custom roles) -% \DUrole{#1}{#2} tries \DUrole#1{#2} -\providecommand*{\DUrole}[2]{% - \ifcsname DUrole\detokenize{#1}\endcsname - \csname DUrole\detokenize{#1}\endcsname{#2}% - \else% backwards compatibility: try \docutilsrole#1{#2} - \ifcsname docutilsrole\detokenize{#1}\endcsname - \csname docutilsrole\detokenize{#1}\endcsname{#2}% - \else - #2% - \fi - \fi -} -\providecommand*{\DUprovidelength}[2]{% - \ifdefined#1\else\newlength{#1}\setlength{#1}{#2}\fi -} +%% STYLING +% +\input{sphinxlatexstylepage.sty} +\input{sphinxlatexstyleheadings.sty} +\input{sphinxlatexstyletext.sty} -\DUprovidelength{\DUlineblockindent}{2.5em} -\ifdefined\DUlineblock\else - \newenvironment{DUlineblock}[1]{% - \list{}{\setlength{\partopsep}{\parskip} - \addtolength{\partopsep}{\baselineskip} - \setlength{\topsep}{0pt} - \setlength{\itemsep}{0.15\baselineskip} - \setlength{\parsep}{0pt} - \setlength{\leftmargin}{#1}} - \raggedright - } - {\endlist} -\fi -%% TEXT STYLING +%% MODULE RELEASE DATA AND OBJECT DESCRIPTIONS % -% to obtain straight quotes we execute \@noligs as patched by upquote, and -% \scantokens is needed in cases where it would be too late for the macro to -% first set catcodes and then fetch its argument. We also make the contents -% breakable at non-escaped . , ; ? ! / using \sphinxbreaksviaactive. -% the macro must be protected if it ends up used in moving arguments, -% in 'alltt' \@noligs is done already, and the \scantokens must be avoided. -\protected\def\sphinxupquote#1{{\def\@tempa{alltt}% - \ifx\@tempa\@currenvir\else - \ifspx@opt@inlineliteralwraps - \sphinxbreaksviaactive\let\sphinxafterbreak\empty - % do not overwrite the comma set-up - \let\verbatim@nolig@list\sphinx@literal@nolig@list - \fi - % fix a space-gobbling issue due to LaTeX's original \do@noligs - \let\do@noligs\sphinx@do@noligs - \@noligs\endlinechar\m@ne\everyeof{}% (<- in case inside \sphinxhref) - \expandafter\scantokens - \fi {{#1}}}}% extra brace pair to fix end-space gobbling issue... -\def\sphinx@do@noligs #1{\catcode`#1\active\begingroup\lccode`\~`#1\relax - \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1 }}} -\def\sphinx@literal@nolig@list {\do\`\do\<\do\>\do\'\do\-}% - -% Some custom font markup commands. -\protected\def\sphinxstrong#1{\textbf{#1}} -\protected\def\sphinxcode#1{\texttt{#1}} -\protected\def\sphinxbfcode#1{\textbf{\sphinxcode{#1}}} -\protected\def\sphinxemail#1{\textsf{#1}} -\protected\def\sphinxtablecontinued#1{\textsf{#1}} -\protected\def\sphinxtitleref#1{\emph{#1}} -\protected\def\sphinxmenuselection#1{\emph{#1}} -\protected\def\sphinxguilabel#1{\emph{#1}} -\protected\def\sphinxaccelerator#1{\underline{#1}} -\protected\def\sphinxcrossref#1{\emph{#1}} -\protected\def\sphinxtermref#1{\emph{#1}} -% \optional is used for ``[, arg]``, i.e. desc_optional nodes. -\long\protected\def\sphinxoptional#1{% - {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}} +\input{sphinxlatexobjects.sty} -% additional customizable styling -\def\sphinxstyleindexentry #1{\texttt{#1}} -\def\sphinxstyleindexextra #1{ (\emph{#1})} -\def\sphinxstyleindexpageref #1{, \pageref{#1}} -\def\sphinxstyleindexpagemain#1{\textbf{#1}} -\protected\def\spxentry#1{#1}% will get \let to \sphinxstyleindexentry in index -\protected\def\spxextra#1{#1}% will get \let to \sphinxstyleindexextra in index -\def\sphinxstyleindexlettergroup #1% - {{\Large\sffamily#1}\nopagebreak\vspace{1mm}} -\def\sphinxstyleindexlettergroupDefault #1% - {{\Large\sffamily\sphinxnonalphabeticalgroupname}\nopagebreak\vspace{1mm}} -\protected\def\sphinxstyletopictitle #1{\textbf{#1}\par\medskip} -\let\sphinxstylesidebartitle\sphinxstyletopictitle -\protected\def\sphinxstyleothertitle #1{\textbf{#1}} -\protected\def\sphinxstylesidebarsubtitle #1{~\\\textbf{#1} \smallskip} -% \text.. commands do not allow multiple paragraphs -\protected\def\sphinxstyletheadfamily {\sffamily} -\protected\def\sphinxstyleemphasis #1{\emph{#1}} -\protected\def\sphinxstyleliteralemphasis#1{\emph{\sphinxcode{#1}}} -\protected\def\sphinxstylestrong #1{\textbf{#1}} -\protected\def\sphinxstyleliteralstrong#1{\sphinxbfcode{#1}} -\protected\def\sphinxstyleabbreviation #1{\textsc{#1}} -\protected\def\sphinxstyleliteralintitle#1{\sphinxcode{#1}} -\newcommand*\sphinxstylecodecontinued[1]{\footnotesize(#1)}% -\newcommand*\sphinxstylecodecontinues[1]{\footnotesize(#1)}% -% figure legend comes after caption and may contain arbitrary body elements -\newenvironment{sphinxlegend}{\par\small}{\par} -% reduce hyperref "Token not allowed in a PDF string" warnings on PDF builds -\AtBeginDocument{\pdfstringdefDisableCommands{% -% all "protected" macros possibly ending up in section titles should be here - \let\sphinxstyleemphasis \@firstofone - \let\sphinxstyleliteralemphasis \@firstofone - \let\sphinxstylestrong \@firstofone - \let\sphinxstyleliteralstrong \@firstofone - \let\sphinxstyleabbreviation \@firstofone - \let\sphinxstyleliteralintitle \@firstofone - \let\sphinxupquote \@firstofone - \let\sphinxstrong \@firstofone - \let\sphinxcode \@firstofone - \let\sphinxbfcode \@firstofone - \let\sphinxemail \@firstofone - \let\sphinxcrossref \@firstofone - \let\sphinxtermref \@firstofone -}} -% For curly braces inside \index macro -\def\sphinxleftcurlybrace{\{} -\def\sphinxrightcurlybrace{\}} +% FIXME: this line should be dropped, as "9" is default anyhow. +\ifdefined\pdfcompresslevel\pdfcompresslevel = 9 \fi -% Declare Unicode characters used by linux tree command to pdflatex utf8/utf8x -\def\spx@bd#1#2{% - \leavevmode - \begingroup - \ifx\spx@bd@height \@undefined\def\spx@bd@height{\baselineskip}\fi - \ifx\spx@bd@width \@undefined\setbox0\hbox{0}\def\spx@bd@width{\wd0 }\fi - \ifx\spx@bd@thickness\@undefined\def\spx@bd@thickness{.6\p@}\fi - \ifx\spx@bd@lower \@undefined\def\spx@bd@lower{\dp\strutbox}\fi - \lower\spx@bd@lower#1{#2}% - \endgroup -}% -\@namedef{sphinx@u2500}% BOX DRAWINGS LIGHT HORIZONTAL - {\spx@bd{\vbox to\spx@bd@height} - {\vss\hrule\@height\spx@bd@thickness - \@width\spx@bd@width\vss}}% -\@namedef{sphinx@u2502}% BOX DRAWINGS LIGHT VERTICAL - {\spx@bd{\hb@xt@\spx@bd@width} - {\hss\vrule\@height\spx@bd@height - \@width \spx@bd@thickness\hss}}% -\@namedef{sphinx@u2514}% BOX DRAWINGS LIGHT UP AND RIGHT - {\spx@bd{\hb@xt@\spx@bd@width} - {\hss\raise.5\spx@bd@height - \hb@xt@\z@{\hss\vrule\@height.5\spx@bd@height - \@width \spx@bd@thickness\hss}% - \vbox to\spx@bd@height{\vss\hrule\@height\spx@bd@thickness - \@width.5\spx@bd@width\vss}}}% -\@namedef{sphinx@u251C}% BOX DRAWINGS LIGHT VERTICAL AND RIGHT - {\spx@bd{\hb@xt@\spx@bd@width} - {\hss - \hb@xt@\z@{\hss\vrule\@height\spx@bd@height - \@width \spx@bd@thickness\hss}% - \vbox to\spx@bd@height{\vss\hrule\@height\spx@bd@thickness - \@width.5\spx@bd@width\vss}}}% -\protected\def\sphinxunichar#1{\@nameuse{sphinx@u#1}}% -% Tell TeX about pathological hyphenation cases: -\hyphenation{Base-HTTP-Re-quest-Hand-ler} \endinput diff --git a/packs_lib/cplint/docs/_build/latex/sphinx.xdy b/packs_lib/cplint/docs/_build/latex/sphinx.xdy index 0d02ef3372..0dcf1133cd 100644 --- a/packs_lib/cplint/docs/_build/latex/sphinx.xdy +++ b/packs_lib/cplint/docs/_build/latex/sphinx.xdy @@ -15,7 +15,7 @@ ;; xindy base module latex.xdy loads tex.xdy and the latter instructs ;; xindy to ignore **all** TeX macros in .idx entries, except those -;; explicitely described in merge rule. But when after applying all +;; explicitly described in merge rule. But when after applying all ;; merge rules an empty string results, xindy raises an error: ;; ERROR: CHAR: index 0 should be less than the length of the string @@ -31,7 +31,7 @@ ;; scripts for the pdflatex engine. ;; Another issue caused by xindy ignoring all TeX macros except those -;; explicitely declared reveals itself when attempting to index ">>>", +;; explicitly declared reveals itself when attempting to index ">>>", ;; as the ">" is converted to "\textgreater{}" by Sphinx's LaTeX ;; escaping. @@ -112,12 +112,14 @@ (merge-rule "\_" "_" :string) (merge-rule "{[}" "[" :string) (merge-rule "{]}" "]" :string) -(merge-rule "{}`" "`" :string) (merge-rule "\textbackslash{}" "\" :string) ; " for Emacs syntax highlighting (merge-rule "\textasciitilde{}" "~~" :string); the ~~ escape is needed here +(merge-rule "\textasciicircum{}" "^" :string) +(merge-rule "\sphinxhyphen{}" "-" :string) +(merge-rule "\textquotesingle{}" "'" :string) +(merge-rule "\textasciigrave{}" "`" :string) (merge-rule "\textless{}" "<" :string) (merge-rule "\textgreater{}" ">" :string) -(merge-rule "\textasciicircum{}" "^" :string) (merge-rule "\P{}" "¶" :string) (merge-rule "\S{}" "§" :string) (merge-rule "\texteuro{}" "€" :string) @@ -147,40 +149,61 @@ (merge-rule "\(\sb{\text{7}}\)" "₇" :string) (merge-rule "\(\sb{\text{8}}\)" "₈" :string) (merge-rule "\(\sb{\text{9}}\)" "₉" :string) -(merge-rule "\(\alpha\)" "α" :string) -(merge-rule "\(\beta\)" "β" :string) -(merge-rule "\(\gamma\)" "γ" :string) -(merge-rule "\(\delta\)" "δ" :string) -(merge-rule "\(\epsilon\)" "ε" :string) -(merge-rule "\(\zeta\)" "ζ" :string) -(merge-rule "\(\eta\)" "η" :string) -(merge-rule "\(\theta\)" "θ" :string) -(merge-rule "\(\iota\)" "ι" :string) -(merge-rule "\(\kappa\)" "κ" :string) -(merge-rule "\(\lambda\)" "λ" :string) -(merge-rule "\(\mu\)" "μ" :string) -(merge-rule "\(\nu\)" "ν" :string) -(merge-rule "\(\xi\)" "ξ" :string) -(merge-rule "\(\pi\)" "π" :string) -(merge-rule "\(\rho\)" "ρ" :string) -(merge-rule "\(\sigma\)" "σ" :string) -(merge-rule "\(\tau\)" "τ" :string) -(merge-rule "\(\upsilon\)" "υ" :string) -(merge-rule "\(\phi\)" "φ" :string) -(merge-rule "\(\chi\)" "χ" :string) -(merge-rule "\(\psi\)" "ψ" :string) -(merge-rule "\(\omega\)" "ω" :string) -(merge-rule "\(\Gamma\)" "Γ" :string) -(merge-rule "\(\Delta\)" "Δ" :string) -(merge-rule "\(\Theta\)" "Θ" :string) -(merge-rule "\(\Lambda\)" "Λ" :string) -(merge-rule "\(\Xi\)" "Ξ" :string) -(merge-rule "\(\Pi\)" "Π" :string) -(merge-rule "\(\Sigma\)" "Σ" :string) -(merge-rule "\(\Upsilon\)" "Υ" :string) -(merge-rule "\(\Phi\)" "Φ" :string) -(merge-rule "\(\Psi\)" "Ψ" :string) -(merge-rule "\(\Omega\)" "Ω" :string) +(merge-rule "\IeC {\textalpha }" "α" :string) +(merge-rule "\IeC {\textbeta }" "β" :string) +(merge-rule "\IeC {\textgamma }" "γ" :string) +(merge-rule "\IeC {\textdelta }" "δ" :string) +(merge-rule "\IeC {\textepsilon }" "ε" :string) +(merge-rule "\IeC {\textzeta }" "ζ" :string) +(merge-rule "\IeC {\texteta }" "η" :string) +(merge-rule "\IeC {\texttheta }" "θ" :string) +(merge-rule "\IeC {\textiota }" "ι" :string) +(merge-rule "\IeC {\textkappa }" "κ" :string) +(merge-rule "\IeC {\textlambda }" "λ" :string) +(merge-rule "\IeC {\textmu }" "μ" :string) +(merge-rule "\IeC {\textnu }" "ν" :string) +(merge-rule "\IeC {\textxi }" "ξ" :string) +(merge-rule "\IeC {\textomicron }" "ο" :string) +(merge-rule "\IeC {\textpi }" "π" :string) +(merge-rule "\IeC {\textrho }" "ρ" :string) +(merge-rule "\IeC {\textsigma }" "σ" :string) +(merge-rule "\IeC {\texttau }" "τ" :string) +(merge-rule "\IeC {\textupsilon }" "υ" :string) +(merge-rule "\IeC {\textphi }" "φ" :string) +(merge-rule "\IeC {\textchi }" "χ" :string) +(merge-rule "\IeC {\textpsi }" "ψ" :string) +(merge-rule "\IeC {\textomega }" "ω" :string) +(merge-rule "\IeC {\textAlpha }" "Α" :string) +(merge-rule "\IeC {\textBeta }" "Β" :string) +(merge-rule "\IeC {\textGamma }" "Γ" :string) +(merge-rule "\IeC {\textDelta }" "Δ" :string) +(merge-rule "\IeC {\textEpsilon }" "Ε" :string) +(merge-rule "\IeC {\textZeta }" "Ζ" :string) +(merge-rule "\IeC {\textEta }" "Η" :string) +(merge-rule "\IeC {\textTheta }" "Θ" :string) +(merge-rule "\IeC {\textIota }" "Ι" :string) +(merge-rule "\IeC {\textKappa }" "Κ" :string) +(merge-rule "\IeC {\textLambda }" "Λ" :string) +(merge-rule "\IeC {\textMu }" "Μ" :string) +(merge-rule "\IeC {\textNu }" "Ν" :string) +(merge-rule "\IeC {\textTheta }" "Θ" :string) +(merge-rule "\IeC {\textIota }" "Ι" :string) +(merge-rule "\IeC {\textKappa }" "Κ" :string) +(merge-rule "\IeC {\textLambda }" "Λ" :string) +(merge-rule "\IeC {\textMu }" "Μ" :string) +(merge-rule "\IeC {\textNu }" "Ν" :string) +(merge-rule "\IeC {\textXi }" "Ξ" :string) +(merge-rule "\IeC {\textOmicron }" "Ο" :string) +(merge-rule "\IeC {\textPi }" "Π" :string) +(merge-rule "\IeC {\textRho }" "Ρ" :string) +(merge-rule "\IeC {\textSigma }" "Σ" :string) +(merge-rule "\IeC {\textTau }" "Τ" :string) +(merge-rule "\IeC {\textUpsilon }" "Υ" :string) +(merge-rule "\IeC {\textPhi }" "Φ" :string) +(merge-rule "\IeC {\textChi }" "Χ" :string) +(merge-rule "\IeC {\textPsi }" "Ψ" :string) +(merge-rule "\IeC {\textOmega }" "Ω" :string) +(merge-rule "\IeC {\textohm }" "Ω" :string) ;; This xindy module provides some basic support for "see" (require "makeindex.xdy") diff --git a/packs_lib/cplint/docs/_build/latex/sphinxhighlight.sty b/packs_lib/cplint/docs/_build/latex/sphinxhighlight.sty index 1557ce6e32..83b523cba0 100644 --- a/packs_lib/cplint/docs/_build/latex/sphinxhighlight.sty +++ b/packs_lib/cplint/docs/_build/latex/sphinxhighlight.sty @@ -1,5 +1,6 @@ \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesPackage{sphinxhighlight}[2016/05/29 stylesheet for highlighting with pygments] +% Its contents depend on pygments_style configuration variable. \makeatletter @@ -13,73 +14,73 @@ \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}} \def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}} -\expandafter\def\csname PYG@tok@w\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} -\expandafter\def\csname PYG@tok@c\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} -\expandafter\def\csname PYG@tok@cp\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\expandafter\def\csname PYG@tok@cs\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}\def\PYG@bc##1{\setlength{\fboxsep}{0pt}\colorbox[rgb]{1.00,0.94,0.94}{\strut ##1}}} -\expandafter\def\csname PYG@tok@k\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\expandafter\def\csname PYG@tok@kp\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\expandafter\def\csname PYG@tok@kt\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.56,0.13,0.00}{##1}}} -\expandafter\def\csname PYG@tok@o\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} -\expandafter\def\csname PYG@tok@ow\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\expandafter\def\csname PYG@tok@nb\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\expandafter\def\csname PYG@tok@nf\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}} -\expandafter\def\csname PYG@tok@nc\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.05,0.52,0.71}{##1}}} -\expandafter\def\csname PYG@tok@nn\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.05,0.52,0.71}{##1}}} -\expandafter\def\csname PYG@tok@ne\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\expandafter\def\csname PYG@tok@nv\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} -\expandafter\def\csname PYG@tok@no\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.38,0.68,0.84}{##1}}} -\expandafter\def\csname PYG@tok@nl\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.13,0.44}{##1}}} -\expandafter\def\csname PYG@tok@ni\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.84,0.33,0.22}{##1}}} -\expandafter\def\csname PYG@tok@na\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\expandafter\def\csname PYG@tok@nt\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.45}{##1}}} -\expandafter\def\csname PYG@tok@nd\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.33,0.33,0.33}{##1}}} -\expandafter\def\csname PYG@tok@s\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\expandafter\def\csname PYG@tok@sd\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\expandafter\def\csname PYG@tok@si\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.44,0.63,0.82}{##1}}} -\expandafter\def\csname PYG@tok@se\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\expandafter\def\csname PYG@tok@sr\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.14,0.33,0.53}{##1}}} -\expandafter\def\csname PYG@tok@ss\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}} -\expandafter\def\csname PYG@tok@sx\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}} -\expandafter\def\csname PYG@tok@m\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\expandafter\def\csname PYG@tok@gh\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} -\expandafter\def\csname PYG@tok@gu\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} -\expandafter\def\csname PYG@tok@gd\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} -\expandafter\def\csname PYG@tok@gi\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} -\expandafter\def\csname PYG@tok@gr\endcsname{\def\PYG@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} -\expandafter\def\csname PYG@tok@ge\endcsname{\let\PYG@it=\textit} -\expandafter\def\csname PYG@tok@gs\endcsname{\let\PYG@bf=\textbf} -\expandafter\def\csname PYG@tok@gp\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}} -\expandafter\def\csname PYG@tok@go\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.20,0.20,0.20}{##1}}} -\expandafter\def\csname PYG@tok@gt\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} -\expandafter\def\csname PYG@tok@err\endcsname{\def\PYG@bc##1{\setlength{\fboxsep}{0pt}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}} -\expandafter\def\csname PYG@tok@kc\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\expandafter\def\csname PYG@tok@kd\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\expandafter\def\csname PYG@tok@kn\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\expandafter\def\csname PYG@tok@kr\endcsname{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\expandafter\def\csname PYG@tok@bp\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} -\expandafter\def\csname PYG@tok@fm\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}} -\expandafter\def\csname PYG@tok@vc\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} -\expandafter\def\csname PYG@tok@vg\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} -\expandafter\def\csname PYG@tok@vi\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} -\expandafter\def\csname PYG@tok@vm\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} -\expandafter\def\csname PYG@tok@sa\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\expandafter\def\csname PYG@tok@sb\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\expandafter\def\csname PYG@tok@sc\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\expandafter\def\csname PYG@tok@dl\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\expandafter\def\csname PYG@tok@s2\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\expandafter\def\csname PYG@tok@sh\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\expandafter\def\csname PYG@tok@s1\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} -\expandafter\def\csname PYG@tok@mb\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\expandafter\def\csname PYG@tok@mf\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\expandafter\def\csname PYG@tok@mh\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\expandafter\def\csname PYG@tok@mi\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\expandafter\def\csname PYG@tok@il\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\expandafter\def\csname PYG@tok@mo\endcsname{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} -\expandafter\def\csname PYG@tok@ch\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} -\expandafter\def\csname PYG@tok@cm\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} -\expandafter\def\csname PYG@tok@cpf\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} -\expandafter\def\csname PYG@tok@c1\endcsname{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@w}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\@namedef{PYG@tok@c}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@cp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@cs}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}\def\PYG@bc##1{{\setlength{\fboxsep}{0pt}\colorbox[rgb]{1.00,0.94,0.94}{\strut ##1}}}} +\@namedef{PYG@tok@k}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kt}{\def\PYG@tc##1{\textcolor[rgb]{0.56,0.13,0.00}{##1}}} +\@namedef{PYG@tok@o}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\@namedef{PYG@tok@ow}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@nf}{\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}} +\@namedef{PYG@tok@nc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.05,0.52,0.71}{##1}}} +\@namedef{PYG@tok@nn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.05,0.52,0.71}{##1}}} +\@namedef{PYG@tok@ne}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@nv}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@no}{\def\PYG@tc##1{\textcolor[rgb]{0.38,0.68,0.84}{##1}}} +\@namedef{PYG@tok@nl}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.13,0.44}{##1}}} +\@namedef{PYG@tok@ni}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.84,0.33,0.22}{##1}}} +\@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@nt}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.45}{##1}}} +\@namedef{PYG@tok@nd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.33,0.33,0.33}{##1}}} +\@namedef{PYG@tok@s}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sd}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@si}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.44,0.63,0.82}{##1}}} +\@namedef{PYG@tok@se}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sr}{\def\PYG@tc##1{\textcolor[rgb]{0.14,0.33,0.53}{##1}}} +\@namedef{PYG@tok@ss}{\def\PYG@tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}} +\@namedef{PYG@tok@sx}{\def\PYG@tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}} +\@namedef{PYG@tok@m}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@gh}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\@namedef{PYG@tok@gu}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\@namedef{PYG@tok@gd}{\def\PYG@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\@namedef{PYG@tok@gi}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\@namedef{PYG@tok@gr}{\def\PYG@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\@namedef{PYG@tok@ge}{\let\PYG@it=\textit} +\@namedef{PYG@tok@gs}{\let\PYG@bf=\textbf} +\@namedef{PYG@tok@gp}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}} +\@namedef{PYG@tok@go}{\def\PYG@tc##1{\textcolor[rgb]{0.20,0.20,0.20}{##1}}} +\@namedef{PYG@tok@gt}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\@namedef{PYG@tok@err}{\def\PYG@bc##1{{\setlength{\fboxsep}{\string -\fboxrule}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}} +\@namedef{PYG@tok@kc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kr}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@bp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@fm}{\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}} +\@namedef{PYG@tok@vc}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@vg}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@vi}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@vm}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@sa}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sb}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sc}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@dl}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@s2}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sh}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@s1}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@mb}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@mf}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@mh}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@mi}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@il}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@mo}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@ch}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@cm}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@cpf}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@c1}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} \def\PYGZbs{\char`\\} \def\PYGZus{\char`\_} diff --git a/packs_lib/cplint/docs/_build/latex/sphinxhowto.cls b/packs_lib/cplint/docs/_build/latex/sphinxhowto.cls index 6e4858567a..951cf810df 100644 --- a/packs_lib/cplint/docs/_build/latex/sphinxhowto.cls +++ b/packs_lib/cplint/docs/_build/latex/sphinxhowto.cls @@ -1,9 +1,9 @@ % -% sphinxhowto.cls for Sphinx (http://sphinx-doc.org/) +% sphinxhowto.cls for Sphinx (https://www.sphinx-doc.org/) % \NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{sphinxhowto}[2018/12/22 v1.8.3 Document class (Sphinx howto)] +\ProvidesClass{sphinxhowto}[2019/12/01 v2.3.0 Document class (Sphinx howto)] % 'oneside' option overriding the 'twoside' default \newif\if@oneside @@ -27,6 +27,17 @@ \setcounter{secnumdepth}{2} \setcounter{tocdepth}{2}% i.e. section and subsection +% Adapt \and command to the flushright context of \sphinxmaketitle, to +% avoid ragged line endings if author names do not fit all on one single line +\DeclareRobustCommand{\and}{% + \end{tabular}\kern-\tabcolsep + \allowbreak + \hskip\dimexpr1em+\tabcolsep\@plus.17fil\begin{tabular}[t]{c}% +}% +% If it is desired that each author name be on its own line, use in preamble: +%\DeclareRobustCommand{\and}{% +% \end{tabular}\kern-\tabcolsep\\\begin{tabular}[t]{c}% +%}% % Change the title page to look a bit better, and fit in with the fncychap % ``Bjarne'' style a bit better. % @@ -46,7 +57,7 @@ {\Large \begin{tabular}[t]{c} \@author - \end{tabular}}\par + \end{tabular}\kern-\tabcolsep}\par \vspace{25pt} \@date \par \py@authoraddress \par @@ -57,15 +68,16 @@ %\gdef\@thanks{}\gdef\@author{}\gdef\@title{} } -\newcommand{\sphinxtableofcontents}{ +\newcommand{\sphinxtableofcontents}{% \begingroup - \parskip = 0mm + \parskip \z@skip + \sphinxtableofcontentshook \tableofcontents \endgroup - \rule{\textwidth}{1pt} - \vspace{12pt} -} - + \noindent\rule{\textwidth}{1pt}\par + \vspace{12pt}% +} +\newcommand\sphinxtableofcontentshook{} \pagenumbering{arabic} % Fix the bibliography environment to add an entry to the Table of diff --git a/packs_lib/cplint/docs/_build/latex/sphinxmanual.cls b/packs_lib/cplint/docs/_build/latex/sphinxmanual.cls index 1ab80d2643..2e4b30d921 100644 --- a/packs_lib/cplint/docs/_build/latex/sphinxmanual.cls +++ b/packs_lib/cplint/docs/_build/latex/sphinxmanual.cls @@ -1,9 +1,9 @@ % -% sphinxmanual.cls for Sphinx (http://sphinx-doc.org/) +% sphinxmanual.cls for Sphinx (https://www.sphinx-doc.org/) % \NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{sphinxmanual}[2018/12/22 v1.8.3 Document class (Sphinx manual)] +\ProvidesClass{sphinxmanual}[2019/12/01 v2.3.0 Document class (Sphinx manual)] % chapters starting at odd pages (overridden by 'openany' document option) \PassOptionsToClass{openright}{\sphinxdocclass} @@ -30,12 +30,23 @@ \setcounter{secnumdepth}{2} \setcounter{tocdepth}{1} +% Adapt \and command to the flushright context of \sphinxmaketitle, to +% avoid ragged line endings if author names do not fit all on one single line +\DeclareRobustCommand{\and}{% + \end{tabular}\kern-\tabcolsep + \allowbreak + \hskip\dimexpr1em+\tabcolsep\@plus.17fil\begin{tabular}[t]{c}% +}% +% If it is desired that each author name be on its own line, use in preamble: +%\DeclareRobustCommand{\and}{% +% \end{tabular}\kern-\tabcolsep\\\begin{tabular}[t]{c}% +%}% % Change the title page to look a bit better, and fit in with the fncychap % ``Bjarne'' style a bit better. % \newcommand{\sphinxmaketitle}{% - \let\spx@tempa\relax - \ifHy@pageanchor\def\spx@tempa{\Hy@pageanchortrue}\fi + \let\sphinxrestorepageanchorsetting\relax + \ifHy@pageanchor\def\sphinxrestorepageanchorsetting{\Hy@pageanchortrue}\fi \hypersetup{pageanchor=false}% avoid duplicate destination warnings \begin{titlepage}% \let\footnotesize\small @@ -55,7 +66,7 @@ {\LARGE \begin{tabular}[t]{c} \@author - \end{tabular} + \end{tabular}\kern-\tabcolsep \par} \vfill\vfill {\large @@ -72,13 +83,14 @@ \clearpage \ifdefined\sphinxbackoftitlepage\sphinxbackoftitlepage\fi \if@openright\cleardoublepage\else\clearpage\fi - \spx@tempa + \sphinxrestorepageanchorsetting } \newcommand{\sphinxtableofcontents}{% \pagenumbering{roman}% \begingroup \parskip \z@skip + \sphinxtableofcontentshook \tableofcontents \endgroup % before resetting page counter, let's do the right thing. @@ -89,8 +101,10 @@ % This is needed to get the width of the section # area wide enough in the % library reference. Doing it here keeps it the same for all the manuals. % -\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}} -\renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}} +\newcommand{\sphinxtableofcontentshook}{% + \renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}}% + \renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}}% +} % Fix the bibliography environment to add an entry to the Table of % Contents. diff --git a/packs_lib/cplint/docs/conf.py b/packs_lib/cplint/docs/conf.py index 0a0356992d..3ead7a3cad 100644 --- a/packs_lib/cplint/docs/conf.py +++ b/packs_lib/cplint/docs/conf.py @@ -32,7 +32,7 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = ['sphinxcontrib.bibtex','sphinx.ext.autosectionlabel','sphinx.ext.mathjax'] - +bibtex_bibfiles = ['newbib.bib'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] diff --git a/packs_lib/cplint/docs/index.rst b/packs_lib/cplint/docs/index.rst index 38597e9edc..1918d8306a 100644 --- a/packs_lib/cplint/docs/index.rst +++ b/packs_lib/cplint/docs/index.rst @@ -9,7 +9,7 @@ cplint on SWISH Manual - SWI-Prolog Version .. toctree:: :maxdepth: 2 - +.. highlight:: cplint Introduction ============ @@ -39,7 +39,9 @@ It requires the packs * `auc `_ * `matrix `_ -They are installed automatically when installing pack `cplint` or can installed manually as :: +They are installed automatically when installing pack `cplint` or can installed manually as + +.. code-block:: console $ swipl ?- pack_install(bddem). @@ -52,7 +54,9 @@ They are installed automatically when installing pack `cplint` or can installed On 32 and 64 bits Linux this should work out of the box. On 64 bits Windows the library must be rebuilt by hand, see the pack page ``_. -You can upgrade the pack with :: +You can upgrade the pack with + +.. code-block:: console $ swipl ?- pack_upgrade(cplint). @@ -61,7 +65,8 @@ Note that the packs on which `cplint` depends are not upgraded automatically in Example of use --------------- -:: + +.. code-block:: console $ cd /cplint/prolog/examples $ swipl @@ -70,7 +75,8 @@ Example of use Testing the installation ------------------------ -:: + +.. code-block:: console $ swipl ?- [library(cplint_test/test)]. @@ -233,7 +239,8 @@ where :code:`Density` is a special atom identifying a probability density on var - :code:`binomial(Var,N,P)` :code:`Var` follows a binomial distribution with parameters :code:`N` (number of trials) and :code:`P` (success probability). - :code:`geometric(Var,P)` :code:`Var` follows a geometric distribution with parameter :code:`P` (success probability). - :code:`exponential(Var,Lambda)` :code:`Var` follows an exponential distribution with parameter :code:`Lambda` (rate, or inverse scale). -- :code:`pascal(Var,R,P)` :code:`Var` follows an exponential distribution with parameters :code:`R` (number of failures) and :code:`P` (success probability). +- :code:`negative_binomial(Var,R,P)` :code:`Var` follows a negative binomial distribution with parameters :code:`N` (number of successes) and :code:`P` (success probability). +- :code:`multinomial(Var,N,P)` :code:`Var` (vector/list of event numbers) follows a multinomial distribution with parameters :code:`N` (number of trials) and :code:`P` (vector/list of event probabilities). For example :: @@ -320,9 +327,9 @@ Distributional Clauses Syntax You can also use the syntax of Distributional Clauses (DC) :cite:`Nitti2016`. Continuous random variables are represented in this case by term whose distribution can be specified with density atoms as in :: - T~Density' := Body. + T~Density := Body. -Here :code:`:=` replaces the implication symbol, :code:`T` is a term and :code:`Density'` is one of the density atoms above without the :code:`Var` argument, because :code:`T` itself represents a random variables. +Here :code:`:=` replaces the implication symbol, :code:`T` is a term and :code:`Density` is one of the density atoms above without the :code:`Var` argument, because :code:`T` itself represents a random variables. In the body of clauses you can use the infix operator :code:`~=` to equate a term representing a random variable with a logical variable or a constant as in :code:`T ~= X`. Internally :code:`cplint` transforms the terms representing random variables into atoms with an extra argument for holding the variable. @@ -337,57 +344,22 @@ If :code:`Body` is empty, as in regular Prolog, the implication symbol :code:`:= The Indian GPA problem from ``_ in distributional clauses syntax (``_) takes the form (`indian_gpadc.pl `_): :: - is_density_A:0.95;is_discrete_A:0.05. - % the probability distribution of GPA scores for American students is - % continuous with probability 0.95 and discrete with probability 0.05 + coin ~ finite([0.95:true,0.05:false]). + agpa ~ beta(8,2) := coin~=true. + american_gpa ~ finite([0.85:4.0,0.15:0.0]) := coin~=false. - agpa(A): beta(A,8,2) :- is_density_A. - % the GPA of American students follows a beta distribution if the - % distribution is continuous + american_gpa ~ val(V) := agpa ~=A, V is A*4.0. - american_gpa(G) : finite(G,[4.0:0.85,0.0:0.15]) :- is_discrete_A. - % the GPA of American students is 4.0 with probability 0.85 and 0.0 - % with - % probability 0.15 if the - % distribution is discrete - - american_gpa(A):- agpa(A0), A is A0*4.0. - % the GPA of American students is obtained by rescaling the value of - % agpa - % to the (0.0,4.0) interval - - is_density_I : 0.99; is_discrete_I:0.01. - % the probability distribution of GPA scores for Indian students is - % continuous with probability 0.99 and discrete with probability - % 0.01 - - igpa(I): beta(I,5,5) :- is_density_I. - % the GPA of Indian students follows a beta distribution if the - % distribution is continuous - - indian_gpa(I): finite(I,[0.0:0.1,10.0:0.9]):- is_discrete_I. - % the GPA of Indian students is 10.0 with probability 0.9 and 0.0 - % with - % probability 0.1 if the - % distribution is discrete - - indian_gpa(I) :- igpa(I0), I is I0*10.0. - % the GPA of Indian students is obtained by rescaling the value - % of igpa - % to the (0.0,4.0) interval - - nation(N) : finite(N,[a:0.25,i:0.75]). - % the nation is America with probability 0.25 and India with - % probability 0.75 - - student_gpa(G):- nation(a),american_gpa(G). - % the GPA of the student is given by american_gpa if the nation is - % America - - student_gpa(G) :- nation(i),indian_gpa(G). - % the GPA of the student is given by indian_gpa if the nation - % is India + coin2 ~ finite([0.99:true,0.01:false]). + igpa ~ beta(5,5) := coin2~=true. + indian_gpa ~ finite([0.1:0.0,0.9:10.0]) := coin2~=false. + + indian_gpa ~ val(V) := igpa ~=A, V is A*10.0. + nation ~ finite([0.25:a,0.75:i]). + + student_gpa ~ val(A) := nation~=a,american_gpa~=A. + student_gpa ~ val(I) := nation~=i,indian_gpa~=I. Semantics ================== @@ -490,7 +462,9 @@ To run a query, you can simply load the Prolog file, for example `coin.pl `_. For example, the :code:`swish-ask.sh` client can be used with bash to download the results for a query in CSV. -The call below downloads a CSV file for the coin example. :: +The call below downloads a CSV file for the coin example + +.. code-block:: console $ bash swish-ask.sh --server=http://cplint.eu e/coin.pl Prob "prob(heads(coin),Prob)" The script can ask queries against Prolog scripts stored in `http://cplint.eu `_ by specifying the script on the commandline. -User defined files stored in :code:`cplint` on SWISH (locations of type `http://cplint.eu/p/coin_user.pl `_) can be directly used, for example: :: +User defined files stored in :code:`cplint` on SWISH (locations of type `http://cplint.eu/p/coin_user.pl `_) can be directly used, for example: + +.. code-block:: console $ bash swish-ask.sh --server=http://cplint.eu coin_user.pl Prob "prob(heads(coin),Prob)" Example programs can be used by specifying the folder portion of the url of the example, as in the first coin example above where the url for the program is ``__. -You can also use an url for the program as in :: +You can also use an url for the program as in + +.. code-block:: console $ bash swish-ask.sh --server=http://cplint.eu \ https://raw.githubusercontent.com/friguzzi/swish/\ master/e/coin.pl Prob "prob(heads(coin),Prob)" Results can be downloaded in JSON using the option :code:`--json-s` or :code:`--json-html`. With the first the output is in a simple string format where Prolog terms are sent using quoted write, the latter serialize responses as HTML strings. -E.g. :: +E.g. + +.. code-block:: console $ bash swish-ask.sh --json-s --server=http://cplint.eu \ coin_user.pl Prob "prob(heads(coin),Prob)" diff --git a/packs_lib/cplint/prolog/cplint_test/cplint_test.pl b/packs_lib/cplint/prolog/cplint_test/cplint_test.pl index 8682f8f95b..ed6c2b979a 100644 --- a/packs_lib/cplint/prolog/cplint_test/cplint_test.pl +++ b/packs_lib/cplint/prolog/cplint_test/cplint_test.pl @@ -2,12 +2,14 @@ :-module(cplint_test, [close_to/2,close_to/3,relatively_close_to/2,relatively_close_to/3,run/1, - perm/2]). + perm/2,perm_map/2]). :- meta_predicate run(:). perm(A,B):- permutation(A,B),!. +perm_map(L,LR):- + maplist(permutation,L,LR), !. run(M:H):- copy_term(H,NH), diff --git a/packs_lib/cplint/prolog/cplint_test/test_mc.pl b/packs_lib/cplint/prolog/cplint_test/test_mc.pl index 495c262227..76b7f491ec 100644 --- a/packs_lib/cplint/prolog/cplint_test/test_mc.pl +++ b/packs_lib/cplint/prolog/cplint_test/test_mc.pl @@ -418,8 +418,8 @@ test(poisson):- run((mc_sample(success_poisson,1000,P),close_to(P,0.042))). -test(pascal):- - run((mc_sample(success_pascal,1000,P),close_to(P,0.036))). +test(negative_binomial):- + run((mc_sample(success_negative_binomial,1000,P),close_to(P,0.02))). :- end_tests(bitcoin_attack). diff --git a/packs_lib/cplint/prolog/cplint_test/test_pita.pl b/packs_lib/cplint/prolog/cplint_test/test_pita.pl index 312b19f2fa..8e44f10503 100644 --- a/packs_lib/cplint/prolog/cplint_test/test_pita.pl +++ b/packs_lib/cplint/prolog/cplint_test/test_pita.pl @@ -39,6 +39,7 @@ hmm_mpe, meta, pcfg, + pcfglrdb, var_objdb, card, dt_umbrella, @@ -86,7 +87,7 @@ :- begin_tests(dt_viral, []). :- ensure_loaded(library(examples/dt_viral)). test(best_st_viral):- - ansi_format([bold,fg(cyan)], '~nThis test takes few seconds.~n',[]), + ansi_format([bold,fg(cyan)], '~nThis test takes some time.~n',[]), % run((dt_solve(Strategy,ExpValue),close_to(ExpValue,2.217),perm(Strategy,[[marketed(theo)],[marketed(guy)]]))). run((dt_solve(Strategy,ExpValue),close_to(ExpValue,3.21),perm(Strategy,[[marketed(theo)],[marketed(martijn)],[marketed(ingo)],[marketed(guy)]]))). :- end_tests(dt_viral). @@ -421,9 +422,9 @@ :-ensure_loaded(library(examples/abd1)). test(a):- - run((abd_prob(a,P,Exp),close_to(P,0.72),perm(Exp,[e, c]))). + run((abd_prob(a,P,Exp),close_to(P,0.72),perm_map(Exp,[[e,c]]))). test(bdd_a):- - run((abd_bdd_dot_string(a,_BDD,_Var,_VarA,P,Exp),close_to(P,0.72),perm(Exp,[e, c]))). + run((abd_bdd_dot_string(a,_BDD,_Var,_VarA,P,Exp),close_to(P,0.72),perm_map(Exp,[[e,c]]))). :- end_tests(abd1). @@ -432,7 +433,7 @@ :-ensure_loaded(library(examples/abd1cons1)). test(a):- - run((abd_prob(a,P,Exp),close_to(P,0.6),perm(Exp,[\+c, e]))). + run((abd_prob(a,P,[[e]]),close_to(P,0.6))). :- end_tests(abd1cons1). @@ -441,7 +442,7 @@ :-ensure_loaded(library(examples/abd1cons2)). test(a):- - run((abd_prob(a,P,Exp),close_to(P,0.648),perm(Exp,[c, e]))). + run((abd_prob(a,P,Exp),close_to(P,0.648),perm_map(Exp,[[c,e]]))). :- end_tests(abd1cons2). @@ -450,10 +451,9 @@ :-ensure_loaded(library(examples/abd2)). test(a):- - run((abd_prob(a,P,Exp),close_to(P,0.72),perm(Exp,[f, (\+g), c, d]))). + run((abd_prob(a,P,Exp),close_to(P,0.72),perm_map(Exp,[[f,c,d]]))). test(bdd_a):- - run((abd_bdd_dot_string(a,_BDD,_Var,_VarA,P,Exp),close_to(P,0.72), - perm(Exp,[f, (\+g), c, d]))). + run((abd_bdd_dot_string(a,_BDD,_Var,_VarA,P,Exp),close_to(P,0.72), perm_map(Exp,[[f,c,d]]))). :- end_tests(abd2). @@ -462,10 +462,10 @@ :-ensure_loaded(library(examples/abd3)). test(a):- - run((abd_prob(a,P,Exp),close_to(P,0.72),perm(Exp,[c, d, f, \+g]))). + run((abd_prob(a,P,Exp),close_to(P,0.72),perm_map(Exp,[[c,d,f]]))). test(bdd_a):- run((abd_bdd_dot_string(a,_BDD,_Var,_VarA,P,Exp),close_to(P,0.72), - perm(Exp,[c, d, f, \+g]))). + perm_map(Exp,[[c,d,f]]))). :- end_tests(abd3). @@ -552,8 +552,8 @@ :-ensure_loaded(library(examples/eruption_mpe)). -test(ev):- - run((map(ev,P,Exp),close_to(P,0.08316), +test(eruption):- + run((map(eruption,P,Exp),close_to(P,0.08316), perm(Exp,[rule(1,sudden_energy_release,[sudden_energy_release:0.7,'':0.30000000000000004],true), rule(2,fault_rupture(southwest_northeast),[fault_rupture(southwest_northeast):0.6,'':0.4],true), rule(3,fault_rupture(east_west),[fault_rupture(east_west):0.55,'':0.44999999999999996],true), @@ -643,11 +643,22 @@ :-ensure_loaded(library(examples/pcfg)). test(pcfg):- - run((prob(pcfg([a,b,a,a]),Prob),close_to(Prob,0.0024) + run((prob(pcfg([a,b,a,a]),Prob),close_to(Prob,0.0024,0.0001) )). :- end_tests(pcfg). + +:- begin_tests(pcfglrdb, []). + +:-ensure_loaded(library(examples/pcfglrdb)). + +test(pcfglrdb):- + run((prob(pcfg([a]),Prob),close_to(Prob,0.3) + )). + +:- end_tests(pcfglrdb). + :- begin_tests(card, []). :-ensure_loaded(library(examples/card)). diff --git a/packs_lib/cplint/prolog/examples/abd3.pl b/packs_lib/cplint/prolog/examples/abd3.pl index e5f932325d..34bc831f71 100644 --- a/packs_lib/cplint/prolog/examples/abd3.pl +++ b/packs_lib/cplint/prolog/examples/abd3.pl @@ -21,8 +21,6 @@ abducible f. abducible g. -constraints. - :- end_lpad. /** diff --git a/packs_lib/cplint/prolog/examples/bitcoin_attack.pl b/packs_lib/cplint/prolog/examples/bitcoin_attack.pl index bd1a180833..5ec74acd87 100644 --- a/packs_lib/cplint/prolog/examples/bitcoin_attack.pl +++ b/packs_lib/cplint/prolog/examples/bitcoin_attack.pl @@ -13,7 +13,7 @@ % progress function attacker_progress_poisson(X):poisson(X,Lambda):- Lambda is 10*0.3/0.7. -attacker_progress_pascal(X):pascal(X,10,0.3). +attacker_progress_negative_binomial(X):negative_binomial(X,10,0.3). move(T,1):0.7; move(T,-1):0.3. @@ -38,8 +38,8 @@ walk(V) ). -success_pascal:- - attacker_progress_pascal(A), +success_negative_binomial:- + attacker_progress_negative_binomial(A), V is 10 - A, ( V = 0 -> true; @@ -50,5 +50,5 @@ /** ?- mc_prob(success_poisson,Prob). -?- mc_prob(success_pascal,Prob). +?- mc_prob(success_negative_binomial,Prob). */ diff --git a/packs_lib/cplint/prolog/examples/eruption_mpe.pl b/packs_lib/cplint/prolog/examples/eruption_mpe.pl index 424f1549a3..e5269d1814 100644 --- a/packs_lib/cplint/prolog/examples/eruption_mpe.pl +++ b/packs_lib/cplint/prolog/examples/eruption_mpe.pl @@ -1,4 +1,3 @@ -% Empty with pita loaded :- use_module(library(pita)). :- if(current_predicate(use_rendering/1)). :- use_rendering(c3). @@ -18,7 +17,7 @@ :- end_lpad. -/** Your example queries go here, e.g. +/** ?- map(eruption,P,MPE). MPE = [rule(1,sudden_energy_release,[sudden_energy_release:0.7,'':0.30000000000000004],true), rule(2,fault_rupture(southwest_northeast),[fault_rupture(southwest_northeast):0.6,'':0.4],true), diff --git a/packs_lib/cplint/prolog/examples/pcfg.cpl b/packs_lib/cplint/prolog/examples/pcfg.cpl index 4df2f7405f..87e4974a8b 100644 --- a/packs_lib/cplint/prolog/examples/pcfg.cpl +++ b/packs_lib/cplint/prolog/examples/pcfg.cpl @@ -12,28 +12,32 @@ Theory and Practice of Logic Programming, doi:10.1017/S1471068413000677. % pcfg(L,LT,LT0) L is a tring of terminals and not terminals that derives % the list of terminals in LT-LT0 -pcfg(L):- pcfg(['S'],L,[]). +pcfg(L):- pcfg(['S'],[],_Der,L,[]). % L is accepted if it can be derived from the start symbol S and an empty % string of previous terminals -pcfg([A|R],L0,L2):- - rule(A,L0,RHS), - pcfg(RHS,L0,L1), - pcfg(R,L1,L2). +pcfg([A|R],Der0,Der,L0,L2):- + grammar_rule(A,Der0,RHS), + pcfg(RHS,[rule(A,RHS)|Der0],Der1,L0,L1), + pcfg(R,Der1,Der,L1,L2). % if there is a rule for A (i.e. it is a non-terminal), expand A using the rule % and continue with the rest of the list -pcfg([A|R],[A|L1],L2):- - \+ rule(A,_,_), - pcfg(R,L1,L2). +pcfg([A|R],Der0,Der,[A|L1],L2):- + terminal(A), + pcfg(R,Der0,Der,L1,L2). % if A is a terminal, move it to the output string -pcfg([],L,L). +pcfg([],Der,Der,L,L). % there are no more symbols to expand -rule('S',L,[a,'S']):0.2; rule('S',L,[b,'S']):0.2; rule('S',L,[a]):0.3; rule('S',L,[b]):0.3. +grammar_rule('S',Der,[a,'S']):0.2; grammar_rule('S',Der,[b,'S']):0.2; + grammar_rule('S',Der,[a]):0.3; grammar_rule('S',Der,[b]):0.3. % encodes the three rules of the grammar +terminal(a). +terminal(b). + /** ?- pcfg([a,b,a,a]). % what is the probability that the string abaa belongs to the language? diff --git a/packs_lib/cplint/prolog/examples/pcfg.pl b/packs_lib/cplint/prolog/examples/pcfg.pl index 47012ce2cb..8c094fa2f6 100644 --- a/packs_lib/cplint/prolog/examples/pcfg.pl +++ b/packs_lib/cplint/prolog/examples/pcfg.pl @@ -27,7 +27,7 @@ % string of previous terminals pcfg([A|R],Der0,Der,L0,L2):- - rule(A,Der0,RHS), + grammar_rule(A,Der0,RHS), pcfg(RHS,[rule(A,RHS)|Der0],Der1,L0,L1), pcfg(R,Der1,Der,L1,L2). % if there is a rule for A (i.e. it is a non-terminal), expand A using the rule @@ -41,7 +41,8 @@ pcfg([],Der,Der,L,L). % there are no more symbols to expand -rule('S',Der,[a,'S']):0.2; rule('S',Der,[b,'S']):0.2; rule('S',Der,[a]):0.3; rule('S',Der,[b]):0.3. +grammar_rule('S',Der,[a,'S']):0.2; grammar_rule('S',Der,[b,'S']):0.2; + grammar_rule('S',Der,[a]):0.3; grammar_rule('S',Der,[b]):0.3. % encodes the three rules of the grammar terminal(a). diff --git a/packs_lib/cplint/prolog/examples/pcfglr.pl b/packs_lib/cplint/prolog/examples/pcfglr.pl index 970644b62d..dace7da7a0 100644 --- a/packs_lib/cplint/prolog/examples/pcfglr.pl +++ b/packs_lib/cplint/prolog/examples/pcfglr.pl @@ -1,7 +1,8 @@ /* -Probabilistic contect-free grammar. -0.2:S->aS -0.2:S->bS +Probabilistic context-free grammar. The grammar is left-recursive, MCINTYRE +is necessary to ensure termination. +Grammar: +0.4:S->SS 0.3:S->a 0.3:S->b From @@ -18,7 +19,7 @@ :- begin_lpad. % pcfg(LT): LT is string of terminals accepted by the grammar -% pcfg(L,LT,LT0) L is a tring of terminals and not terminals that derives +% pcfg(L,LT,LT0) L is a string of terminals and not terminals that derives % the list of terminals in LT-LT0 pcfg(L):- pcfg(['S'],[],_Der,L,[]). diff --git a/packs_lib/cplint/prolog/examples/pcfglrdb.pl b/packs_lib/cplint/prolog/examples/pcfglrdb.pl index 9a07d2799f..ef357ee375 100644 --- a/packs_lib/cplint/prolog/examples/pcfglrdb.pl +++ b/packs_lib/cplint/prolog/examples/pcfglrdb.pl @@ -1,7 +1,7 @@ /* -Probabilistic contect-free grammar. -0.2:S->aS -0.2:S->bS +Probabilistic context-free grammar. The grammar is left-recursive, depth bounded +inference is necessary to ensure termination. +0.4:S->SS 0.3:S->a 0.3:S->b From @@ -30,25 +30,27 @@ % string of previous terminals pcfg([A|R],Der0,Der,L0,L2):- - rule(A,Der0,RHS), + grammar_rule(A,Der0,RHS), pcfg(RHS,[rule(A,RHS)|Der0],Der1,L0,L1), pcfg(R,Der1,Der,L1,L2). % if there is a rule for A (i.e. it is a non-terminal), expand A using the rule % and continue with the rest of the list pcfg([A|R],Der0,Der,[A|L1],L2):- - \+ rule(A,_,_), + terminal(A), pcfg(R,Der0,Der,L1,L2). % if A is a terminal, move it to the output string pcfg([],Der,Der,L,L). % there are no more symbols to expand -rule('S',Der,['S','S']):0.4; rule('S',Der,[a]):0.3; - rule('S',Der,[b]):0.3. - +grammar_rule('S',Der,['S','S']):0.4; grammar_rule('S',Der,[a]):0.3; + grammar_rule('S',Der,[b]):0.3. % encodes the three rules of the grammar +terminal(a). +terminal(b). + :- end_lpad. diff --git a/packs_lib/cplint/prolog/examples/widget.pl b/packs_lib/cplint/prolog/examples/widget.pl index 50681b93b9..7e4bb63e2d 100644 --- a/packs_lib/cplint/prolog/examples/widget.pl +++ b/packs_lib/cplint/prolog/examples/widget.pl @@ -8,7 +8,7 @@ If the widget is produced by machine b, the feature is distributed as a Gaussian with mean 3.0 and variance 1.0. The widget then is processed by a third machine that adds a random quantity to -the feature distributed as a Gaussian with mean 0.5 and variance 1.5. +the feature distributed as a Gaussian with mean 0.5 and variance 0.1. What is the distribution of the feature? What is the distribution of the feature given that the widget was procuded by machine a? @@ -43,7 +43,7 @@ st(b,X): gaussian(X,3.0, 1.0). -pt(X): gaussian(X,0.5, 1.5). +pt(X): gaussian(X,0.5, 0.1). :- end_lpad. diff --git a/packs_lib/cplint/prolog/examples/widgetmsw.pl b/packs_lib/cplint/prolog/examples/widgetmsw.pl index 6fad89bb89..10ff88d2d8 100644 --- a/packs_lib/cplint/prolog/examples/widgetmsw.pl +++ b/packs_lib/cplint/prolog/examples/widgetmsw.pl @@ -8,7 +8,7 @@ If the widget is produced by machine b, the feature is distributed as a Gaussian with mean 3.0 and variance 1.0. The widget then is processed by a third machine that adds a random quantity to -the feature distributed as a Gaussian with mean 0.5 and variance 1.5. +the feature distributed as a Gaussian with mean 0.5 and variance 0.1. What is the distribution of the feature? What is the distribution of the feature given that the widget was procuded by machine a? diff --git a/packs_lib/cplint/prolog/lemur.pl b/packs_lib/cplint/prolog/lemur.pl index 092930135a..bd2fac1393 100644 --- a/packs_lib/cplint/prolog/lemur.pl +++ b/packs_lib/cplint/prolog/lemur.pl @@ -25,7 +25,6 @@ :-use_module(library(random)). :-use_module(library(system)). :-use_module(library(terms)). -:-use_module(library(rbtrees)). :- set_prolog_flag(discontiguous_warnings,on). diff --git a/packs_lib/cplint/prolog/mcintyre.pl b/packs_lib/cplint/prolog/mcintyre.pl index fe8fb705dd..d872f46516 100644 --- a/packs_lib/cplint/prolog/mcintyre.pl +++ b/packs_lib/cplint/prolog/mcintyre.pl @@ -153,7 +153,6 @@ :-meta_predicate setting_mc(:,-). :-use_module(library(lists)). -:-use_module(library(rbtrees)). :-use_module(library(apply)). :-use_module(library(assoc)). :-use_module(library(clpr)). @@ -2642,7 +2641,7 @@ /** * multinomial(+N:int,+P:list,+M:module,-S:list) is det * - * samples a value from a multinomiaò probability distribution with parameters + * samples a value from a multinomial probability distribution with parameters * N and P and returns it in S. */ @@ -2770,40 +2769,42 @@ exponential(Lambda,_M,X,V):- V is Lambda*exp(-Lambda*X). + /** - * pascal(+R:int,+P:float,+M:module,-Value:int) is det + * negative_binomial(+N:int,+P:float,+M:module,-Value:int) is det * - * samples a value from a pascal probability distribution with parameters + * samples a value from a negative binomial probability distribution with parameters * R and P and returns it in Value. - * R is the number of failures + * N is the number of successes * P is the success probability */ -% R number of failures +% N number of successes % P probability of success -pascal(R,P,_M,Value):- - pascal_int(0,R,P,V0), +negative_binomial(N,P,_M,Value):- random(RandomVal), - pascal_prob_(0,R,P,V0,RandomVal,Value). + negative_binomial_prob_(0,N,P,0,RandomVal,Value). -pascal_prob_(I,_,_,CurrentProb,RandomVal,I):- - RandomVal =< CurrentProb, !. -pascal_prob_(I,R,P,CurrentProb,RandomVal,V):- +negative_binomial_prob_(I,_,_,CurrentProb,RandomVal,I1):- + RandomVal =< CurrentProb, !, + I1 is I - 1. +negative_binomial_prob_(I,R,P,CurrentProb,RandomVal,V):- + negative_binomial_int(I,R,P,V0), I1 is I+1, - pascal_int(I1,R,P,V0), CurrentProb1 is V0 + CurrentProb, - pascal_prob_(I1,R,P,CurrentProb1,RandomVal,V). + negative_binomial_prob_(I1,R,P,CurrentProb1,RandomVal,V). /* -* K number of successes -* R number of failures +* N number of successes +* X number of failures * P probability of success */ -pascal_int(K,R,P,Value):- - KR1 is K+R-1, - binomial_coeff(KR1,K,Bin), - Value is Bin*(P**K)*(1-P)**R. +negative_binomial_int(X,N,P,Value):- + XN1 is X+N-1, + binomial_coeff(XN1,X,Bin), + Value is Bin*(P**N)*(1-P)**X. +binomial_coeff(N,K,0):- N < K, !. binomial_coeff(N,K,Val):- fact(N,1,NF), fact(K,1,KF), @@ -2948,30 +2949,6 @@ setting_mc(M:P,V):- M:local_mc_setting(P,V). -extract_vars_list(L,[],V):- - rb_new(T), - extract_vars_term(L,T,T1), - rb_keys(T1,V). - -extract_vars_term(Variable, Var0, Var1) :- - var(Variable), !, - (rb_lookup(Variable, Var0,_) -> - Var1 = Var0 - ; - rb_insert(Var0,Variable,1,Var1) - ). - -extract_vars_term(Term, Var0, Var1) :- - Term=..[_F|Args], - extract_vars_tree(Args, Var0, Var1). - - - -extract_vars_tree([], Var, Var). - -extract_vars_tree([Term|Tail], Var0, Var1) :- - extract_vars_term(Term, Var0, Var), - extract_vars_tree(Tail, Var, Var1). delete_equal([],_,[]). @@ -3105,7 +3082,7 @@ Head=(H~Distr0), !, add_arg(H,Var,H1), switch_finite(Distr0,Distr), - extract_vars_list([Head,Body],[],VC), + term_variables([Head,Body],VC), get_next_rule_number(M,R), (M:local_mc_setting(single_var,true)-> generate_clause_distr(H1,Body,[],M,R,Var,Distr,Clause) @@ -3122,7 +3099,7 @@ Head = (_;_), !, list2or(HeadListOr, Head), process_head(HeadListOr, HeadList), - extract_vars_list((Head :- Body),[],VC), + term_variables((Head :- Body),VC), get_next_rule_number(M,R), (M:local_mc_setting(single_var,true)-> generate_rules(HeadList,Body,HeadList,[],M,R,0,Clauses) @@ -3140,7 +3117,7 @@ Distr0=..[D,Var|Pars], is_dist(M,D),!, Distr=..[D|Pars], - extract_vars_list([Head,Body],[],VC0), + term_variables([Head,Body],VC0), delete_equal(VC0,Var,VC), get_next_rule_number(M,R), (M:local_mc_setting(single_var,true)-> @@ -3165,7 +3142,7 @@ (Head = (H:_);Head = (_::H)), !, list2or(HeadListOr, Head), process_head(HeadListOr, HeadList), - extract_vars_list((Head :- Body),[],VC), + term_variables((Head :- Body),VC), get_next_rule_number(M,R), (M:local_mc_setting(single_var,true)-> generate_clause_samp(H,Body,HeadList,[],M,R,0,Clauses) @@ -3180,7 +3157,7 @@ Head=(_;_), !, list2or(HeadListOr, Head), process_head(HeadListOr, HeadList), - extract_vars_list(Head,[],VC), + term_variables(Head,VC), get_next_rule_number(M,R), (M:local_mc_setting(single_var,true)-> generate_rules_fact(HeadList,HeadList,[],M,R,0,Clauses) @@ -3197,7 +3174,7 @@ !, switch_finite(Distr0,Distr), add_arg(H,Var,H1), - extract_vars_list(Head,[],VC), + term_variables(Head,VC), get_next_rule_number(M,R), (M:local_mc_setting(single_var,true)-> generate_clause_distr(H1,true,[],M,R,Var,Distr,Clause) @@ -3215,7 +3192,7 @@ Distr0=..[D,Var|Pars], is_dist(M,D),!, Distr=..[D|Pars], - extract_vars_list([Head],[],VC0), + term_variables([Head],VC0), delete_equal(VC0,Var,VC), get_next_rule_number(M,R), (M:local_mc_setting(single_var,true)-> @@ -3250,7 +3227,7 @@ (Head=(H:_);Head=(_::H)), !, list2or(HeadListOr, Head), process_head(HeadListOr, HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), (M:local_mc_setting(single_var,true)-> generate_clause_samp(H,true,HeadList,[],M,R,0,Clause) @@ -3320,7 +3297,7 @@ multinomial, geometric, exponential, - pascal, + negative_binomial, user ]),!. diff --git a/packs_lib/cplint/prolog/pita.pl b/packs_lib/cplint/prolog/pita.pl index e2e31c97bc..d2d257afbb 100644 --- a/packs_lib/cplint/prolog/pita.pl +++ b/packs_lib/cplint/prolog/pita.pl @@ -71,7 +71,6 @@ % :- dynamic utility/2. :-use_module(library(lists)). -:-use_module(library(rbtrees)). :-use_module(library(apply)). :-use_module(library(assoc)). @@ -156,25 +155,6 @@ pair(M,A,B):- M:rule_by_num(A,B,_,_). split([A,B],A,B). -/** - * dt_solve(-Strategy:list,-Cost:float) is det - * - * The predicate computes the best solution for the decision theory - * problem. It returns the best strategy in Strategy and it cost - * in Cost. Solution with pruning. - */ -dt_solve_bug(M:Strategy,Cost):- - abolish_all_tables, - findall([S,U],M:'$util'(S,U),L), - % writeln(L), - maplist(split,L,LStrategy,LUtils), - init(Env), - get_bdd(M,Env,LStrategy,[],LBDD), - % writeln(LBDD), - compute_best_strategy(Env,LBDD,LUtils,St,Cost), - end(Env), - maplist(pair(M),St,Strategy). - get_bdd(_,_,[],L,L):- !. get_bdd(M,Env,[G|T],L,LO):- get_node(M:G,Env,Out), @@ -264,21 +244,46 @@ end(Env), erase(Ref), member((Goal,P,Exp),L), - from_assign_to_exp(Exp,M,Delta). + maplist(from_assign_to_exp(M),Exp,DeltaAll), + simplify_delta(DeltaAll,Delta). + +subset_([], []). +subset_([E|Tail], [E|NTail]):- + subset_(Tail, NTail). +subset_([_|Tail], NTail):- + subset_(Tail, NTail). + +mycompare(<,L1,L2) :- length(L1,A1), length(L2,A2), A1 < A2. +mycompare(>, _, _). + +sub([A],[A]). +sub([H|T],[V|R]):- + findall(X,(subset_(H,X), member(X,T)),LX), + ( LX = [] -> + V = H, + sub(T,R) ; + sub(T,[V|R]) + ). +simplify_delta([],[]):- !. +simplify_delta(Din,Delta):- + predsort(mycompare,Din,LS), + reverse(LS,LNR), + sub(LNR,Delta), !. -from_assign_to_exp([],_M,[]). -from_assign_to_exp([Var-Val|TA],M,[Abd|TDelta]):- +from_assign_to_exp(_M,[],[]):- !. +from_assign_to_exp(M,[Var-Val|TA],[Abd|TDelta]):- M:av(R,S,Var), M:abd(R,S,H), (Val=1-> Abd=H ; Abd= \+(H) + % Abd= [] ), - from_assign_to_exp(TA,M,TDelta). + from_assign_to_exp(M,TA,TDelta). /** @@ -351,7 +356,7 @@ ret_abd_prob(Env,BDD,P,Exp), create_dot_string(Env,BDD,Dot), end(Env), - from_assign_to_exp(Exp,M,Delta), + maplist(from_assign_to_exp(M),Exp,Delta), findall([V,R,S],M:v(R,S,V),LV), findall([V,R,S],M:av(R,S,V),LAV). @@ -596,15 +601,21 @@ get_abd_p(M:Goal,M:Evidence,Env,P,Exp):- + % get_node_no_rec(M:Evidence,Env,OutIC), get_cond_node(M:Goal,M:Evidence,Env,Out,_), + % get_node(M:Evidence,Env,OutIC), Out=(_,BDD), + % OutIC = (_,BDDIC), ret_abd_prob(Env,BDD,P,Exp). get_cond_p(M:Goal,M:Evidence,Env,P):- get_cond_node(M:Goal,M:Evidence,Env,BDDGE,BDDE), ret_probc(Env,BDDE,PE), ret_probc(Env,BDDGE,PGE), - P is PGE/PE. + ( PE =:= 0 -> + writeln("Undefined: probability of evidence 0.") ; + P is PGE/PE + ). get_node(M:Goal,Env,BDD):- @@ -620,6 +631,18 @@ zeroc(Env,BDD) ). +get_node_no_rec(M:Goal,Env,BDD):- %with DB=false + retractall(M:v(_,_,_)), + retractall(M:v(_,_,_)), + retractall(M:av(_,_,_)), + add_bdd_arg(Goal,Env,BDD,M,Goal1), + (M:Goal1*-> + true + ; + zeroc(Env,BDD) + % format("-------------------------Failed goal: ~w ~n",[M:Goal]) + ). + get_node(M:Goal,Env,BDD):- %with DB=false retractall(M:v(_,_,_)), retractall(M:av(_,_,_)), @@ -863,12 +886,12 @@ generate_rules_fact_vars([],_Env,_R,_Probs,_N,[],_Module). generate_rules_fact_vars([Head:_P1,'':_P2],Env,R,Probs,N,[Clause],Module):-!, - extract_vars_list([Head],[],VC), + term_variables([Head],VC), add_bdd_arg(Head,Env,BDD,Module,Head1), Clause=(Head1:-(get_var_n(Module,Env,R,VC,Probs,V),equalityc(Env,V,N,BDD))). generate_rules_fact_vars([Head:_P|T],Env,R,Probs,N,[Clause|Clauses],Module):- - extract_vars_list([Head],[],VC), + term_variables([Head],VC), add_bdd_arg(Head,Env,BDD,Module,Head1), Clause=(Head1:-(get_var_n(Module,Env,R,VC,Probs,V),equalityc(Env,V,N,BDD))), N1 is N+1, @@ -932,7 +955,7 @@ process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module). process_body([\+ H|T],BDD,BDD1,Vars,[BDDH,BDDN,BDD2|Vars1], -[(H1,bdd_notc(Env,BDDH,BDDN)), +[H1,bdd_notc(Env,BDDH,BDDN), andc(Env,BDD,BDDN,BDD2)|Rest],Env,Module):-!, add_bdd_arg(H,Env,BDDH,Module,H1), process_body(T,BDD2,BDD1,Vars,Vars1,Rest,Env,Module). @@ -965,7 +988,7 @@ process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module). process_body_db([\+ H|T],BDD,BDD1,DB,Vars,[BDDH,BDDN,BDD2|Vars1], -[(H1,bdd_notc(Env,BDDH,BDDN)), +[H1,bdd_notc(Env,BDDH,BDDN), andc(Env,BDD,BDDN,BDD2)|Rest],Env,Module):-!, add_bdd_arg_db(H,Env,BDDH,DB,Module,H1), process_body_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Env,Module). @@ -988,9 +1011,14 @@ process_body_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Env,Module). -process_head(HeadList, GroundHeadList) :- +process_head(HeadList, GroundHeadList1) :- ground_prob(HeadList), !, - process_head_ground(HeadList, 0.0, GroundHeadList). + process_head_ground(HeadList, 0.0, GroundHeadList), + ( GroundHeadList = [V:P] -> + P1 is 1.0 - P, + GroundHeadList1 = [V:P,'':P1] ; + GroundHeadList1 = GroundHeadList + ). process_head(HeadList0, HeadList):- get_probs(HeadList0,PL), @@ -1082,38 +1110,6 @@ setting_pita(M:P,V):- M:local_pita_setting(P,V). -extract_vars_list(L,[],V):- - rb_empty(T), - extract_vars_tree(L,T,T1), - rb_keys(T1,V). - -extract_vars(Term,V):- - rb_empty(T), - extract_vars_term(Term,T,T1), - rb_keys(T1,V). - -extract_vars_term(Variable, Var0, Var1) :- - var(Variable), !, - (rb_lookup(Variable, Var0,_) -> - Var1 = Var0 - ; - rb_insert(Var0,Variable,1,Var1) - ). - -extract_vars_term(Term, Var0, Var1) :- - Term=..[_F|Args], - % format('Term: ~w - Args: ~w ~n',[Term,Args]), - extract_vars_tree(Args, Var0, Var1). - - - -extract_vars_tree([], Var, Var). - -extract_vars_tree([Term|Tail], Var0, Var1) :- - extract_vars_term(Term, Var0, Var), - extract_vars_tree(Tail, Var, Var1). - - delete_equal([],_,[]). delete_equal([H|T],E,T):- @@ -1168,27 +1164,37 @@ tab_dir(_M,'':_,[],[]):-!. -tab_dir(M,H:P,[],[H:P]):- - M:tabled(H),!. - % tab dir for decision variables % merge with the previous one? % the predicates are equal except % (?)::H and H:P -tab_dir(M,HT,[],[H]):- - (HT = ?::H ; HT = (?)::H), +tab_dir(M,D::H,[],[H]):- + (D == ? ; D == (?)), M:tabled(H),!. % tab dir for decision variables % merge with the previous one? % the predicates are equal except % (?)::H and '$util'(A,B) tab_dir(M,H,[],[H]):- - M:tabled(H),!, H=..[F|_], - F = utility. + F = utility, + M:tabled(H),!. +tab_dir(M,H:P,[],[H:P]):- + M:tabled(H),!. + +tab_dir(M,P::H,[],[H:P]):- + P \== ?, + M:tabled(H),!. -tab_dir(M,H:P,[(:- table HT)],[H1:P]):- + + +% tab dir for decision variables +% merge with the previous one? +% the predicates are equal +% except variable n 2 and 4. +tab_dir(M,P::H,[(:- table HT)],[H1]):- + (P== ?;P == (?)),!, functor(H,F,A0), functor(PT,F,A0), PT=..[F|Args0], @@ -1205,12 +1211,13 @@ zero_clause(M,F/A0,LZ), assert(M:zero_clauses(LZ)). -% tab dir for decision variables +% tab dir for utility variables % merge with the previous one? % the predicates are equal % except variable n 2 and 4. -tab_dir(M,HT1,[(:- table HT)],[H1]):- - (HT1 = ?::H ; HT1 = (?)::H), +tab_dir(M,H,[(:- table HT)],[H1]):- + H=..[F|_], + F = utility,!, functor(H,F,A0), functor(PT,F,A0), PT=..[F|Args0], @@ -1227,13 +1234,9 @@ zero_clause(M,F/A0,LZ), assert(M:zero_clauses(LZ)). -% tab dir for utility variables -% merge with the previous one? -% the predicates are equal -% except variable n 2 and 4. -tab_dir(M,H,[(:- table HT)],[H1]):- - H=..[F|_], - F = utility, + +tab_dir(M,Head,[(:- table HT)],[H1:P]):- + (Head=H:P;Head=P::H),!, functor(H,F,A0), functor(PT,F,A0), PT=..[F|Args0], @@ -1250,6 +1253,7 @@ zero_clause(M,F/A0,LZ), assert(M:zero_clauses(LZ)). + pita_expansion(begin_of_file,_):- !, fail. @@ -1316,7 +1320,7 @@ append([onec(Env,BDD)],BodyList2,BodyList3), list2and(BodyList3,Body2), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs),%***test single_vars (M:local_pita_setting(single_var,true)-> @@ -1345,7 +1349,7 @@ ; Clauses=[Clauses0] ), - extract_vars(Clause,VC), + term_variables(Clause,VC), list2or(HeadListOr, Head), process_head(HeadListOr, HeadList). @@ -1359,7 +1363,7 @@ H=Head, Probs=[1.0,1.0] ), - extract_vars_list([H],[],VC), + term_variables([H],VC), get_next_rule_number(M,R), add_bdd_arg(H,Env,BDD,M,Head1), %***test single_var (M:local_pita_setting(single_var,true)-> @@ -1383,7 +1387,7 @@ append([onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append([Head],BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), to_table(M,[Head],TabDir,HeadList1), HeadList1 = [H1], @@ -1398,7 +1402,7 @@ M:pita_on, (Head \= ((pita_expansion(_,_)) :- _ )), (Head = ((?) :: H) ; Head = decision(H)), ground(H), !, - extract_vars_list([Head],_,VC), % VC is [] so maybe avoid the computation + term_variables([Head],VC), % VC is [] so maybe avoid the computation get_next_rule_number(M,R), to_table(M,[Head],TabDir,HeadList1), HeadList1 = [H1], @@ -1412,13 +1416,15 @@ pita_input_mod(M), M:pita_on, (Head \= ((pita_expansion(_,_)) :- _ )), - (Head = (H => U) ; Head = utility(H,U)), ground(H), number(U), !, + (Head = (H => U) ; Head = utility(H,U)), + ( ground(H) -> true ; throw(error("Expected ground decision fact in utility/2"))), + ( number(U) -> true ; throw(error("Expected a number for utility in utility/2"))), !, list2and(BodyList, Body), process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList1,Env,M), append([onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append([Head],BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), to_table(M,[Head],TabDir,HeadList1), % <---------------------- if HEAD = H => U does NOT WORKS HeadList1 = [H1], @@ -1432,7 +1438,9 @@ pita_input_mod(M), M:pita_on, (Head \= ((pita_expansion(_,_)) :- _ )), - (Head = (H => U) ; Head = utility(H,U)), ground(H), number(U), !. + (Head = (H => U) ; Head = utility(H,U)), + ( ground(H) -> true ; throw(error("Expected ground decision fact in utility/2"))), + ( number(U) -> true ; throw(error("Expected a number for utility in utility/2"))), !. pita_expansion(Head:-Body,[rule_by_num(R,HeadList,BodyList,VC1)|Clauses]) :- prolog_load_context(module, M),pita_input_mod(M),M:pita_on, @@ -1448,7 +1456,7 @@ ), length(D0,Len), Prob is 1.0/Len, - extract_vars_list([H],[],VH), + term_variables([H],VH), delete_equal(VH,Var,VH1), maplist(gen_head(H,Prob,VH1,Var),D0,HeadList), get_next_rule_number(M,R), @@ -1458,7 +1466,7 @@ append([onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), (M:local_pita_setting(single_var,true)-> VC1 = [] ; @@ -1481,7 +1489,7 @@ ; true ), - extract_vars_list([H],[],VH), + term_variables([H],VH), delete_equal(VH,Var,VH1), maplist(gen_head_disc(H,VH1,Var),D,HeadList), get_next_rule_number(M,R), @@ -1491,7 +1499,7 @@ append([onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), (M:local_pita_setting(single_var,true)-> VC1 = [] ; @@ -1514,7 +1522,7 @@ append([onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), (M:local_pita_setting(single_var,true)-> @@ -1541,7 +1549,7 @@ append([onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), (M:local_pita_setting(single_var,true)-> @@ -1605,7 +1613,7 @@ append([onec(Env,BDD)],BodyList2,BodyList3), list2and(BodyList3,Body2), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs),%***test single_var (M:local_pita_setting(single_var,true)-> @@ -1629,7 +1637,7 @@ append([onec(Env,BDD)],BodyList2,BodyList3), list2and(BodyList3,Body2), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs),%***test single_vars (M:local_pita_setting(single_var,true)-> @@ -1683,7 +1691,7 @@ Head=(_;_), !, list2or(HeadListOr, Head), process_head(HeadListOr, HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), (M:local_pita_setting(single_var,true)-> @@ -1701,7 +1709,7 @@ Head=(_;_), !, list2or(HeadListOr, Head), process_head(HeadListOr, HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), %**** test single_var (M:local_pita_setting(single_var,true)-> @@ -1727,12 +1735,12 @@ ), length(D0,Len), Prob is 1.0/Len, - extract_vars_list([H],[],VH), + term_variables([H],VH), delete_equal(VH,Var,VH1), maplist(gen_head(H,Prob,VH1,Var),D0,HeadList), get_next_rule_number(M,R), get_probs(HeadList,Probs), %**** test single_var - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), (M:local_pita_setting(single_var,true)-> VC1 = [] ; @@ -1755,12 +1763,12 @@ ; true ), - extract_vars_list([H],[],VH), + term_variables([H],VH), delete_equal(VH,Var,VH1), maplist(gen_head_disc(H,VH1,Var),D,HeadList), get_next_rule_number(M,R), get_probs(HeadList,Probs), %**** test single_var - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), (M:local_pita_setting(single_var,true)-> VC1 = [] ; @@ -1811,7 +1819,7 @@ (Head=(_H:_);Head=(_::_H)), !, list2or(HeadListOr, Head), process_head(HeadListOr, HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), to_table(M,HeadList,TabDir,[H1:_]), @@ -1831,7 +1839,7 @@ (Head=(_H:_);Head=(_::_H)), !, list2or(HeadListOr, Head), process_head(HeadListOr, HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), to_table(M,HeadList,TabDir,[H1:_]), diff --git a/packs_lib/cplint/prolog/pitaind.pl b/packs_lib/cplint/prolog/pitaind.pl index f3d72fbef7..9731d4c844 100644 --- a/packs_lib/cplint/prolog/pitaind.pl +++ b/packs_lib/cplint/prolog/pitaind.pl @@ -37,7 +37,6 @@ :-meta_predicate set_sw(:,+). :-use_module(library(lists)). -:-use_module(library(rbtrees)). :-use_module(library(apply)). :-use_module(library(assoc)). @@ -536,12 +535,12 @@ generate_rules_fact_vars([],__R,_Probs,_N,[],_Module). generate_rules_fact_vars([Head:_P1,'':_P2],R,Probs,N,[Clause],Module):-!, - extract_vars_list([Head],[],VC), + term_variables([Head],VC), add_bdd_arg(Head,BDD,Module,Head1), Clause=(Head1:-(get_var_n(Module,R,VC,Probs,V),equalityc(V,N,BDD))). generate_rules_fact_vars([Head:_P|T],R,Probs,N,[Clause|Clauses],Module):- - extract_vars_list([Head],[],VC), + term_variables([Head],VC), add_bdd_arg(Head,BDD,Module,Head1), Clause=(Head1:-(get_var_n(Module,R,VC,Probs,V),equalityc(V,N,BDD))), N1 is N+1, @@ -815,30 +814,6 @@ setting_pitaind(M:P,V):- M:local_pitaind_setting(P,V). -extract_vars_list(L,[],V):- - rb_new(T), - extract_vars_tree(L,T,T1), - rb_keys(T1,V). - -extract_vars_term(Variable, Var0, Var1) :- - var(Variable), !, - (rb_lookup(Variable, Var0,_) -> - Var1 = Var0 - ; - rb_insert(Var0,Variable,1,Var1) - ). - -extract_vars_term(Term, Var0, Var1) :- - Term=..[_F|Args], - extract_vars_tree(Args, Var0, Var1). - - - -extract_vars_tree([], Var, Var). - -extract_vars_tree([Term|Tail], Var0, Var1) :- - extract_vars_term(Term, Var0, Var), - extract_vars_tree(Tail, Var, Var1). delete_equal([],_,[]). @@ -910,7 +885,7 @@ append([onec(BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), (M:local_pitaind_setting(single_var,true)-> @@ -930,7 +905,7 @@ append([onec(BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), (M:local_pitaind_setting(single_var,true)-> @@ -989,7 +964,7 @@ append([onec(BDD)],BodyList2,BodyList3), list2and(BodyList3,Body2), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs),%***test single_var (M:local_pitaind_setting(single_var,true)-> @@ -1010,7 +985,7 @@ append([onec(BDD)],BodyList2,BodyList3), list2and(BodyList3,Body2), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs),%***test single_vars (M:local_pitaind_setting(single_var,true)-> @@ -1056,7 +1031,7 @@ Head=(_;_), !, list2or(HeadListOr, Head), process_head(HeadListOr, HeadList), -extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), (M:local_pitaind_setting(single_var,true)-> @@ -1071,7 +1046,7 @@ Head=(_;_), !, list2or(HeadListOr, Head), process_head(HeadListOr, HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), %**** test single_var (M:local_pitaind_setting(single_var,true)-> @@ -1154,7 +1129,7 @@ (Head=(H:_);Head=(_::H)), !, list2or(HeadListOr, Head), process_head(HeadListOr, HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), add_bdd_arg_db(H,BDD,_DB,M,Head1), @@ -1171,7 +1146,7 @@ (Head=(H:_);Head=(_::H)), !, list2or(HeadListOr, Head), process_head(HeadListOr, HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), add_bdd_arg(H,BDD,M,Head1),%***test single_var diff --git a/packs_lib/cplint/prolog/slipcover.pl b/packs_lib/cplint/prolog/slipcover.pl index bf76e28dbf..18c3f63c50 100644 --- a/packs_lib/cplint/prolog/slipcover.pl +++ b/packs_lib/cplint/prolog/slipcover.pl @@ -53,7 +53,6 @@ :-use_module(library(random)). :-use_module(library(system)). :-use_module(library(terms)). -:-use_module(library(rbtrees)). :-use_module(library(apply)). :-use_module(cplint_util). :-set_prolog_flag(unknown,warning). @@ -2574,30 +2573,6 @@ setting_sc(M:P,V):- M:local_setting(P,V). -extract_vars_list(L,[],V):- - rb_new(T), - extract_vars_tree(L,T,T1), - rb_keys(T1,V). - -extract_vars_term(Variable, Var0, Var1) :- - var(Variable), !, - (rb_lookup(Variable, Var0,_) -> - Var1 = Var0 - ; - rb_insert(Var0,Variable,1,Var1) - ). - -extract_vars_term(Term, Var0, Var1) :- - Term=..[_F|Args], - extract_vars_tree(Args, Var0, Var1). - - - -extract_vars_tree([], Var, Var). - -extract_vars_tree([Term|Tail], Var0, Var1) :- - extract_vars_term(Term, Var0, Var), - extract_vars_tree(Tail, Var, Var1). difference([],_,[]). @@ -2737,7 +2712,7 @@ append([slipcover:onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_probs(HeadList,Probs), (M:local_setting(single_var,true)-> generate_rules(HeadList,Env,Body1,[],N,Probs,BDDAnd,0,Clauses,Module,M) @@ -2784,7 +2759,7 @@ append([slipcover:onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_probs(HeadList,Probs), (M:local_setting(single_var,true)-> generate_rules_db(HeadList,Env,Body1,[],RI,Probs,DB,BDDAnd,0,Clauses,Module,M) @@ -2805,7 +2780,7 @@ append([slipcover:onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_probs(HeadList,Probs), (M:local_setting(single_var,true)-> generate_rules(HeadList,Env,Body1,[],RI,Probs,BDDAnd,0,Clauses,Module,M) @@ -2906,7 +2881,7 @@ gen_cl_db_t(M,HeadList,BodyList,Clauses,rule(ng(R,Vals),HeadList1,BodyList,true,Tun)):- process_body_db(BodyList,BDD,BDDAnd, DB,[],_Vars,BodyList1,Env,Module,M), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), append([slipcover:onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), get_next_nonground_rule_number(M,R), @@ -2925,7 +2900,7 @@ ). gen_cl_db_fact_t(M,HeadList,Clauses,rule(ng(R,Vals),HeadList1,[],true,Tun)):- - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_nonground_rule_number(M,R), get_probs_t(HeadList,M,Probs,HeadList1), HeadList=[_:Ann|_], @@ -2942,7 +2917,7 @@ ). gen_cl_fact_t(M,HeadList,Clauses,rule(ng(R,Vals),HeadList1,[],true,Tun)):- - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_nonground_rule_number(M,R), get_probs_t(HeadList,M,Probs,HeadList1), HeadList=[_:Ann|_], @@ -2961,7 +2936,7 @@ gen_cl_t(M,HeadList,BodyList,Clauses,rule(ng(R,Vals),HeadList1,BodyList,true,Tun)):- process_body(BodyList,BDD,BDDAnd, [],_Vars,BodyList1,Env,Module,M), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), append([slipcover:onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), get_next_nonground_rule_number(M,R), @@ -3017,7 +2992,7 @@ append([slipcover:onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), (M:local_setting(single_var,true)-> @@ -3038,7 +3013,7 @@ append([slipcover:onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), (M:local_setting(single_var,true)-> @@ -3059,7 +3034,7 @@ append([slipcover:onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), (M:local_setting(single_var,true)-> @@ -3079,7 +3054,7 @@ append([slipcover:onec(Env,BDD)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), (M:local_setting(single_var,true)-> @@ -3124,7 +3099,7 @@ append([slipcover:onec(Env,BDD)],BodyList2,BodyList3), list2and(BodyList3,Body2), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs),%***test single_var (M:local_setting(single_var,true)-> @@ -3146,7 +3121,7 @@ append([slipcover:onec(Env,BDD)],BodyList2,BodyList3), list2and(BodyList3,Body2), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs),%***test single_vars (M:local_setting(single_var,true)-> @@ -3203,7 +3178,7 @@ append([slipcover:onec(Env,BDD)],BodyList2,BodyList3), list2and(BodyList3,Body2), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs),%***test single_var (M:local_setting(single_var,true)-> @@ -3224,7 +3199,7 @@ append([slipcover:onec(Env,BDD)],BodyList2,BodyList3), list2and(BodyList3,Body2), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs),%***test single_vars (M:local_setting(single_var,true)-> @@ -3270,7 +3245,7 @@ Head=(_:p(_);_), !, list2or(HeadListOr, Head), process_head_fixed(HeadListOr,M,0,HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), (M:local_setting(single_var,true)-> @@ -3286,7 +3261,7 @@ Head=(_:p(_);_), !, list2or(HeadListOr, Head), process_head_fixed(HeadListOr,M,0,HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), %**** test single_var (M:local_setting(single_var,true)-> @@ -3323,7 +3298,7 @@ Head=(_;_), !, list2or(HeadListOr, Head), process_head(HeadListOr,M,HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), (M:local_setting(single_var,true)-> @@ -3339,7 +3314,7 @@ Head=(_;_), !, list2or(HeadListOr, Head), process_head(HeadListOr,M,HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), %**** test single_var (M:local_setting(single_var,true)-> @@ -3381,7 +3356,7 @@ Head=(H:p(_)), !, list2or(HeadListOr, Head), process_head_fixed(HeadListOr,M,0,HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), add_bdd_arg_db(H,Env,BDD,_DB,_Module,Head1), @@ -3398,7 +3373,7 @@ Head=(H:p(_)), !, list2or(HeadListOr, Head), process_head_fixed(HeadListOr,M,0,HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), add_bdd_arg(H,Env,BDD,_Module,Head1),%***test single_var @@ -3436,7 +3411,7 @@ Head=(H:_), !, list2or(HeadListOr, Head), process_head(HeadListOr,M,HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), add_bdd_arg_db(H,Env,BDD,_DB,_Module,Head1), @@ -3453,7 +3428,7 @@ Head=(H:_), !, list2or(HeadListOr, Head), process_head(HeadListOr,M,HeadList), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs), add_bdd_arg(H,Env,BDD,_Module,Head1),%***test single_var diff --git a/packs_lib/cplint/prolog/viterbi.pl b/packs_lib/cplint/prolog/viterbi.pl index d84208fafa..5daf21486c 100644 --- a/packs_lib/cplint/prolog/viterbi.pl +++ b/packs_lib/cplint/prolog/viterbi.pl @@ -14,7 +14,6 @@ @license Artistic License 2.0 https://opensource.org/licenses/Artistic-2.0 @copyright Stefano Bragaglia and Fabrizio Riguzzi */ -:-use_module(library(rbtrees)). :- thread_local vit_input_mod/1. @@ -405,35 +404,6 @@ setting_vit(M:P,V):- M:local_viterbi_setting(P,V). -extract_vars_list(L,[],V):- - rb_new(T), - extract_vars_tree(L,T,T1), - rb_keys(T1,V). - -extract_vars(Term,V):- - rb_new(T), - extract_vars_term(Term,T,T1), - rb_keys(T1,V). - -extract_vars_term(Variable, Var0, Var1) :- - var(Variable), !, - (rb_lookup(Variable, Var0,_) -> - Var1 = Var0 - ; - rb_insert(Var0,Variable,1,Var1) - ). - -extract_vars_term(Term, Var0, Var1) :- - Term=..[_F|Args], - extract_vars_tree(Args, Var0, Var1). - - - -extract_vars_tree([], Var, Var). - -extract_vars_tree([Term|Tail], Var0, Var1) :- - extract_vars_term(Term, Var0, Var), - extract_vars_tree(Tail, Var, Var1). assert_all([],_M,[]). @@ -481,7 +451,7 @@ listN(0, LH, NH), get_next_rule_number(M,R), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), assert_rules(HeadList, M, 0, HeadList, BodyList, NH, R, VC), assertz(M:rule_by_num(R, VC, NH, HeadList, BodyList)). @@ -496,7 +466,7 @@ listN(0, LH, NH), get_next_rule_number(M,R), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), assert_rules(HeadList, M,0, HeadList, BodyList, NH, R, VC), assertz(M:rule_by_num(R, VC, NH, HeadList, BodyList)). @@ -513,7 +483,7 @@ length(HeadList, LH), listN(0, LH, NH), get_next_rule_number(M,R), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), assert_rules(HeadList, M, 0, HeadList, [], NH, R, VC), assertz(M:rule_by_num(R, VC, NH, HeadList, [])). @@ -525,7 +495,7 @@ length(HeadList, LH), listN(0, LH, NH), get_next_rule_number(M,R), - extract_vars_list(HeadList,[],VC), + term_variables(HeadList,VC), assert_rules(HeadList, M, 0, HeadList, [], NH, R, VC), assertz(M:rule_by_num(R, VC, NH, HeadList, [])). diff --git a/packs_lib/phil/buildenv.sh b/packs_lib/phil/buildenv.sh index 6f75a252e4..0ae12caaf8 100644 --- a/packs_lib/phil/buildenv.sh +++ b/packs_lib/phil/buildenv.sh @@ -4,20 +4,25 @@ # # $ source buildenv.sh -PATH='/opt/logicmoo_workspace/lib/swipl/bin/x86_64-linux:/opt/logicmoo_workspace/packs_sys/instant_prolog_docs/biocham:/opt/logicmoo_workspace/packs_sys/instant_prolog_docs/biocham:/root/.nvm/versions/node/v16.6.2/bin:/opt/logicmoo_workspace/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/root/.dotnet/tools:/opt/logicmoo_workspace/packs_lib/sparqlprog/bin' +PATH='/opt/logicmoo_workspace/lib/swipl/bin/x86_64-linux:/opt/logicmoo_workspace/packs_sys/instant_prolog_docs/biocham:/opt/logicmoo_workspace/packs_sys/instant_prolog_docs/biocham:/root/.cargo/bin:/opt/ros/noetic/bin:/opt/miniconda3/bin:/root/.nvm/versions/node/v18.8.0/bin:/opt/logicmoo_workspace/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/root/.dotnet/tools:/opt/logicmoo_workspace/packs_lib/sparqlprog/bin' SWIPL='/opt/logicmoo_workspace/lib/swipl/bin/x86_64-linux/swipl' -SWIPLVERSION='80329' +SWIPL_PACK_VERSION='1' +SWIPLVERSION='80515' SWIHOME='/opt/logicmoo_workspace/lib/swipl' SWIARCH='x86_64-linux' PACKSODIR='lib/x86_64-linux' SWISOLIB='' SWILIB='-lswipl' CC='gcc' -LD='/usr/bin/cc' +LD='/usr/lib/ccache/cc' +SWIPL_INCLUDE_DIRS='/opt/logicmoo_workspace/lib/swipl/include' +SWIPL_LIBRARIES_DIR='/opt/logicmoo_workspace/lib/swipl/lib/x86_64-linux' CFLAGS='-fPIC -pthread -I"/opt/logicmoo_workspace/lib/swipl/include"' LDSOFLAGS=' -shared' SOEXT='so' +PREFIX='/opt/logicmoo_workspace' USER='root' HOME='/root' +LANG='en_US.UTF-8' -export PATH SWIPL SWIPLVERSION SWIHOME SWIARCH PACKSODIR SWISOLIB SWILIB CC LD CFLAGS LDSOFLAGS SOEXT USER HOME +export PATH SWIPL SWIPL_PACK_VERSION SWIPLVERSION SWIHOME SWIARCH PACKSODIR SWISOLIB SWILIB CC LD SWIPL_INCLUDE_DIRS SWIPL_LIBRARIES_DIR CFLAGS LDSOFLAGS SOEXT PREFIX USER HOME LANG diff --git a/packs_lib/phil/docs/_build/doctrees/environment.pickle b/packs_lib/phil/docs/_build/doctrees/environment.pickle index d3536fbe0cb6a94b578cf23de962bbf78220e609..bfb8f65209461fb22100641b8c10486cf90f0654 100644 GIT binary patch literal 54247 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�^gq;Za za&CxavAg+$85uh}5(D6l7aG{pxu6eV&RzzWF{=&@k{P09B=|mp zErKKfI6HS2FP;G)<}&w8US0;UQ@JxNUn9RZVVK1zY9DY9&jJBmLSO(1?8h?GQH{9W z3ud8UZid*U8Q0z)`TO2=%Y?*G!?XdzImCfYd;nL=ydb0HE}{f>{9fMpC~knu`Vd6t z$vO>O)q~_o7>13iYY+$c~1YXewV9jCZ=sntw zRfa624eU??L4VVT?8ErcEh-&m(LtWHh85pr+OK_2Ts!ZSkw#K3AYC5sFqrFux2Ly| zs>|8au>*5TD;Bb_VT8i`8t4kPacu(xV{3NSa`G81MRdztSrkM!y*_ze!kZ9g0(}OJ zut8K(h=OU`$lH85j8!SVfcZ5ZMgz126CwsDng>I8ZQ5dxIO+hV_lm(L^os08+1NHY zYSkZwzBDEt-L~}&Bfm$Q-L#O`TpR?o09P_?TsD)jfNcnKTGql)(er|3S2RKQpzB~v z8w@tX3~bqPZ4Q1jBvNB`1devX9kNO|yCI|b)irj-aw_-*x>3-)!wAqdIr$nw*s>O; z6;Bmjno}C@ijkWjWemA&6--;PBv`-#kxEQ$<331Q4|YLxdLB12a^!;=n!xY3d0K@) zWZEj1;R*y%*hsRr#S996t|&^H5QwSeHC$0B77K&oJB$R$^yGNC-1H^JCq`q#<7c7t z$ff6WVmO`{#$IM8hNq^+Vo(QT-%M{m9HoG z6@s55cpJeR2;NTcMuK+`{5-+05xj}uT?B6?csIdY2;NKZ3k1JO@QVOZTjcBT?1pWT z-Lp7(0s=vVT-hbG=>0diu5}ZdVnhqxM%xLma%KO0wqwyr@83wnZXN8EA0X1+PsBv- zm474m%4ic}%dOMjNgKD$Pw@TGTc^JV`MZy|N2v{nf@oNPYuqgt*Rhz7c4H9g? zieDn`KSS^pg3l6sjo@=IlTLG5mr2w?~@o$f1P$JxuH0MT^*F-hn9S+uW*(x1j2v_a|DOyK8NRFJhFMM|e= zjrBrqT{1++Ovi-CL$wUsr=Wfif0(qNdLfRJgFxNflBi6@wN=B$ei2Z10$W8OFCrAf zmkE1DrxLNTaZtXX=IM~Gl(yqLx=rI<1&6a38E1$B6usj^!gHYHV0(x@gyDql9lmog z`o5PKKSK~BcoxAB!Ltbx1m8h0O7I+lae@JY34(h7qNrNKvjb7}Kohd=S=UY5*^1f= z+|D(iBShCtn&^9>1;keLEj@}mx)&fF?eVcv+JbFhn#27b4k>aQ_*=;yM=G#ODAVrs z@WX?AWgGm^1rf!e%2|K_oehXiN-k<2;29RuIw%F0#(m(zyl>ls1X(L1)u>RAgekm- zn&C(+dXZY8%`cKYK?$h^9U9ygczdpKSxL9;>zUduGGBn~f6NFR>T(d>b~_ z`Fn&%xnV1~Z{P2nUpu!9a-LsX!ym=Pf=nA(H+NMdthnZNN0;;o18%+7c7C& zU}=-XsU&lEL;z*G?gNFIoDC#~IUA?#h0!#!md@ra+tz0FO}pY`^Wf`6!%P*;M`JI7 zWLkC#+J*xRU`>OLk6w-mk`IY&!eUDgQQbl;qrY0t1 zqp_*csmUowm=iH{&|iA6`o|`x&SF_n^VXYyF%{LY8p)OBX;1~nMn;E+WW#aBf#O6$ zDu`!CLW|A&NK9`h_$`9}O7J@b?;!YHf_D=99>K2>yr1CL2|hsZE`mQG_zi+TBzQN$ z9}~O>AZoFBE1uoB#YP>)7scH@a82^S#r>Cu-gO*LiBqQ{1%WR3Q8y}~MuOGhBOLID zIjG3h;qSaH9IFG|q#GvVbsLt2db{U7%G;;-%KD`sur3A`LAMva4H#zNB~(-&CU;@y z3}j1RVN&GP7dqE6Vu?6^Woc%9dHsc}bHevlFfbpig1RsZ@i0x8 z1-;eFgvu#ACY3!J{DfUjnQfI&!ZU$(#WDzwrc_JOx{P(juOTFDYHYHCgTjPCsgk83 ziXI7R;lr=6fWR+Giz?SJib6P~l1mz_QSb{Qz5-7J!{7emQk`MRH`cQ0OvqrX`2mj5 zEi~Inr*V!WcH^3tiVnagO`Q2Hh33*X$qh;~8-z3)?+_L+_>IhsJ>rqcirlMZdl)O+c5uuR0L9U4F0bYn>Y24%_N-Ph;Hj7gTGn!)W2E@!SE0_I_xt`V7 z?&=(Dr5RXIZOz!$^Nt7t06u7U7nW#A@%DX)6J-y?246HP!gLJ#b70qDuX(PKU^pFN ztvo{yM?RLftZm7k@t|jT9SrC&bECUL%pd~7#Oqtoh5Ufg3vwc{@Spz^1V6&e8}Oe; z#4Gdb;2S}EVO)jH+dh)el?`!XFxf=1xrN@)))kPHY>R4rXn8i-t$+a;AcCYGdO ze6ZfyAjZ->0Ao<`k-rrnnu2jZ;T_?~mHCTnS5Xsdgfci!D6<$&YAtTkExTdF&C1YA zH?W^^Z&iL*Y_-_lL}Zchy9PT;M`9#wkUNA6wa4^~k0fH_V>G6PcAGwQ!|#Rg$=w1O zW^`n9bO`OU-?7QDiI70^ZElHQAUM z7)xJe=>$t(W9cMIUuWqSmcGH#tt@>Lr6?iib9im#k_4N)lE@Vu7!5%Ulb5_zL+S!p2w@kd`v}{~j0FR}h%1sI zN2}mt>?5-XR75(R5_LKm*%r1LoLSZ@aqS#V9MB!QAB!1miEspAEkU#;Jd%htXfPLe z){U;wv$4_15XIfcagGr@k6@hOy9v$`JfC2K;2gmuKoqSc@a#s>O6LVDOI5g8%ngpP zy~Go{dzK9cG26wEcOxK|MfUardlV_n{(~f!=HY_ZLpd+zyXz?@AQ_K_qMY;7Uc@5y zg{7I;IpMp8uH}W5foS$wU_mp%d!DYBA2hcip25vb=|NoHmlzu!jh`JJg|i@J8Nxy) zh3IE`i=eFP2I)ITTP@r}=T!%x7B)R`1Nv<&zwSn9YXk7U*_Mx8i!p0S~U3qhV z6kc;3RsmswXc8*2a@h-(6%xig_I}8T;t0(-dM}|12zd&p^&?f}bS#d4iuJcr(FI z14L2zPvF@Nqw?-m3r8(egO^LAduR#eT61J46wem1Q9TQe6`RRAemiwdbj>jSKEx~m zng1%s`&N!AlFa{6l6ikA2(NA+@JX4)w|K@(%sFvD;5GBs= z^UMJ=B34XW6W>q>ZL-(kz6ptqg{6=8uVSh~D`f(C%Pc^@KHP?vax$%{c+; zA&LPLFf=he7n&waR~uwB=!ZE2L-3bu}J_VIGO0-iVLU9M?J{4Xo zLqmK*^=w-pNrccUsSge!#Xk~-iW<oi*qaY-+S*Ityqf*gt!Kj z1jD9@FX7lQq#;|POoqWwVP;2}_=K*L7IBd=6kzug?MWs?4GTz>!YhPTy4qpz6*6nu zDYH=!jEH|sL+7GZE7Iw$R=2?EeW(wc-WR#^b+Gg#OIuB!X^;(rIJ zMn!5!T9dnSXwM9!n?@OT=^VJltav5@>9L9_kCneY`i$4G+DaD13M?GkVaq{XSbtb> zxm%^7)jNlMHLBJC+D`olF$QS^kU)Gn@K7jJr6<9-MFu=7{B>S%@WGiHmJJ6Vk0baP z2L{1PEKz)4yS89I0~Gn6iE(KT4$aTc*KR8R0cDyRNv5w2Z=>g%!-}5X|-rIJPXN58!;PymB~+?;iyM4&6EQd16-)SsHZFg&dqR@X(9x54?>!wp#-S zJi+o&);1wz$sb|s@_kW|%N|(8d*JrMCo0?QHIP#8f2)y~D0k=@j4wzeDHkw#_*^5F z2O;(V--Fow^TN9+9DAN)Nv;?0@gd{F8_xqX>%r!ZzQG0PrFE#DdV8!8dO|<+{ZEK} z#zsr!n^oXGq)l7pLLgg+qo)|MB}6=UsY7np+P7mz*6E1K(!*^-_QC0HoVW82tj&cz zxS$9QeuKxyAO)tlRkU`Hvjd^+QT&iXMFygeC;HbBNfvSV5YynCb6^!np}P<=aD(YF zR#}QxAVit+Atm*I9s>bO(IRE67zT$#lN#qANf@~{=+-6$Mo+$DtcH~2Kw}j2I6CQR zvzdFW1WULSTj@kTnMp|o!VMCcfq$8df;e+&l#}rRbnb^t92dE}O%r@C!8w98f*FDb z2xbW`6U-63kl;MQiwRyp@G!ys1WAH<0-fLjL7HHJz#v#8*d$m2h!S7E8_#Z-_|m;> zB6~JUeqq7{a^||0bf;{Edf z(3v5YzFK4Q!b&JW4TMiVKMTbdPB!H|!D2A2^cJWmzHGEEV{iv>_@V}*@i+q6g6vNgjbF@h0N+ zrwQId@H&EDB={MEUncljf?pwcJ;B=uevaVn1aBaC2f-Twq8RJ7c(xB?P4APQKZtyc zy8QUXChnwcs~7-1l-wk?imO`0fcT!6=g z*Mt&{NWut_>fs3(=Tvuc5262IuStkNI}>yl%Tx?xQ;4+n`jkB+7Qx=9@`}coS2Q{n zgHQ2bc^CgcZ2lF&KN9>k!9Njvl;B?o{)XU_1Ro>#G{N5ze3szj1fM7PJAfz__)9$7 zhXtZfsA#ey^jtQP0VZO=J-^IhLC&>~nJ#fMOjB$9*Vx;yut$*;{7Ff{HOG@S5N&@2 z5y$ZO!pG$$p4Z%I49D*4$BXMp*CWp({5YLi!O21Nw<~ICT%xb(_!PAc!pj16to9X0 z7vkCj%qMqn=uGfNw`=C|=;YbZDtRk=eKWyr1Sbhj6PzNrli(JBsHs1OX9t@4W>yh# z5J_|QO!%x3-$m1ee6IC?kznO}HivqK!-=GuPk9CrpcEe46pkOt!ECAH_@M^sX)X)2 zJPG7^>_j~ch5fwVocj^xN^1{om5o&OU8^cTp5nN4=mmkalBEc-dGQk|d3c-1TRe~1~tP|W15Jl+E$Fu)XgdTkiPVX$##`G2t z6?ik7u}X9ctq#)pK4R-3VkDARJ}r4g6Q}1Wch`_OmJ947kLAjwaO6@0>s*7h@KW}p zo?ULJwD969Gb>l6CyOWPDCdn(2Zdw2&KUxmI@6V@C^Lp!dEBUs*4P*d;KZ<@@J>%~ z7Kv+Ex2?@MxsgVjICw(I#fQSO#ycTC`mzQ#0X$P;P|wJiNJ{g>ji?g>!U<@@Q`kl( zuJsh2faiXUbMZ2QA18Q>;3o)PPEaLyoZtz9R}lOp!7B-Vn&4FgKSSUGMDgJdCMxM4#}2o}i9OVmk*yfz4`{`Xzd)qDnTUyG$InQ1Y&-(5f&H5ATrHE)exH4) zXT|WwAy@gv&1r0Qo!bs5o(zWX4oJ5XbWRu(;q0qpFw_Mj)$U1?>pS4Oz1Vr2p^u$t zdU|@kURMnQ$)yC}cqUb%CQ^l?`4fT<6MT^1BLp7;h$78D!m}GjnjJ52_Uh?@@tRcM zIv{;Od-D!X>poYuu-xyz*muqsH<`EGEDY4`T+c!*-FLG9i2{W=)@s&->RHc4q|qSL zC!||8*?F$(oQ#ig8a_%?M-uyIC9(4$-hAD60&Wz!A31_vv?g~i?89Hb1L4NY9u7rd zskJ-sRE1+cx^W&`$$>D|g&l@j*nMKFfn~JW`ESpfH4Kr}5fbOXVc;fjQ<3{mm_K`P zR%c=&c`gY0Lr^`ko@L<5cX$eG8b0{gjxC~9V1tS!rl7KloTfxwgg;^i#o1L#oa>&M zdtf!WhUQh`^jXC0<6s-;E@64@^qPZo(Y5*YxvSa?*c$e4PqqxUx6aX60!nd!sR!SB zxIX&}tAt!UxQBAMA@6qc_?EyJ&4cfF{u7g;=*y;Dy1Nq%sc)aWdf_;rJ&nj@3XU{5<16FfO|Bg%Qwy zU&??dgANzwcExZWtmqbIN(eqaPVgcJ$z>cOZHQh9kT(EkM}a?uZosFdGQQvdyZr_- zNcN<(lB6T3#*ET@s=1;c$An+lkr2+BnVRdP{X zPd#59^nDou1Fz2`j+x#9LU7!ejDHD5`p83-z4O{gTl_r+AviL7v9wAGd~ZI>hQT3I_K%Fa+;&U@Afc;UxhUW;`rVt@757 zQzJ2ZBt9IQ93MvX#Z+R7M-8h*<;cY{h`flV&#%@jF>XIsgBSvXQ9Tg)?&dOhir@^v zEdDAy3C0PYMleBe7r_+4(+R$l z;28i>yYdMW$&-5omIQct zLY5ewFd5#(g6*_-Y%IaEBVnBm*to zoW}0 zpCL*{9nCC6Ac!E?`5`rxDcUKHR%;2wC1xf=N`fgD(w`q$DguWYn+gX6dgMu4Qs$7c zCCn;kT&{>x5s^HUo$z@Cp7p}mYH`d9Xx=~Mg_7PmY*>(#XH^`_tf|W|qk(g?vpiE( z^v6Fm)GT<(^?S9#tS4T1F-mdmB030(SNWGAjmX4)Tl0dorCiBq8jMIrV;~k7F()`$ zfbZZSL*g=oz?xSKYDGj7L9`R2#h^AV#jR3;IE4X%1fB=x zmuCm@PsaWd^8*)G*1bsxJ!JRPOb27fSf!4D7f5Mo+Gc}dmd>7 zAVEwP!w2923O*7LV$8E*xlrJ35P~Iz5V`8@_i3gGGT6g84M<8?J*NgnQbxFvL?F7T z=SltC-v(uL4?f0*Srccm!c!->k+fHP>?~aznq2<4U8az3mo4DvfFQ7l0Y!4M#p``k zf|rPDk;0F$q9H#P$%`{m3>6+RbS}i`1p^TrDWa9+_ba7NL3-h@@l=LcDL0Jwidrq< zu?GEJ=I;kV|4k}HDGoJNy=bn;Ljq)i1eFy0EF={C9`~hp5xk$^HwZpJ@NR-XAb1bK z9}>Km;ExI3NAM>Eze(^xg5M(eQ-a?n_;Z5aA@~b|-vx*gE#8S|2NErsi1Y`MpMx~9 zzhPJZn%#+%4E{AROd(ASwkdod)cb&CgMe^AJM5>}i+W)pZ0BhZ3zUH-ye|haJD#;h zDTpDfQ_ZHWHe3-D+$cRfPi;|xn^tN9R9l&q+u4~1W{cKYK%1%r}(&q8mFF@oVHvgt3FNM(K z=Xuan88K1w6`g_CVGN)2eV$rkP>iWoR633gPwWID$Owp1)6h933}iAyJIZ!PBuLxc zNL@DiO-DgQUmztNX6cJ8b+Ys%OWiE}8%w<`eTk)hmcGo=QI@{K(s7o)%F@j&eT}74 zEPb7&r?B)5mY&MeH(9!!rEj4W#qFQNvq*0LcT?sE@F^yx%mc?lo!{TWeUO!;$%52# ztww=X+Wd`(x9nKActT?{H-OuZGPD#g|AJ5Z(Qo0ADL$ciM`cY*Jzf%NPkuHgAHY1CYKGK3ovcl7EUh} z=3xq3k>M6ah_ocZCc#SxOah%?iy%c%AV>p5G4w-t z7Rk`pY8lwyB=`Rj7yE~0?+||uaTF<2d{Hn-z+qp)wfJ^XZWZwX;`=JOCs^X?@wtCw ziRWwQ?&PsWJW4osnI)cAn)^kTcs60~lPvKVpxhv{<9NbL?nNx|;EmjWVu@!Hgd1KhbAw z=*aE}e{^fWv-)~pM{rMMWSyi;Uf8Q<%Wem(Yxs&5UULk5npCf{s|$zSz9cj=f+ z8=tv4zQa#%WReElSB%$QhOA^tMHL_M5`8*V*QYgnTp;-VTM`+i_yD8V8z<$Y_)%)x zJ(0xu^6Eo{Y&rW#_6J^8UBzct@!hIB@etoN#20q`I(sqdaJx7)RDKlkD(~i zh>>6ze82zwdT~?w1%w>2xC$q$gKwvICUNWw@QYL69Z(TyVU^z^!|5KGJ<^o-yc63? zSv|$~C3&hIyus=zPUrD|i;!_M19=6LXW(x~y0RNoT(tCzY9@uxy2CPDv@omUyJ$&k zV}lg9fKM~!J_80@IF$P=|KM7;Q;%m~RUtXrZg)~Po_)kUZA1SyGQn5X>^O6XOH5bj zzbHSIDT!RtYwk%j=taNF@3Y|xiA@l;a8oVj(Zyy+2M;!o+(Ji_Z%T?U6M#w2;wug3cHE8hB=*pI;q>bpnXGQy~#Yonl7Hc3j?ozZSI7za~)Z zty{}W|J(te%>pEAVDd4{UGD3$a5(o3S?I`pQx-aN-;#x{+_z<+J9pDD@vENPAzA3n z9hQZ@T!$?5=Q>5fcsW)W&b7rg6`wkXL{hP=JQWUk?={thBb-*)2i+rB_MC!O`6`#o X6G>!~mEcWHnwv#L^@iSX;ya{2rosLxTn-P|~m@KDVTG?(E4WN7Q+Z@&asL z75N3zkf#y|>hVJ@`1WY<^;No(WQE~tZAdnH|Lp3$9JhTOlkz{oxmx#X@R1XD4 z8uIuiaJa?hH}b(jiNj`=mzEb3r(_o=vyv(}*_x>k*etl(p|OkM=El=Pdl@kd4@z%{ zVCwO=yLdMdYOV>I$Ho)sRzYKlXnaYllGa0-iLrGr#;B8m6V2r`U{$6AKi&sAf}*|~ zJkGpWUR(%j@Zm1rEpc2?3oVyV&!4E1Ik zfbSTH>E%>187g?uSF3^cizSB}Z-ytzb@}v~d>=ck>ZxLhjnLN9+w5YP$25rf| z${OM(ofC~{t0bD~F}jSVw;u^J0rO(&sV2i%V&AqrwM{EoS4RF0YUhspc(Z)g&jT4# z33&+QZq4gLMv_3fbW#GD+B~8I8(&{w0uusXju@~0E20EOqQI#bcMBtjz-{&2$Z_W7 zQnjT_gkU7 zRPQ#J$p;DCBEfa(A};$oE+g9xDztBw`CrWf6I|pXh~wEVZGUzqO;! z5F*@A-CYtclmE;2TVCPVEOs8# zTC$IH_%4PgQ%0gJq{;}Lj1zGs1W>BMZWfFjW7{Xd{G-%q(bch_Em71tWy1S!s}Egkb+9>uDpI_~r8u zs&4EP38ReA)N6g_8t~!!QxR)<-&iOy!m@wXcPPN0!sKIhrWD1aw0|NjN37QRN;Hw6 z)Y>tj_G|s$0JhFcRMvcV+;0b_q9@&O3pHG|bWl&WN1{$~NBwC~I=tbITB4!a=ML@; za7NuXWF-5DD1@thi!<0KUX)_q3WA+cpU56+IpbBoYGV_$aNelKHq-361+$7eRFqQ9 zx{hpGI{Kj7gixynKib-x=I=A=?wscAj2CqsK}1%cSoTJ_x4f9i+r0xRB{*T6!6Sp2 zIow+mtT1n~k@o@`v~S6~)zI8Z4#dfUMPi_KOiO0&A_qFjfu(|6^7!@U9C>|+w=8`F z?SGA5?*(JjHTk)$&|6HLrpXd!jNLRjr6C)G!oA(aXC;yt=uLB(-ByH#TdWSB-c0>! z$`JM_@d#JDmSnIhZ(+R05q7b9sJMVVCC6Typ20Tj$6hXJ>O=K;u^{eE2m{sf^;R`} z>T>f*$^V3uvBfbu71O4e-Bx2|n58vCqZiq4O&tRkk5;<9+M#u%y?EMp0Cgzo5cav0 z#HT!iU67KjL8f(TyRu>d(M;V_mdSpRP#r2V*{^!2h2@zN>i?~j2lxn6HGeXb1^SSw z0)!9_1=Uk+vRRY_iQ1aUVg!h{lvA@Mk!_T4W>B=M+XN1#s_DUn1^xXE2gvWgoHjXx!C4EVgXB(Z~c%# zYpq;4(ygW?AW?_4k_lc|ODstUo!T!g3vID{{a|ROM&+2*8INXJQfXY*kwy8cCmxMq z_=jrX9yfET?f%gNMhIqZ*4pb7TRrfPI5x?b%3siacl?N|ei(@)tQ)@Fg}aL%bu~g=id|B< zEedK}=vquar5?AfH^M1god#!(;A>acv8SYc54r32?V1g6%}Bq)PW{wVYfCM^c&bN* zVeGmj_{)>$FY4iS^Vu(gr|%7N<_)e$BJ+5+>H;xLngh4m)F9u__v>`Xs*$ zW7UP5vS7UW#-^cAs0MEhRfio&gDL8yt;yc+BFpji^-m50Hr^x_$i749+Gta~6>^^B zRBcaxdI^Ko>YH0e!bTzmUDW6&Q(+SlOM%t)jayd%Tdff~g@hiHgtV1xo{29@U@as6 zLYZxl=)Q<0)*~Dkjzw&ipcdU+ajb>Y9R`xiUfg|As_oG`j{BHDmInIJVW5ggAD=Tw z?wllN($LlRd)u`j_R4Wms{SJSBqE?|*1Xuqd`ptMAsq(SRsUTdnE#d+?@E7tfY8_J zN_~H+Jzk1$9c0Gqa`V7cF|#Ot`sC6g*8)Zn!&b$j*1gisyAJ6Ds<1Z}cWy+K_!F{o zY8N`Hw_lp%*V;)`{rjcpLe1IJ6_-YP_9U6|B<_O(_hZBz`9I+fe`TJjLSmI6RuZn{ zQE)9#{LO0O-nRF36q)S0No*lh?cHU5T+*pBQy%$z<{Y&DW8Y}NNWHXwINL^p;odf{ zsfEdEbaoosVHRE4d4%4m9zPIm*+^7`*`15=MT22%u+49Bd0BD(%tA+3`#OrNb+yL` zr6dkwFNpzO)Hu|%R%m(j@+k$oVxyCVxXiZ>!q!Y+G~G; z`s=}NY@=E9og_6HV9kqhs_oTy^9^Z$AI-9V{oek=tKMMw^M9$3mwN1wrci*NQ=vE# zfoM?4wy}gXR{)DMF)HS+i}>?<2Q#s>Y4iF-h(fBZ^|SmX0VSOF(d#pygBo-=CFqJf z>f?t}Al)7HsuR`j|4%P~A&8qApl4~%JKP7b*17Tgw-Zsl`o=<&LfToC5@PNB6OE}m z-t2?feeKOn<`r^qnV&S`!}gjZ-T-R}HuM*SeVE2&u8*TEQqxy-QPWTQs=bbNhpq0M ze-#*FWpMIXAhYatV7nIjeAyGYcD(ae27A@dwc6J@#@&80k__->TtU3dbH3`K6Upqf z4p*BfcdHR^KMT9nV{fMh=%rS@PtJv}-6j3gCF!Y?AA#kThorbA5vm@4H;VmX!0eV9 za%wo-LS`vGcb%kE`>9oyP=9GLO=oPVhMmsCUF`Y^73uHX+VWN638z-QbUIEXRH(n| zcV-~!d-+^Sa0A*T*DGXy^2|tJsf6Fk;@X1AVG>YSKlQ!VU>V>hiLy&t|Izm|*f4)j z>ksgk);GX&Sid_f)ZuBCAE53!*9{jLm(Qiuv%J0a2QLGA*hA1jm!N9Py5}u64>{G( z>eAQ-16DS*&xa~@XlNLp2tmef`RH$E-cKZ~%3go0cb$E6T8JTa)TfVOm|y&Ky!nhA zKjkmO{G`3|vwe(xD!?r{xRHVT&kiX>E>HV>0=p&z*ClgKD*>nOxD;X!{i16__KUz* zmt6D-sE57&;y7Sx^7rmtXilO=Ak?1vRXmt20YdDc04a8o7`E@YbQmlxXsBLcR?Du8 zZe;Vp8zIHzVyB_CV1a8Gvyw#6wYCIx*_8y>-YC(a=3GtvdZwito#;C876D>!RII)6 z_l!o+B{b3v<~0NJLmd*weR(nM)>Z$kGROVcxV3jC0ig};ghP_BUCN@ zX*~N(nAeh%?%|=vH#);NNX;YIGMyCcYj3Os%WV&fs_DOH!Cg;DZmXMaJ!k|EKlfq5 zja-#O6aBV2=jWlu2%+i^KPRzxL!|6qcCgzHeS0~jRnu=5L8f}^PD*ee4{g7@-I?V! zqSB{N%zhejh`r?36JQzNsDAR`>I_w7MFvugx9|P^1zZU<5*gq#K%*3@K7VI0EI~2S z>L+)%KRUBD9unj@@$5B!tOv_xV+o!!kYKa@y}#lha6^Lz7?$`CYtd#YP4G|;{nPHH zu%jN_hr77Hac?zPk;MDP0(@#9!27SBhj?J`JD84iXUh9ANM$!YxaK*z^0N#EnHmHN z;qQ^_d>(WSPHPBnuz*0Sah9C1?$m3_ydZ_K=7H``9q*)2bJGVHSQ3c7t|Vef@G`+T z)+x|4A`|#}6I_M_UeO3rf=fM^9x_87uxt;eM6b0PN%fbOiofbm#f z768QtcxqjbQ2u8CB(S+UG_CU)8|b=IHI{@nxCIgmT#e#q1qJlm#Ie8@u@S5J(Hy>9ELC!-&n?24JO_y z2C~D)5rl5Gc3=eYy)h8MpO1ky9&%th&@98#zJM^34LZ>VW0}rU!H#WNjg)OJuWbo) z`H5KghXFAWuN85S0Lyhmv{>rR&&I)*taoEsHlGo8s<|2u3z%iIn}M+U;^q;5qzxp& za|X0F^J{G&)dLOfO813>-0utX9ql1j++Z;)$Aw+p?+KFtqVE|KH_)5bzFm1iTYLcL zw3|^k^Bs7ZZI(&|zo2)v2n}mHSPO8)85;U_`y~lYA;xdDhlS>!NfxVeQv{kR=YVUx z=0qYq0G4|MP``e)OM+Lym)B*uhx0vd>4-)5o

    Q?xOK0I>Jhf7{nA4zh1J}bes#5 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 YE2!mn7O^g-r%^auJZ|DCi&^gf1%E6K#sB~S delta 25512 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 BJM#bl diff --git a/packs_lib/phil/docs/_build/html/.buildinfo b/packs_lib/phil/docs/_build/html/.buildinfo index 2796c608d2..a1098dac2a 100644 --- a/packs_lib/phil/docs/_build/html/.buildinfo +++ b/packs_lib/phil/docs/_build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 77d7c20d44c2f308cba5d4b9ab89e752 +config: d33a20068b563b5dcb3ca40a56dbfc18 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/packs_lib/phil/docs/_build/html/_sources/index.rst.txt b/packs_lib/phil/docs/_build/html/_sources/index.rst.txt index bf5e3f558f..d149859974 100644 --- a/packs_lib/phil/docs/_build/html/_sources/index.rst.txt +++ b/packs_lib/phil/docs/_build/html/_sources/index.rst.txt @@ -13,7 +13,7 @@ phil on SWISH Manual - SWI-Prolog Version Introduction ============ -phil is a suite of programs for reasoning with hierarchical probabilistic logic programs (HPLP) :cite:`NguLamRig17-PLP-IW`. +phil is a suite of programs for reasoning with hierarchical probabilistic logic programs (HPLP) :cite:`fadja2021learning,NguLamRig17-PLP-IW`. It allows both inference and learning. phil is available only for SWI-Prolog. phil is part of cplint on SWISH web application available at ``_. @@ -72,7 +72,7 @@ Other machine learning datasets are available in pack `phil_datasets ])`. diff --git a/packs_lib/phil/docs/_build/html/_static/basic.css b/packs_lib/phil/docs/_build/html/_static/basic.css index 607b5f5582..0807176ec0 100644 --- a/packs_lib/phil/docs/_build/html/_static/basic.css +++ b/packs_lib/phil/docs/_build/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -81,10 +81,26 @@ div.sphinxsidebar input { font-size: 1em; } +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + div.sphinxsidebar #searchbox input[type="text"] { - width: 170px; + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; } +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + img { border: 0; max-width: 100%; @@ -199,6 +215,11 @@ table.modindextable td { /* -- general body styles --------------------------------------------------- */ +div.body { + min-width: 450px; + max-width: 800px; +} + div.body p, div.body dd, div.body li, div.body blockquote { -moz-hyphens: auto; -ms-hyphens: auto; @@ -410,6 +431,13 @@ table.field-list td, table.field-list th { hyphens: manual; } +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist td { + vertical-align: top; +} + + /* -- other body styles ----------------------------------------------------- */ ol.arabic { diff --git a/packs_lib/phil/docs/_build/html/_static/classic.css b/packs_lib/phil/docs/_build/html/_static/classic.css index 1f9c20bcdc..552c8ea90b 100644 --- a/packs_lib/phil/docs/_build/html/_static/classic.css +++ b/packs_lib/phil/docs/_build/html/_static/classic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- classic theme. * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/packs_lib/phil/docs/_build/html/_static/doctools.js b/packs_lib/phil/docs/_build/html/_static/doctools.js index 0c15c0099b..344db17ddb 100644 --- a/packs_lib/phil/docs/_build/html/_static/doctools.js +++ b/packs_lib/phil/docs/_build/html/_static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -70,7 +70,9 @@ jQuery.fn.highlightText = function(text, className) { if (node.nodeType === 3) { var val = node.nodeValue; var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { var span; var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); if (isInSVG) { @@ -148,7 +150,9 @@ var Documentation = { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); - + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } }, /** @@ -308,4 +312,4 @@ _ = Documentation.gettext; $(document).ready(function() { Documentation.init(); -}); \ No newline at end of file +}); diff --git a/packs_lib/phil/docs/_build/html/_static/jquery.js b/packs_lib/phil/docs/_build/html/_static/jquery.js index ba171ca3fd..7e3291082f 100644 --- a/packs_lib/phil/docs/_build/html/_static/jquery.js +++ b/packs_lib/phil/docs/_build/html/_static/jquery.js @@ -1,5 +1,5 @@ /*! - * jQuery JavaScript Library v3.2.1 + * jQuery JavaScript Library v3.3.1-dfsg * https://jquery.com/ * * Includes Sizzle.js @@ -9,7 +9,7 @@ * Released under the MIT license * https://jquery.org/license * - * Date: 2017-09-03T00:14Z + * Date: 2019-04-19T06:52Z */ ( function( global, factory ) { @@ -71,16 +71,57 @@ var ObjectFunctionString = fnToString.call( Object ); var support = {}; +var isFunction = function isFunction( obj ) { + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; - function DOMEval( code, doc ) { + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + + + + var preservedScriptAttributes = { + type: true, + src: true, + noModule: true + }; + + function DOMEval( code, doc, node ) { doc = doc || document; - var script = doc.createElement( "script" ); + var i, + script = doc.createElement( "script" ); script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + if ( node[ i ] ) { + script[ i ] = node[ i ]; + } + } + } doc.head.appendChild( script ).parentNode.removeChild( script ); } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} /* global Symbol */ // Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module @@ -88,7 +129,7 @@ var support = {}; var - version = "3.2.1", + version = "3.3.1", // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -100,16 +141,7 @@ var // Support: Android <=4.0 only // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; jQuery.fn = jQuery.prototype = { @@ -209,7 +241,7 @@ jQuery.extend = jQuery.fn.extend = function() { } // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + if ( typeof target !== "object" && !isFunction( target ) ) { target = {}; } @@ -229,8 +261,9 @@ jQuery.extend = jQuery.fn.extend = function() { src = target[ name ]; copy = options[ name ]; + // Prevent Object.prototype pollution // Prevent never-ending loop - if ( target === copy ) { + if ( name === "__proto__" || target === copy ) { continue; } @@ -275,28 +308,6 @@ jQuery.extend( { noop: function() {}, - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); - }, - isPlainObject: function( obj ) { var proto, Ctor; @@ -330,29 +341,11 @@ jQuery.extend( { return true; }, - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - // Evaluates a script in a global context globalEval: function( code ) { DOMEval( code ); }, - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 13 - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - each: function( obj, callback ) { var length, i = 0; @@ -473,37 +466,6 @@ jQuery.extend( { // A global GUID counter for objects guid: 1, - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support @@ -526,9 +488,9 @@ function isArrayLike( obj ) { // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); + type = toType( obj ); - if ( type === "function" || jQuery.isWindow( obj ) ) { + if ( isFunction( obj ) || isWindow( obj ) ) { return false; } @@ -2848,11 +2810,9 @@ var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>| -var risSimple = /^.[^:#\[\.,]*$/; - // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { + if ( isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { return !!qualifier.call( elem, i, elem ) !== not; } ); @@ -2872,16 +2832,8 @@ function winnow( elements, qualifier, not ) { } ); } - // Simple selector that can be filtered directly, removing non-Elements - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - // Complex selector, compare the two sets, removing non-Elements - qualifier = jQuery.filter( qualifier, elements ); - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; - } ); + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); } jQuery.filter = function( expr, elems, not ) { @@ -3002,7 +2954,7 @@ var rootjQuery, for ( match in context ) { // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { + if ( isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes @@ -3045,7 +2997,7 @@ var rootjQuery, // HANDLE: $(function) // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { + } else if ( isFunction( selector ) ) { return root.ready !== undefined ? root.ready( selector ) : @@ -3360,11 +3312,11 @@ jQuery.Callbacks = function( options ) { ( function add( args ) { jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { + if ( isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + } else if ( arg && arg.length && toType( arg ) !== "string" ) { // Inspect recursively add( arg ); @@ -3479,11 +3431,11 @@ function adoptValue( value, resolve, reject, noValue ) { try { // Check for promise aspect first to privilege synchronous behavior - if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + if ( value && isFunction( ( method = value.promise ) ) ) { method.call( value ).done( resolve ).fail( reject ); // Other thenables - } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + } else if ( value && isFunction( ( method = value.then ) ) ) { method.call( value, resolve, reject ); // Other non-thenables @@ -3541,14 +3493,14 @@ jQuery.extend( { jQuery.each( tuples, function( i, tuple ) { // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; // deferred.progress(function() { bind to newDefer or newDefer.notify }) // deferred.done(function() { bind to newDefer or newDefer.resolve }) // deferred.fail(function() { bind to newDefer or newDefer.reject }) deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { + if ( returned && isFunction( returned.promise ) ) { returned.promise() .progress( newDefer.notify ) .done( newDefer.resolve ) @@ -3602,7 +3554,7 @@ jQuery.extend( { returned.then; // Handle a returned thenable - if ( jQuery.isFunction( then ) ) { + if ( isFunction( then ) ) { // Special processors (notify) just wait for resolution if ( special ) { @@ -3698,7 +3650,7 @@ jQuery.extend( { resolve( 0, newDefer, - jQuery.isFunction( onProgress ) ? + isFunction( onProgress ) ? onProgress : Identity, newDefer.notifyWith @@ -3710,7 +3662,7 @@ jQuery.extend( { resolve( 0, newDefer, - jQuery.isFunction( onFulfilled ) ? + isFunction( onFulfilled ) ? onFulfilled : Identity ) @@ -3721,7 +3673,7 @@ jQuery.extend( { resolve( 0, newDefer, - jQuery.isFunction( onRejected ) ? + isFunction( onRejected ) ? onRejected : Thrower ) @@ -3761,8 +3713,15 @@ jQuery.extend( { // fulfilled_callbacks.disable tuples[ 3 - i ][ 2 ].disable, + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock ); } @@ -3832,7 +3791,7 @@ jQuery.extend( { // Use .then() to unwrap secondary thenables (cf. gh-3000) if ( master.state() === "pending" || - jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { return master.then(); } @@ -3960,7 +3919,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { bulk = key == null; // Sets many values - if ( jQuery.type( key ) === "object" ) { + if ( toType( key ) === "object" ) { chainable = true; for ( i in key ) { access( elems, fn, i, key[ i ], true, emptyGet, raw ); @@ -3970,7 +3929,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { } else if ( value !== undefined ) { chainable = true; - if ( !jQuery.isFunction( value ) ) { + if ( !isFunction( value ) ) { raw = true; } @@ -4012,6 +3971,23 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { return len ? fn( elems[ 0 ], key ) : emptyGet; }; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} var acceptData = function( owner ) { // Accepts only: @@ -4074,14 +4050,14 @@ Data.prototype = { // Handle: [ owner, key, value ] args // Always use camelCase key (gh-2257) if ( typeof data === "string" ) { - cache[ jQuery.camelCase( data ) ] = value; + cache[ camelCase( data ) ] = value; // Handle: [ owner, { properties } ] args } else { // Copy the properties one-by-one to the cache object for ( prop in data ) { - cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + cache[ camelCase( prop ) ] = data[ prop ]; } } return cache; @@ -4091,7 +4067,7 @@ Data.prototype = { this.cache( owner ) : // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; }, access: function( owner, key, value ) { @@ -4139,9 +4115,9 @@ Data.prototype = { // If key is an array of keys... // We always set camelCase keys, so remove that. - key = key.map( jQuery.camelCase ); + key = key.map( camelCase ); } else { - key = jQuery.camelCase( key ); + key = camelCase( key ); // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace @@ -4287,7 +4263,7 @@ jQuery.fn.extend( { if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); + name = camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } @@ -4534,8 +4510,7 @@ var swap = function( elem, options, callback, args ) { function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, + var adjusted, scale, maxIterations = 20, currentValue = tween ? function() { @@ -4553,30 +4528,33 @@ function adjustCSS( elem, prop, valueParts, tween ) { if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + // Trust units reported by jQuery.css unit = unit || initialInUnit[ 3 ]; - // Make sure we update the tween properties later on - valueParts = valueParts || []; - // Iteratively approximate from a nonzero starting point initialInUnit = +initial || 1; - do { + while ( maxIterations-- ) { - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - initialInUnit = initialInUnit / scale; + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; } if ( valueParts ) { @@ -4694,7 +4672,7 @@ var rcheckableType = ( /^(?:checkbox|radio)$/i ); var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); -var rscriptType = ( /^$|\/(?:java|ecma)script/i ); +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); @@ -4776,7 +4754,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) { if ( elem || elem === 0 ) { // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { + if ( toType( elem ) === "object" ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit @@ -5286,7 +5264,7 @@ jQuery.event = { enumerable: true, configurable: true, - get: jQuery.isFunction( hook ) ? + get: isFunction( hook ) ? function() { if ( this.originalEvent ) { return hook( this.originalEvent ); @@ -5421,7 +5399,7 @@ jQuery.Event = function( src, props ) { } // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); + this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed this[ jQuery.expando ] = true; @@ -5620,14 +5598,13 @@ var /* eslint-enable */ - // Support: IE <=10 - 11, Edge 12 - 13 + // Support: IE <=10 - 11, Edge 12 - 13 only // In IE/Edge using regex groups here causes severe slowdowns. // See https://connect.microsoft.com/IE/feedback/details/1736512/ rnoInnerhtml = /\s*$/g; // Prefer a tbody over its parent table for containing new rows @@ -5635,7 +5612,7 @@ function manipulationTarget( elem, content ) { if ( nodeName( elem, "table" ) && nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - return jQuery( ">tbody", elem )[ 0 ] || elem; + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; } return elem; @@ -5647,10 +5624,8 @@ function disableScript( elem ) { return elem; } function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); } else { elem.removeAttribute( "type" ); } @@ -5716,15 +5691,15 @@ function domManip( collection, args, callback, ignored ) { l = collection.length, iNoClone = l - 1, value = args[ 0 ], - isFunction = jQuery.isFunction( value ); + valueIsFunction = isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || + if ( valueIsFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return collection.each( function( index ) { var self = collection.eq( index ); - if ( isFunction ) { + if ( valueIsFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } domManip( self, args, callback, ignored ); @@ -5778,14 +5753,14 @@ function domManip( collection, args, callback, ignored ) { !dataPriv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - if ( node.src ) { + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl ) { jQuery._evalUrl( node.src ); } } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node ); } } } @@ -6065,8 +6040,6 @@ jQuery.each( { return this.pushStack( ret ); }; } ); -var rmargin = ( /^margin/ ); - var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); var getStyles = function( elem ) { @@ -6083,6 +6056,8 @@ var getStyles = function( elem ) { return view.getComputedStyle( elem ); }; +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + ( function() { @@ -6096,25 +6071,33 @@ var getStyles = function( elem ) { return; } + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; div.style.cssText = - "box-sizing:border-box;" + - "position:relative;display:block;" + + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + - "top:1%;width:50%"; - div.innerHTML = ""; - documentElement.appendChild( container ); + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); var divStyle = window.getComputedStyle( div ); pixelPositionVal = divStyle.top !== "1%"; // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = divStyle.marginLeft === "2px"; - boxSizingReliableVal = divStyle.width === "4px"; + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - // Support: Android 4.0 - 4.3 only + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 // Some styles come back with percentage values, even though they shouldn't - div.style.marginRight = "50%"; - pixelMarginRightVal = divStyle.marginRight === "4px"; + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + div.style.position = "absolute"; + scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; documentElement.removeChild( container ); @@ -6123,7 +6106,12 @@ var getStyles = function( elem ) { div = null; } - var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableMarginLeftVal, container = document.createElement( "div" ), div = document.createElement( "div" ); @@ -6138,26 +6126,26 @@ var getStyles = function( elem ) { div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; - container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + - "padding:0;margin-top:1px;position:absolute"; - container.appendChild( div ); - jQuery.extend( support, { - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, boxSizingReliable: function() { computeStyleTests(); return boxSizingReliableVal; }, - pixelMarginRight: function() { + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { computeStyleTests(); - return pixelMarginRightVal; + return pixelPositionVal; }, reliableMarginLeft: function() { computeStyleTests(); return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; } } ); } )(); @@ -6189,7 +6177,7 @@ function curCSS( elem, name, computed ) { // but width seems to be reliably pixels. // This is against the CSSOM draft spec: // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { // Remember the original values width = style.width; @@ -6294,87 +6282,120 @@ function setPositiveNumber( elem, value, subtract ) { value; } -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i, - val = 0; - - // If we already have the right measurement, avoid augmentation - if ( extra === ( isBorderBox ? "border" : "content" ) ) { - i = 4; +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; - // Otherwise initialize for horizontal or vertical properties - } else { - i = name === "width" ? 1 : 0; + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; } for ( ; i < 4; i += 2 ) { - // Both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); } - if ( isBorderBox ) { + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - // At this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" } else { - // At this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } - // At this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } } - return val; + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + ) ); + } + + return delta; } -function getWidthOrHeight( elem, name, extra ) { +function getWidthOrHeight( elem, dimension, extra ) { // Start with computed style - var valueIsBorderBox, - styles = getStyles( elem ), - val = curCSS( elem, name, styles ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + var styles = getStyles( elem ), + val = curCSS( elem, dimension, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox; - // Computed unit is not pixels. Stop here and return. + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. if ( rnumnonpx.test( val ) ) { - return val; + if ( !extra ) { + return val; + } + val = "auto"; } // Check for style in case a browser which returns unreliable values // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && - ( support.boxSizingReliable() || val === elem.style[ name ] ); + valueIsBorderBox = valueIsBorderBox && + ( support.boxSizingReliable() || val === elem.style[ dimension ] ); - // Fall back to offsetWidth/Height when value is "auto" + // Fall back to offsetWidth/offsetHeight when value is "auto" // This happens for inline elements with no explicit setting (gh-3571) - if ( val === "auto" ) { - val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + if ( val === "auto" || + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) { + + val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ]; + + // offsetWidth/offsetHeight provide border-box values + valueIsBorderBox = true; } - // Normalize "", auto, and prepare for extra + // Normalize "" and auto val = parseFloat( val ) || 0; - // Use the active box-sizing model to add/subtract irrelevant styles + // Adjust for the element's box model return ( val + - augmentWidthOrHeight( + boxModelAdjustment( elem, - name, + dimension, extra || ( isBorderBox ? "border" : "content" ), valueIsBorderBox, - styles + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val ) ) + "px"; } @@ -6415,9 +6436,7 @@ jQuery.extend( { // Add in properties whose names you wish to fix before // setting or getting the value - cssProps: { - "float": "cssFloat" - }, + cssProps: {}, // Get and set the style property on a DOM Node style: function( elem, name, value, extra ) { @@ -6429,7 +6448,7 @@ jQuery.extend( { // Make sure that we're working with the right name var ret, type, hooks, - origName = jQuery.camelCase( name ), + origName = camelCase( name ), isCustomProp = rcustomProp.test( name ), style = elem.style; @@ -6497,7 +6516,7 @@ jQuery.extend( { css: function( elem, name, extra, styles ) { var val, num, hooks, - origName = jQuery.camelCase( name ), + origName = camelCase( name ), isCustomProp = rcustomProp.test( name ); // Make sure that we're working with the right name. We don't @@ -6535,8 +6554,8 @@ jQuery.extend( { } } ); -jQuery.each( [ "height", "width" ], function( i, name ) { - jQuery.cssHooks[ name ] = { +jQuery.each( [ "height", "width" ], function( i, dimension ) { + jQuery.cssHooks[ dimension ] = { get: function( elem, computed, extra ) { if ( computed ) { @@ -6552,29 +6571,41 @@ jQuery.each( [ "height", "width" ], function( i, name ) { // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? swap( elem, cssShow, function() { - return getWidthOrHeight( elem, name, extra ); + return getWidthOrHeight( elem, dimension, extra ); } ) : - getWidthOrHeight( elem, name, extra ); + getWidthOrHeight( elem, dimension, extra ); } }, set: function( elem, value, extra ) { var matches, - styles = extra && getStyles( elem ), - subtract = extra && augmentWidthOrHeight( + styles = getStyles( elem ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra && boxModelAdjustment( elem, - name, + dimension, extra, - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + isBorderBox, styles ); + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && support.scrollboxSize() === styles.position ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + // Convert to pixels if value adjustment is needed if ( subtract && ( matches = rcssNum.exec( value ) ) && ( matches[ 3 ] || "px" ) !== "px" ) { - elem.style[ name ] = value; - value = jQuery.css( elem, name ); + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); } return setPositiveNumber( elem, value, subtract ); @@ -6618,7 +6649,7 @@ jQuery.each( { } }; - if ( !rmargin.test( prefix ) ) { + if ( prefix !== "margin" ) { jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; } } ); @@ -6789,7 +6820,7 @@ function createFxNow() { window.setTimeout( function() { fxNow = undefined; } ); - return ( fxNow = jQuery.now() ); + return ( fxNow = Date.now() ); } // Generate parameters to create a standard animation @@ -6893,9 +6924,10 @@ function defaultPrefilter( elem, props, opts ) { // Restrict "overflow" and "display" styles during box animations if ( isBox && elem.nodeType === 1 ) { - // Support: IE <=9 - 11, Edge 12 - 13 + // Support: IE <=9 - 11, Edge 12 - 15 // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; // Identify a display type, preferring old show/hide data over the CSS cascade @@ -7003,7 +7035,7 @@ function propFilter( props, specialEasing ) { // camelCase, specialEasing and expand cssHook pass for ( index in props ) { - name = jQuery.camelCase( index ); + name = camelCase( index ); easing = specialEasing[ name ]; value = props[ index ]; if ( Array.isArray( value ) ) { @@ -7128,9 +7160,9 @@ function Animation( elem, properties, options ) { for ( ; index < length; index++ ) { result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); if ( result ) { - if ( jQuery.isFunction( result.stop ) ) { + if ( isFunction( result.stop ) ) { jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - jQuery.proxy( result.stop, result ); + result.stop.bind( result ); } return result; } @@ -7138,7 +7170,7 @@ function Animation( elem, properties, options ) { jQuery.map( props, createTween, animation ); - if ( jQuery.isFunction( animation.opts.start ) ) { + if ( isFunction( animation.opts.start ) ) { animation.opts.start.call( elem, animation ); } @@ -7171,7 +7203,7 @@ jQuery.Animation = jQuery.extend( Animation, { }, tweener: function( props, callback ) { - if ( jQuery.isFunction( props ) ) { + if ( isFunction( props ) ) { callback = props; props = [ "*" ]; } else { @@ -7203,9 +7235,9 @@ jQuery.Animation = jQuery.extend( Animation, { jQuery.speed = function( speed, easing, fn ) { var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, + isFunction( speed ) && speed, duration: speed, - easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + easing: fn && easing || easing && !isFunction( easing ) && easing }; // Go to the end state if fx are off @@ -7232,7 +7264,7 @@ jQuery.speed = function( speed, easing, fn ) { opt.old = opt.complete; opt.complete = function() { - if ( jQuery.isFunction( opt.old ) ) { + if ( isFunction( opt.old ) ) { opt.old.call( this ); } @@ -7396,7 +7428,7 @@ jQuery.fx.tick = function() { i = 0, timers = jQuery.timers; - fxNow = jQuery.now(); + fxNow = Date.now(); for ( ; i < timers.length; i++ ) { timer = timers[ i ]; @@ -7749,7 +7781,7 @@ jQuery.each( [ // Strip and collapse whitespace according to HTML spec - // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace function stripAndCollapse( value ) { var tokens = value.match( rnothtmlwhite ) || []; return tokens.join( " " ); @@ -7760,20 +7792,30 @@ function getClass( elem ) { return elem.getAttribute && elem.getAttribute( "class" ) || ""; } +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + jQuery.fn.extend( { addClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; - if ( jQuery.isFunction( value ) ) { + if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); } ); } - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; + classes = classesToArray( value ); + if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); @@ -7802,7 +7844,7 @@ jQuery.fn.extend( { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; - if ( jQuery.isFunction( value ) ) { + if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); } ); @@ -7812,9 +7854,9 @@ jQuery.fn.extend( { return this.attr( "class", "" ); } - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; + classes = classesToArray( value ); + if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); @@ -7844,13 +7886,14 @@ jQuery.fn.extend( { }, toggleClass: function( value, stateVal ) { - var type = typeof value; + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); - if ( typeof stateVal === "boolean" && type === "string" ) { + if ( typeof stateVal === "boolean" && isValidValue ) { return stateVal ? this.addClass( value ) : this.removeClass( value ); } - if ( jQuery.isFunction( value ) ) { + if ( isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( value.call( this, i, getClass( this ), stateVal ), @@ -7862,12 +7905,12 @@ jQuery.fn.extend( { return this.each( function() { var className, i, self, classNames; - if ( type === "string" ) { + if ( isValidValue ) { // Toggle individual class names i = 0; self = jQuery( this ); - classNames = value.match( rnothtmlwhite ) || []; + classNames = classesToArray( value ); while ( ( className = classNames[ i++ ] ) ) { @@ -7926,7 +7969,7 @@ var rreturn = /\r/g; jQuery.fn.extend( { val: function( value ) { - var hooks, ret, isFunction, + var hooks, ret, valueIsFunction, elem = this[ 0 ]; if ( !arguments.length ) { @@ -7955,7 +7998,7 @@ jQuery.fn.extend( { return; } - isFunction = jQuery.isFunction( value ); + valueIsFunction = isFunction( value ); return this.each( function( i ) { var val; @@ -7964,7 +8007,7 @@ jQuery.fn.extend( { return; } - if ( isFunction ) { + if ( valueIsFunction ) { val = value.call( this, i, jQuery( this ).val() ); } else { val = value; @@ -8106,18 +8149,24 @@ jQuery.each( [ "radio", "checkbox" ], function() { // Return jQuery for attributes-only inclusion -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; jQuery.extend( jQuery.event, { trigger: function( event, data, elem, onlyHandlers ) { - var i, cur, tmp, bubbleType, ontype, handle, special, + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - cur = tmp = elem = elem || document; + cur = lastElement = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { @@ -8169,7 +8218,7 @@ jQuery.extend( jQuery.event, { // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { @@ -8189,7 +8238,7 @@ jQuery.extend( jQuery.event, { // Fire handlers on the event path i = 0; while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - + lastElement = cur; event.type = i > 1 ? bubbleType : special.bindType || type; @@ -8221,7 +8270,7 @@ jQuery.extend( jQuery.event, { // Call a native DOM method on the target with the same name as the event. // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; @@ -8232,7 +8281,17 @@ jQuery.extend( jQuery.event, { // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + jQuery.event.triggered = undefined; if ( tmp ) { @@ -8278,31 +8337,6 @@ jQuery.fn.extend( { } ); -jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup contextmenu" ).split( " " ), - function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; -} ); - -jQuery.fn.extend( { - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -} ); - - - - -support.focusin = "onfocusin" in window; - - // Support: Firefox <=44 // Firefox doesn't have focus(in | out) events // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 @@ -8346,7 +8380,7 @@ if ( !support.focusin ) { } var location = window.location; -var nonce = jQuery.now(); +var nonce = Date.now(); var rquery = ( /\?/ ); @@ -8404,7 +8438,7 @@ function buildParams( prefix, obj, traditional, add ) { } } ); - } else if ( !traditional && jQuery.type( obj ) === "object" ) { + } else if ( !traditional && toType( obj ) === "object" ) { // Serialize object item. for ( name in obj ) { @@ -8426,7 +8460,7 @@ jQuery.param = function( a, traditional ) { add = function( key, valueOrFunction ) { // If value is a function, invoke it and use its return value - var value = jQuery.isFunction( valueOrFunction ) ? + var value = isFunction( valueOrFunction ) ? valueOrFunction() : valueOrFunction; @@ -8544,7 +8578,7 @@ function addToPrefiltersOrTransports( structure ) { i = 0, dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - if ( jQuery.isFunction( func ) ) { + if ( isFunction( func ) ) { // For each dataType in the dataTypeExpression while ( ( dataType = dataTypes[ i++ ] ) ) { @@ -9016,7 +9050,7 @@ jQuery.extend( { if ( s.crossDomain == null ) { urlAnchor = document.createElement( "a" ); - // Support: IE <=8 - 11, Edge 12 - 13 + // Support: IE <=8 - 11, Edge 12 - 15 // IE throws exception on accessing the href property if url is malformed, // e.g. http://example.com:80x/ try { @@ -9074,8 +9108,8 @@ jQuery.extend( { // Remember the hash so we can put it back uncached = s.url.slice( cacheURL.length ); - // If data is available, append data to url - if ( s.data ) { + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; // #9682: remove data so that it's not used in an eventual retry @@ -9312,7 +9346,7 @@ jQuery.each( [ "get", "post" ], function( i, method ) { jQuery[ method ] = function( url, data, callback, type ) { // Shift arguments if data argument was omitted - if ( jQuery.isFunction( data ) ) { + if ( isFunction( data ) ) { type = type || callback; callback = data; data = undefined; @@ -9350,7 +9384,7 @@ jQuery.fn.extend( { var wrap; if ( this[ 0 ] ) { - if ( jQuery.isFunction( html ) ) { + if ( isFunction( html ) ) { html = html.call( this[ 0 ] ); } @@ -9376,7 +9410,7 @@ jQuery.fn.extend( { }, wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { + if ( isFunction( html ) ) { return this.each( function( i ) { jQuery( this ).wrapInner( html.call( this, i ) ); } ); @@ -9396,10 +9430,10 @@ jQuery.fn.extend( { }, wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); + var htmlIsFunction = isFunction( html ); return this.each( function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); } ); }, @@ -9491,7 +9525,8 @@ jQuery.ajaxTransport( function( options ) { return function() { if ( callback ) { callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; if ( type === "abort" ) { xhr.abort(); @@ -9531,7 +9566,7 @@ jQuery.ajaxTransport( function( options ) { // Listen to events xhr.onload = callback(); - errorCallback = xhr.onerror = callback( "error" ); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); // Support: IE 9 only // Use onreadystatechange to replace onabort @@ -9685,7 +9720,7 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { // Get callback name, remembering preexisting value associated with it - callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? + callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback; @@ -9736,7 +9771,7 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { } // Call if it was a function and we have a response - if ( responseContainer && jQuery.isFunction( overwritten ) ) { + if ( responseContainer && isFunction( overwritten ) ) { overwritten( responseContainer[ 0 ] ); } @@ -9828,7 +9863,7 @@ jQuery.fn.load = function( url, params, callback ) { } // If it's a function - if ( jQuery.isFunction( params ) ) { + if ( isFunction( params ) ) { // We assume that it's the callback callback = params; @@ -9936,7 +9971,7 @@ jQuery.offset = { curLeft = parseFloat( curCSSLeft ) || 0; } - if ( jQuery.isFunction( options ) ) { + if ( isFunction( options ) ) { // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); @@ -9959,6 +9994,8 @@ jQuery.offset = { }; jQuery.fn.extend( { + + // offset() relates an element's border box to the document origin offset: function( options ) { // Preserve chaining for setter @@ -9970,7 +10007,7 @@ jQuery.fn.extend( { } ); } - var doc, docElem, rect, win, + var rect, win, elem = this[ 0 ]; if ( !elem ) { @@ -9985,50 +10022,52 @@ jQuery.fn.extend( { return { top: 0, left: 0 }; } + // Get document-relative position by adding viewport scroll to viewport-relative gBCR rect = elem.getBoundingClientRect(); - - doc = elem.ownerDocument; - docElem = doc.documentElement; - win = doc.defaultView; - + win = elem.ownerDocument.defaultView; return { - top: rect.top + win.pageYOffset - docElem.clientTop, - left: rect.left + win.pageXOffset - docElem.clientLeft + top: rect.top + win.pageYOffset, + left: rect.left + win.pageXOffset }; }, + // position() relates an element's margin box to its offset parent's padding box + // This corresponds to the behavior of CSS absolute positioning position: function() { if ( !this[ 0 ] ) { return; } - var offsetParent, offset, + var offsetParent, offset, doc, elem = this[ 0 ], parentOffset = { top: 0, left: 0 }; - // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, - // because it is its only offset parent + // position:fixed elements are offset from the viewport, which itself always has zero offset if ( jQuery.css( elem, "position" ) === "fixed" ) { - // Assume getBoundingClientRect is there when computed position is fixed + // Assume position:fixed implies availability of getBoundingClientRect offset = elem.getBoundingClientRect(); } else { + offset = this.offset(); - // Get *real* offsetParent - offsetParent = this.offsetParent(); + // Account for the *real* offset parent, which can be the document or its root element + // when a statically positioned element is identified + doc = elem.ownerDocument; + offsetParent = elem.offsetParent || doc.documentElement; + while ( offsetParent && + ( offsetParent === doc.body || offsetParent === doc.documentElement ) && + jQuery.css( offsetParent, "position" ) === "static" ) { - // Get correct offsets - offset = this.offset(); - if ( !nodeName( offsetParent[ 0 ], "html" ) ) { - parentOffset = offsetParent.offset(); + offsetParent = offsetParent.parentNode; } + if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { - // Add offsetParent borders - parentOffset = { - top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ), - left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ) - }; + // Incorporate borders into its offset, since they are outside its content origin + parentOffset = jQuery( offsetParent ).offset(); + parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); + parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); + } } // Subtract parent offsets and element margins @@ -10070,7 +10109,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( // Coalesce documents and windows var win; - if ( jQuery.isWindow( elem ) ) { + if ( isWindow( elem ) ) { win = elem; } else if ( elem.nodeType === 9 ) { win = elem.defaultView; @@ -10128,7 +10167,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { return access( this, function( elem, type, value ) { var doc; - if ( jQuery.isWindow( elem ) ) { + if ( isWindow( elem ) ) { // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) return funcName.indexOf( "outer" ) === 0 ? @@ -10162,6 +10201,28 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { } ); +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + jQuery.fn.extend( { bind: function( types, data, fn ) { @@ -10183,6 +10244,37 @@ jQuery.fn.extend( { } } ); +// Bind a function to a context, optionally partially applying any +// arguments. +// jQuery.proxy is deprecated to promote standards (specifically Function#bind) +// However, it is not slated for removal any time soon +jQuery.proxy = function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; +}; + jQuery.holdReady = function( hold ) { if ( hold ) { jQuery.readyWait++; @@ -10193,6 +10285,26 @@ jQuery.holdReady = function( hold ) { jQuery.isArray = Array.isArray; jQuery.parseJSON = JSON.parse; jQuery.nodeName = nodeName; +jQuery.isFunction = isFunction; +jQuery.isWindow = isWindow; +jQuery.camelCase = camelCase; +jQuery.type = toType; + +jQuery.now = Date.now; + +jQuery.isNumeric = function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); +}; diff --git a/packs_lib/phil/docs/_build/html/_static/searchtools.js b/packs_lib/phil/docs/_build/html/_static/searchtools.js index 41b8336776..5ff318066d 100644 --- a/packs_lib/phil/docs/_build/html/_static/searchtools.js +++ b/packs_lib/phil/docs/_build/html/_static/searchtools.js @@ -1,331 +1,52 @@ /* - * searchtools.js_t + * searchtools.js * ~~~~~~~~~~~~~~~~ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ - -/* Non-minified version JS is _stemmer.js if file is provided */ -/** - * Porter Stemmer - */ -var Stemmer = function() { - - var step2list = { - ational: 'ate', - tional: 'tion', - enci: 'ence', - anci: 'ance', - izer: 'ize', - bli: 'ble', - alli: 'al', - entli: 'ent', - eli: 'e', - ousli: 'ous', - ization: 'ize', - ation: 'ate', - ator: 'ate', - alism: 'al', - iveness: 'ive', - fulness: 'ful', - ousness: 'ous', - aliti: 'al', - iviti: 'ive', - biliti: 'ble', - logi: 'log' - }; - - var step3list = { - icate: 'ic', - ative: '', - alize: 'al', - iciti: 'ic', - ical: 'ic', - ful: '', - ness: '' +if (!Scorer) { + /** + * Simple result scoring code. + */ + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [filename, title, anchor, descr, score] + // and returns the new score. + /* + score: function(result) { + return result[4]; + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: {0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5}, // used to be unimportantResults + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + // query found in terms + term: 5 }; - - var c = "[^aeiou]"; // consonant - var v = "[aeiouy]"; // vowel - var C = c + "[^aeiouy]*"; // consonant sequence - var V = v + "[aeiou]*"; // vowel sequence - - var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 - var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 - var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 - var s_v = "^(" + C + ")?" + v; // vowel in stem - - this.stemWord = function (w) { - var stem; - var suffix; - var firstch; - var origword = w; - - if (w.length < 3) - return w; - - var re; - var re2; - var re3; - var re4; - - firstch = w.substr(0,1); - if (firstch == "y") - w = firstch.toUpperCase() + w.substr(1); - - // Step 1a - re = /^(.+?)(ss|i)es$/; - re2 = /^(.+?)([^s])s$/; - - if (re.test(w)) - w = w.replace(re,"$1$2"); - else if (re2.test(w)) - w = w.replace(re2,"$1$2"); - - // Step 1b - re = /^(.+?)eed$/; - re2 = /^(.+?)(ed|ing)$/; - if (re.test(w)) { - var fp = re.exec(w); - re = new RegExp(mgr0); - if (re.test(fp[1])) { - re = /.$/; - w = w.replace(re,""); - } - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1]; - re2 = new RegExp(s_v); - if (re2.test(stem)) { - w = stem; - re2 = /(at|bl|iz)$/; - re3 = new RegExp("([^aeiouylsz])\\1$"); - re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re2.test(w)) - w = w + "e"; - else if (re3.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - else if (re4.test(w)) - w = w + "e"; - } - } - - // Step 1c - re = /^(.+?)y$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(s_v); - if (re.test(stem)) - w = stem + "i"; - } - - // Step 2 - re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step2list[suffix]; - } - - // Step 3 - re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step3list[suffix]; - } - - // Step 4 - re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; - re2 = /^(.+?)(s|t)(ion)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - if (re.test(stem)) - w = stem; - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1] + fp[2]; - re2 = new RegExp(mgr1); - if (re2.test(stem)) - w = stem; - } - - // Step 5 - re = /^(.+?)e$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - re2 = new RegExp(meq1); - re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) - w = stem; - } - re = /ll$/; - re2 = new RegExp(mgr1); - if (re.test(w) && re2.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - - // and turn initial Y back to y - if (firstch == "y") - w = firstch.toLowerCase() + w.substr(1); - return w; - } } - - -/** - * Simple result scoring code. - */ -var Scorer = { - // Implement the following function to further tweak the score for each result - // The function takes a result array [filename, title, anchor, descr, score] - // and returns the new score. - /* - score: function(result) { - return result[4]; - }, - */ - - // query matches the full name of an object - objNameMatch: 11, - // or matches in the last dotted part of the object name - objPartialMatch: 6, - // Additive scores depending on the priority of the object - objPrio: {0: 15, // used to be importantResults - 1: 5, // used to be objectResults - 2: -5}, // used to be unimportantResults - // Used when the priority is not in the mapping. - objPrioDefault: 0, - - // query found in title - title: 15, - // query found in terms - term: 5 -}; - - - - - -var splitChars = (function() { - var result = {}; - var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, - 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702, - 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971, - 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345, - 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761, - 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823, - 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125, - 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695, - 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587, - 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141]; - var i, j, start, end; - for (i = 0; i < singles.length; i++) { - result[singles[i]] = true; - } - var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709], - [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161], - [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568], - [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807], - [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047], - [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383], - [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450], - [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547], - [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673], - [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820], - [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946], - [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023], - [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173], - [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332], - [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481], - [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718], - [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791], - [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095], - [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205], - [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687], - [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968], - [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869], - [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102], - [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271], - [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592], - [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822], - [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167], - [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959], - [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143], - [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318], - [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483], - [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101], - [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567], - [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292], - [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444], - [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783], - [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311], - [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511], - [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774], - [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071], - [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263], - [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519], - [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647], - [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967], - [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295], - [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274], - [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007], - [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381], - [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]]; - for (i = 0; i < ranges.length; i++) { - start = ranges[i][0]; - end = ranges[i][1]; - for (j = start; j <= end; j++) { - result[j] = true; - } - } - return result; -})(); - -function splitQuery(query) { - var result = []; - var start = -1; - for (var i = 0; i < query.length; i++) { - if (splitChars[query.charCodeAt(i)]) { - if (start !== -1) { - result.push(query.slice(start, i)); - start = -1; - } - } else if (start === -1) { - start = i; - } - } - if (start !== -1) { - result.push(query.slice(start)); - } - return result; +if (!splitQuery) { + function splitQuery(query) { + return query.split(/\s+/); + } } - - - /** * Search Module */ @@ -417,7 +138,6 @@ var Search = { */ query : function(query) { var i; - var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"]; // stem the searchterms and add them to the correct list var stemmer = new Stemmer(); @@ -758,4 +478,4 @@ var Search = { $(document).ready(function() { Search.init(); -}); \ No newline at end of file +}); diff --git a/packs_lib/phil/docs/_build/html/_static/sidebar.js b/packs_lib/phil/docs/_build/html/_static/sidebar.js index dfbfb05cdc..686ca396d1 100644 --- a/packs_lib/phil/docs/_build/html/_static/sidebar.js +++ b/packs_lib/phil/docs/_build/html/_static/sidebar.js @@ -16,7 +16,7 @@ * Once the browser is closed the cookie is deleted and the position * reset to the default (expanded). * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/packs_lib/phil/docs/_build/html/_static/underscore.js b/packs_lib/phil/docs/_build/html/_static/underscore.js index b29332f945..709ae8e30b 100644 --- a/packs_lib/phil/docs/_build/html/_static/underscore.js +++ b/packs_lib/phil/docs/_build/html/_static/underscore.js @@ -1,6 +1,6 @@ -// Underscore.js 1.8.3 +// Underscore.js 1.9.1 // http://underscorejs.org -// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license. (function() { @@ -8,29 +8,32 @@ // Baseline setup // -------------- - // Establish the root object, `window` in the browser, or `exports` on the server. - var root = this; + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = typeof self == 'object' && self.self === self && self || + typeof global == 'object' && global.global === global && global || + this || + {}; // Save the previous value of the `_` variable. var previousUnderscore = root._; // Save bytes in the minified (but not gzipped) version: - var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; // Create quick reference variables for speed access to core prototypes. - var - push = ArrayProto.push, - slice = ArrayProto.slice, - toString = ObjProto.toString, - hasOwnProperty = ObjProto.hasOwnProperty; + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; // All **ECMAScript 5** native function implementations that we hope to use // are declared here. - var - nativeIsArray = Array.isArray, - nativeKeys = Object.keys, - nativeBind = FuncProto.bind, - nativeCreate = Object.create; + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create; // Naked function reference for surrogate-prototype-swapping. var Ctor = function(){}; @@ -43,10 +46,12 @@ }; // Export the Underscore object for **Node.js**, with - // backwards-compatibility for the old `require()` API. If we're in + // backwards-compatibility for their old module API. If we're in // the browser, add `_` as a global object. - if (typeof exports !== 'undefined') { - if (typeof module !== 'undefined' && module.exports) { + // (`nodeType` is checked to ensure that `module` + // and `exports` are not HTML elements.) + if (typeof exports != 'undefined' && !exports.nodeType) { + if (typeof module != 'undefined' && !module.nodeType && module.exports) { exports = module.exports = _; } exports._ = _; @@ -55,7 +60,7 @@ } // Current version. - _.VERSION = '1.8.3'; + _.VERSION = '1.9.1'; // Internal function that returns an efficient (for current engines) version // of the passed-in callback, to be repeatedly applied in other Underscore @@ -66,9 +71,7 @@ case 1: return function(value) { return func.call(context, value); }; - case 2: return function(value, other) { - return func.call(context, value, other); - }; + // The 2-argument case is omitted because we’re not using it. case 3: return function(value, index, collection) { return func.call(context, value, index, collection); }; @@ -81,34 +84,51 @@ }; }; - // A mostly-internal function to generate callbacks that can be applied - // to each element in a collection, returning the desired result — either - // identity, an arbitrary callback, a property matcher, or a property accessor. + var builtinIteratee; + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `identity`, + // an arbitrary callback, a property matcher, or a property accessor. var cb = function(value, context, argCount) { + if (_.iteratee !== builtinIteratee) return _.iteratee(value, context); if (value == null) return _.identity; if (_.isFunction(value)) return optimizeCb(value, context, argCount); - if (_.isObject(value)) return _.matcher(value); + if (_.isObject(value) && !_.isArray(value)) return _.matcher(value); return _.property(value); }; - _.iteratee = function(value, context) { + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only argCount argument. + _.iteratee = builtinIteratee = function(value, context) { return cb(value, context, Infinity); }; - // An internal function for creating assigner functions. - var createAssigner = function(keysFunc, undefinedOnly) { - return function(obj) { - var length = arguments.length; - if (length < 2 || obj == null) return obj; - for (var index = 1; index < length; index++) { - var source = arguments[index], - keys = keysFunc(source), - l = keys.length; - for (var i = 0; i < l; i++) { - var key = keys[i]; - if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; - } + // Some functions take a variable number of arguments, or a few expected + // arguments at the beginning and then a variable number of values to operate + // on. This helper accumulates all remaining arguments past the function’s + // argument length (or an explicit `startIndex`), into an array that becomes + // the last argument. Similar to ES6’s "rest parameter". + var restArguments = function(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; } - return obj; + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); }; }; @@ -122,18 +142,31 @@ return result; }; - var property = function(key) { + var shallowProperty = function(key) { return function(obj) { return obj == null ? void 0 : obj[key]; }; }; + var has = function(obj, path) { + return obj != null && hasOwnProperty.call(obj, path); + } + + var deepGet = function(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + }; + // Helper for collection methods to determine whether a collection - // should be iterated as an array or as an object + // should be iterated as an array or as an object. // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; - var getLength = property('length'); + var getLength = shallowProperty('length'); var isArrayLike = function(collection) { var length = getLength(collection); return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; @@ -175,30 +208,29 @@ }; // Create a reducing function iterating left or right. - function createReduce(dir) { - // Optimized iterator function as using arguments.length - // in the main function will deoptimize the, see #1991. - function iterator(obj, iteratee, memo, keys, index, length) { + var createReduce = function(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[keys ? keys[index] : index]; + index += dir; + } for (; index >= 0 && index < length; index += dir) { var currentKey = keys ? keys[index] : index; memo = iteratee(memo, obj[currentKey], currentKey, obj); } return memo; - } + }; return function(obj, iteratee, memo, context) { - iteratee = optimizeCb(iteratee, context, 4); - var keys = !isArrayLike(obj) && _.keys(obj), - length = (keys || obj).length, - index = dir > 0 ? 0 : length - 1; - // Determine the initial value if none is provided. - if (arguments.length < 3) { - memo = obj[keys ? keys[index] : index]; - index += dir; - } - return iterator(obj, iteratee, memo, keys, index, length); + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); }; - } + }; // **Reduce** builds up a single result from a list of values, aka `inject`, // or `foldl`. @@ -209,12 +241,8 @@ // Return the first value which passes a truth test. Aliased as `detect`. _.find = _.detect = function(obj, predicate, context) { - var key; - if (isArrayLike(obj)) { - key = _.findIndex(obj, predicate, context); - } else { - key = _.findKey(obj, predicate, context); - } + var keyFinder = isArrayLike(obj) ? _.findIndex : _.findKey; + var key = keyFinder(obj, predicate, context); if (key !== void 0 && key !== -1) return obj[key]; }; @@ -269,14 +297,26 @@ }; // Invoke a method (with arguments) on every item in a collection. - _.invoke = function(obj, method) { - var args = slice.call(arguments, 2); - var isFunc = _.isFunction(method); - return _.map(obj, function(value) { - var func = isFunc ? method : value[method]; - return func == null ? func : func.apply(value, args); + _.invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (_.isFunction(path)) { + func = path; + } else if (_.isArray(path)) { + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return _.map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); }); - }; + }); // Convenience version of a common use case of `map`: fetching a property. _.pluck = function(obj, key) { @@ -299,20 +339,20 @@ _.max = function(obj, iteratee, context) { var result = -Infinity, lastComputed = -Infinity, value, computed; - if (iteratee == null && obj != null) { + if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { obj = isArrayLike(obj) ? obj : _.values(obj); for (var i = 0, length = obj.length; i < length; i++) { value = obj[i]; - if (value > result) { + if (value != null && value > result) { result = value; } } } else { iteratee = cb(iteratee, context); - _.each(obj, function(value, index, list) { - computed = iteratee(value, index, list); + _.each(obj, function(v, index, list) { + computed = iteratee(v, index, list); if (computed > lastComputed || computed === -Infinity && result === -Infinity) { - result = value; + result = v; lastComputed = computed; } }); @@ -324,20 +364,20 @@ _.min = function(obj, iteratee, context) { var result = Infinity, lastComputed = Infinity, value, computed; - if (iteratee == null && obj != null) { + if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { obj = isArrayLike(obj) ? obj : _.values(obj); for (var i = 0, length = obj.length; i < length; i++) { value = obj[i]; - if (value < result) { + if (value != null && value < result) { result = value; } } } else { iteratee = cb(iteratee, context); - _.each(obj, function(value, index, list) { - computed = iteratee(value, index, list); + _.each(obj, function(v, index, list) { + computed = iteratee(v, index, list); if (computed < lastComputed || computed === Infinity && result === Infinity) { - result = value; + result = v; lastComputed = computed; } }); @@ -345,21 +385,13 @@ return result; }; - // Shuffle a collection, using the modern version of the - // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // Shuffle a collection. _.shuffle = function(obj) { - var set = isArrayLike(obj) ? obj : _.values(obj); - var length = set.length; - var shuffled = Array(length); - for (var index = 0, rand; index < length; index++) { - rand = _.random(0, index); - if (rand !== index) shuffled[index] = shuffled[rand]; - shuffled[rand] = set[index]; - } - return shuffled; + return _.sample(obj, Infinity); }; - // Sample **n** random values from a collection. + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). // If **n** is not specified, returns a single random element. // The internal `guard` argument allows it to work with `map`. _.sample = function(obj, n, guard) { @@ -367,17 +399,28 @@ if (!isArrayLike(obj)) obj = _.values(obj); return obj[_.random(obj.length - 1)]; } - return _.shuffle(obj).slice(0, Math.max(0, n)); + var sample = isArrayLike(obj) ? _.clone(obj) : _.values(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = _.random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); }; // Sort the object's values by a criterion produced by an iteratee. _.sortBy = function(obj, iteratee, context) { + var index = 0; iteratee = cb(iteratee, context); - return _.pluck(_.map(obj, function(value, index, list) { + return _.pluck(_.map(obj, function(value, key, list) { return { value: value, - index: index, - criteria: iteratee(value, index, list) + index: index++, + criteria: iteratee(value, key, list) }; }).sort(function(left, right) { var a = left.criteria; @@ -391,9 +434,9 @@ }; // An internal function used for aggregate "group by" operations. - var group = function(behavior) { + var group = function(behavior, partition) { return function(obj, iteratee, context) { - var result = {}; + var result = partition ? [[], []] : {}; iteratee = cb(iteratee, context); _.each(obj, function(value, index) { var key = iteratee(value, index, obj); @@ -406,7 +449,7 @@ // Groups the object's values by a criterion. Pass either a string attribute // to group by, or a function that returns the criterion. _.groupBy = group(function(result, value, key) { - if (_.has(result, key)) result[key].push(value); else result[key] = [value]; + if (has(result, key)) result[key].push(value); else result[key] = [value]; }); // Indexes the object's values by a criterion, similar to `groupBy`, but for @@ -419,13 +462,18 @@ // either a string attribute to count by, or a function that returns the // criterion. _.countBy = group(function(result, value, key) { - if (_.has(result, key)) result[key]++; else result[key] = 1; + if (has(result, key)) result[key]++; else result[key] = 1; }); + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; // Safely create a real, live array from anything iterable. _.toArray = function(obj) { if (!obj) return []; if (_.isArray(obj)) return slice.call(obj); + if (_.isString(obj)) { + // Keep surrogate pair characters together + return obj.match(reStrSymbol); + } if (isArrayLike(obj)) return _.map(obj, _.identity); return _.values(obj); }; @@ -438,14 +486,9 @@ // Split a collection into two arrays: one whose elements all satisfy the given // predicate, and one whose elements all do not satisfy the predicate. - _.partition = function(obj, predicate, context) { - predicate = cb(predicate, context); - var pass = [], fail = []; - _.each(obj, function(value, key, obj) { - (predicate(value, key, obj) ? pass : fail).push(value); - }); - return [pass, fail]; - }; + _.partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); // Array Functions // --------------- @@ -454,7 +497,7 @@ // values in the array. Aliased as `head` and `take`. The **guard** check // allows it to work with `_.map`. _.first = _.head = _.take = function(array, n, guard) { - if (array == null) return void 0; + if (array == null || array.length < 1) return n == null ? void 0 : []; if (n == null || guard) return array[0]; return _.initial(array, array.length - n); }; @@ -469,7 +512,7 @@ // Get the last element of an array. Passing **n** will return the last N // values in the array. _.last = function(array, n, guard) { - if (array == null) return void 0; + if (array == null || array.length < 1) return n == null ? void 0 : []; if (n == null || guard) return array[array.length - 1]; return _.rest(array, Math.max(0, array.length - n)); }; @@ -483,21 +526,23 @@ // Trim out all falsy values from an array. _.compact = function(array) { - return _.filter(array, _.identity); + return _.filter(array, Boolean); }; // Internal implementation of a recursive `flatten` function. - var flatten = function(input, shallow, strict, startIndex) { - var output = [], idx = 0; - for (var i = startIndex || 0, length = getLength(input); i < length; i++) { + var flatten = function(input, shallow, strict, output) { + output = output || []; + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { var value = input[i]; if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { - //flatten current level of array or arguments object - if (!shallow) value = flatten(value, shallow, strict); - var j = 0, len = value.length; - output.length += len; - while (j < len) { - output[idx++] = value[j++]; + // Flatten current level of array or arguments object. + if (shallow) { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } else { + flatten(value, shallow, strict, output); + idx = output.length; } } else if (!strict) { output[idx++] = value; @@ -512,12 +557,15 @@ }; // Return a version of the array that does not contain the specified value(s). - _.without = function(array) { - return _.difference(array, slice.call(arguments, 1)); - }; + _.without = restArguments(function(array, otherArrays) { + return _.difference(array, otherArrays); + }); // Produce a duplicate-free version of the array. If the array has already // been sorted, you have the option of using a faster algorithm. + // The faster algorithm will not work with an iteratee if the iteratee + // is not a one-to-one function, so providing an iteratee will disable + // the faster algorithm. // Aliased as `unique`. _.uniq = _.unique = function(array, isSorted, iteratee, context) { if (!_.isBoolean(isSorted)) { @@ -531,7 +579,7 @@ for (var i = 0, length = getLength(array); i < length; i++) { var value = array[i], computed = iteratee ? iteratee(value, i, array) : value; - if (isSorted) { + if (isSorted && !iteratee) { if (!i || seen !== computed) result.push(value); seen = computed; } else if (iteratee) { @@ -548,9 +596,9 @@ // Produce an array that contains the union: each distinct element from all of // the passed-in arrays. - _.union = function() { - return _.uniq(flatten(arguments, true, true)); - }; + _.union = restArguments(function(arrays) { + return _.uniq(flatten(arrays, true, true)); + }); // Produce an array that contains every item shared between all the // passed-in arrays. @@ -560,7 +608,8 @@ for (var i = 0, length = getLength(array); i < length; i++) { var item = array[i]; if (_.contains(result, item)) continue; - for (var j = 1; j < argsLength; j++) { + var j; + for (j = 1; j < argsLength; j++) { if (!_.contains(arguments[j], item)) break; } if (j === argsLength) result.push(item); @@ -570,21 +619,15 @@ // Take the difference between one array and a number of other arrays. // Only the elements present in just the first array will remain. - _.difference = function(array) { - var rest = flatten(arguments, true, true, 1); + _.difference = restArguments(function(array, rest) { + rest = flatten(rest, true, true); return _.filter(array, function(value){ return !_.contains(rest, value); }); - }; - - // Zip together multiple lists into a single array -- elements that share - // an index go together. - _.zip = function() { - return _.unzip(arguments); - }; + }); // Complement of _.zip. Unzip accepts an array of arrays and groups - // each array's elements on shared indices + // each array's elements on shared indices. _.unzip = function(array) { var length = array && _.max(array, getLength).length || 0; var result = Array(length); @@ -595,9 +638,13 @@ return result; }; + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = restArguments(_.unzip); + // Converts lists into objects. Pass either a single array of `[key, value]` // pairs, or two parallel arrays of the same length -- one of keys, and one of - // the corresponding values. + // the corresponding values. Passing by pairs is the reverse of _.pairs. _.object = function(list, values) { var result = {}; for (var i = 0, length = getLength(list); i < length; i++) { @@ -610,8 +657,8 @@ return result; }; - // Generator function to create the findIndex and findLastIndex functions - function createPredicateIndexFinder(dir) { + // Generator function to create the findIndex and findLastIndex functions. + var createPredicateIndexFinder = function(dir) { return function(array, predicate, context) { predicate = cb(predicate, context); var length = getLength(array); @@ -621,9 +668,9 @@ } return -1; }; - } + }; - // Returns the first index on an array-like that passes a predicate test + // Returns the first index on an array-like that passes a predicate test. _.findIndex = createPredicateIndexFinder(1); _.findLastIndex = createPredicateIndexFinder(-1); @@ -640,15 +687,15 @@ return low; }; - // Generator function to create the indexOf and lastIndexOf functions - function createIndexFinder(dir, predicateFind, sortedIndex) { + // Generator function to create the indexOf and lastIndexOf functions. + var createIndexFinder = function(dir, predicateFind, sortedIndex) { return function(array, item, idx) { var i = 0, length = getLength(array); if (typeof idx == 'number') { if (dir > 0) { - i = idx >= 0 ? idx : Math.max(idx + length, i); + i = idx >= 0 ? idx : Math.max(idx + length, i); } else { - length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; } } else if (sortedIndex && idx && length) { idx = sortedIndex(array, item); @@ -663,7 +710,7 @@ } return -1; }; - } + }; // Return the position of the first occurrence of an item in an array, // or -1 if the item is not included in the array. @@ -680,7 +727,9 @@ stop = start || 0; start = 0; } - step = step || 1; + if (!step) { + step = stop < start ? -1 : 1; + } var length = Math.max(Math.ceil((stop - start) / step), 0); var range = Array(length); @@ -692,11 +741,23 @@ return range; }; + // Chunk a single array into multiple arrays, each containing `count` or fewer + // items. + _.chunk = function(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; + }; + // Function (ahem) Functions // ------------------ // Determines whether to execute a function as a constructor - // or a normal function with the provided arguments + // or a normal function with the provided arguments. var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); var self = baseCreate(sourceFunc.prototype); @@ -708,52 +769,53 @@ // Create a function bound to a given object (assigning `this`, and arguments, // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if // available. - _.bind = function(func, context) { - if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + _.bind = restArguments(function(func, context, args) { if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); - var args = slice.call(arguments, 2); - var bound = function() { - return executeBound(func, bound, context, this, args.concat(slice.call(arguments))); - }; + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); return bound; - }; + }); // Partially apply a function by creating a version that has had some of its // arguments pre-filled, without changing its dynamic `this` context. _ acts - // as a placeholder, allowing any combination of arguments to be pre-filled. - _.partial = function(func) { - var boundArgs = slice.call(arguments, 1); + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + _.partial = restArguments(function(func, boundArgs) { + var placeholder = _.partial.placeholder; var bound = function() { var position = 0, length = boundArgs.length; var args = Array(length); for (var i = 0; i < length; i++) { - args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i]; + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; } while (position < arguments.length) args.push(arguments[position++]); return executeBound(func, bound, this, this, args); }; return bound; - }; + }); + + _.partial.placeholder = _; // Bind a number of an object's methods to that object. Remaining arguments // are the method names to be bound. Useful for ensuring that all callbacks // defined on an object belong to it. - _.bindAll = function(obj) { - var i, length = arguments.length, key; - if (length <= 1) throw new Error('bindAll must be passed function names'); - for (i = 1; i < length; i++) { - key = arguments[i]; + _.bindAll = restArguments(function(obj, keys) { + keys = flatten(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; obj[key] = _.bind(obj[key], obj); } - return obj; - }; + }); // Memoize an expensive function by storing its results. _.memoize = function(func, hasher) { var memoize = function(key) { var cache = memoize.cache; var address = '' + (hasher ? hasher.apply(this, arguments) : key); - if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); + if (!has(cache, address)) cache[address] = func.apply(this, arguments); return cache[address]; }; memoize.cache = {}; @@ -762,12 +824,11 @@ // Delays a function for the given number of milliseconds, and then calls // it with the arguments supplied. - _.delay = function(func, wait) { - var args = slice.call(arguments, 2); - return setTimeout(function(){ + _.delay = restArguments(function(func, wait, args) { + return setTimeout(function() { return func.apply(null, args); }, wait); - }; + }); // Defers a function, scheduling it to run after the current call stack has // cleared. @@ -779,17 +840,18 @@ // but if you'd like to disable the execution on the leading edge, pass // `{leading: false}`. To disable execution on the trailing edge, ditto. _.throttle = function(func, wait, options) { - var context, args, result; - var timeout = null; + var timeout, context, args, result; var previous = 0; if (!options) options = {}; + var later = function() { previous = options.leading === false ? 0 : _.now(); timeout = null; result = func.apply(context, args); if (!timeout) context = args = null; }; - return function() { + + var throttled = function() { var now = _.now(); if (!previous && options.leading === false) previous = now; var remaining = wait - (now - previous); @@ -808,6 +870,14 @@ } return result; }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; }; // Returns a function, that, as long as it continues to be invoked, will not @@ -815,35 +885,32 @@ // N milliseconds. If `immediate` is passed, trigger the function on the // leading edge, instead of the trailing. _.debounce = function(func, wait, immediate) { - var timeout, args, context, timestamp, result; + var timeout, result; - var later = function() { - var last = _.now() - timestamp; - - if (last < wait && last >= 0) { - timeout = setTimeout(later, wait - last); - } else { - timeout = null; - if (!immediate) { - result = func.apply(context, args); - if (!timeout) context = args = null; - } - } + var later = function(context, args) { + timeout = null; + if (args) result = func.apply(context, args); }; - return function() { - context = this; - args = arguments; - timestamp = _.now(); - var callNow = immediate && !timeout; - if (!timeout) timeout = setTimeout(later, wait); - if (callNow) { - result = func.apply(context, args); - context = args = null; + var debounced = restArguments(function(args) { + if (timeout) clearTimeout(timeout); + if (immediate) { + var callNow = !timeout; + timeout = setTimeout(later, wait); + if (callNow) result = func.apply(this, args); + } else { + timeout = _.delay(later, wait, this, args); } return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = null; }; + + return debounced; }; // Returns the first function passed as an argument to the second, @@ -898,22 +965,24 @@ // often you call it. Useful for lazy initialization. _.once = _.partial(_.before, 2); + _.restArguments = restArguments; + // Object Functions // ---------------- // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', - 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; - function collectNonEnumProps(obj, keys) { + var collectNonEnumProps = function(obj, keys) { var nonEnumIdx = nonEnumerableProps.length; var constructor = obj.constructor; - var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto; + var proto = _.isFunction(constructor) && constructor.prototype || ObjProto; // Constructor is a special case. var prop = 'constructor'; - if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + if (has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); while (nonEnumIdx--) { prop = nonEnumerableProps[nonEnumIdx]; @@ -921,15 +990,15 @@ keys.push(prop); } } - } + }; // Retrieve the names of an object's own properties. - // Delegates to **ECMAScript 5**'s native `Object.keys` + // Delegates to **ECMAScript 5**'s native `Object.keys`. _.keys = function(obj) { if (!_.isObject(obj)) return []; if (nativeKeys) return nativeKeys(obj); var keys = []; - for (var key in obj) if (_.has(obj, key)) keys.push(key); + for (var key in obj) if (has(obj, key)) keys.push(key); // Ahem, IE < 9. if (hasEnumBug) collectNonEnumProps(obj, keys); return keys; @@ -956,22 +1025,22 @@ return values; }; - // Returns the results of applying the iteratee to each element of the object - // In contrast to _.map it returns an object + // Returns the results of applying the iteratee to each element of the object. + // In contrast to _.map it returns an object. _.mapObject = function(obj, iteratee, context) { iteratee = cb(iteratee, context); - var keys = _.keys(obj), - length = keys.length, - results = {}, - currentKey; - for (var index = 0; index < length; index++) { - currentKey = keys[index]; - results[currentKey] = iteratee(obj[currentKey], currentKey, obj); - } - return results; + var keys = _.keys(obj), + length = keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; }; // Convert an object into a list of `[key, value]` pairs. + // The opposite of _.object. _.pairs = function(obj) { var keys = _.keys(obj); var length = keys.length; @@ -993,7 +1062,7 @@ }; // Return a sorted list of the function names available on the object. - // Aliased as `methods` + // Aliased as `methods`. _.functions = _.methods = function(obj) { var names = []; for (var key in obj) { @@ -1002,14 +1071,33 @@ return names.sort(); }; + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + }; + // Extend a given object with all the properties in passed-in object(s). _.extend = createAssigner(_.allKeys); - // Assigns a given object with all the own properties in the passed-in object(s) + // Assigns a given object with all the own properties in the passed-in object(s). // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) _.extendOwn = _.assign = createAssigner(_.keys); - // Returns the first key on an object that passes a predicate test + // Returns the first key on an object that passes a predicate test. _.findKey = function(obj, predicate, context) { predicate = cb(predicate, context); var keys = _.keys(obj), key; @@ -1019,16 +1107,21 @@ } }; + // Internal pick helper function to determine if `obj` has key `key`. + var keyInObj = function(value, key, obj) { + return key in obj; + }; + // Return a copy of the object only containing the whitelisted properties. - _.pick = function(object, oiteratee, context) { - var result = {}, obj = object, iteratee, keys; + _.pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; if (obj == null) return result; - if (_.isFunction(oiteratee)) { + if (_.isFunction(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); keys = _.allKeys(obj); - iteratee = optimizeCb(oiteratee, context); } else { - keys = flatten(arguments, false, false, 1); - iteratee = function(value, key, obj) { return key in obj; }; + iteratee = keyInObj; + keys = flatten(keys, false, false); obj = Object(obj); } for (var i = 0, length = keys.length; i < length; i++) { @@ -1037,20 +1130,22 @@ if (iteratee(value, key, obj)) result[key] = value; } return result; - }; + }); - // Return a copy of the object without the blacklisted properties. - _.omit = function(obj, iteratee, context) { + // Return a copy of the object without the blacklisted properties. + _.omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; if (_.isFunction(iteratee)) { iteratee = _.negate(iteratee); + if (keys.length > 1) context = keys[1]; } else { - var keys = _.map(flatten(arguments, false, false, 1), String); + keys = _.map(flatten(keys, false, false), String); iteratee = function(value, key) { return !_.contains(keys, key); }; } return _.pick(obj, iteratee, context); - }; + }); // Fill in a given object with default properties. _.defaults = createAssigner(_.allKeys, true); @@ -1092,12 +1187,23 @@ // Internal recursive comparison function for `isEqual`. - var eq = function(a, b, aStack, bStack) { + var eq, deepEq; + eq = function(a, b, aStack, bStack) { // Identical objects are equal. `0 === -0`, but they aren't identical. // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). if (a === b) return a !== 0 || 1 / a === 1 / b; - // A strict comparison is necessary because `null == undefined`. - if (a == null || b == null) return a === b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + }; + + // Internal recursive comparison function for `isEqual`. + deepEq = function(a, b, aStack, bStack) { // Unwrap any wrapped objects. if (a instanceof _) a = a._wrapped; if (b instanceof _) b = b._wrapped; @@ -1114,7 +1220,7 @@ return '' + a === '' + b; case '[object Number]': // `NaN`s are equivalent, but non-reflexive. - // Object(NaN) is equivalent to NaN + // Object(NaN) is equivalent to NaN. if (+a !== +a) return +b !== +b; // An `egal` comparison is performed for other numeric values. return +a === 0 ? 1 / +a === 1 / b : +a === +b; @@ -1124,6 +1230,8 @@ // millisecond representations. Note that invalid dates with millisecond representations // of `NaN` are not equivalent. return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); } var areArrays = className === '[object Array]'; @@ -1175,7 +1283,7 @@ while (length--) { // Deep compare each member key = keys[length]; - if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; } } // Remove the first object from the stack of traversed objects. @@ -1214,8 +1322,8 @@ return type === 'function' || type === 'object' && !!obj; }; - // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError. - _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) { + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet. + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'], function(name) { _['is' + name] = function(obj) { return toString.call(obj) === '[object ' + name + ']'; }; @@ -1225,13 +1333,14 @@ // there isn't any inspectable "Arguments" type. if (!_.isArguments(arguments)) { _.isArguments = function(obj) { - return _.has(obj, 'callee'); + return has(obj, 'callee'); }; } // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, - // IE 11 (#1621), and in Safari 8 (#1929). - if (typeof /./ != 'function' && typeof Int8Array != 'object') { + // IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = root.document && root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { _.isFunction = function(obj) { return typeof obj == 'function' || false; }; @@ -1239,12 +1348,12 @@ // Is a given object a finite number? _.isFinite = function(obj) { - return isFinite(obj) && !isNaN(parseFloat(obj)); + return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj)); }; - // Is the given value `NaN`? (NaN is the only number which does not equal itself). + // Is the given value `NaN`? _.isNaN = function(obj) { - return _.isNumber(obj) && obj !== +obj; + return _.isNumber(obj) && isNaN(obj); }; // Is a given value a boolean? @@ -1264,8 +1373,19 @@ // Shortcut function for checking if an object has a given property directly // on itself (in other words, not on a prototype). - _.has = function(obj, key) { - return obj != null && hasOwnProperty.call(obj, key); + _.has = function(obj, path) { + if (!_.isArray(path)) { + return has(obj, path); + } + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (obj == null || !hasOwnProperty.call(obj, key)) { + return false; + } + obj = obj[key]; + } + return !!length; }; // Utility Functions @@ -1292,12 +1412,24 @@ _.noop = function(){}; - _.property = property; + // Creates a function that, when passed an object, will traverse that object’s + // properties down the given `path`, specified as an array of keys or indexes. + _.property = function(path) { + if (!_.isArray(path)) { + return shallowProperty(path); + } + return function(obj) { + return deepGet(obj, path); + }; + }; // Generates a function for a given object that returns a given property. _.propertyOf = function(obj) { - return obj == null ? function(){} : function(key) { - return obj[key]; + if (obj == null) { + return function(){}; + } + return function(path) { + return !_.isArray(path) ? obj[path] : deepGet(obj, path); }; }; @@ -1332,7 +1464,7 @@ return new Date().getTime(); }; - // List of HTML entities for escaping. + // List of HTML entities for escaping. var escapeMap = { '&': '&', '<': '<', @@ -1348,7 +1480,7 @@ var escaper = function(match) { return map[match]; }; - // Regexes for identifying a key that needs to be escaped + // Regexes for identifying a key that needs to be escaped. var source = '(?:' + _.keys(map).join('|') + ')'; var testRegexp = RegExp(source); var replaceRegexp = RegExp(source, 'g'); @@ -1360,14 +1492,24 @@ _.escape = createEscaper(escapeMap); _.unescape = createEscaper(unescapeMap); - // If the value of the named `property` is a function then invoke it with the - // `object` as context; otherwise, return it. - _.result = function(object, property, fallback) { - var value = object == null ? void 0 : object[property]; - if (value === void 0) { - value = fallback; + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + _.result = function(obj, path, fallback) { + if (!_.isArray(path)) path = [path]; + var length = path.length; + if (!length) { + return _.isFunction(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = _.isFunction(prop) ? prop.call(obj) : prop; } - return _.isFunction(value) ? value.call(object) : value; + return obj; }; // Generate a unique integer id (unique within the entire client session). @@ -1381,9 +1523,9 @@ // By default, Underscore uses ERB-style template delimiters, change the // following template settings to use alternative delimiters. _.templateSettings = { - evaluate : /<%([\s\S]+?)%>/g, - interpolate : /<%=([\s\S]+?)%>/g, - escape : /<%-([\s\S]+?)%>/g + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g }; // When customizing `templateSettings`, if you don't want to define an @@ -1394,20 +1536,27 @@ // Certain characters need to be escaped so that they can be put into a // string literal. var escapes = { - "'": "'", - '\\': '\\', - '\r': 'r', - '\n': 'n', + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', '\u2028': 'u2028', '\u2029': 'u2029' }; - var escaper = /\\|'|\r|\n|\u2028|\u2029/g; + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; var escapeChar = function(match) { return '\\' + escapes[match]; }; + // In order to prevent third-party code injection through + // `_.templateSettings.variable`, we test it against the following regular + // expression. It is intentionally a bit more liberal than just matching valid + // identifiers, but still prevents possible loopholes through defaults or + // destructuring assignment. + var bareIdentifier = /^\s*(\w|\$)+\s*$/; + // JavaScript micro-templating, similar to John Resig's implementation. // Underscore templating handles arbitrary delimiters, preserves whitespace, // and correctly escapes quotes within interpolated code. @@ -1427,7 +1576,7 @@ var index = 0; var source = "__p+='"; text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { - source += text.slice(index, offset).replace(escaper, escapeChar); + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); index = offset + match.length; if (escape) { @@ -1438,20 +1587,30 @@ source += "';\n" + evaluate + "\n__p+='"; } - // Adobe VMs need the match returned to produce the correct offest. + // Adobe VMs need the match returned to produce the correct offset. return match; }); source += "';\n"; - // If a variable is not specified, place data values in local scope. - if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } source = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + source + 'return __p;\n'; + var render; try { - var render = new Function(settings.variable || 'obj', '_', source); + render = new Function(argument, '_', source); } catch (e) { e.source = source; throw e; @@ -1462,7 +1621,6 @@ }; // Provide the compiled source as a convenience for precompilation. - var argument = settings.variable || 'obj'; template.source = 'function(' + argument + '){\n' + source + '}'; return template; @@ -1482,7 +1640,7 @@ // underscore functions. Wrapped objects may be chained. // Helper function to continue chaining intermediate results. - var result = function(instance, obj) { + var chainResult = function(instance, obj) { return instance._chain ? _(obj).chain() : obj; }; @@ -1493,9 +1651,10 @@ _.prototype[name] = function() { var args = [this._wrapped]; push.apply(args, arguments); - return result(this, func.apply(_, args)); + return chainResult(this, func.apply(_, args)); }; }); + return _; }; // Add all of the Underscore functions to the wrapper object. @@ -1508,7 +1667,7 @@ var obj = this._wrapped; method.apply(obj, arguments); if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; - return result(this, obj); + return chainResult(this, obj); }; }); @@ -1516,7 +1675,7 @@ _.each(['concat', 'join', 'slice'], function(name) { var method = ArrayProto[name]; _.prototype[name] = function() { - return result(this, method.apply(this._wrapped, arguments)); + return chainResult(this, method.apply(this._wrapped, arguments)); }; }); @@ -1530,7 +1689,7 @@ _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; _.prototype.toString = function() { - return '' + this._wrapped; + return String(this._wrapped); }; // AMD registration happens at the end for compatibility with AMD loaders @@ -1540,9 +1699,9 @@ // popular enough to be bundled in a third party lib, but not be part of // an AMD load request. Those cases could generate an error when an // anonymous define() is called outside of a loader request. - if (typeof define === 'function' && define.amd) { + if (typeof define == 'function' && define.amd) { define('underscore', [], function() { return _; }); } -}.call(this)); +}()); diff --git a/packs_lib/phil/docs/_build/html/genindex.html b/packs_lib/phil/docs/_build/html/genindex.html index 58574a6118..2cddcea184 100644 --- a/packs_lib/phil/docs/_build/html/genindex.html +++ b/packs_lib/phil/docs/_build/html/genindex.html @@ -5,29 +5,22 @@ + Index — phil 1.0.0 documentation - + + - + + - - + \ No newline at end of file diff --git a/packs_lib/phil/docs/_build/html/index.html b/packs_lib/phil/docs/_build/html/index.html index ee6f5802ed..ea75d3ea28 100644 --- a/packs_lib/phil/docs/_build/html/index.html +++ b/packs_lib/phil/docs/_build/html/index.html @@ -4,29 +4,22 @@ + phil on SWISH Manual - SWI-Prolog Version — phil 1.0.0 documentation - + + - + + - - + @@ -56,7 +49,7 @@

    Introduction

    phil is distributed as a pack of SWI-Prolog. To install it, use

    -
    $ swipl
    +
    $ swipl
     ?- pack_install(phil).
     
    @@ -70,13 +63,13 @@

    Requirements
    $ swipl
    +
    $ swipl
     ?- pack_install(auc).
     ?- pack_install(matrix).
     

    You can upgrade the pack with

    -
    $ swipl
    +
    $ swipl
     ?- pack_upgrade(phil).
     
    @@ -84,7 +77,7 @@

    Requirements

    Example of use

    -
    $ cd <pack>/phil/prolog/examples
    +
    $ cd <pack>/phil/prolog/examples
     $ swipl
     ?- [uwcse].
     ?- inference_hplp(advisedby(harry,ben),ai,Prob).
    @@ -93,7 +86,7 @@ 

    Example of use

    Testing the installation

    -
    $ swipl
    +
    $ swipl
     ?- [library(phil_test/test)].
     ?- test.
     
    @@ -106,38 +99,38 @@

    Datasets

    Syntax

    -

    phil allows the definition of discrete probability distributions. It performs inference, parameter and structure learning on Hierarchical Probabilistic Logic Programs (HPLPs) [NguembangFadjaLR17].

    -

    HPLPs are restrictions of Logic programs with annotated disjunctions LPADs ([VV03][VVB04]). A HPLP is a set of annotated clauses whose head contain a single atom annotated with a probability. For the rest, the usual syntax of Prolog is used. +

    phil allows the definition of discrete probability distributions. It performs inference, parameter and structure learning on Hierarchical Probabilistic Logic Programs (HPLPs), see [FRL21].

    +

    HPLPs are restrictions of Logic programs with annotated disjunctions LPADs ([VV03][VVB04]). A HPLP is a set of annotated clauses whose head contain a single atom annotated with a probability. For the rest, the usual syntax of Prolog is used. A general HPLP clause has the following form:

    -
    h:p:- BodyInput, b1,b2...,bn.
    +
    h:p:- BodyInput, b1,b2...,bn.
     
    -

    where BodyInput is a conjunction of predicates called input predicates, that are defined by certain facts and rules, and the bi are predicates non explicitly defined in the data called hidden predicates. Each hidden predicate is described by a set of clauses in a level immediately bellow. e.g b1 can be described as follows:

    -
    b1:p1_1:- BodyInput1, b1_11,b1_12...,b1_1m.
    +

    where BodyInput is a conjunction of predicates called input predicates, that are defined by certain facts and rules, and the bi are predicates non explicitly defined in the data called hidden predicates. Each hidden predicate is described by a set of clauses in a level immediately bellow. e.g b1 can be described as follows:

    +
    b1:p1_1:- BodyInput1, b1_11,b1_12...,b1_1m.
     b1:p1_2:- BodyInput2, b1_21,b1_22...,b1_2m.
     ...
     
     b1:p1_k:- BodyInputk, b1_k1,b1_k2...,b1_km.
     
    -

    Each b1_ij is also described by a set clauses in the layer immediately bellow. This creates an hierarchy among predicates and clauses. Programs having this structure are called hierarchical probabilistic logic programs. The predicate in the head of clauses in the first layer is called target or output predicate which is the predicate we are interested in predicting. -The p1_i are numeric expressions representing probabilities. -It is up to the user to ensure that their are legal, i.e. they are greater than zero and less than one. The first clause above states that if the conjunction of the input and the hidden predicates in the body is true, then the head is true is true with probability p otherwise, the head is false with probability 1-p. Note that, hidden predicates in the body of clauses in the programs are all different. +

    Each b1_ij is also described by a set clauses in the layer immediately bellow. This creates an hierarchy among predicates and clauses. Programs having this structure are called hierarchical probabilistic logic programs. The predicate in the head of clauses in the first layer is called target or output predicate which is the predicate we are interested in predicting. +The p1_i are numeric expressions representing probabilities. +It is up to the user to ensure that their are legal, i.e. they are greater than zero and less than one. The first clause above states that if the conjunction of the input and the hidden predicates in the body is true, then the head is true is true with probability p otherwise, the head is false with probability 1-p. Note that, hidden predicates in the body of clauses in the programs are all different. If the clause has an empty body, it can be represented like this:

    -
    h:p.
    +
    h:p.
     

    If the clause is annotated with probability 1, the annotation can be omitted and the clause takes the form of a normal prolog clause, i.e.:

    -
    h :- Body.
    +
    h :- Body.
     

    stands for:

    -
    h:1 :- Body.
    +
    h:1 :- Body.
     
    -

    The following example inspired from the UWCSE dataset used in [KD05] is represented as (file uwcse.pl)

    -
    advisedby(A,B):0.3 :-student(A),professor(B),project(A,C),project(B,C),hid_1(A,B,C).
    +

    The following example inspired from the UWCSE dataset used in [KD05] is represented as (file uwcse.pl)

    +
    advisedby(A,B):0.3 :-student(A),professor(B),project(A,C),project(B,C),hid_1(A,B,C).
     advisedby(A,B):0.6 :-student(A),professor(B),ta(C,A),taughtby(C,B).
     hid_1(A,B,C): 0.2 :- publication(D,A,C),publication(D,B,C).
     
    @@ -164,14 +157,14 @@ 

    Semantics[Poo97][SK01].

    +

    If the HPLP contains function symbols, the definition is more complex, see [Poo97][SK01].

    Inference

    -

    phil answers queries using the module phil. It performs exact inference using a program transformation technique. Each program is converted to a set of arithmetic circuits (ACs) or deep neural networks using a modified version of PITA [Rig14] with tabling and answer subsumption [RS10] as described in [NguembangFadjaLR17].

    -

    For answering queries, you have to prepare a Prolog file where you first load the inference module phil, initialize it with the directive :- phil and then enclose the hierarchical program clauses in :-begin_in. and :-end_in. or enclose the clauses in in([<clauses>]). -For example, the uwcse program above can be stored in uwcse.pl for performing inference with phil as follows

    -
    :- use_module(library(phil)).
    +

    phil answers queries using the module phil. It performs exact inference using a program transformation technique. Each program is converted to a set of arithmetic circuits (ACs) or deep neural networks using a modified version of PITA [Rig14] with tabling and answer subsumption [RS10] as described in [FRL21][NguembangFadjaLR17].

    +

    For answering queries, you have to prepare a Prolog file where you first load the inference module phil, initialize it with the directive :- phil and then enclose the hierarchical program clauses in :-begin_in. and :-end_in. or enclose the clauses in in([<clauses>]). +For example, the uwcse program above can be stored in uwcse.pl for performing inference with phil as follows

    +
    :- use_module(library(phil)).
     :- phil.
     
     :- begin_in.
    @@ -193,25 +186,25 @@ 

    Inferenceend(model(ai)).

    -

    You can also have (non-probabilistic) clauses outside :-begin/end_in. which can be enclosed in bg(<list of terms representing clauses>). +

    You can also have (non-probabilistic) clauses outside :-begin/end_in. which can be enclosed in bg(<list of terms representing clauses>). These are considered as database clauses.

    To run a query, you can simply load the Prolog file, for example uwcse.pl, as:

    -
    ?- [uwcse].
    +
    ?- [uwcse].
     

    or:

    -
    $ swipl uwcse.pl
    +
    $ swipl uwcse.pl
     

    and run the query:

    -
    ?- inference_hplp(advisedby(harry,ben),ai,Prob).
    +
    ?- inference_hplp(advisedby(harry,ben),ai,Prob).
     
    -

    where advisedby(harry,ben) is the atom for the target predicate, ai the interpretation or the model where the query is run and Prob stores the computed probability. For also generating the arithmetic circuit, run the query:

    -
    ?- inference_hplp(advisedby(harry,ben),ai,Prob,Circuit).
    +

    where advisedby(harry,ben) is the atom for the target predicate, ai the interpretation or the model where the query is run and Prob stores the computed probability. For also generating the arithmetic circuit, run the query:

    +
    ?- inference_hplp(advisedby(harry,ben),ai,Prob,Circuit).
     
    -

    where Circuit stores the arithmetic circuit as a Prolog term.

    +

    where Circuit stores the arithmetic circuit as a Prolog term.

    Learning

    @@ -220,8 +213,8 @@

    LearningPHIL for Parameter learning for HIerarchical probabilistic Logic programs. Given an input HPLP, PHIL learns its parameters from data. Two versions of PHIL are implemented:

      -
    • DPHIL (Deep PHIL) [NFRL18b] performs gradient descent over the ACs. Two regularizations of DPHIL are implemented: L1 and L2 regularizations as used in the deep learning community.
    • -
    • EMPHIL (Expectation Maximization PHIL) [NFRL18a] performs EM. Three regularizations of EMPHIL are implemented: besides the previous two regularizations, a regularization based on Bayesian update of the parameters is also implemented.
    • +
    • DPHIL (Deep PHIL) [NFRL18b] performs gradient descent over the ACs. Two regularizations of DPHIL are implemented: L1 and L2 regularizations as used in the deep learning community.
    • +
    • EMPHIL (Expectation Maximization PHIL) [NFRL18a] performs EM. Three regularizations of EMPHIL are implemented: besides the previous two regularizations, a regularization based on Bayesian update of the parameters is also implemented.
    @@ -239,19 +232,19 @@

    Input
  • example interpretations
  • The preamble must come first, the order of the other parts can be changed.

    -

    For example, consider the Bongard problems of [DRVL95]. bongard.pl and bongardkeys.pl represent a Bongard problem for SLEAHP.

    +

    For example, consider the Bongard problems of [DRVL95]. bongard.pl and bongardkeys.pl represent a Bongard problem for SLEAHP.

    Preamble

    In the preamble, the PHIL library is loaded with (bongard.pl):

    -
    :- use_module(library(phil)).
    +
    :- use_module(library(phil)).
     

    Now you can initialize with

    -
    :- phil.
    +
    :- phil.
     

    At this point you can start setting parameters for SLEAHP such as for example

    -
    :- set_hplp(megaex_bottom,10).
    +
    :- set_hplp(megaex_bottom,10).
     :- set_hplp(rate,0.95).
     :- set_hplp(max_layer,-1).
     :- set_hplp(min_probability,0.00001).
    @@ -263,19 +256,19 @@ 

    Preamble

    Background and Initial hierarchical program

    Now you can specify the background knowledge with a fact of the form

    -
    bg(<list of terms representing clauses>).
    +
    bg(<list of terms representing clauses>).
     

    where the clauses must be deterministic. -Alternatively, you can specify a set of clauses by including them in a section between :- begin_bg. and :- end_bg. +Alternatively, you can specify a set of clauses by including them in a section between :- begin_bg. and :- end_bg. Moreover, you can specify an initial program with a fact of the form

    -
    in(<list of terms representing clauses>).
    +
    in(<list of terms representing clauses>).
     

    The initial program is used in parameter learning for providing the structure. -Remember to enclose each clause in parentheses because :- has the highest precedence.

    +Remember to enclose each clause in parentheses because :- has the highest precedence.

    For example, bongard.pl has the initial program

    -
    in([(pos:0.197575 :-
    +
    in([(pos:0.197575 :-
        circle(A),
        in(B,A)),
     (pos:0.000303421 :-
    @@ -286,8 +279,8 @@ 

    Background and Initial hierarchical programcircle(B))]).

    -

    Alternatively, you can specify an input program in a section between :- begin_in. and :- end_in. as for example

    -

    Language Bias

    The language bias part contains the declarations of the input and output predicates. Note that the hidden predicates are not declared since there are automatically generated. The output predicate is declared as

    -
    output(<predicate>/<arity>).
    +
    output(<predicate>/<arity>).
     

    and indicates the predicate whose atom you want to predict. Derivations for the atoms for this predicate in the input data is built by the system. Input predicates are those whose atoms you are not interested in predicting. You can declare input predicates with

    -
    input(<predicate>/<arity>).
    +
    input(<predicate>/<arity>).
     

    For these predicates, the only true atoms are those in the interpretations and those derivable from them using the background knowledge.

    Then, for structure learning you have to specify the language bias by means of mode declarations in the style of Progol.

    -
    modeh(<recall>,<predicate>(<arg1>,...)).
    +
    modeh(<recall>,<predicate>(<arg1>,...)).
     

    specifies the atoms that can appear in the head of clauses. In hierarchical programs only the ouput and the hidden predicates can appear in the head of clauses.

    -
    modeb(<recall>,<predicate>(<arg1>,...)).
    +
    modeb(<recall>,<predicate>(<arg1>,...)).
     
    -

    specifies the atoms that can appear in the body of clauses. <recall> can be an integer or *. <recall> indicates how many atoms for the predicate specification are retained in the bottom clause during a saturation step. * stands for all those that are found. +

    specifies the atoms that can appear in the body of clauses. <recall> can be an integer or *. <recall> indicates how many atoms for the predicate specification are retained in the bottom clause during a saturation step. * stands for all those that are found. Otherwise the indicated number of atoms are randomly chosen.

    Arguments of the form

    -
    +<type>
    +
    +<type>
     
    -

    specifies that the argument should be an input variable of type <type>, i.e., a variable replacing a +<type> argument in the head or a -<type> argument in a preceding literal in the current hypothesized clause.

    +

    specifies that the argument should be an input variable of type <type>, i.e., a variable replacing a +<type> argument in the head or a -<type> argument in a preceding literal in the current hypothesized clause.

    Another argument form is

    -
    -<type>
    +
    -<type>
     
    -

    for specifying that the argument should be a output variable of type <type>. +

    for specifying that the argument should be a output variable of type <type>. Any variable can replace this argument, either input or output. The only constraint on output variables is that those in the head of a clause must appear as output variables in an atom in the body.

    Other forms are

    -
    #<type>
    +
    #<type>
     
    -

    for specifying an argument which should be replaced by a constant of type <type> in the bottom clause but should not be used for replacing input variables of the following literals when building the bottom clause or

    -
    -#<type>
    +

    for specifying an argument which should be replaced by a constant of type <type> in the bottom clause but should not be used for replacing input variables of the following literals when building the bottom clause or

    +
    -#<type>
     
    -

    for specifying an argument which should be replaced by a constant of type <type> in the bottom clause and that should be used for replacing input variables of the following literals when building the bottom clause.

    -
    <constant>
    +

    for specifying an argument which should be replaced by a constant of type <type> in the bottom clause and that should be used for replacing input variables of the following literals when building the bottom clause.

    +
    <constant>
     

    for specifying a constant.

    An example of language bias for the Bongard domain is

    -
    output(pos/0).
    +
    output(pos/0).
     
     input(triangle/1).
     input(square/1).
    @@ -373,23 +366,23 @@ 

    Language Biasmodeb(*,config(+obj,-#dir)).

    -

    SLEAHP also requires facts for the determination/2 Aleph-style predicate that indicate which predicates can appear in the body of clauses. +

    SLEAHP also requires facts for the determination/2 Aleph-style predicate that indicate which predicates can appear in the body of clauses. For example

    -
    determination(pos/0,triangle/1).
    +
    determination(pos/0,triangle/1).
     determination(pos/0,square/1).
     determination(pos/0,circle/1).
     determination(pos/0,in/2).
     determination(pos/0,config/2).
     
    -

    state that triangle/1 can appear in the body of clauses for pos/0.

    +

    state that triangle/1 can appear in the body of clauses for pos/0.

    Example Interpretations

    The last part of the file contains the data. You can specify data with two modalities: models and keys. -In the models case, you specify an example model (or interpretation or mega-example) as a list of Prolog facts initiated by begin(model(<name>)). and terminated by end(model(<name>)). as in

    -
    begin(model(2)).
    +In the models case, you specify an example model (or interpretation or mega-example) as a list of Prolog facts initiated by begin(model(<name>)). and terminated by end(model(<name>)). as in

    +
    begin(model(2)).
     pos.
     triangle(o5).
     config(o5,up).
    @@ -405,11 +398,11 @@ 

    Example Interpretations

    The facts in the interpretation are loaded in SWI-Prolog database by adding an extra initial argument equal to the name of the model. -After each interpretation is loaded, a fact of the form int(<id>) is asserted, where id is the name of the interpretation. +After each interpretation is loaded, a fact of the form int(<id>) is asserted, where id is the name of the interpretation. This can be used in order to retrieve the list of interpretations.

    Alternatively, with the keys modality, you can directly write the facts and the first argument will be interpreted as a model identifier. The above interpretation in the keys modality is

    -
    pos(2).
    +
     

    which is contained in the bongardkeys.pl. -This is also how model 2 above is stored in SWI-Prolog database. +This is also how model 2 above is stored in SWI-Prolog database. The two modalities, models and keys, can be mixed in the same file. -Facts for int/1 are not asserted for interpretations in the key modality but can be added by the user explicitly.

    +Facts for int/1 are not asserted for interpretations in the key modality but can be added by the user explicitly.

    Note that you can add background knowledge that is not probabilistic directly to the file writing clauses taking into account the model argument. -For example (carc.pl), available in phil_datasets, contains

    -
    connected(_M,Ring1,Ring2):-
    +For example (carc.pl), available in phil_datasets, contains

    +
    connected(_M,Ring1,Ring2):-
             Ring1 \= Ring2,
             member(A,Ring1),
             member(A,Ring2), !.
    @@ -438,26 +431,26 @@ 

    Example Interpretations

    where the first argument of all atoms is the model.

    -

    Then you must indicate how examples are divided in folds with facts of the form: fold(<fold_name>,<list of model identifiers>), as for example

    -
    fold(train,[2,3,...]).
    +

    Then you must indicate how examples are divided in folds with facts of the form: fold(<fold_name>,<list of model identifiers>), as for example

    +
    fold(train,[2,3,...]).
     fold(test,[490,491,...]).
     

    As the input file is a Prolog program, you can define intentionally the folds as in

    -
    fold(all,F):-
    +
    fold(all,F):-
     findall(I,int(I),F).
     
    -

    fold/2 is dynamic so you can also write

    -
    :- fold(all,F),
    +

    fold/2 is dynamic so you can also write

    +
    :- fold(all,F),
     sample_hplp(4,F,FTr,FTe),
     assert(fold(rand_train,FTr)),
     assert(fold(rand_test,FTe)).
     
    -

    which however must be inserted after the input interpretations otherwise the facts for int/1 will not be available and the fold all would be empty. -This command uses sample_hplp(N,List,Sampled,Rest) exported from phil that samples N elements from List and returns the sampled elements in Sampled and the rest in Rest. -If List has N elements or less, Sampled is equal to List and Rest is empty.

    +

    which however must be inserted after the input interpretations otherwise the facts for int/1 will not be available and the fold all would be empty. +This command uses sample_hplp(N,List,Sampled,Rest) exported from phil that samples N elements from List and returns the sampled elements in Sampled and the rest in Rest. +If List has N elements or less, Sampled is equal to List and Rest is empty.

    @@ -465,63 +458,63 @@

    Commands

    Parameter Learning

    To execute PHIL, prepare an input file as indicated above and call

    -
    ?- induce_hplp_par(+List_of_folds:list,-P:list).
    +
    ?- induce_hplp_par(+List_of_folds:list,-P:list).
     
    -

    where <list of folds> is a list of the folds for training and P will contain the input program with updated parameters.

    -

    For example bongard.pl, you can perform parameter learning on the train fold with

    -
    ?- induce_hplp_par([train],P).
    +

    where <list of folds> is a list of the folds for training and P will contain the input program with updated parameters.

    +

    For example bongard.pl, you can perform parameter learning on the train fold with

    +
    ?- induce_hplp_par([train],P).
     

    Structure Learning

    To execute SLEAHP, prepare an input file in the editor panel as indicated above and call

    -
    ?- induce_hplp(+List_of_folds:list,-P:list).
    +
    ?- induce_hplp(+List_of_folds:list,-P:list).
     
    -

    where List_of_folds is a list of the folds for training and P will contain the learned program.

    -

    For example bongard.pl, you can perform structure learning on the train fold with

    -
    ?- induce_hplp([train],P).
    +

    where List_of_folds is a list of the folds for training and P will contain the learned program.

    +

    For example bongard.pl, you can perform structure learning on the train fold with

    +
    ?- induce_hplp([train],P).
     
    -

    A program can also be tested on a test set with test_hplp/7 as described below.

    -

    Between two executions of induce_hplp/2 you should exit SWI-Prolog to have a clean database.

    +

    A program can also be tested on a test set with test_hplp/7 as described below.

    +

    Between two executions of induce_hplp/2 you should exit SWI-Prolog to have a clean database.

    Testing

    A program can also be tested on a test set in SLEAHP with

    -
    test_hplp(+Program:list,+List_of_folds:list,-LL:float,-AUCROC:float,-ROC:list,-AUCPR:float,-PR:list) is det
    +
    test_hplp(+Program:list,+List_of_folds:list,-LL:float,-AUCROC:float,-ROC:list,-AUCPR:float,-PR:list) is det
     
    -

    where Program is a list of terms representing clauses and List_of_folds is a list of folds.

    -

    test_hplp/7 returns the log likelihood of the test examples in LL, the Area Under the ROC curve in AUCROC, a dictionary containing the list of points (in the form of Prolog pairs x-y) of the ROC curve in ROC, the Area Under the PR curve in AUCPR, a dictionary containing the list of points of the PR curve in PR.

    -

    Then you can draw the curves in phil using C3.js as follows

    -
    compute_areas_diagrams(+ExampleList:list,-AUCROC:float,-ROC:dict,-AUCPR:float,-PR:dict) is det
    +

    where Program is a list of terms representing clauses and List_of_folds is a list of folds.

    +

    test_hplp/7 returns the log likelihood of the test examples in LL, the Area Under the ROC curve in AUCROC, a dictionary containing the list of points (in the form of Prolog pairs x-y) of the ROC curve in ROC, the Area Under the PR curve in AUCPR, a dictionary containing the list of points of the PR curve in PR.

    +

    Then you can draw the curves in phil using C3.js as follows

    +
    compute_areas_diagrams(+ExampleList:list,-AUCROC:float,-ROC:dict,-AUCPR:float,-PR:dict) is det
     
    -

    (from pack auc.pl) that takes as input a list ExampleList of pairs probability-literal.

    -

    For example, to test on fold test the program learned on fold train you can run the query

    -
    ?- induce_hplp_par([train],P),
    +

    (from pack auc.pl) that takes as input a list ExampleList of pairs probability-literal.

    +

    For example, to test on fold test the program learned on fold train you can run the query

    +
    ?- induce_hplp_par([train],P),
     test_hplp(P,[test],LL,AUCROC,ROC,AUCPR,PR).
     
    -

    Or you can test the input program on the fold test with

    -
    ?- in(P),test_hplp(P,[test],LL,AUCROC,ROC,AUCPR,PR).
    +

    Or you can test the input program on the fold test with

    +
    ?- in(P),test_hplp(P,[test],LL,AUCROC,ROC,AUCPR,PR).
     
    -

    In phil on SWISH, by including

    -
    :- use_rendering(c3).
    +

    In phil on SWISH, by including

    +
    :- use_rendering(c3).
     :- use_rendering(lpad).
     
    -

    in the code before :- phil. the curves will be shown as graphs using C3.js and the output program will be pretty printed.

    +

    in the code before :- phil. the curves will be shown as graphs using C3.js and the output program will be pretty printed.

    Hyper-parameters for Learning

    Hyper-parameters are set with commands of the form

    -
    :- set_hplp(<parameter>,<value>).
    +
    :- set_hplp(<parameter>,<value>).
     

    They are available both for PHIL and SLEAHP:

    @@ -529,43 +522,43 @@

    Hyper-parameters for LearningPHIL hyper-parameters

      -
    • algorithmType (values: {dphil,emphil}, default value: dphil): defines the parameter learning algorithm.
    • -
    • maxIter_phil (values: integer, default value: 1000): maximum number of iteration of PHIL. If set to -1, no maximum number of iterations is imposed.
    • -
    • epsilon_deep (values: real, default value: 0.0001): if the difference in the log likelihood in two successive PHIL (DPHIL and EMPHIL) iteration is smaller than epsilon_deep, then PHIL stops.
    • -
    • epsilon_deep_fraction (values: real, default value: 0.00001): if the difference in the log likelihood in two successive PHIL iteration is smaller than epsilon_deep_fraction*(-current log likelihood), then PHIL stops.
    • -
    • seed (values: seed(integer) or seed(random), default value seed(3032)): seed for the Prolog random functions, see SWI-Prolog manual .
    • -
    • setSeed (values: {no,yes}, default value: no): if yes, the value of c_seed is used as seed for randomly initializing the probabilities in PHIL otherwise the actual clock value is used.
    • -
    • c_seed (values: unsigned integer, default value 21344)): seed for the C random functions if setSeed is set to yes.
    • -
    • useInitParams (values: {no,yes}, default value: no): if yes the initial parameters during the learning are the ones indicated in the program. Otherwise, the initial parameters are generated randomly using the clock seed.
    • -
    • logzero (values: negative real, default value \(\log(0.000001)\)): value assigned to \(\log(0)\).
    • -
    • zero (values: real, default value \(0.000001\)): value assigned to \(0\).
    • -
    • max_initial_weight (values: real number , default value: 0.5): weights in DPHIL are randomly initialized with values in the interval [-max_initial_weight, max_initial_weight].
    • -
    • adam_params (values: list of four values [learningRate, beta1, beta2, epsilon], default value: [0.001,0.9,0.999,1e-8]): provides Adam’s hyper-parameters.
    • -
    • batch_strategy (values: minibatch(size), stoch_minibatch(size), batch, default value: minibatch(10)): defines the gradient descent strategy in DPHIL. If set to minibatch(size) the mini batch strategy with batch size size is used i.e at each iteration, size arithmetic circuits (ACs) are used to compute the gradients. If set to batch the whole set of ACs are used to compute the gradients. stoch_minibatch(size) is a modified version of mini batch in which at each iteration, size ACs are randomly selected for computing the gradients.
    • -
    • saveStatistics (values: {no,yes}, default value: no): if yes, the statistics (evolution of the likelihood and other values) during parameter learning are saved in a folder whose name is the value of statistics_folder hyper-parameter.
    • -
    • statistics_folder (values: string , default value: statistics): folder where to save the statistics if saveStatistics is set to yes.
    • -
    • regularized (values: {no,yes} , default value: no): if set to yes regularization is enabled.
    • -
    • regularizationType (values: integer in [0,3] , default value: 0): 0 to disable regularization, 1, 2 and 3 for L1, L2 and Bayesian regularization respectively.
    • -
    • gamma (values: real number, default value: 10): regularization coefficient for L1 and L2. Is equal to the Dirichlet coefficient a for Bayesian regularization.
    • -
    • gammaCount (values:real number , default value: 0): Dirichlet coefficient b for Bayesian regularization and typically 0 for L1 and l2 regularization.
    • +
    • algorithmType (values: {dphil,emphil}, default value: dphil): defines the parameter learning algorithm.
    • +
    • maxIter_phil (values: integer, default value: 1000): maximum number of iteration of PHIL. If set to -1, no maximum number of iterations is imposed.
    • +
    • epsilon_deep (values: real, default value: 0.0001): if the difference in the log likelihood in two successive PHIL (DPHIL and EMPHIL) iteration is smaller than epsilon_deep, then PHIL stops.
    • +
    • epsilon_deep_fraction (values: real, default value: 0.00001): if the difference in the log likelihood in two successive PHIL iteration is smaller than epsilon_deep_fraction*(-current log likelihood), then PHIL stops.
    • +
    • seed (values: seed(integer) or seed(random), default value seed(3032)): seed for the Prolog random functions, see SWI-Prolog manual .
    • +
    • setSeed (values: {no,yes}, default value: no): if yes, the value of c_seed is used as seed for randomly initializing the probabilities in PHIL otherwise the actual clock value is used.
    • +
    • c_seed (values: unsigned integer, default value 21344)): seed for the C random functions if setSeed is set to yes.
    • +
    • useInitParams (values: {no,yes}, default value: no): if yes the initial parameters during the learning are the ones indicated in the program. Otherwise, the initial parameters are generated randomly using the clock seed.
    • +
    • logzero (values: negative real, default value \(\log(0.000001)\)): value assigned to \(\log(0)\).
    • +
    • zero (values: real, default value \(0.000001\)): value assigned to \(0\).
    • +
    • max_initial_weight (values: real number , default value: 0.5): weights in DPHIL are randomly initialized with values in the interval [-max_initial_weight, max_initial_weight].
    • +
    • adam_params (values: list of four values [learningRate, beta1, beta2, epsilon], default value: [0.001,0.9,0.999,1e-8]): provides Adam’s hyper-parameters.
    • +
    • batch_strategy (values: minibatch(size), stoch_minibatch(size), batch, default value: minibatch(10)): defines the gradient descent strategy in DPHIL. If set to minibatch(size) the mini batch strategy with batch size size is used i.e at each iteration, size arithmetic circuits (ACs) are used to compute the gradients. If set to batch the whole set of ACs are used to compute the gradients. stoch_minibatch(size) is a modified version of mini batch in which at each iteration, size ACs are randomly selected for computing the gradients.
    • +
    • saveStatistics (values: {no,yes}, default value: no): if yes, the statistics (evolution of the likelihood and other values) during parameter learning are saved in a folder whose name is the value of statistics_folder hyper-parameter.
    • +
    • statistics_folder (values: string , default value: statistics): folder where to save the statistics if saveStatistics is set to yes.
    • +
    • regularized (values: {no,yes} , default value: no): if set to yes regularization is enabled.
    • +
    • regularizationType (values: integer in [0,3] , default value: 0): 0 to disable regularization, 1, 2 and 3 for L1, L2 and Bayesian regularization respectively.
    • +
    • gamma (values: real number, default value: 10): regularization coefficient for L1 and L2. Is equal to the Dirichlet coefficient a for Bayesian regularization.
    • +
    • gammaCount (values:real number , default value: 0): Dirichlet coefficient b for Bayesian regularization and typically 0 for L1 and l2 regularization.
  • SLEAHP hyper-parameters

      -
    • megaex_bottom (values: integer, default value: 1, valid for SLEAHP): number of mega-examples on which to build the bottom clauses.
    • -
    • initial_clauses_per_megaex (values: integer, default value: 1, valid for SLEAHP): number of bottom clauses to build for each mega-example (or model or interpretation).
    • -
    • d (values: integer, default value: 1, valid for SLEAHP): number of saturation steps when building the bottom clause.
    • -
    • neg_ex (values: given, cw, default value: cw): if set to given, the negative examples in training and testing are taken from the test folds interpretations, i.e., those examples ex stored as neg(ex); if set to cw, the negative examples in training and testing are generated according to the closed world assumption, i.e., all atoms for target predicates that are not positive examples. The set of all atoms is obtained by collecting the set of constants for each type of the arguments of the target predicate, so the target predicates must have at least one fact for modeh/2 or modeb/2 also for parameter learning.
    • -
    • probability (values:real number in [0,1] , default value: 1.0): initial value which indicates the probability to go from the current layer to the next when generating the initial HPLP.
    • -
    • rate (values: real number in [0,1], default value: 0.95): at each layer during the tree generation, the probability to go deeper is equal to probability=probability*rate. The deeper the layer the lower is the probability to go deeper.
    • -
    • min_probability (values: real number in [0,1], default value: 1e-5): probability threshold under which a clause is dropped out.
    • -
    • use_all_mega_examples (values: {no,yes} , default value:yes): if set to yes all the the bottom clauses are used to create the tree otherwise only one of them is used (typically the first).
    • -
    • saveHPLP (values: {no,yes}, default value: no): if set to yes the initial and the learned hierarchical programs are saved in the current folder.
    • -
    • saveFile (values: string, default value: “hplp”): file name where to save the initial hierarchical programs if saveHPLP is set to yes. If the file name is hplp, the learned program is saved in file hplp_learned.
    • -
    • max_layer (values: integer, default value: -1): maximum layer of clauses. If set to -1, no maximum is imposed.
    • -
    • verbosity (values: integer in [1,3], default value: 1): level of verbosity of the algorithms.
    • +
    • megaex_bottom (values: integer, default value: 1, valid for SLEAHP): number of mega-examples on which to build the bottom clauses.
    • +
    • initial_clauses_per_megaex (values: integer, default value: 1, valid for SLEAHP): number of bottom clauses to build for each mega-example (or model or interpretation).
    • +
    • d (values: integer, default value: 1, valid for SLEAHP): number of saturation steps when building the bottom clause.
    • +
    • neg_ex (values: given, cw, default value: cw): if set to given, the negative examples in training and testing are taken from the test folds interpretations, i.e., those examples ex stored as neg(ex); if set to cw, the negative examples in training and testing are generated according to the closed world assumption, i.e., all atoms for target predicates that are not positive examples. The set of all atoms is obtained by collecting the set of constants for each type of the arguments of the target predicate, so the target predicates must have at least one fact for modeh/2 or modeb/2 also for parameter learning.
    • +
    • probability (values:real number in [0,1] , default value: 1.0): initial value which indicates the probability to go from the current layer to the next when generating the initial HPLP.
    • +
    • rate (values: real number in [0,1], default value: 0.95): at each layer during the tree generation, the probability to go deeper is equal to probability=probability*rate. The deeper the layer the lower is the probability to go deeper.
    • +
    • min_probability (values: real number in [0,1], default value: 1e-5): probability threshold under which a clause is dropped out.
    • +
    • use_all_mega_examples (values: {no,yes} , default value:yes): if set to yes all the the bottom clauses are used to create the tree otherwise only one of them is used (typically the first).
    • +
    • saveHPLP (values: {no,yes}, default value: no): if set to yes the initial and the learned hierarchical programs are saved in the current folder.
    • +
    • saveFile (values: string, default value: “hplp”): file name where to save the initial hierarchical programs if saveHPLP is set to yes. If the file name is hplp, the learned program is saved in file hplp_learned.
    • +
    • max_layer (values: integer, default value: -1): maximum layer of clauses. If set to -1, no maximum is imposed.
    • +
    • verbosity (values: integer in [1,3], default value: 1): level of verbosity of the algorithms.
  • @@ -574,9 +567,9 @@

    Hyper-parameters for Learning

    Example Files

    -

    The pack/phil/prolog/examples folder in SWI-Prolog home contains some example programs. -The subfolder learning contains some learning examples. -The pack/phil/docs folder contains this manual in latex, html and pdf.

    +

    The pack/phil/prolog/examples folder in SWI-Prolog home contains some example programs. +The subfolder learning contains some learning examples. +The pack/phil/docs folder contains this manual in latex, html and pdf.

    Manual in PDF

    @@ -592,67 +585,73 @@

    References - + + +
    [DRVL95]L. De Raedt and W. Van Laer. Inductive constraint logic. In Proceedings of the 6th Conference on Algorithmic Learning Theory (ALT 1995), volume 997 of LNAI, 80–94. Fukuoka, Japan, 1995. Springer.
    [DRVL95]L. De Raedt and W. Van Laer. Inductive constraint logic. In Proceedings of the 6th Conference on Algorithmic Learning Theory (ALT 1995), volume 997 of LNAI, 80–94. Fukuoka, Japan, 1995. Springer.
    + + + +
    [FRL21](1, 2, 3) Arnaud Nguembang Fadja, Fabrizio Riguzzi, and Evelina Lamma. Learning hierarchical probabilistic logic programs. Machine Learning, pages 1–57, 2021.
    - +
    [KD05]Stanley Kok and Pedro Domingos. Learning the structure of markov logic networks. In Proceedings of the 22nd international conference on Machine learning, 441–448. 2005.
    [KD05]Stanley Kok and Pedro Domingos. Learning the structure of markov logic networks. In Proceedings of the 22nd international conference on Machine learning, 441–448. 2005.
    - +
    [NFRL18a]Arnaud Nguembang Fadja, Fabrizio Riguzzi, and Evelina Lamma. Expectation maximization in deep probabilistic logic programming. In International Conference of the Italian Association for Artificial Intelligence, 293–306. Springer, 2018.
    [NFRL18a]Arnaud Nguembang Fadja, Fabrizio Riguzzi, and Evelina Lamma. Expectation maximization in deep probabilistic logic programming. In International Conference of the Italian Association for Artificial Intelligence, 293–306. Springer, 2018.
    - +
    [NFRL18b]Arnaud Nguembang Fadja, Fabrizio Riguzzi, and Evelina Lamma. Learning the parameters of deep probabilistic logic programs. In Elena Bellodi and Tom Schrijvers, editors, Probabilistic Logic Programming (PLP 2018), volume 2219 of CEUR Workshop Proceedings, 9–14. Aachen, Germany, 2018. Sun SITE Central Europe. URL: http://ceur-ws.org/Vol-2219/paper2.pdf.
    [NFRL18b]Arnaud Nguembang Fadja, Fabrizio Riguzzi, and Evelina Lamma. Learning the parameters of deep probabilistic logic programs. In Elena Bellodi and Tom Schrijvers, editors, Probabilistic Logic Programming (PLP 2018), volume 2219 of CEUR Workshop Proceedings, 9–14. Aachen, Germany, 2018. Sun SITE Central Europe. URL: http://ceur-ws.org/Vol-2219/paper2.pdf.
    - +
    [Poo97]David Poole. The independent choice logic for modelling multiple agents under uncertainty. Artificial Intelligence, 94(1-2):7–56, 1997.
    [Poo97]David Poole. The independent choice logic for modelling multiple agents under uncertainty. Artificial Intelligence, 94(1-2):7–56, 1997.
    - +
    [Rig14]Fabrizio Riguzzi. Speeding up inference for probabilistic logic programs. CJ_J, 57(3):347–363, 2014. doi:10.1093/comjnl/bxt096.
    [Rig14]Fabrizio Riguzzi. Speeding up inference for probabilistic logic programs. CJ_J, 57(3):347–363, 2014. doi:10.1093/comjnl/bxt096.
    - +
    [RS10]Fabrizio Riguzzi and Terrance Swift. Tabling and Answer Subsumption for Reasoning on Logic Programs with Annotated Disjunctions. In Technical Communications of the International Conference on Logic Programming, volume 7 of Leibniz International Proceedings in Informatics (LIPIcs), 162–171. Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik, 2010. doi:10.4230/LIPIcs.ICLP.2010.162.
    [RS10]Fabrizio Riguzzi and Terrance Swift. Tabling and Answer Subsumption for Reasoning on Logic Programs with Annotated Disjunctions. In Technical Communications of the International Conference on Logic Programming, volume 7 of Leibniz International Proceedings in Informatics (LIPIcs), 162–171. Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik, 2010. doi:10.4230/LIPIcs.ICLP.2010.162.
    - +
    [SK01]Taisuke Sato and Yoshitaka Kameya. Parameter learning of logic programs for symbolic-statistical modeling. J. Artif. Intell. Res., 15:391–454, 2001.
    [SK01]Taisuke Sato and Yoshitaka Kameya. Parameter learning of logic programs for symbolic-statistical modeling. J. Artif. Intell. Res., 15:391–454, 2001.
    - +
    [VV03]J. Vennekens and S. Verbaeten. Logic programs with annotated disjunctions. Technical Report CW386, K. U. Leuven, 2003.
    [VV03]J. Vennekens and S. Verbaeten. Logic programs with annotated disjunctions. Technical Report CW386, K. U. Leuven, 2003.
    - +
    [VVB04]J. Vennekens, S. Verbaeten, and M. Bruynooghe. Logic programs with annotated disjunctions. In International Conference on Logic Programming, volume 3131 of LNCS, 195–209. Springer, 2004.
    [VVB04]J. Vennekens, S. Verbaeten, and M. Bruynooghe. Logic programs with annotated disjunctions. In International Conference on Logic Programming, volume 3131 of LNCS, 195–209. Springer, 2004.
    - +
    [NguembangFadjaLR17](1, 2, 3) Arnaud Nguembang Fadja, Evelina Lamma, and Fabrizio Riguzzi. Deep probabilistic logic programming. In Christian Theil Have and Riccardo Zese, editors, PLP17_B, volume 1916 of CEUR_S, 3–14. Sun SITE Central Europe, 2017.
    [NguembangFadjaLR17](1, 2) Arnaud Nguembang Fadja, Evelina Lamma, and Fabrizio Riguzzi. Deep probabilistic logic programming. In Christian Theil Have and Riccardo Zese, editors, PLP17_B, volume 1916 of CEUR_S, 3–14. Sun SITE Central Europe, 2017.

    @@ -665,7 +664,7 @@

    References \ No newline at end of file diff --git a/packs_lib/phil/docs/_build/html/objects.inv b/packs_lib/phil/docs/_build/html/objects.inv index d89935310df6a79f00b3e22ea4432132141e00c6..37d5f927cd180b4fb499c4978b91c4fcf0e05491 100644 GIT binary patch delta 699 zcmV;s0!00#2B-#*d4Ek$<1i40@BS5*cCWLvEC|Yx1w@}>T^h#tTmFnGX64+tK&`}<83`-#k!B}4VWjlauZ1AiiN^jMQmv3CO^@`bK$ z*0ym5b$y2Ftg=?q8Pz;LW|w+sl*cVHJ*>g*R-uD z>#Y;1gCIB`Ykxv#lqr&QL8hD8hr(>f@wxb~SiM)|phB)U;&aw=X`MW}$7dC=3Zm-q zE6=B4RqS3Yx7oh0tX4`(j>P=$bp9xx(KOr+&<!|Xs{r;P<;#P7PjPEOOFc);?CwF7HvghVt9J+seMvlX*t#xk ztCi2Cv2>~!UqQuR5%rb~9^=fiVtjoH9xL{E14MLJ^|Pps;SA+mzo~j9%TUfdZ101% zoL~ELK7YIqJAgINIlvIkogRYz^v2;Y8I}v3%JFPKghSFulS@GDCzr|CIU0H`bp!p5 z5cB^U<)|d%(~2D?+Pq&twg$CMzl$n3MB@>tOjq3_iPzNLy!%K$*H_@YU!QSDG0Qpd zDoefdJTRj6j$6KQbiAM0VnZFhRbyH6TD02Vc;&hv~`ap{vXyXY>l}gW0(K{ delta 696 zcmV;p0!RI*2Bij&d4J1p+b|GC_xuV1?RFYFO_0YjO@bIm0HY4t^;jCqv?)?0sXYF^ zqZb_q5$%N`Q#$vOnz^Kwm~9JZYm-alpE4>a)N-xJq081P<3Z(Y;jolGHlv9~=U@};h> zH@0>LwLd|1Qdz6%>S9#e2w)HZDi{Rt$!mkkop=m(JDDEo)<|HGfS@-lD@}5xG>yMZ zPeDiB^_u%;6djZa-UNrRLBV;Ub&Ym>!c=hj25GFd{zOgAgUg|@_g){ zirvC;o9+9`YOS>7cU%0OEgs|(nwkR+%@F3!YFo%Z?8k4qF(8eZW`~oXzX(pk{}Ot=*nZCg%sM+;mc-DSv7#NG=tQr*fd6r5*>(4UfbT z)5P9rm67qOnm%@fD7)S$BddHh%6AlR7HFuasF~m1i_+#_WVCvR;XxOPCoWsNubQ;- zduc44DyA1u@wuR0lf`44SyoIhkHKSN4{v~o?ovOG>R8Sp&i+;TwJe7?^RPMLn>fF8 zaUP$C9e=#!6lkbKxMjWFG<`}^DW&+x_ey$7v1wY?hOkKrsaJA-(0FJ0g-{-FyR&IRAP9umJW1 e&m&Iag$&1Z@)Lqf_Mzv_+P1ZqB>o?;E?uS~zgF1* diff --git a/packs_lib/phil/docs/_build/html/search.html b/packs_lib/phil/docs/_build/html/search.html index f422e5ddc0..e2b6401ad5 100644 --- a/packs_lib/phil/docs/_build/html/search.html +++ b/packs_lib/phil/docs/_build/html/search.html @@ -4,24 +4,19 @@ + Search — phil 1.0.0 documentation - + + + - + + @@ -33,8 +28,7 @@ - - + \ No newline at end of file diff --git a/packs_lib/phil/docs/_build/html/searchindex.js b/packs_lib/phil/docs/_build/html/searchindex.js index 9bf85e2a5e..5e9644a772 100644 --- a/packs_lib/phil/docs/_build/html/searchindex.js +++ b/packs_lib/phil/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["index"],envversion:53,filenames:["index.rst"],objects:{},objnames:{},objtypes:{},terms:{"10e4":[],"1e20":[],"22nd":0,"3aevent_to_json":[],"6th":0,"boolean":[],"case":0,"default":0,"export":0,"final":0,"float":0,"function":0,"import":[],"int":0,"new":[],"null":[],"public":0,"return":0,"switch":[],"throw":[],"true":0,"universit\u00e0":[],"var":[],"while":[],ACs:0,AND:[],ARE:[],BUT:[],FOR:[],For:0,Its:[],NOT:[],Res:0,SUCH:[],THE:[],TIES:[],The:0,Then:0,There:[],These:0,USE:[],With:[],_build:0,_by:0,_coin:[],aaai:[],aachen:0,abl:0,abov:0,abs:[],accept:[],accord:0,account:0,achiev:[],act:0,action:[],actual:0,adam:0,adam_param:0,adapt:[],add:0,added:0,adding:0,addit:[],address:[],administ:[],admiss:[],admit:[],advis:0,advised_bi:[],advisedbi:0,after:0,against:[],agent:0,aggreg:0,aleph:0,algebra:[],algorithm:0,algorithmtyp:0,all:0,allow:0,alpha:[],alreadi:[],also:0,alt:0,altern:0,alwai:[],among:0,ampl:[],analysi:[],ani:0,anna:[],annot:0,annual:[],anoth:0,answer:0,appear:0,appl:[],appli:[],applic:0,approach:[],approxim:[],ar1:[],arc:[],area:0,arg1:0,arg:[],argbar:[],argbar_r:[],argument:0,ari:[],aris:[],arithm:[],arithmet:0,ariti:0,arity1:[],arityn:[],ark:[],arnaud:0,arnaudfadja:0,artif:0,artifici:0,artist:0,arun:[],arxiv:[],asi:[],ask:[],assert:0,assign:0,assist:0,assit:[],associ:0,assum:[],assumpt:0,atom:0,auc:0,aucpr:0,aucroc:0,author:0,automat:0,avail:0,averag:[],avoid:[],b1_11:0,b1_12:0,b1_1m:0,b1_21:0,b1_22:0,b1_2k:[],b1_2m:0,b1_ij:0,b1_k1:0,b1_k2:0,b1_km:0,background_claus:[],backtrack:[],bandit:[],bar1:[],bar:[],bar_r:[],barchar:[],barchart:[],base:0,bash:[],batch:0,batch_strategi:0,bayesian:0,bdd_dot_fil:[],bdd_dot_str:[],beam:[],beamsiz:[],becaus:0,becom:[],been:[],befor:0,begin:0,begin_bg:0,begin_in:0,begin_lpad:[],begin_plp:[],behavior:[],being:[],bellodi:0,bellow:0,below:0,belrig13:[],belrig:[],ben:0,besid:0,best:[],beta1:0,beta2:0,between:0,bias:[],bin:[],binari:[],binomi:[],block:[],bodi:0,bodyinput1:0,bodyinput2:0,bodyinput:0,bodyinputk:0,bond:0,bongard:0,bongardkei:0,borel:[],both:0,bottom:0,bound:[],br11:[],br13a:[],br13b:[],br15:[],branch:[],broeck:[],broken_umbrella:[],bruynoogh:0,build:0,built:0,bureau:[],busi:[],bxt096:0,c_1:0,c_2:0,c_seed:0,calculu:[],call:0,cambridg:[],can:0,cannot:[],carc:0,carlo:[],cathi:[],caus:[],central:0,certain:0,certainti:[],ceur:0,ceur_:0,chain:[],chang:0,chart:[],check:[],children:[],choic:0,chosen:0,christian:0,chu:[],cilc11:[],circl:0,circuit:0,cite:[],cj_j:0,clase:[],claus:0,clean:0,client:[],clock:0,close:0,clpr:[],coauthor:0,code:0,coeffici:0,coh95:[],cohen:[],coin:[],coin_us:[],coinmc:[],coinmsw:[],collect:0,colorado:[],column:[],com:[],combin:0,come:0,comjnl:0,commandlin:[],common:[],commun:0,comp:[],complex:0,compon:[],compos:[],comput:0,compute_areas_diagram:0,compute_areas_diagrams_r:[],confer:0,confid:[],config:0,conjunct:0,connect:0,consequenti:[],consid:0,consist:[],constant:0,constitut:[],constraint:0,contain:0,content:[],continu:[],contract:[],contributor:[],control:[],control_unit:[],convert:0,copi:[],copy_term:[],copyright:0,correspond:[],cost:[],counterpart:[],coupl:[],cours:0,courselevel:[],cover:[],cplint:0,creat:0,csv:[],cudd:[],current:0,curv:0,cw386:0,dagstuhl:0,damag:[],dash:[],data:0,databas:0,david:0,declar:0,deep:0,deeper:0,defin:0,definit:0,defualt:[],delet:[],den:[],densiti:[],densities_r:[],density_r:[],depend:0,depth:[],depth_bound:[],deriv:0,descent:0,describ:0,det:0,determin:0,determinist:0,diagram:[],dict:0,dictionari:0,differ:0,digit:[],dimbelrig:[],dipartimento:[],dir:0,direct:0,directli:0,dirichlet:0,disabl:0,discard:[],disclaim:[],discoveri:[],discret:0,disjunct:0,distinct:[],distribut:0,divid:0,dmbr15:[],doc:0,doc_for:[],document:[],doesn:[],doi:0,domain:0,domingo:0,done:[],dot:[],dotstr:[],dphil:0,draw:0,draw_r:[],drawn:[],drkt07:[],drop:0,drug:[],drvl95:0,dt_solv:[],dtproblog:[],due:[],dure:0,dynam:0,each:0,eason:0,edg:[],editor:0,effect:[],effici:[],either:0,elect:[],element:0,elen:[],elena:0,emblem:[],emphil:0,empti:0,enabl:0,enclos:0,encount:[],end:0,end_bg:0,end_in:0,end_lpad:[],end_plp:[],endors:[],engin:[],ensur:0,entir:[],epsilon:0,epsilon_deep:0,epsilon_deep_fract:0,epsilon_em:[],epsilon_em_fract:[],epsilon_pars:[],equal:0,equival:[],estim:[],europ:0,eval:[],evalu:[],evelina:0,even:[],event:[],eventu:[],everi:[],evid:[],evolut:0,exact:0,examplelist:0,except:[],exclus:[],execut:0,exemplari:[],exit:0,exp:[],expect:0,explan:[],explicitli:0,exploit:[],express:0,extra:0,fabrizio:0,fact:0,fadja:0,fail:[],failur:[],fair:[],fals:0,fastest:[],fc90:[],femal:[],ferrara:[],fifth:[],filenam:[],filter:[],find:0,findal:0,finit:[],first:0,fit:[],five:0,fix:[],flexprob:[],fold:0,fold_hplp:[],fold_nam:0,folder:0,follow:0,forev:[],forget:[],forgotten:[],form:0,format:[],found:0,four:0,fourth:[],freedom:[],freeli:[],friguzzi:[],from:0,fte:0,ftr:0,fuer:0,fukuoka:0,functor:[],fundamenta:[],fung:[],gamma:0,gammacount:0,gauss_mean_est:[],gauss_mean_est_r:[],gaussian:[],gear:[],gener:0,germani:0,getrand:[],gibb:[],github:0,githubusercont:[],give:[],given:0,goal:[],good:[],gradient:0,graph:0,graphviz:[],greater:0,ground:0,guarante:[],gui:[],handl:[],harri:0,has:0,hasposit:[],hast:[],have:0,head:0,her:0,here:[],hexadecim:[],hid_1:0,hidden:0,hidden_1:[],hierarch:[],hierarchi:0,hierarchila:[],high:[],highest:0,his:0,histogram:[],histogram_r:[],hold:[],holder:[],holland:[],home:0,how:0,howev:0,hplp:0,hplp_learn:0,html:0,http:0,hybrid:[],hypothes:0,iclp:0,ida:[],identifi:0,immedi:0,implement:0,impli:[],impos:0,incident:[],includ:0,increas:[],independ:0,index:[],indian_gpa:[],indic:0,indirect:[],individu:[],induc:[],induce__hplp_par:[],induce_hplp:0,induce_hplp_par:0,induce_lm:[],induce_par:[],induct:0,inference_hplp:0,infinit:[],influenc:[],inform:0,informat:0,informatica:[],informatik:0,ing:[],ingegneria:[],ingo:[],inherit:0,initial_clauses_per_megaex:0,inphas:[],input_cw:[],insert:0,inspir:0,instanti:[],instead:[],integ:0,integr:[],intel:0,intellig:0,intension:[],intention:0,inter:[],interest:0,intern:0,interrupt:[],interv:0,involv:[],irr12:[],isjunct:0,islam:[],itali:[],italian:0,iter:0,iterref:[],its:0,japan:0,john:[],joint:0,json:[],juli:[],just:[],kalman:[],kalman_filt:[],kameya:0,kd05:0,kei:0,kf_fin:[],kf_o:[],kimmig:[],knowledg:0,kok:0,koller2009probabilist:[],kuo:[],laer:0,laet:[],lag:[],lamma:0,larg:0,larger:[],last:0,later:0,latex:0,latter:[],layer:0,ldot:[],lead:[],learningr:0,least:0,leav:[],lebesgu:[],left:[],legal:0,leibniz:0,lemur:[],length:[],less:0,leuven:0,level:0,liabil:[],liabl:[],librari:0,lift:[],like:0,likelihood:0,limit:[],line:[],link:[],lipic:0,list:0,list_of_fold:0,liter:0,lnai:0,lnc:0,load:0,locat:[],log:0,logic:0,logp:[],logzero:0,lookahead:[],lookahead_con:[],lookahead_cons_var:[],loop:[],loss:[],lower:0,lpad:0,luc:[],mach:[],machin:0,mai:[],make:[],male:[],mani:0,manipul:[],markov:0,markov_chain:[],markov_chaindb:[],martijn:[],master:[],match:[],materi:[],math:[],matrix:0,matter:[],mauro:[],max:[],max_initial_weight:0,max_it:[],max_iter_structur:[],max_lay:0,max_sampl:[],max_var:[],maxdepth_var:[],maxim:0,maximum:0,maxiter_phil:0,mc_expect:[],mc_gibbs_expect:[],mc_gibbs_sampl:[],mc_gibbs_sample_arg:[],mc_lw_expect:[],mc_lw_sampl:[],mc_lw_sample_arg:[],mc_mh_expect:[],mc_mh_sampl:[],mc_mh_sample_arg:[],mc_particle_expect:[],mc_particle_sampl:[],mc_particle_sample_arg:[],mc_prob:[],mc_rejection_expect:[],mc_rejection_sampl:[],mc_rejection_sample_arg:[],mc_sampl:[],mc_sample_arg:[],mc_sample_arg_first:[],mc_sample_arg_on:[],mc_sample_arg_raw:[],mcintyr:[],mcmc:[],mcts_beamsiz:[],mcts_c:[],mcts_iter:[],mcts_max_depth:[],mcts_maxrestart:[],mcts_visit:[],mean:0,measur:[],mechan:[],mega:0,megaex_bottom:0,megaexampl:[],member:0,memo:[],memoiz:[],memori:[],merchant:[],met:[],meta:[],method:[],metropoli:[],min:[],min_error:[],min_prob:0,mine:[],mini:0,minibatch:0,minim:[],minimum:[],minu:[],mix:0,ml15:[],mod:0,modal:0,mode:0,modeb:0,modebb:[],modeh:0,model:0,modif:[],modifi:0,modul:0,mont:[],more:0,moreov:0,msw:[],much:[],muhammad:[],multi:[],multipl:0,multipli:[],multivalu:[],must:0,muta:[],mutual:[],name:0,nampal:[],nat:[],nation:[],nbin:[],ndldr16:[],necessari:0,need:0,neg:0,neg_ex:0,negat:[],neglig:[],neither:[],nest:[],network:0,neumann:[],neural:0,next:0,nf_r:[],nfrl18a:0,nfrl18b:0,nguembang:0,nguembangfadjalr17:0,nicola:[],nitti2016:[],nitti:[],nneg:[],nnotat:0,node:[],non:0,nondet:[],none_worn:[],nor:[],normal:0,north:[],not_replac:[],not_worn:[],note:0,noth:[],notic:[],now:0,npo:[],nr14:[],nswer:0,number:0,numer:0,obj:0,object:[],observ:[],obtain:0,ogic:0,omit:0,one:0,one_worn:[],ones:0,onli:0,open:[],oper:[],option:0,order:0,org:0,origin:[],other:0,otherwis:0,otterlo:[],ouput:0,out:0,output:0,outsid:0,over:0,overal:[],owner:[],p1_1:0,p1_2:0,p1_i:0,p1_k:0,p_1:[],p_2:[],p_3:[],p_4:[],pac:[],pack:0,pack_instal:0,pack_upgrad:0,pair:0,panel:0,paper2:0,paper:[],parenthes:0,part:0,parti:[],particip:[],particl:[],particular:[],particularli:[],path:[],patient:[],pcfglr:[],pctl_slep:[],pea00:[],pearl:[],pedro:0,pengin:[],pengine_rpc:[],perform:0,permiss:[],permit:[],person:[],phil_dataset:0,phil_r:[],phil_test:0,pita:0,placemark:[],plcg:[],pldoc:[],plp17_b:0,plp:0,plu:[],point:0,polici:[],poo97:0,pool:0,portion:[],pos:0,posit:0,possibl:[],post:[],posterior:[],postlist:[],potenti:[],pr1:0,pr2:0,pr_1:[],pr_2:[],practic:[],preced:0,predic:0,predicate1:[],predicaten:[],predict:0,prepar:0,preprint:[],presenc:[],present:[],press:[],pretti:0,previou:0,print:0,prior:[],priorlist:[],prism_memo:[],prob:0,probabilist:0,probabl:0,problem:0,procedur:0,proceed:0,process:[],procur:[],produc:0,product:0,professor:0,profit:[],progol:0,programmat:[],project:0,promot:[],proof:[],proport:[],propos:[],provid:0,pubblic:[],publish:[],purpos:[],queri:0,quot:[],raedt:0,rais:[],ramakrishnan:[],rand_test:0,rand_train:0,random:0,random_restarts_numb:[],random_restarts_refnumb:[],randomli:0,rate:0,raw:[],reach:[],read:[],real:0,reason:0,recal:0,recogn:[],recognis:[],record:[],recoveri:[],recurs:[],red:[],redistribut:[],refin:[],reflect:[],regent:[],registr:[],regular:0,regularizationtyp:0,reject:[],relat:[],rememb:0,render:[],replac:0,report:0,repres:0,represent:[],reproduc:[],res:[],resampl:[],reserv:[],resolut:[],resolv:[],resort:[],respect:0,respons:[],rest:0,restart:[],restrict:0,retain:0,retriev:0,riccardo:0,rig13:[],rig14:0,right:[],riguzzi:0,ring1:0,ring2:0,robert:[],roc:0,rogram:0,rolog:[],root:0,rs10:0,rule:0,run:0,s10994:[],s1471068412000154:[],s1471068413000689:[],same:0,sampl:0,sample_hplp:0,sampled_mal:[],satisfi:[],sato:0,satur:0,save:0,savefil:0,savehplp:0,savestatist:0,schema:[],schloss:0,schrijver:0,script:[],search:[],second:0,section:0,see:0,seed:0,select:0,sent:[],separ:[],ser:[],serial:[],server:[],servic:[],set:0,set_hplp:0,set_lm:[],set_mc:[],set_pita:[],set_sc:0,set_sw:[],setrand:[],setse:0,setting_mc:[],setting_pita:[],shall:[],share:[],should:0,show:[],shown:0,signific:[],similar:[],simpl:[],simpli:0,simpson:[],simul:[],sinc:0,singl:0,single_var:[],site:0,size:0,sk01:0,sk97:[],sleahp:0,slipcov:[],slowest:[],small:0,smaller:0,softwar:[],solid:[],some:0,sourc:[],space:[],special:[],specif:0,specifi:0,speed:0,springer:0,squar:0,src_url:[],stand:0,stanlei:0,start:0,state:0,statist:0,statistics_fold:0,step:0,stoch_minibatch:0,stochast:[],stop:0,store:0,strategi:0,strict:[],string:0,student:0,student_gpa:[],style:0,sub:[],subfold:0,subgoal:[],substitut:[],subsumpt:0,succe:[],succeed:[],success:0,successor:[],suit:0,sum:0,sun:0,support:[],swift:0,swinb:[],swipl:0,symbol:0,symbond:0,symmetr:[],system:0,tabl:0,tail:[],taisuk:0,take:0,taken:0,target:0,taught:0,taught_bi:[],taughtbi:0,teacher:0,technic:0,techniqu:0,tempadvisedbi:[],term:0,termin:0,terranc:0,test_hplp:0,test_prob:[],test_r:[],testdb:[],than:0,thei:0,theil:0,them:0,theoret:[],theori:0,thi:0,third:0,thon:[],those:0,three:0,threshold:0,thu:[],time:[],tinn:[],togeth:[],toivonen:[],tom:0,top:[],tort:[],toss:[],total:[],train:0,transform:0,treat:[],tree:0,triangl:0,truncat:[],tune:[],tupl:[],twenti:[],two:0,type:0,typic:0,ubsumpt:0,uct:[],umbrella:[],unbias:[],uncertainti:0,unchang:[],undelet:[],under:0,undirect:[],unif:[],uniform:[],uniformli:[],univers:[],unsign:0,updat:0,upgrad:0,upload:[],url:0,use_all_mega_exampl:0,use_modul:0,use_rend:0,used:0,useinitparam:0,user:0,uses:0,using:0,usual:0,util:[],uwcs:0,uwcselearn:[],val:[],valid:0,vallist:[],valu:0,van:0,var_obj:[],variabl:0,variou:[],vdbtvodr10:[],vector:[],venneken:0,verbaeten:0,verbos:0,veri:0,visit:[],visual:[],vn51:[],vol:0,volum:0,von:[],vv03:0,vvb04:0,wai:[],want:0,warran:[],warranti:[],web:0,weigh:[],weight:0,wheel:[],when:0,where:0,whether:[],which:0,whole:0,whose:0,width:[],william:[],without:0,work:0,workshop:0,world:0,worn:[],would:0,write:0,written:[],www:[],xi_j:[],yap:[],yearsinprogram:[],yes:0,yield:[],yoshitaka:0,you:0,zentrum:0,zero:0,zese:0},titles:["phil on SWISH Manual - SWI-Prolog Version"],titleterms:{Using:[],api:[],background:0,bdd:[],bia:0,causal:[],command:0,condit:[],continu:[],cpl:[],dataset:0,decis:[],discret:[],distribut:[],download:[],draw:[],exampl:0,file:0,graph:[],hierarch:0,hyper:0,infer:0,initi:0,input:0,instal:0,interpret:0,introduct:0,languag:0,learn:0,licens:0,lpad:[],manual:0,paramet:0,pdf:0,phil:0,preambl:0,prism:[],probabl:[],problog:[],program:0,prolog:0,queri:[],refer:0,requir:0,result:[],semant:0,structur:0,swi:0,swish:0,syntax:0,tabl:[],test:0,theori:[],through:[],uncondit:[],use:0,variabl:[],version:0}}) \ No newline at end of file +Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},filenames:["index.rst"],objects:{},objnames:{},objtypes:{},terms:{"22nd":0,"6th":0,"case":0,"default":0,"export":0,"final":0,"float":0,"function":0,"int":0,"public":0,"return":0,"true":0,ACs:0,For:0,Res:0,The:0,Then:0,These:0,_build:0,_by:0,aachen:0,abl:0,abov:0,accord:0,account:0,act:0,actual:0,adam:0,adam_param:0,add:0,added:0,adding:0,advis:0,advisedbi:0,after:0,agent:0,aggreg:0,aleph:0,algorithm:0,algorithmtyp:0,all:0,allow:0,also:0,alt:0,altern:0,among:0,ani:0,annot:0,anoth:0,answer:0,appear:0,applic:0,area:0,arg1:0,argument:0,arithmet:0,ariti:0,arnaud:0,arnaudfadja:0,artif:0,artifici:0,artist:0,assert:0,assign:0,assist:0,associ:0,assumpt:0,atom:0,auc:0,aucpr:0,aucroc:0,author:0,automat:0,avail:0,b1_11:0,b1_12:0,b1_1m:0,b1_21:0,b1_22:0,b1_2m:0,b1_ij:0,b1_k1:0,b1_k2:0,b1_km:0,base:0,batch:0,batch_strategi:0,bayesian:0,becaus:0,befor:0,begin:0,begin_bg:0,begin_in:0,bellodi:0,bellow:0,below:0,ben:0,besid:0,beta1:0,beta2:0,between:0,bodi:0,bodyinput1:0,bodyinput2:0,bodyinput:0,bodyinputk:0,bond:0,bongard:0,bongardkei:0,both:0,bottom:0,bruynoogh:0,build:0,built:0,bxt096:0,c_1:0,c_2:0,c_seed:0,call:0,can:0,carc:0,central:0,certain:0,ceur:0,ceur_:0,chang:0,choic:0,chosen:0,christian:0,circl:0,circuit:0,cite:[],cj_j:0,claus:0,clean:0,clock:0,close:0,coauthor:0,code:0,coeffici:0,collect:0,combin:0,come:0,comjnl:0,commun:0,complex:0,comput:0,compute_areas_diagram:0,confer:0,config:0,conjunct:0,connect:0,consid:0,constant:0,constraint:0,contain:0,convert:0,copyright:0,cours:0,cplint:0,creat:0,current:0,curv:0,cw386:0,dagstuhl:0,data:0,databas:0,david:0,declar:0,deep:0,deeper:0,defin:0,definit:0,depend:0,deriv:0,descent:0,describ:0,det:0,determin:0,determinist:0,dict:0,dictionari:0,differ:0,dir:0,direct:0,directli:0,dirichlet:0,disabl:0,discret:0,disjunct:0,distribut:0,divid:0,doc:0,doi:0,domain:0,domingo:0,dphil:0,draw:0,drop:0,drvl95:0,dure:0,dynam:0,each:0,eason:0,editor:0,either:0,element:0,elena:0,emphil:0,empti:0,enabl:0,enclos:0,end:0,end_bg:0,end_in:0,ensur:0,epsilon:0,epsilon_deep:0,epsilon_deep_fract:0,equal:0,europ:0,evelina:0,evolut:0,exact:0,examplelist:0,execut:0,exit:0,expect:0,explicitli:0,express:0,extra:0,fabrizio:0,fact:0,fadja2021learn:[],fadja:0,fals:0,find:0,findal:0,first:0,five:0,fold:0,fold_nam:0,folder:0,follow:0,form:0,found:0,four:0,frl21:0,from:0,fte:0,ftr:0,fuer:0,fukuoka:0,gamma:0,gammacount:0,gener:0,germani:0,github:0,given:0,gradient:0,graph:0,greater:0,ground:0,harri:0,has:0,have:0,head:0,her:0,hid_1:0,hidden:0,hierarchi:0,highest:0,his:0,home:0,how:0,howev:0,hplp:0,hplp_learn:0,html:0,http:0,hypothes:0,iclp:0,identifi:0,immedi:0,implement:0,impos:0,includ:0,independ:0,indic:0,induce_hplp:0,induce_hplp_par:0,induct:0,inference_hplp:0,inform:0,informat:0,informatik:0,inherit:0,initial_clauses_per_megaex:0,insert:0,inspir:0,integ:0,intel:0,intellig:0,intention:0,interest:0,intern:0,interv:0,isjunct:0,italian:0,iter:0,its:0,japan:0,joint:0,kameya:0,kd05:0,kei:0,knowledg:0,kok:0,laer:0,lamma:0,larg:0,last:0,later:0,latex:0,layer:0,learningr:0,least:0,legal:0,leibniz:0,less:0,leuven:0,level:0,librari:0,like:0,likelihood:0,lipic:0,list:0,list_of_fold:0,liter:0,lnai:0,lnc:0,load:0,log:0,logic:0,logzero:0,lower:0,lpad:0,machin:0,mani:0,markov:0,matrix:0,max_initial_weight:0,max_lay:0,maxim:0,maximum:0,maxiter_phil:0,mean:0,mega:0,megaex_bottom:0,member:0,min_prob:0,mini:0,minibatch:0,mix:0,mod:0,modal:0,mode:0,modeb:0,modeh:0,model:0,modifi:0,modul:0,more:0,moreov:0,multipl:0,must:0,name:0,necessari:0,need:0,neg:0,neg_ex:0,network:0,neural:0,next:0,nfrl18a:0,nfrl18b:0,nguembang:0,nguembangfadjalr17:0,nnotat:0,non:0,normal:0,note:0,now:0,nswer:0,number:0,numer:0,obj:0,obtain:0,ogic:0,omit:0,one:0,ones:0,onli:0,option:0,order:0,org:0,other:0,otherwis:0,ouput:0,out:0,output:0,outsid:0,over:0,p1_1:0,p1_2:0,p1_i:0,p1_k:0,pack:0,pack_instal:0,pack_upgrad:0,page:0,pair:0,panel:0,paper2:0,parenthes:0,part:0,pedro:0,perform:0,phil_dataset:0,phil_test:0,pita:0,plp17_b:0,plp:0,point:0,poo97:0,pool:0,pos:0,posit:0,pr1:0,pr2:0,preced:0,predic:0,predict:0,prepar:0,pretti:0,previou:0,print:0,prob:0,probabilist:0,probabl:0,problem:0,procedur:0,proceed:0,produc:0,product:0,professor:0,progol:0,project:0,provid:0,queri:0,raedt:0,rand_test:0,rand_train:0,random:0,randomli:0,rate:0,real:0,reason:0,recal:0,regular:0,regularizationtyp:0,rememb:0,replac:0,report:0,repres:0,respect:0,rest:0,restrict:0,retain:0,retriev:0,riccardo:0,rig14:0,riguzzi:0,ring1:0,ring2:0,roc:0,rogram:0,root:0,rs10:0,rule:0,run:0,same:0,sampl:0,sample_hplp:0,sato:0,satur:0,save:0,savefil:0,savehplp:0,savestatist:0,schloss:0,schrijver:0,second:0,section:0,see:0,seed:0,select:0,set:0,set_hplp:0,set_sc:0,setse:0,should:0,shown:0,simpli:0,sinc:0,singl:0,site:0,size:0,sk01:0,sleahp:0,small:0,smaller:0,some:0,specif:0,specifi:0,speed:0,springer:0,squar:0,stand:0,stanlei:0,start:0,state:0,statist:0,statistics_fold:0,step:0,stoch_minibatch:0,stop:0,store:0,strategi:0,string:0,student:0,style:0,subfold:0,subsumpt:0,success:0,suit:0,sum:0,sun:0,swift:0,swipl:0,symbol:0,symbond:0,system:0,tabl:0,taisuk:0,take:0,taken:0,target:0,taught:0,taughtbi:0,teacher:0,technic:0,techniqu:0,term:0,termin:0,terranc:0,test_hplp:0,than:0,thei:0,theil:0,them:0,theori:0,thi:0,third:0,those:0,three:0,threshold:0,tom:0,train:0,transform:0,tree:0,triangl:0,two:0,type:0,typic:0,ubsumpt:0,uncertainti:0,under:0,unsign:0,updat:0,upgrad:0,url:0,use_all_mega_exampl:0,use_modul:0,use_rend:0,used:0,useinitparam:0,user:0,uses:0,using:0,usual:0,uwcs:0,valid:0,valu:0,van:0,variabl:0,venneken:0,verbaeten:0,verbos:0,veri:0,vol:0,volum:0,vv03:0,vvb04:0,want:0,web:0,weight:0,when:0,where:0,which:0,whole:0,whose:0,without:0,work:0,workshop:0,world:0,would:0,write:0,yes:0,yoshitaka:0,you:0,zentrum:0,zero:0,zese:0},titles:["phil on SWISH Manual - SWI-Prolog Version"],titleterms:{background:0,bia:0,command:0,dataset:0,exampl:0,file:0,hierarch:0,hyper:0,infer:0,initi:0,input:0,instal:0,interpret:0,introduct:0,languag:0,learn:0,licens:0,manual:0,paramet:0,pdf:0,phil:0,preambl:0,program:0,prolog:0,refer:0,requir:0,semant:0,structur:0,swi:0,swish:0,syntax:0,test:0,use:0,version:0}}) \ No newline at end of file diff --git a/packs_lib/phil/docs/_build/latex/footnotehyper-sphinx.sty b/packs_lib/phil/docs/_build/latex/footnotehyper-sphinx.sty index ff23f6ebe8..b6692cfb85 100644 --- a/packs_lib/phil/docs/_build/latex/footnotehyper-sphinx.sty +++ b/packs_lib/phil/docs/_build/latex/footnotehyper-sphinx.sty @@ -1,13 +1,13 @@ \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{footnotehyper-sphinx}% - [2017/03/07 v1.6 hyperref aware footnote.sty for sphinx (JFB)] + [2017/10/27 v1.7 hyperref aware footnote.sty for sphinx (JFB)] %% %% Package: footnotehyper-sphinx %% Version: based on footnotehyper.sty 2017/03/07 v1.0 -%% as available at http://www.ctan.org/pkg/footnotehyper +%% as available at https://www.ctan.org/pkg/footnotehyper %% License: the one applying to Sphinx %% -%% Refer to the PDF documentation at http://www.ctan.org/pkg/footnotehyper for +%% Refer to the PDF documentation at https://www.ctan.org/pkg/footnotehyper for %% the code comments. %% %% Differences: @@ -16,6 +16,7 @@ %% 3. use of \sphinxunactivateextrasandspace from sphinx.sty, %% 4. macro definition \sphinxfootnotemark, %% 5. macro definition \sphinxlongtablepatch +%% 6. replaced an \undefined by \@undefined \DeclareOption*{\PackageWarning{footnotehyper-sphinx}{Option `\CurrentOption' is unknown}}% \ProcessOptions\relax \newbox\FNH@notes @@ -197,7 +198,7 @@ }% \AtBeginDocument{% \let\FNH@@makefntext\@makefntext - \ifx\@makefntextFB\undefined + \ifx\@makefntextFB\@undefined \expandafter\@gobble\else\expandafter\@firstofone\fi {\ifFBFrenchFootnotes \let\FNH@@makefntext\@makefntextFB \else \let\FNH@@makefntext\@makefntextORI\fi}% diff --git a/packs_lib/phil/docs/_build/latex/latexmkjarc b/packs_lib/phil/docs/_build/latex/latexmkjarc index 39ea47f3ba..5b315d6c9c 100644 --- a/packs_lib/phil/docs/_build/latex/latexmkjarc +++ b/packs_lib/phil/docs/_build/latex/latexmkjarc @@ -1,6 +1,21 @@ $latex = 'platex ' . $ENV{'LATEXOPTS'} . ' -kanji=utf8 %O %S'; $dvipdf = 'dvipdfmx %O -o %D %S'; -$makeindex = 'rm -f %D; mendex -U -f -d %B.dic -s python.ist %S || echo "mendex exited with error code $? (ignoring)" && : >> %D'; +$makeindex = 'internal mendex %S %B %D'; +sub mendex { + my ($source, $basename, $destination) = @_; + my $dictfile = $basename . ".dic"; + unlink($destination); + system("mendex", "-U", "-f", "-d", $dictfile, "-s", "python.ist", $source); + if ($? > 0) { + print("mendex exited with error code $? (ignored)\n"); + } + if (!-e $destination) { + # create an empty .ind file if nothing + open(FH, ">" . $destination); + close(FH); + } + return 0; +} add_cus_dep( "glo", "gls", 0, "makeglo" ); sub makeglo { return system( "mendex -J -f -s gglo.ist -o '$_[0].gls' '$_[0].glo'" ); diff --git a/packs_lib/phil/docs/_build/latex/phil.aux b/packs_lib/phil/docs/_build/latex/phil.aux index 99855575a1..c24532b461 100644 --- a/packs_lib/phil/docs/_build/latex/phil.aux +++ b/packs_lib/phil/docs/_build/latex/phil.aux @@ -1,5 +1,6 @@ \relax \providecommand\hyper@newdestlabel[2]{} +\@nameuse{bbl@beforestart} \providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} \HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined \global\let\oldcontentsline\contentsline @@ -17,109 +18,100 @@ \providecommand\HyField@AuxAddToFields[1]{} \providecommand\HyField@AuxAddToCoFields[2]{} \babel@aux{english}{} +\citation{index:fadja2021learning} +\citation{index:ngulamrig17-plp-iw} \newlabel{index::doc}{{}{1}{}{section*.2}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {1}Introduction}{1}{chapter.1}} +\@writefile{toc}{\contentsline {chapter}{\numberline {1}Introduction}{1}{chapter.1}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} \newlabel{index:introduction}{{1}{1}{Introduction}{chapter.1}{}} -\newlabel{index:phil-on-swish-manual-swi-prolog-version}{{1}{1}{Introduction}{chapter.1}{}} -\newlabel{index:id1}{{1}{1}{Introduction}{section*.3}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {2}Installation}{3}{chapter.2}} +\@writefile{toc}{\contentsline {chapter}{\numberline {2}Installation}{3}{chapter.2}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} \newlabel{index:installation}{{2}{3}{Installation}{chapter.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {2.1}Requirements}{3}{section.2.1}} +\@writefile{toc}{\contentsline {section}{\numberline {2.1}Requirements}{3}{section.2.1}\protected@file@percent } \newlabel{index:requirements}{{2.1}{3}{Requirements}{section.2.1}{}} -\@writefile{toc}{\contentsline {section}{\numberline {2.2}Example of use}{3}{section.2.2}} +\@writefile{toc}{\contentsline {section}{\numberline {2.2}Example of use}{3}{section.2.2}\protected@file@percent } \newlabel{index:example-of-use}{{2.2}{3}{Example of use}{section.2.2}{}} -\@writefile{toc}{\contentsline {section}{\numberline {2.3}Testing the installation}{3}{section.2.3}} +\@writefile{toc}{\contentsline {section}{\numberline {2.3}Testing the installation}{3}{section.2.3}\protected@file@percent } \newlabel{index:testing-the-installation}{{2.3}{3}{Testing the installation}{section.2.3}{}} -\@writefile{toc}{\contentsline {section}{\numberline {2.4}Datasets}{4}{section.2.4}} +\@writefile{toc}{\contentsline {section}{\numberline {2.4}Datasets}{4}{section.2.4}\protected@file@percent } \newlabel{index:datasets}{{2.4}{4}{Datasets}{section.2.4}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {3}Syntax}{5}{chapter.3}} +\citation{index:fadja2021learning} +\citation{index:venver03-tr} +\citation{index:venver04-iclp04-ic} +\citation{index:kok2005learning} +\@writefile{toc}{\contentsline {chapter}{\numberline {3}Syntax}{5}{chapter.3}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} \newlabel{index:syntax}{{3}{5}{Syntax}{chapter.3}{}} -\newlabel{index:id2}{{3}{5}{Syntax}{section*.4}{}} -\newlabel{index:id3}{{3}{5}{Syntax}{section*.5}{}} -\newlabel{index:id4}{{3}{5}{Syntax}{section*.6}{}} -\newlabel{index:id5}{{3}{5}{Syntax}{section*.7}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {4}Semantics}{7}{chapter.4}} +\citation{index:dblp-journals-ai-poole97} +\citation{index:dblp-journals-jair-satok01} +\@writefile{toc}{\contentsline {chapter}{\numberline {4}Semantics}{7}{chapter.4}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} \newlabel{index:semantics}{{4}{7}{Semantics}{chapter.4}{}} -\newlabel{index:id6}{{4}{7}{Semantics}{section*.8}{}} -\newlabel{index:id7}{{4}{7}{Semantics}{section*.9}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {5}Inference}{9}{chapter.5}} +\citation{index:rig14-cj-ij} +\citation{index:rigswi10-iclp10-ic} +\citation{index:fadja2021learning} +\citation{index:ngulamrig17-plp-iw} +\@writefile{toc}{\contentsline {chapter}{\numberline {5}Inference}{9}{chapter.5}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} \newlabel{index:inference}{{5}{9}{Inference}{chapter.5}{}} -\newlabel{index:id8}{{5}{9}{Inference}{section*.10}{}} -\newlabel{index:id9}{{5}{9}{Inference}{section*.11}{}} -\newlabel{index:id10}{{5}{9}{Inference}{section*.12}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {6}Learning}{11}{chapter.6}} +\citation{index:nguriglam18-plp-iw} +\citation{index:fadja2018expectation} +\citation{index:raelae95-alt95} +\@writefile{toc}{\contentsline {chapter}{\numberline {6}Learning}{11}{chapter.6}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} \newlabel{index:learning}{{6}{11}{Learning}{chapter.6}{}} -\newlabel{index:id11}{{6}{11}{Learning}{section*.13}{}} -\newlabel{index:id12}{{6}{11}{Learning}{section*.14}{}} -\@writefile{toc}{\contentsline {section}{\numberline {6.1}Input}{11}{section.6.1}} +\@writefile{toc}{\contentsline {section}{\numberline {6.1}Input}{11}{section.6.1}\protected@file@percent } \newlabel{index:input}{{6.1}{11}{Input}{section.6.1}{}} -\newlabel{index:id13}{{6.1}{11}{Input}{section*.15}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.1}Preamble}{11}{subsection.6.1.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.1}Preamble}{11}{subsection.6.1.1}\protected@file@percent } \newlabel{index:preamble}{{6.1.1}{11}{Preamble}{subsection.6.1.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.2}Background and Initial hierarchical program}{12}{subsection.6.1.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.2}Background and Initial hierarchical program}{12}{subsection.6.1.2}\protected@file@percent } \newlabel{index:background-and-initial-hierarchical-program}{{6.1.2}{12}{Background and Initial hierarchical program}{subsection.6.1.2}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.3}Language Bias}{13}{subsection.6.1.3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.3}Language Bias}{13}{subsection.6.1.3}\protected@file@percent } \newlabel{index:language-bias}{{6.1.3}{13}{Language Bias}{subsection.6.1.3}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.4}Example Interpretations}{14}{subsection.6.1.4}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.4}Example Interpretations}{14}{subsection.6.1.4}\protected@file@percent } \newlabel{index:example-interpretations}{{6.1.4}{14}{Example Interpretations}{subsection.6.1.4}{}} -\@writefile{toc}{\contentsline {section}{\numberline {6.2}Commands}{16}{section.6.2}} +\@writefile{toc}{\contentsline {section}{\numberline {6.2}Commands}{16}{section.6.2}\protected@file@percent } \newlabel{index:commands}{{6.2}{16}{Commands}{section.6.2}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.1}Parameter Learning}{16}{subsection.6.2.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.1}Parameter Learning}{16}{subsection.6.2.1}\protected@file@percent } \newlabel{index:parameter-learning}{{6.2.1}{16}{Parameter Learning}{subsection.6.2.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.2}Structure Learning}{16}{subsection.6.2.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.2}Structure Learning}{16}{subsection.6.2.2}\protected@file@percent } \newlabel{index:structure-learning}{{6.2.2}{16}{Structure Learning}{subsection.6.2.2}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.3}Testing}{16}{subsection.6.2.3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.3}Testing}{16}{subsection.6.2.3}\protected@file@percent } \newlabel{index:testing}{{6.2.3}{16}{Testing}{subsection.6.2.3}{}} -\@writefile{toc}{\contentsline {section}{\numberline {6.3}Hyper-parameters for Learning}{17}{section.6.3}} +\@writefile{toc}{\contentsline {section}{\numberline {6.3}Hyper-parameters for Learning}{17}{section.6.3}\protected@file@percent } \newlabel{index:hyper-parameters-for-learning}{{6.3}{17}{Hyper-parameters for Learning}{section.6.3}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {7}Example Files}{21}{chapter.7}} +\@writefile{toc}{\contentsline {chapter}{\numberline {7}Example Files}{21}{chapter.7}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} \newlabel{index:example-files}{{7}{21}{Example Files}{chapter.7}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {8}Manual in PDF}{23}{chapter.8}} +\@writefile{toc}{\contentsline {chapter}{\numberline {8}Manual in PDF}{23}{chapter.8}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} \newlabel{index:manual-in-pdf}{{8}{23}{Manual in PDF}{chapter.8}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {9}License}{25}{chapter.9}} +\@writefile{toc}{\contentsline {chapter}{\numberline {9}License}{25}{chapter.9}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} \newlabel{index:license}{{9}{25}{License}{chapter.9}{}} -\@writefile{toc}{\contentsline {chapter}{\numberline {10}References}{27}{chapter.10}} +\@writefile{toc}{\contentsline {chapter}{\numberline {10}References}{27}{chapter.10}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} \newlabel{index:references}{{10}{27}{References}{chapter.10}{}} -\bibcite{DRVL95}{DRVL95} -\bibcite{KD05}{KD05} -\bibcite{NFRL18a}{NFRL18a} -\bibcite{NFRL18b}{NFRL18b} -\bibcite{Poo97}{Poo97} -\bibcite{Rig14}{Rig14} -\bibcite{RS10}{RS10} -\bibcite{SK01}{SK01} -\bibcite{VV03}{VV03} -\bibcite{VVB04}{VVB04} -\bibcite{NguembangFadjaLR17}{NguembangFadjaLR17} -\@writefile{toc}{\contentsline {chapter}{Bibliography}{29}{chapter*.16}} -\newlabel{index:raelae95-alt95}{{10}{29}{\bibname }{section*.17}{}} -\newlabel{index:kok2005learning}{{10}{29}{\bibname }{section*.18}{}} -\newlabel{index:fadja2018expectation}{{10}{29}{\bibname }{section*.19}{}} -\newlabel{index:nguriglam18-plp-iw}{{10}{29}{\bibname }{section*.20}{}} -\newlabel{index:dblp-journals-ai-poole97}{{10}{29}{\bibname }{section*.21}{}} -\newlabel{index:rig14-cj-ij}{{10}{29}{\bibname }{section*.22}{}} -\newlabel{index:rigswi10-iclp10-ic}{{10}{29}{\bibname }{section*.23}{}} -\newlabel{index:dblp-journals-jair-satok01}{{10}{29}{\bibname }{section*.24}{}} -\newlabel{index:venver03-tr}{{10}{29}{\bibname }{section*.25}{}} -\newlabel{index:venver04-iclp04-ic}{{10}{29}{\bibname }{section*.26}{}} -\newlabel{index:ngulamrig17-plp-iw}{{10}{29}{\bibname }{section*.27}{}} +\bibcite{index:raelae95-alt95}{DRVL95} +\bibcite{index:fadja2021learning}{FRL21} +\bibcite{index:kok2005learning}{KD05} +\bibcite{index:fadja2018expectation}{NFRL18a} +\bibcite{index:nguriglam18-plp-iw}{NFRL18b} +\bibcite{index:dblp-journals-ai-poole97}{Poo97} +\bibcite{index:rig14-cj-ij}{Rig14} +\bibcite{index:rigswi10-iclp10-ic}{RS10} +\bibcite{index:dblp-journals-jair-satok01}{SK01} +\bibcite{index:venver03-tr}{VV03} +\bibcite{index:venver04-iclp04-ic}{VVB04} +\bibcite{index:ngulamrig17-plp-iw}{NguembangFadjaLR17} +\@writefile{toc}{\contentsline {chapter}{Bibliography}{29}{chapter*.3}\protected@file@percent } diff --git a/packs_lib/phil/docs/_build/latex/phil.fdb_latexmk b/packs_lib/phil/docs/_build/latex/phil.fdb_latexmk index a04538fe69..3465f86252 100644 --- a/packs_lib/phil/docs/_build/latex/phil.fdb_latexmk +++ b/packs_lib/phil/docs/_build/latex/phil.fdb_latexmk @@ -1,173 +1,173 @@ # Fdb version 3 -["makeindex phil.idx"] 1580287447 "phil.idx" "phil.ind" "phil" 1584103483 - "phil.idx" 1584103482 0 d41d8cd98f00b204e9800998ecf8427e "" +["makeindex phil.idx"] 1580287447 "phil.idx" "phil.ind" "phil" 1640010453 + "phil.idx" 1640010448 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" (generated) "phil.ilg" "phil.ind" -["pdflatex"] 1584103482 "phil.tex" "phil.pdf" "phil" 1584103483 - "/etc/texmf/web2c/texmf.cnf" 1579868053 475 c0e671620eb5563b2130f56340a5fde8 "" - "/usr/share/texlive/texmf-dist/fonts/enc/dvips/base/8r.enc" 1480098666 4850 80dc9bab7f31fb78a000ccfed0e27cab "" - "/usr/share/texlive/texmf-dist/fonts/map/fontname/texfonts.map" 1511824771 3332 103109f5612ad95229751940c61aada0 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrb8r.tfm" 1480098688 1292 3059476c50a24578715759f22652f3d0 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrb8t.tfm" 1480098688 1384 87406e4336af44af883a035f17f319d9 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm" 1480098688 1292 bd42be2f344128bff6d35d98474adfe3 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrr8t.tfm" 1480098688 1384 4632f5e54900a7dadbb83f555bc61e56 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrro8r.tfm" 1480098688 1544 4fb84cf2931ec523c2c6a08d939088ba "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrro8t.tfm" 1480098688 1596 04a657f277f0401ba37d66e716627ac4 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/helvetic/phvb8r.tfm" 1480098688 4484 b828043cbd581d289d955903c1339981 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/helvetic/phvb8t.tfm" 1480098688 6628 34c39492c0adc454c1c199922bba8363 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/helvetic/phvbo8r.tfm" 1480098688 4736 423eba67d4e9420ec9df4a8def143b08 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/helvetic/phvbo8t.tfm" 1480098688 6880 fe6c7967f27585f6fa9876f3af14edd2 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/helvetic/phvr8t.tfm" 1480098688 7040 b2bd27e2bfe6f6948cbc3239cae7444f "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm" 1480098689 4524 6bce29db5bc272ba5f332261583fee9c "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm" 1480098689 6880 f19b8995b61c334d78fc734065f6b4d4 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8c.tfm" 1480098689 1352 fa28a7e6d323c65ce7d13d5342ff6be2 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm" 1480098689 4408 25b74d011a4c66b7f212c0cc3c90061b "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm" 1480098689 6672 e3ab9e37e925f3045c9005e6d1473d56 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm" 1480098689 4640 532ca3305aad10cc01d769f3f91f1029 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmri8t.tfm" 1480098689 6944 94c55ad86e6ea2826f78ba2240d50df9 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/jknappen/ec/ecrm1000.tfm" 1480098696 3584 adb004a0c8e7c46ee66cad73671f37b4 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm" 1480098698 1004 54797486969f23fa377b128694d548df "" - "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm" 1480098698 916 f87d7c45f9c908e672703b83b72241a3 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam5.tfm" 1480098698 924 9904cf1d39e9767e7a3622f2a125a565 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm" 1480098698 928 2dc8d444221b7a635bb58038579b861a "" - "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm" 1480098698 908 2921f8a10601f252058503cc6570e581 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm5.tfm" 1480098698 940 75ac932a52f80982a9f8ea75d03a34cf "" - "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm" 1480098698 940 228d6584342e91276bf566bcf9716b83 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmex10.tfm" 1480098701 992 662f679a0b3d2d53c1b94050fdaa3f50 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm" 1480098701 1524 4414a8315f39513458b80dfc63bff03a "" - "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr12.tfm" 1480098701 1288 655e228510b4c2a1abe905c368440826 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr17.tfm" 1480098701 1292 296a67155bdbfc32aa9c636f21e91433 "" - "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm" 1480098701 1124 6c73e740cf17375f03eec0ee63599741 "" - "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb" 1480098733 36299 5f9df58c2139e7edcf37c8fca4bd384d "" - "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi5.pfb" 1480098733 37912 77d683123f92148345f3fc36a38d9ab1 "" - "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb" 1480098733 35752 024fb6c41858982481f6968b5fc26508 "" - "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy5.pfb" 1480098733 32915 7bf7720c61a5b3a7ff25b0964421c9b6 "" - "/usr/share/texlive/texmf-dist/fonts/type1/urw/courier/ucrb8a.pfb" 1480098746 50493 4ed1f7e9eba8f1f3e1ec25195460190d "" - "/usr/share/texlive/texmf-dist/fonts/type1/urw/courier/ucrr8a.pfb" 1480098746 45758 19968a0990191524e34e1994d4a31cb6 "" - "/usr/share/texlive/texmf-dist/fonts/type1/urw/courier/ucrro8a.pfb" 1480098746 44404 ea3d9c0311883914133975dd62a9185c "" - "/usr/share/texlive/texmf-dist/fonts/type1/urw/helvetic/uhvb8a.pfb" 1480098746 35941 f27169cc74234d5bd5e4cca5abafaabb "" - "/usr/share/texlive/texmf-dist/fonts/type1/urw/helvetic/uhvbo8a.pfb" 1480098746 39013 b244066151b1e3e718f9b8e88a5ff23b "" - "/usr/share/texlive/texmf-dist/fonts/type1/urw/times/utmb8a.pfb" 1480098746 44729 811d6c62865936705a31c797a1d5dada "" - "/usr/share/texlive/texmf-dist/fonts/type1/urw/times/utmr8a.pfb" 1480098746 46026 6dab18b61c907687b520c72847215a68 "" - "/usr/share/texlive/texmf-dist/fonts/type1/urw/times/utmri8a.pfb" 1480098746 45458 a3faba884469519614ca56ba5f6b1de1 "" - "/usr/share/texlive/texmf-dist/fonts/vf/adobe/courier/pcrb8t.vf" 1480098757 2184 5d20c8b00cd914e50251116c274e2d0b "" - "/usr/share/texlive/texmf-dist/fonts/vf/adobe/courier/pcrr8t.vf" 1480098757 2184 8475af1b9cfa983db5f46f5ed4b8f9f7 "" - "/usr/share/texlive/texmf-dist/fonts/vf/adobe/courier/pcrro8t.vf" 1480098757 2280 d7cd083c724c9449e1d12731253966f7 "" - "/usr/share/texlive/texmf-dist/fonts/vf/adobe/helvetic/phvb8t.vf" 1480098757 2340 0efed6a948c3c37d870e4e7ddb85c7c3 "" - "/usr/share/texlive/texmf-dist/fonts/vf/adobe/helvetic/phvbo8t.vf" 1480098757 2344 88834f8322177295b0266ecc4b0754c3 "" - "/usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf" 1480098758 2340 df9c920cc5688ebbf16a93f45ce7bdd3 "" - "/usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmr8c.vf" 1480098758 3556 8a9a6dcbcd146ef985683f677f4758a6 "" - "/usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf" 1480098758 2348 91706c542228501c410c266421fbe30c "" - "/usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmri8t.vf" 1480098758 2328 6cd7df782b09b29cfc4d93e55b6b9a59 "" - "/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1480098806 71627 94eb9990bed73c364d7f53f960cc8c5b "" +["pdflatex"] 1640010447 "phil.tex" "phil.pdf" "phil" 1640010453 + "/etc/texmf/web2c/texmf.cnf" 1634807904 475 c0e671620eb5563b2130f56340a5fde8 "" + "/usr/share/texlive/texmf-dist/fonts/enc/dvips/base/8r.enc" 1165713224 4850 80dc9bab7f31fb78a000ccfed0e27cab "" + "/usr/share/texlive/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrb8r.tfm" 1136768653 1292 3059476c50a24578715759f22652f3d0 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrb8t.tfm" 1136768653 1384 87406e4336af44af883a035f17f319d9 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm" 1136768653 1292 bd42be2f344128bff6d35d98474adfe3 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrr8t.tfm" 1136768653 1384 4632f5e54900a7dadbb83f555bc61e56 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrro8r.tfm" 1136768653 1544 4fb84cf2931ec523c2c6a08d939088ba "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrro8t.tfm" 1136768653 1596 04a657f277f0401ba37d66e716627ac4 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/helvetic/phvb8r.tfm" 1136768653 4484 b828043cbd581d289d955903c1339981 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/helvetic/phvb8t.tfm" 1136768653 6628 34c39492c0adc454c1c199922bba8363 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/helvetic/phvbo8r.tfm" 1136768653 4736 423eba67d4e9420ec9df4a8def143b08 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/helvetic/phvbo8t.tfm" 1136768653 6880 fe6c7967f27585f6fa9876f3af14edd2 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/helvetic/phvr8t.tfm" 1136768653 7040 b2bd27e2bfe6f6948cbc3239cae7444f "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm" 1136768653 4524 6bce29db5bc272ba5f332261583fee9c "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmb8t.tfm" 1136768653 6880 f19b8995b61c334d78fc734065f6b4d4 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8c.tfm" 1136768653 1352 fa28a7e6d323c65ce7d13d5342ff6be2 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm" 1136768653 4408 25b74d011a4c66b7f212c0cc3c90061b "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm" 1136768653 6672 e3ab9e37e925f3045c9005e6d1473d56 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm" 1136768653 4640 532ca3305aad10cc01d769f3f91f1029 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmri8t.tfm" 1136768653 6944 94c55ad86e6ea2826f78ba2240d50df9 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/jknappen/ec/ecrm1000.tfm" 1136768653 3584 adb004a0c8e7c46ee66cad73671f37b4 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm" 1246382020 1004 54797486969f23fa377b128694d548df "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm" 1246382020 916 f87d7c45f9c908e672703b83b72241a3 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam5.tfm" 1246382020 924 9904cf1d39e9767e7a3622f2a125a565 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm" 1246382020 928 2dc8d444221b7a635bb58038579b861a "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm" 1246382020 908 2921f8a10601f252058503cc6570e581 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm5.tfm" 1246382020 940 75ac932a52f80982a9f8ea75d03a34cf "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm" 1246382020 940 228d6584342e91276bf566bcf9716b83 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmex10.tfm" 1136768653 992 662f679a0b3d2d53c1b94050fdaa3f50 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm" 1136768653 1524 4414a8315f39513458b80dfc63bff03a "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr12.tfm" 1136768653 1288 655e228510b4c2a1abe905c368440826 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr17.tfm" 1136768653 1292 296a67155bdbfc32aa9c636f21e91433 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm" 1136768653 1124 6c73e740cf17375f03eec0ee63599741 "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb" 1248133631 36299 5f9df58c2139e7edcf37c8fca4bd384d "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi5.pfb" 1248133631 37912 77d683123f92148345f3fc36a38d9ab1 "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb" 1248133631 35752 024fb6c41858982481f6968b5fc26508 "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy5.pfb" 1248133631 32915 7bf7720c61a5b3a7ff25b0964421c9b6 "" + "/usr/share/texlive/texmf-dist/fonts/type1/urw/courier/ucrb8a.pfb" 1136849748 50493 4ed1f7e9eba8f1f3e1ec25195460190d "" + "/usr/share/texlive/texmf-dist/fonts/type1/urw/courier/ucrr8a.pfb" 1136849748 45758 19968a0990191524e34e1994d4a31cb6 "" + "/usr/share/texlive/texmf-dist/fonts/type1/urw/courier/ucrro8a.pfb" 1136849748 44404 ea3d9c0311883914133975dd62a9185c "" + "/usr/share/texlive/texmf-dist/fonts/type1/urw/helvetic/uhvb8a.pfb" 1136849748 35941 f27169cc74234d5bd5e4cca5abafaabb "" + "/usr/share/texlive/texmf-dist/fonts/type1/urw/helvetic/uhvbo8a.pfb" 1136849748 39013 b244066151b1e3e718f9b8e88a5ff23b "" + "/usr/share/texlive/texmf-dist/fonts/type1/urw/times/utmb8a.pfb" 1136849748 44729 811d6c62865936705a31c797a1d5dada "" + "/usr/share/texlive/texmf-dist/fonts/type1/urw/times/utmr8a.pfb" 1136849748 46026 6dab18b61c907687b520c72847215a68 "" + "/usr/share/texlive/texmf-dist/fonts/type1/urw/times/utmri8a.pfb" 1136849748 45458 a3faba884469519614ca56ba5f6b1de1 "" + "/usr/share/texlive/texmf-dist/fonts/vf/adobe/courier/pcrb8t.vf" 1136768653 2184 5d20c8b00cd914e50251116c274e2d0b "" + "/usr/share/texlive/texmf-dist/fonts/vf/adobe/courier/pcrr8t.vf" 1136768653 2184 8475af1b9cfa983db5f46f5ed4b8f9f7 "" + "/usr/share/texlive/texmf-dist/fonts/vf/adobe/courier/pcrro8t.vf" 1136768653 2280 d7cd083c724c9449e1d12731253966f7 "" + "/usr/share/texlive/texmf-dist/fonts/vf/adobe/helvetic/phvb8t.vf" 1136768653 2340 0efed6a948c3c37d870e4e7ddb85c7c3 "" + "/usr/share/texlive/texmf-dist/fonts/vf/adobe/helvetic/phvbo8t.vf" 1136768653 2344 88834f8322177295b0266ecc4b0754c3 "" + "/usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmb8t.vf" 1136768653 2340 df9c920cc5688ebbf16a93f45ce7bdd3 "" + "/usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmr8c.vf" 1136768653 3556 8a9a6dcbcd146ef985683f677f4758a6 "" + "/usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf" 1136768653 2348 91706c542228501c410c266421fbe30c "" + "/usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmri8t.vf" 1136768653 2328 6cd7df782b09b29cfc4d93e55b6b9a59 "" + "/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1461363279 71627 94eb9990bed73c364d7f53f960cc8c5b "" + "/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty" 1575674566 24708 5584a51a7101caf7e6bbf1fc27d8f7b1 "" "/usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf" 1496785618 7008 9ff5fdcc865b01beca2b0fe4a46231d4 "" - "/usr/share/texlive/texmf-dist/tex/generic/babel/babel.def" 1518644053 67244 2dce3d67c354c8d92f638d0f8682fb73 "" - "/usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty" 1518644053 15861 065fe343082d0cd2428cf984d6b2ef66 "" - "/usr/share/texlive/texmf-dist/tex/generic/babel/switch.def" 1518644053 12523 d80bc74bf5e02fe4304443a6de8d01be "" - "/usr/share/texlive/texmf-dist/tex/generic/babel/txtbabel.def" 1518644053 7434 1b3955075683beb1c883a0fcf92ed2d5 "" - "/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty" 1480098815 1458 43ab4710dc82f3edeabecd0d099626b2 "" - "/usr/share/texlive/texmf-dist/tex/generic/oberdiek/etexcmds.sty" 1480098815 7612 729a8cc22a1ee0029997c7f74717ae05 "" - "/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty" 1480098815 8237 3b62ef1f7e2c23a328c814b3893bc11f "" - "/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty" 1517006633 185082 6c11d4e30ed78e2a12957b7e77030856 "" - "/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty" 1480098815 70864 bcd5b216757bd619ae692a151d90085d "" - "/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifluatex.sty" 1480098815 7324 2310d1247db0114eb4726807c8837a0e "" - "/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty" 1490564930 1251 d170e11a3246c3392bc7f59595af42cb "" - "/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifvtex.sty" 1480098815 6797 90b7f83b0ad46826bc16058b1e3d48df "" - "/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty" 1480098815 8253 473e0e41f9adadb1977e8631b8f72ea6 "" - "/usr/share/texlive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty" 1480098815 14040 ac8866aac45982ac84021584b0abb252 "" - "/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty" 1480098815 18425 5b3c0c59d76fac78978b5558e83c1f36 "" - "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty" 1480098820 5949 3f3fd50a8cc94c3d4cbf4fc66cd3df1c "" - "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty" 1480098820 13829 94730e64147574077f8ecfea9bb69af4 "" - "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd" 1480098820 961 6518c6525a34feb5e8250ffa91731cff "" - "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd" 1480098820 961 d02606146ba5601b5645f987c92e6193 "" - "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty" 1480098820 2210 5c54ab129b848a5071554186d0168766 "" - "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty" 1480098820 4160 c115536cf8d4ff25aa8c1c9bc4ecb79a "" - "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty" 1504905757 84352 897a476d96a0681047a5b0f91178a3d2 "" - "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty" 1480098820 4115 318a66090112f3aa3f415aeb6fe8540f "" - "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty" 1480098820 2431 fe3078ec12fc30287f568596f8e0b948 "" - "/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty" 1480098821 3140 977eaf314c97ac67b8675753fb15f67f "" - "/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty" 1492297155 4571 13977df0eda144b93597fc709035ad1f "" - "/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty" 1480098821 4732 d63eda807ac82cca2ca8488efd31a966 "" - "/usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty" 1480098821 1940 c559b92ca91f1b2a0e60d836d4973f41 "" - "/usr/share/texlive/texmf-dist/tex/latex/base/omsenc.dfu" 1487721667 2004 ac51aeac484f08c01026120d62677eca "" - "/usr/share/texlive/texmf-dist/tex/latex/base/ot1enc.dfu" 1487721667 3181 1cb3e9ad01f4a01127b2ffd821bfeec7 "" - "/usr/share/texlive/texmf-dist/tex/latex/base/report.cls" 1480098821 22880 e7be6f7dd8c05d5108bf3a7d8cabe59a "" - "/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo" 1480098821 8292 e897c12e1e886ce77fe26afc5d470886 "" - "/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def" 1492297155 10006 a90ba4035cf778f32f424e297d92e235 "" - "/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.dfu" 1487721667 11255 9d97362866549d3d3c994b5f28d1b9b5 "" - "/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty" 1492297155 16154 f2c73e20ca771d534a8516c62c6b0eae "" - "/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd" 1480098821 2217 d274654bda1292013bdf48d5f720a495 "" - "/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def" 1480098821 7767 aa88823823f5e767d79ea1166ab1ae74 "" - "/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.dfu" 1487721667 4919 76510afd60e8282294f944c2f9f5103b "" - "/usr/share/texlive/texmf-dist/tex/latex/base/utf8.def" 1487721667 7784 325a2a09984cb5c4ff230f9867145ad3 "" - "/usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty" 1480098823 1311 063f8536a047a2d9cb1803321f793f37 "" - "/usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty" 1480098825 2883 427a7f7cb58418a0394dbd85c80668f6 "" - "/usr/share/texlive/texmf-dist/tex/latex/cmap/ot1.cmap" 1480098825 1207 4e0d96772f0d338847cbfb4eca683c81 "" - "/usr/share/texlive/texmf-dist/tex/latex/cmap/t1.cmap" 1480098825 1938 beaa4a8467aa0074076e0e19f2992e29 "" - "/usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty" 1498861448 10663 d7fcc0dc4f35e8998b8cfeef8407d37d "" - "/usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty" 1480098827 45360 a0833d32f1b541964596b02870342d5a "" - "/usr/share/texlive/texmf-dist/tex/latex/float/float.sty" 1480098828 6749 16d2656a1984957e674b149555f1ea1d "" - "/usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty" 1480098828 19488 fdd52eb173b3197d748e1ec25acb042f "" - "/usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty" 1480098829 22449 7ec15c16d0d66790f28e90343c5434a3 "" - "/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty" 1480098829 40502 e003406220954b0716679d7928aedd8a "" - "/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg" 1480098830 1213 620bba36b25224fa9b7e1ccb4ecb76fd "" - "/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg" 1480098830 1224 978390e9c2234eab29404bc21b268d1e "" + "/usr/share/texlive/texmf-dist/tex/generic/babel/babel.def" 1581719732 87344 ec128793fb5196bbcc1741e5366ddac1 "" + "/usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty" 1581719732 18844 909add1631725af40d27125357ea816e "" + "/usr/share/texlive/texmf-dist/tex/generic/babel/switch.def" 1581719732 15529 e761dc130df77f0ce9717a25d1b52a95 "" + "/usr/share/texlive/texmf-dist/tex/generic/babel/txtbabel.def" 1580769195 5220 42a6518b499d20676051f269c61f4d9a "" + "/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty" 1576625341 40635 c40361e206be584d448876bba8a64a3b "" + "/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty" 1576016050 33961 6b5c75130e435b2bfdb9f480a09a39f9 "" + "/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty" 1576625273 7734 b98cbb34c81f667027c1e3ebdbfce34b "" + "/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty" 1576625223 8371 9d55b8bd010bc717624922fb3477d92e "" + "/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty" 1573336935 6902 30fdaf7dc5636b8e3afa306210c45cae "" + "/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty" 1572645307 1057 525c2192b5febbd8c1f662c9468335bb "" + "/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty" 1575499628 8356 7bbb2c2373aa810be568c29e333da8ed "" + "/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty" 1576625065 31769 002a487f55041f8e805cfbf6385ffd97 "" + "/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty" 1576878844 5412 d5a2436094cd7be85769db90f29250a6 "" + "/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty" 1576624944 13807 952b0226d4efca026f0e19dd266dcc22 "" + "/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1576624883 18552 1e1cc7b75da0dfaacce7cdcb27d306bf "" + "/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty" 1576015897 19007 15924f7228aca6c6d184b115f4baa231 "" + "/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty" 1576624663 7008 f92eaa0a3872ed622bbf538217cd2ab7 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty" 1359763108 5949 3f3fd50a8cc94c3d4cbf4fc66cd3df1c "" + "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty" 1359763108 13829 94730e64147574077f8ecfea9bb69af4 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd" 1359763108 961 6518c6525a34feb5e8250ffa91731cff "" + "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd" 1359763108 961 d02606146ba5601b5645f987c92e6193 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty" 1523134290 2211 ca7ce284ab93c8eecdc6029dc5ccbd73 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty" 1523134290 4161 7f6eb9092061a11f87d08ed13515b48d "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty" 1580683321 85660 baee036978c7a91f4e2bba43f05e5945 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty" 1523134290 4116 32e6abd27229755a83a8b7f18e583890 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty" 1523134290 2432 8ff93b1137020e8f21930562a874ae66 "" + "/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty" 1576191570 19336 ce7ae9438967282886b3b036cfad1e4d "" + "/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty" 1576625391 3935 57aa3c3e203a5c2effb4d2bd2efbc323 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty" 1580683321 3140 3b501b609b11ff7320ce1a19dbac0e3b "" + "/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty" 1581632200 4947 0c2888dd88121ae675fc6e82213623ba "" + "/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty" 1580683321 5050 8933a39ad74377accd18991c5eb90c58 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty" 1580683321 1940 dd4f2aa11c89855a3c47d09758782ba5 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/report.cls" 1580683321 23082 a0e9a5941c744eda6abe56770037a201 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo" 1580683321 8446 9874cccac5fee462272c582807dbbf56 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty" 1581112666 2821 2c0928feafd5527387e29a1af774d030 "" + "/usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty" 1264379041 1311 063f8536a047a2d9cb1803321f793f37 "" + "/usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty" 1215522782 2883 427a7f7cb58418a0394dbd85c80668f6 "" + "/usr/share/texlive/texmf-dist/tex/latex/cmap/ot1.cmap" 1177721415 1207 4e0d96772f0d338847cbfb4eca683c81 "" + "/usr/share/texlive/texmf-dist/tex/latex/cmap/t1.cmap" 1215522782 1938 beaa4a8467aa0074076e0e19f2992e29 "" + "/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty" 1579991033 13886 d1306dcf79a944f6988e688c1785f9ce "" + "/usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty" 1548974385 11128 a53805799bebfed6358fc1658a18e41f "" + "/usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty" 1578950756 43158 eb6545ca94a288335910480ca6755b55 "" + "/usr/share/texlive/texmf-dist/tex/latex/float/float.sty" 1137110151 6749 16d2656a1984957e674b149555f1ea1d "" + "/usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty" 1292029257 19488 fdd52eb173b3197d748e1ec25acb042f "" + "/usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty" 1338588508 22449 7ec15c16d0d66790f28e90343c5434a3 "" + "/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty" 1578002852 41601 9cf6c5257b1bc7af01a58859749dd37a "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg" 1459978653 1213 620bba36b25224fa9b7e1ccb4ecb76fd "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg" 1465944070 1224 978390e9c2234eab29404bc21b268d1e "" "/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def" 1515537368 17334 520b9b85ad8a2a48eda3f643e27a5179 "" - "/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty" 1498427532 15275 7d676729b1bedd3e7f3c6717affb366c "" - "/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty" 1498427532 9066 649f2ccf62888e3d8c3e57256b70b8e1 "" - "/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty" 1480098830 2594 d18d5e19aa8239cf867fa670c556d2e9 "" - "/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty" 1480098830 3980 0a268fbfda01e381fa95821ab13b6aee "" - "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def" 1518041854 51699 9069fc983fff0db91d59a15af144ad62 "" - "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty" 1518041854 234088 2c849389d62d41c593d9f5176c4116ab "" - "/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty" 1480098831 12949 81e4e808884a8f0e276b69410e234656 "" - "/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def" 1518041854 14098 4e70bf396c7c265bd8b0e5cab3fd3d4d "" - "/usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def" 1518041854 122411 10b605a58a28bbe5d61db37da4a85beb "" - "/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg" 1480098833 678 4792914a8f45be57bb98413425e4c7af "" - "/usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg" 1480098833 235 6031e5765137be07eed51a510b2b8fb7 "" - "/usr/share/texlive/texmf-dist/tex/latex/mmap/oml.cmap" 1480098835 1866 c1c12138091b4a8edd4a24a940e6f792 "" - "/usr/share/texlive/texmf-dist/tex/latex/mmap/oms.cmap" 1480098835 2370 3b1f71b14b974f07cef532db09ae9ee0 "" - "/usr/share/texlive/texmf-dist/tex/latex/mmap/omx.cmap" 1480098835 3001 252c8ca42b06a22cb1a11c0e47790c6e "" - "/usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty" 1480098835 852 0e34dbb72efc69fa07602405ad95585e "" - "/usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty" 1480098836 3834 4363110eb0ef1eb2b71c8fcbcdb6c357 "" - "/usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty" 1480098836 12095 5337833c991d80788a43d3ce26bd1c46 "" - "/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty" 1480098836 7075 2fe3d848bba95f139de11ded085e74aa "" - "/usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty" 1480098836 3720 63669daeb0b67d5fbec899824e2f1491 "" - "/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty" 1480098836 22417 1d9df1eb66848aa31b18a593099cf45c "" - "/usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty" 1480098836 9581 023642318cef9f4677efe364de1e2a27 "" - "/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty" 1480098836 2763 02a40cc5a32805c41d919cfbdba7e99a "" - "/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1pcr.fd" 1480098837 798 d5895e9edc628f2be019beb2c0ec66df "" - "/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1phv.fd" 1480098837 1488 9a55ac1cde6b4798a7f56844bb75a553 "" - "/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ptm.fd" 1480098837 774 61d7da1e9f9e74989b196d147e623736 "" - "/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty" 1480098837 857 6c716f26c5eadfb81029fcd6ce2d45e6 "" - "/usr/share/texlive/texmf-dist/tex/latex/psnfss/ts1ptm.fd" 1480098837 619 96f56dc5d1ef1fe1121f1cfeec70ee0c "" - "/usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty" 1480098840 13791 8c83287d79183c3bf58fd70871e8a70b "" - "/usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty" 1480098841 37387 afa86533e532701faf233f3f592c61e0 "" - "/usr/share/texlive/texmf-dist/tex/latex/tools/array.sty" 1485129666 12396 d41f82b039f900e95f351e54ae740f31 "" - "/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty" 1480098841 12083 80916157594a8e4354985aaefae4f367 "" - "/usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty" 1480098842 1048 517e01cde97c1c0baf72e69d43aa5a2e "" - "/usr/share/texlive/texmf-dist/tex/latex/url/url.sty" 1480098842 12796 8edb7d69a20b857904dd0ea757c14ec9 "" - "/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty" 1480098842 10894 d359a13923460b2a73d4312d613554c8 "" - "/usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty" 1480098843 26220 3701aebf80ccdef248c0c20dd062fea9 "" - "/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty" 1480098843 55589 34128738f682d033422ca125f82e5d62 "" - "/usr/share/texlive/texmf-dist/web2c/texmf.cnf" 1520210507 32485 c64754543d8ac501bea6e75e209ea521 "" - "/usr/share/texmf/web2c/texmf.cnf" 1520210507 32485 c64754543d8ac501bea6e75e209ea521 "" - "/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map" 1579876244 2700761 ac0584cc9514ab21918550a6948c4ee2 "" - "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1579876260 4134937 1a3d6c00fd29ce48313002512f8d8f25 "" - "footnotehyper-sphinx.sty" 1517759638 8841 e18cbb7bca599a223414f9b8a156abee "" - "phil.aux" 1584103483 7412 a9b9665a298a7b64070013c3705c314c "" - "phil.ind" 1580287447 0 d41d8cd98f00b204e9800998ecf8427e "makeindex phil.idx" - "phil.out" 1584103483 1945 1915d9b1351e5383040d738821c16b9b "" - "phil.tex" 1584103482 58663 879ad84b74db7722472b7e46e33f944b "" - "phil.toc" 1584103483 1870 79621e4d049ed36cb48524a3375b9f37 "" - "sphinx.sty" 1517759638 64257 27389b3f9c27254b2f20d236bdb2ebcf "" - "sphinxhighlight.sty" 1584103481 8137 38a433148fcb7611515a989ff1750dd5 "" - "sphinxmanual.cls" 1516805694 3589 0b0aac49c6f36925cf5f9d524a75a978 "" - "sphinxmulticell.sty" 1516805694 14618 0defbdc8536ad2e67f1eac6a1431bc55 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty" 1580683321 16932 04729abe63b66ec59ea56edcd722b058 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty" 1580683321 9067 1b996612394a52e1efe89c8bfe8a5892 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty" 1580683321 2590 e3b24ff953e5b58d924f163d25380312 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty" 1580683321 3976 d7fa7d81d2870d509d25b17d0245e735 "" + "/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty" 1580250785 17914 4c28a13fc3d975e6e81c9bea1d697276 "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def" 1579642962 50630 3d9728faf8630190cf601ce2cbe470d9 "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty" 1579642962 238752 60dd338d71b6a4ab2192131f73dc908b "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty" 1579642962 13244 0070bcab7b5a88187847128d22faf4d8 "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def" 1579642962 14134 32b36577d311ddb6522413c7581ee968 "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def" 1579642962 122447 2f3bff59bea0a0fa94e11cc69e0f3066 "" + "/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1575152344 22520 c4c2dab203104295e1e618be7e5c0f5b "" + "/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def" 1580854751 25404 9d60f463a00d154207ec0048dee27cf0 "" + "/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg" 1279039959 678 4792914a8f45be57bb98413425e4c7af "" + "/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty" 1575499565 5766 13a9e8766c47f30327caf893ece86ac8 "" + "/usr/share/texlive/texmf-dist/tex/latex/mmap/oml.cmap" 1215649417 1866 c1c12138091b4a8edd4a24a940e6f792 "" + "/usr/share/texlive/texmf-dist/tex/latex/mmap/oms.cmap" 1215649417 2370 3b1f71b14b974f07cef532db09ae9ee0 "" + "/usr/share/texlive/texmf-dist/tex/latex/mmap/omx.cmap" 1215649417 3001 252c8ca42b06a22cb1a11c0e47790c6e "" + "/usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty" 1364856750 852 0e34dbb72efc69fa07602405ad95585e "" + "/usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty" 1575152444 3822 b53c749cd81352b4679a35b0dafefb95 "" + "/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip-2001-04-09.sty" 1536789184 2757 ea00cb4f4e9abc702916f74d3812ef67 "" + "/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty" 1579802043 4151 bd592f37b856f80e699388b77e72d753 "" + "/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty" 1574631863 19963 36fd8e818f9f0f32e2db8413d4970122 "" + "/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1pcr.fd" 1137110629 798 d5895e9edc628f2be019beb2c0ec66df "" + "/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1phv.fd" 1137110629 1488 9a55ac1cde6b4798a7f56844bb75a553 "" + "/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ptm.fd" 1137110629 774 61d7da1e9f9e74989b196d147e623736 "" + "/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty" 1156702453 857 6c716f26c5eadfb81029fcd6ce2d45e6 "" + "/usr/share/texlive/texmf-dist/tex/latex/psnfss/ts1ptm.fd" 1137110629 619 96f56dc5d1ef1fe1121f1cfeec70ee0c "" + "/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty" 1576624809 9878 9e94e8fa600d95f9c7731bb21dfb67a4 "" + "/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty" 1575674187 9715 b051d5b493d9fe5f4bc251462d039e5f "" + "/usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty" 1403566480 13791 8c83287d79183c3bf58fd70871e8a70b "" + "/usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty" 1571259403 48596 2b6a95da931c07a430b1a61904aaa42d "" + "/usr/share/texlive/texmf-dist/tex/latex/tools/array.sty" 1580683321 12560 ce3f59ceae9d9a27bfe037d6bf1d903c "" + "/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty" 1580683321 12133 b1e3e65b69714dbfcc5e6c0b19d66b50 "" + "/usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty" 1334873510 1048 517e01cde97c1c0baf72e69d43aa5a2e "" + "/usr/share/texlive/texmf-dist/tex/latex/url/url.sty" 1388531844 12796 8edb7d69a20b857904dd0ea757c14ec9 "" + "/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty" 1238697683 10894 d359a13923460b2a73d4312d613554c8 "" + "/usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty" 1137111090 26220 3701aebf80ccdef248c0c20dd062fea9 "" + "/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty" 1463002160 55589 34128738f682d033422ca125f82e5d62 "" + "/usr/share/texlive/texmf-dist/web2c/texmf.cnf" 1581979058 38841 ce3692aa899bb693b90b87eaa5d4d84e "" + "/usr/share/texmf/web2c/texmf.cnf" 1581979058 38841 ce3692aa899bb693b90b87eaa5d4d84e "" + "/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map" 1634811683 4770781 1ed1abab22da9c3e2cc82e4db562318b "" + "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1634811721 8256508 638cce0446ad68372bc52123d5ab594a "" + "footnotehyper-sphinx.sty" 1552140457 8888 1bbd7bdeae8c8bed1d10d551bddb1cc9 "" + "phil.aux" 1640010448 7220 ff8163f9158f06753cc681a0c7acf518 "pdflatex" + "phil.ind" 1640008160 0 d41d8cd98f00b204e9800998ecf8427e "makeindex phil.idx" + "phil.out" 1640010448 1944 af45d09d682c6230517004752cc8b727 "pdflatex" + "phil.tex" 1640010447 59239 39b65e1d76d7cdd04d4c141815dada44 "" + "phil.toc" 1640010448 1894 9cb61336d215ce7c4dd6b30e72a7e2ae "pdflatex" + "sphinx.sty" 1552204022 76220 63a32157b97240a297c69d4d077e82ab "" + "sphinxhighlight.sty" 1640010452 8137 38a433148fcb7611515a989ff1750dd5 "" + "sphinxmanual.cls" 1552204022 3622 686a4f202ad31ad9dfe0d7d6ebdb7066 "" + "sphinxmulticell.sty" 1640008160 14618 0defbdc8536ad2e67f1eac6a1431bc55 "" (generated) - "phil.log" "phil.out" - "phil.idx" - "phil.aux" - "phil.toc" + "phil.log" "phil.pdf" + "phil.toc" + "phil.aux" + "phil.idx" diff --git a/packs_lib/phil/docs/_build/latex/phil.fls b/packs_lib/phil/docs/_build/latex/phil.fls index 4a4d4fca28..57393036ee 100644 --- a/packs_lib/phil/docs/_build/latex/phil.fls +++ b/packs_lib/phil/docs/_build/latex/phil.fls @@ -1,4 +1,4 @@ -PWD /home/arnaud/phil/docs/_build/latex +PWD /home/arnaud/Documents/UNIFE/HPLP/phil/docs/_build/latex INPUT /etc/texmf/web2c/texmf.cnf INPUT /usr/share/texmf/web2c/texmf.cnf INPUT /usr/share/texlive/texmf-dist/web2c/texmf.cnf @@ -13,20 +13,10 @@ INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size10.clo INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size10.clo INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/utf8.def -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/utf8.def -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/t1enc.dfu -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/t1enc.dfu -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ot1enc.dfu -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ot1enc.dfu -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/omsenc.dfu -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/omsenc.dfu INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def INPUT /usr/share/texlive/texmf-dist/fonts/map/fontname/texfonts.map INPUT /usr/share/texlive/texmf-dist/fonts/tfm/jknappen/ec/ecrm1000.tfm INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/t1.cmap @@ -60,8 +50,8 @@ INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty INPUT sphinx.sty INPUT sphinx.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty @@ -78,10 +68,6 @@ INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.dfu -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.dfu INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty @@ -111,8 +97,10 @@ INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip-2001-04-09.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip-2001-04-09.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty @@ -123,68 +111,79 @@ INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty INPUT sphinxhighlight.sty INPUT sphinxhighlight.sty -INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty -INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/etexcmds.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/etexcmds.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifluatex.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifluatex.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifvtex.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifvtex.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty -INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty -INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def -INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg -INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def -INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty -INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty OUTPUT phil.idx +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def INPUT phil.aux INPUT phil.aux OUTPUT phil.aux -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd -INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd INPUT /usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ptm.fd INPUT /usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ptm.fd INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii -INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty -INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty -INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty -INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty -INPUT /usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty INPUT phil.out INPUT phil.out INPUT phil.out @@ -257,9 +256,6 @@ INPUT /usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm INPUT /usr/share/texlive/texmf-dist/fonts/vf/adobe/helvetic/phvb8t.vf INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/helvetic/phvb8r.tfm -INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmri8t.tfm -INPUT /usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmri8t.vf -INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm INPUT /usr/share/texlive/texmf-dist/tex/latex/psnfss/t1pcr.fd INPUT /usr/share/texlive/texmf-dist/tex/latex/psnfss/t1pcr.fd @@ -268,12 +264,18 @@ INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrr8t.tfm INPUT /usr/share/texlive/texmf-dist/tex/latex/psnfss/ts1ptm.fd INPUT /usr/share/texlive/texmf-dist/tex/latex/psnfss/ts1ptm.fd INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8c.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmri8t.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm INPUT /usr/share/texlive/texmf-dist/fonts/vf/adobe/courier/pcrr8t.vf INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm INPUT /usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmr8c.vf +INPUT /usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmri8t.vf +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrr8t.tfm INPUT /usr/share/texlive/texmf-dist/fonts/vf/adobe/courier/pcrr8t.vf INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/vf/adobe/times/ptmr8t.vf +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/times/ptmr8t.tfm INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/helvetic/phvr8t.tfm INPUT /usr/share/texlive/texmf-dist/fonts/tfm/adobe/courier/pcrb8t.tfm diff --git a/packs_lib/phil/docs/_build/latex/phil.log b/packs_lib/phil/docs/_build/latex/phil.log index 8f83de6d45..46b6864939 100644 --- a/packs_lib/phil/docs/_build/latex/phil.log +++ b/packs_lib/phil/docs/_build/latex/phil.log @@ -1,698 +1,277 @@ -This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=pdflatex 2020.1.24) 13 MAR 2020 13:44 +This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2021.10.21) 20 DEC 2021 15:27 entering extended mode restricted \write18 enabled. %&-line parsing enabled. **phil.tex (./phil.tex -LaTeX2e <2017-04-15> -Babel <3.18> and hyphenation patterns for 84 language(s) loaded. -(./sphinxmanual.cls -Document Class: sphinxmanual 2017/03/26 v1.6 Document class (Sphinx manual) +LaTeX2e <2020-02-02> patch level 2 +L3 programming layer <2020-02-14> (./sphinxmanual.cls +Document Class: sphinxmanual 2018/12/22 v1.8.3 Document class (Sphinx manual) (/usr/share/texlive/texmf-dist/tex/latex/base/report.cls -Document Class: report 2014/09/29 v1.4h Standard LaTeX document class +Document Class: report 2019/12/20 v1.4l Standard LaTeX document class (/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo -File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) -) -\c@part=\count79 -\c@chapter=\count80 -\c@section=\count81 -\c@subsection=\count82 -\c@subsubsection=\count83 -\c@paragraph=\count84 -\c@subparagraph=\count85 -\c@figure=\count86 -\c@table=\count87 -\abovecaptionskip=\skip41 -\belowcaptionskip=\skip42 -\bibindent=\dimen102 -)) (/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty -Package: inputenc 2015/03/17 v1.2c Input encoding file +File: size10.clo 2019/12/20 v1.4l Standard LaTeX file (size option) +) +\c@part=\count167 +\c@chapter=\count168 +\c@section=\count169 +\c@subsection=\count170 +\c@subsubsection=\count171 +\c@paragraph=\count172 +\c@subparagraph=\count173 +\c@figure=\count174 +\c@table=\count175 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen134 +)) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2018/08/11 v1.3c Input encoding file \inpenc@prehook=\toks14 \inpenc@posthook=\toks15 -(/usr/share/texlive/texmf-dist/tex/latex/base/utf8.def -File: utf8.def 2017/01/28 v1.1t UTF-8 support for inputenc -Now handling font encoding OML ... -... no UTF-8 mapping file for font encoding OML -Now handling font encoding T1 ... -... processing UTF-8 mapping file for font encoding T1 -(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.dfu -File: t1enc.dfu 2017/01/28 v1.1t UTF-8 support for inputenc - defining Unicode char U+00A0 (decimal 160) - defining Unicode char U+00A1 (decimal 161) - defining Unicode char U+00A3 (decimal 163) - defining Unicode char U+00AB (decimal 171) - defining Unicode char U+00AD (decimal 173) - defining Unicode char U+00BB (decimal 187) - defining Unicode char U+00BF (decimal 191) - defining Unicode char U+00C0 (decimal 192) - defining Unicode char U+00C1 (decimal 193) - defining Unicode char U+00C2 (decimal 194) - defining Unicode char U+00C3 (decimal 195) - defining Unicode char U+00C4 (decimal 196) - defining Unicode char U+00C5 (decimal 197) - defining Unicode char U+00C6 (decimal 198) - defining Unicode char U+00C7 (decimal 199) - defining Unicode char U+00C8 (decimal 200) - defining Unicode char U+00C9 (decimal 201) - defining Unicode char U+00CA (decimal 202) - defining Unicode char U+00CB (decimal 203) - defining Unicode char U+00CC (decimal 204) - defining Unicode char U+00CD (decimal 205) - defining Unicode char U+00CE (decimal 206) - defining Unicode char U+00CF (decimal 207) - defining Unicode char U+00D0 (decimal 208) - defining Unicode char U+00D1 (decimal 209) - defining Unicode char U+00D2 (decimal 210) - defining Unicode char U+00D3 (decimal 211) - defining Unicode char U+00D4 (decimal 212) - defining Unicode char U+00D5 (decimal 213) - defining Unicode char U+00D6 (decimal 214) - defining Unicode char U+00D8 (decimal 216) - defining Unicode char U+00D9 (decimal 217) - defining Unicode char U+00DA (decimal 218) - defining Unicode char U+00DB (decimal 219) - defining Unicode char U+00DC (decimal 220) - defining Unicode char U+00DD (decimal 221) - defining Unicode char U+00DE (decimal 222) - defining Unicode char U+00DF (decimal 223) - defining Unicode char U+00E0 (decimal 224) - defining Unicode char U+00E1 (decimal 225) - defining Unicode char U+00E2 (decimal 226) - defining Unicode char U+00E3 (decimal 227) - defining Unicode char U+00E4 (decimal 228) - defining Unicode char U+00E5 (decimal 229) - defining Unicode char U+00E6 (decimal 230) - defining Unicode char U+00E7 (decimal 231) - defining Unicode char U+00E8 (decimal 232) - defining Unicode char U+00E9 (decimal 233) - defining Unicode char U+00EA (decimal 234) - defining Unicode char U+00EB (decimal 235) - defining Unicode char U+00EC (decimal 236) - defining Unicode char U+00ED (decimal 237) - defining Unicode char U+00EE (decimal 238) - defining Unicode char U+00EF (decimal 239) - defining Unicode char U+00F0 (decimal 240) - defining Unicode char U+00F1 (decimal 241) - defining Unicode char U+00F2 (decimal 242) - defining Unicode char U+00F3 (decimal 243) - defining Unicode char U+00F4 (decimal 244) - defining Unicode char U+00F5 (decimal 245) - defining Unicode char U+00F6 (decimal 246) - defining Unicode char U+00F8 (decimal 248) - defining Unicode char U+00F9 (decimal 249) - defining Unicode char U+00FA (decimal 250) - defining Unicode char U+00FB (decimal 251) - defining Unicode char U+00FC (decimal 252) - defining Unicode char U+00FD (decimal 253) - defining Unicode char U+00FE (decimal 254) - defining Unicode char U+00FF (decimal 255) - defining Unicode char U+0100 (decimal 256) - defining Unicode char U+0101 (decimal 257) - defining Unicode char U+0102 (decimal 258) - defining Unicode char U+0103 (decimal 259) - defining Unicode char U+0104 (decimal 260) - defining Unicode char U+0105 (decimal 261) - defining Unicode char U+0106 (decimal 262) - defining Unicode char U+0107 (decimal 263) - defining Unicode char U+0108 (decimal 264) - defining Unicode char U+0109 (decimal 265) - defining Unicode char U+010A (decimal 266) - defining Unicode char U+010B (decimal 267) - defining Unicode char U+010C (decimal 268) - defining Unicode char U+010D (decimal 269) - defining Unicode char U+010E (decimal 270) - defining Unicode char U+010F (decimal 271) - defining Unicode char U+0110 (decimal 272) - defining Unicode char U+0111 (decimal 273) - defining Unicode char U+0112 (decimal 274) - defining Unicode char U+0113 (decimal 275) - defining Unicode char U+0114 (decimal 276) - defining Unicode char U+0115 (decimal 277) - defining Unicode char U+0116 (decimal 278) - defining Unicode char U+0117 (decimal 279) - defining Unicode char U+0118 (decimal 280) - defining Unicode char U+0119 (decimal 281) - defining Unicode char U+011A (decimal 282) - defining Unicode char U+011B (decimal 283) - defining Unicode char U+011C (decimal 284) - defining Unicode char U+011D (decimal 285) - defining Unicode char U+011E (decimal 286) - defining Unicode char U+011F (decimal 287) - defining Unicode char U+0120 (decimal 288) - defining Unicode char U+0121 (decimal 289) - defining Unicode char U+0122 (decimal 290) - defining Unicode char U+0123 (decimal 291) - defining Unicode char U+0124 (decimal 292) - defining Unicode char U+0125 (decimal 293) - defining Unicode char U+0128 (decimal 296) - defining Unicode char U+0129 (decimal 297) - defining Unicode char U+012A (decimal 298) - defining Unicode char U+012B (decimal 299) - defining Unicode char U+012C (decimal 300) - defining Unicode char U+012D (decimal 301) - defining Unicode char U+012E (decimal 302) - defining Unicode char U+012F (decimal 303) - defining Unicode char U+0130 (decimal 304) - defining Unicode char U+0131 (decimal 305) - defining Unicode char U+0132 (decimal 306) - defining Unicode char U+0133 (decimal 307) - defining Unicode char U+0134 (decimal 308) - defining Unicode char U+0135 (decimal 309) - defining Unicode char U+0136 (decimal 310) - defining Unicode char U+0137 (decimal 311) - defining Unicode char U+0139 (decimal 313) - defining Unicode char U+013A (decimal 314) - defining Unicode char U+013B (decimal 315) - defining Unicode char U+013C (decimal 316) - defining Unicode char U+013D (decimal 317) - defining Unicode char U+013E (decimal 318) - defining Unicode char U+0141 (decimal 321) - defining Unicode char U+0142 (decimal 322) - defining Unicode char U+0143 (decimal 323) - defining Unicode char U+0144 (decimal 324) - defining Unicode char U+0145 (decimal 325) - defining Unicode char U+0146 (decimal 326) - defining Unicode char U+0147 (decimal 327) - defining Unicode char U+0148 (decimal 328) - defining Unicode char U+014A (decimal 330) - defining Unicode char U+014B (decimal 331) - defining Unicode char U+014C (decimal 332) - defining Unicode char U+014D (decimal 333) - defining Unicode char U+014E (decimal 334) - defining Unicode char U+014F (decimal 335) - defining Unicode char U+0150 (decimal 336) - defining Unicode char U+0151 (decimal 337) - defining Unicode char U+0152 (decimal 338) - defining Unicode char U+0153 (decimal 339) - defining Unicode char U+0154 (decimal 340) - defining Unicode char U+0155 (decimal 341) - defining Unicode char U+0156 (decimal 342) - defining Unicode char U+0157 (decimal 343) - defining Unicode char U+0158 (decimal 344) - defining Unicode char U+0159 (decimal 345) - defining Unicode char U+015A (decimal 346) - defining Unicode char U+015B (decimal 347) - defining Unicode char U+015C (decimal 348) - defining Unicode char U+015D (decimal 349) - defining Unicode char U+015E (decimal 350) - defining Unicode char U+015F (decimal 351) - defining Unicode char U+0160 (decimal 352) - defining Unicode char U+0161 (decimal 353) - defining Unicode char U+0162 (decimal 354) - defining Unicode char U+0163 (decimal 355) - defining Unicode char U+0164 (decimal 356) - defining Unicode char U+0165 (decimal 357) - defining Unicode char U+0168 (decimal 360) - defining Unicode char U+0169 (decimal 361) - defining Unicode char U+016A (decimal 362) - defining Unicode char U+016B (decimal 363) - defining Unicode char U+016C (decimal 364) - defining Unicode char U+016D (decimal 365) - defining Unicode char U+016E (decimal 366) - defining Unicode char U+016F (decimal 367) - defining Unicode char U+0170 (decimal 368) - defining Unicode char U+0171 (decimal 369) - defining Unicode char U+0172 (decimal 370) - defining Unicode char U+0173 (decimal 371) - defining Unicode char U+0174 (decimal 372) - defining Unicode char U+0175 (decimal 373) - defining Unicode char U+0176 (decimal 374) - defining Unicode char U+0177 (decimal 375) - defining Unicode char U+0178 (decimal 376) - defining Unicode char U+0179 (decimal 377) - defining Unicode char U+017A (decimal 378) - defining Unicode char U+017B (decimal 379) - defining Unicode char U+017C (decimal 380) - defining Unicode char U+017D (decimal 381) - defining Unicode char U+017E (decimal 382) - defining Unicode char U+01CD (decimal 461) - defining Unicode char U+01CE (decimal 462) - defining Unicode char U+01CF (decimal 463) - defining Unicode char U+01D0 (decimal 464) - defining Unicode char U+01D1 (decimal 465) - defining Unicode char U+01D2 (decimal 466) - defining Unicode char U+01D3 (decimal 467) - defining Unicode char U+01D4 (decimal 468) - defining Unicode char U+01E2 (decimal 482) - defining Unicode char U+01E3 (decimal 483) - defining Unicode char U+01E6 (decimal 486) - defining Unicode char U+01E7 (decimal 487) - defining Unicode char U+01E8 (decimal 488) - defining Unicode char U+01E9 (decimal 489) - defining Unicode char U+01EA (decimal 490) - defining Unicode char U+01EB (decimal 491) - defining Unicode char U+01F0 (decimal 496) - defining Unicode char U+01F4 (decimal 500) - defining Unicode char U+01F5 (decimal 501) - defining Unicode char U+0218 (decimal 536) - defining Unicode char U+0219 (decimal 537) - defining Unicode char U+021A (decimal 538) - defining Unicode char U+021B (decimal 539) - defining Unicode char U+0232 (decimal 562) - defining Unicode char U+0233 (decimal 563) - defining Unicode char U+1E02 (decimal 7682) - defining Unicode char U+1E03 (decimal 7683) - defining Unicode char U+200C (decimal 8204) - defining Unicode char U+2010 (decimal 8208) - defining Unicode char U+2011 (decimal 8209) - defining Unicode char U+2012 (decimal 8210) - defining Unicode char U+2013 (decimal 8211) - defining Unicode char U+2014 (decimal 8212) - defining Unicode char U+2015 (decimal 8213) - defining Unicode char U+2018 (decimal 8216) - defining Unicode char U+2019 (decimal 8217) - defining Unicode char U+201A (decimal 8218) - defining Unicode char U+201C (decimal 8220) - defining Unicode char U+201D (decimal 8221) - defining Unicode char U+201E (decimal 8222) - defining Unicode char U+2030 (decimal 8240) - defining Unicode char U+2031 (decimal 8241) - defining Unicode char U+2039 (decimal 8249) - defining Unicode char U+203A (decimal 8250) - defining Unicode char U+2423 (decimal 9251) - defining Unicode char U+1E20 (decimal 7712) - defining Unicode char U+1E21 (decimal 7713) -) -Now handling font encoding OT1 ... -... processing UTF-8 mapping file for font encoding OT1 -(/usr/share/texlive/texmf-dist/tex/latex/base/ot1enc.dfu -File: ot1enc.dfu 2017/01/28 v1.1t UTF-8 support for inputenc - defining Unicode char U+00A0 (decimal 160) - defining Unicode char U+00A1 (decimal 161) - defining Unicode char U+00A3 (decimal 163) - defining Unicode char U+00AD (decimal 173) - defining Unicode char U+00B8 (decimal 184) - defining Unicode char U+00BF (decimal 191) - defining Unicode char U+00C5 (decimal 197) - defining Unicode char U+00C6 (decimal 198) - defining Unicode char U+00D8 (decimal 216) - defining Unicode char U+00DF (decimal 223) - defining Unicode char U+00E6 (decimal 230) - defining Unicode char U+00EC (decimal 236) - defining Unicode char U+00ED (decimal 237) - defining Unicode char U+00EE (decimal 238) - defining Unicode char U+00EF (decimal 239) - defining Unicode char U+00F8 (decimal 248) - defining Unicode char U+0131 (decimal 305) - defining Unicode char U+0141 (decimal 321) - defining Unicode char U+0142 (decimal 322) - defining Unicode char U+0152 (decimal 338) - defining Unicode char U+0153 (decimal 339) - defining Unicode char U+0174 (decimal 372) - defining Unicode char U+0175 (decimal 373) - defining Unicode char U+0176 (decimal 374) - defining Unicode char U+0177 (decimal 375) - defining Unicode char U+0218 (decimal 536) - defining Unicode char U+0219 (decimal 537) - defining Unicode char U+021A (decimal 538) - defining Unicode char U+021B (decimal 539) - defining Unicode char U+2013 (decimal 8211) - defining Unicode char U+2014 (decimal 8212) - defining Unicode char U+2018 (decimal 8216) - defining Unicode char U+2019 (decimal 8217) - defining Unicode char U+201C (decimal 8220) - defining Unicode char U+201D (decimal 8221) -) -Now handling font encoding OMS ... -... processing UTF-8 mapping file for font encoding OMS -(/usr/share/texlive/texmf-dist/tex/latex/base/omsenc.dfu -File: omsenc.dfu 2017/01/28 v1.1t UTF-8 support for inputenc - defining Unicode char U+00A7 (decimal 167) - defining Unicode char U+00B6 (decimal 182) - defining Unicode char U+00B7 (decimal 183) - defining Unicode char U+2020 (decimal 8224) - defining Unicode char U+2021 (decimal 8225) - defining Unicode char U+2022 (decimal 8226) -) -Now handling font encoding OMX ... -... no UTF-8 mapping file for font encoding OMX -Now handling font encoding U ... -... no UTF-8 mapping file for font encoding U - defining Unicode char U+00A9 (decimal 169) - defining Unicode char U+00AA (decimal 170) - defining Unicode char U+00AE (decimal 174) - defining Unicode char U+00BA (decimal 186) - defining Unicode char U+02C6 (decimal 710) - defining Unicode char U+02DC (decimal 732) - defining Unicode char U+200C (decimal 8204) - defining Unicode char U+2026 (decimal 8230) - defining Unicode char U+2122 (decimal 8482) - defining Unicode char U+2423 (decimal 9251) -)) +) defining Unicode char U+00A0 (decimal 160) defining Unicode char U+2500 (decimal 9472) defining Unicode char U+2502 (decimal 9474) defining Unicode char U+2514 (decimal 9492) defining Unicode char U+251C (decimal 9500) defining Unicode char U+2572 (decimal 9586) + (/usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty Package: cmap 2008/03/06 v1.0h CMap support: searchable PDF -) (/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty -Package: fontenc 2017/04/05 v2.0i Standard LaTeX package -(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def -File: t1enc.def 2017/04/05 v2.0i Standard LaTeX file -LaTeX Font Info: Redeclaring font encoding T1 on input line 48. -)<>) (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty -Package: amsmath 2017/09/02 v2.17a AMS math features -\@mathmargin=\skip43 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2020/02/11 v2.0o Standard LaTeX package +<>) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/01/20 v2.17e AMS math features +\@mathmargin=\skip49 + For additional information on amsmath, use the `?' option. (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty Package: amstext 2000/06/29 v2.01 AMS text + (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty File: amsgen.sty 1999/11/30 v2.0 generic functions \@emptytoks=\toks16 -\ex@=\dimen103 -)) (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +\ex@=\dimen135 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty Package: amsbsy 1999/11/29 v1.2d Bold Symbols -\pmbraise@=\dimen104 -) (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +\pmbraise@=\dimen136 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty Package: amsopn 2016/03/08 v2.02 operator names ) -\inf@bad=\count88 -LaTeX Info: Redefining \frac on input line 213. -\uproot@=\count89 -\leftroot@=\count90 -LaTeX Info: Redefining \overline on input line 375. -\classnum@=\count91 -\DOTSCASE@=\count92 -LaTeX Info: Redefining \ldots on input line 472. -LaTeX Info: Redefining \dots on input line 475. -LaTeX Info: Redefining \cdots on input line 596. -\Mathstrutbox@=\box26 -\strutbox@=\box27 -\big@size=\dimen105 -LaTeX Font Info: Redeclaring font encoding OML on input line 712. -LaTeX Font Info: Redeclaring font encoding OMS on input line 713. -\macc@depth=\count93 -\c@MaxMatrixCols=\count94 -\dotsspace@=\muskip10 -\c@parentequation=\count95 -\dspbrk@lvl=\count96 +\inf@bad=\count176 +LaTeX Info: Redefining \frac on input line 227. +\uproot@=\count177 +\leftroot@=\count178 +LaTeX Info: Redefining \overline on input line 389. +\classnum@=\count179 +\DOTSCASE@=\count180 +LaTeX Info: Redefining \ldots on input line 486. +LaTeX Info: Redefining \dots on input line 489. +LaTeX Info: Redefining \cdots on input line 610. +\Mathstrutbox@=\box45 +\strutbox@=\box46 +\big@size=\dimen137 +LaTeX Font Info: Redeclaring font encoding OML on input line 733. +LaTeX Font Info: Redeclaring font encoding OMS on input line 734. +\macc@depth=\count181 +\c@MaxMatrixCols=\count182 +\dotsspace@=\muskip16 +\c@parentequation=\count183 +\dspbrk@lvl=\count184 \tag@help=\toks17 -\row@=\count97 -\column@=\count98 -\maxfields@=\count99 +\row@=\count185 +\column@=\count186 +\maxfields@=\count187 \andhelp@=\toks18 -\eqnshift@=\dimen106 -\alignsep@=\dimen107 -\tagshift@=\dimen108 -\tagwidth@=\dimen109 -\totwidth@=\dimen110 -\lineht@=\dimen111 +\eqnshift@=\dimen138 +\alignsep@=\dimen139 +\tagshift@=\dimen140 +\tagwidth@=\dimen141 +\totwidth@=\dimen142 +\lineht@=\dimen143 \@envbody=\toks19 -\multlinegap=\skip44 -\multlinetaggap=\skip45 +\multlinegap=\skip50 +\multlinetaggap=\skip51 \mathdisplay@stack=\toks20 -LaTeX Info: Redefining \[ on input line 2817. -LaTeX Info: Redefining \] on input line 2818. -) (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +LaTeX Info: Redefining \[ on input line 2859. +LaTeX Info: Redefining \] on input line 2860. +) +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty Package: amssymb 2013/01/14 v3.01 AMS font symbols + (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support \symAMSa=\mathgroup4 \symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' (Font) U/euf/m/n --> U/euf/b/n on input line 106. -)) (/usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty -Package: babel 2018/02/14 3.18 The Babel package +)) +(/usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +Package: babel 2020/02/14 3.40 The Babel package + (/usr/share/texlive/texmf-dist/tex/generic/babel/switch.def -File: switch.def 2018/02/14 3.18 Babel switching mechanism -) (/usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf +File: switch.def 2020/02/14 3.40 Babel switching mechanism +) +(/usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf Language: english 2017/06/06 v3.3r English support from the babel system + (/usr/share/texlive/texmf-dist/tex/generic/babel/babel.def -File: babel.def 2018/02/14 3.18 Babel common definitions -\babel@savecnt=\count100 -\U@D=\dimen112 +File: babel.def 2020/02/14 3.40 Babel common definitions +\babel@savecnt=\count188 +\U@D=\dimen144 + (/usr/share/texlive/texmf-dist/tex/generic/babel/txtbabel.def) -\bbl@dirlevel=\count101 +\bbl@readstream=\read2 +\bbl@dirlevel=\count189 ) -\l@canadian = a dialect from \language\l@american -\l@australian = a dialect from \language\l@british -\l@newzealand = a dialect from \language\l@british -)) (/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty +Package babel Info: \l@canadian = using hyphenrules for english +(babel) (\language0) on input line 102. +Package babel Info: \l@australian = using hyphenrules for ukenglish +(babel) (\language41) on input line 105. +Package babel Info: \l@newzealand = using hyphenrules for ukenglish +(babel) (\language41) on input line 108. +)) +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty Package: times 2005/04/12 PSNFSS-v9.2a (SPQR) -) (/usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +) +(/usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty Package: fncychap 2007/07/30 v1.34 LaTeX package (Revised chapters) -\RW=\skip46 -\mylen=\skip47 -\myhi=\skip48 -\px=\skip49 -\py=\skip50 -\pyy=\skip51 -\pxx=\skip52 -\c@AlphaCnt=\count102 -\c@AlphaDecCnt=\count103 +\RW=\skip52 +\mylen=\skip53 +\myhi=\skip54 +\px=\skip55 +\py=\skip56 +\pyy=\skip57 +\pxx=\skip58 +\c@AlphaCnt=\count190 +\c@AlphaDecCnt=\count191 ) (./sphinx.sty -Package: sphinx 2017/12/12 v1.6.6 LaTeX package (Sphinx markup) -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty -Package: ltxcmds 2016/05/16 v1.23 LaTeX kernel commands for general use (HO) -) (/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty -Package: graphicx 2017/06/01 v1.1a Enhanced LaTeX Graphics (DPC,SPQR) +Package: sphinx 2019/01/12 v1.8.4 LaTeX package (Sphinx markup) + +(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR) + (/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty Package: keyval 2014/10/28 v1.15 key=value parser (DPC) \KV@toks@=\toks21 -) (/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty -Package: graphics 2017/06/25 v1.2c Standard LaTeX Graphics (DPC,SPQR) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR) + (/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty Package: trig 2016/01/03 v1.10 sin cos tan (DPC) -) (/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration ) -Package graphics Info: Driver file: pdftex.def on input line 99. +Package graphics Info: Driver file: pdftex.def on input line 105. + (/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex )) -\Gin@req@height=\dimen113 -\Gin@req@width=\dimen114 -) (/usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty -Package: fancyhdr 2017/06/30 v3.9a Extensive control of page headers and footer +\Gin@req@height=\dimen145 +\Gin@req@width=\dimen146 +) +(/usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +Package: fancyhdr 2019/01/31 v3.10 Extensive control of page headers and footer s -\f@nch@headwidth=\skip53 -\f@nch@O@elh=\skip54 -\f@nch@O@erh=\skip55 -\f@nch@O@olh=\skip56 -\f@nch@O@orh=\skip57 -\f@nch@O@elf=\skip58 -\f@nch@O@erf=\skip59 -\f@nch@O@olf=\skip60 -\f@nch@O@orf=\skip61 -) (/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty -Package: textcomp 2017/04/05 v2.0i Standard LaTeX package -Package textcomp Info: Sub-encoding information: -(textcomp) 5 = only ISO-Adobe without \textcurrency -(textcomp) 4 = 5 + \texteuro -(textcomp) 3 = 4 + \textohm -(textcomp) 2 = 3 + \textestimated + \textcurrency -(textcomp) 1 = TS1 - \textcircled - \t -(textcomp) 0 = TS1 (full) -(textcomp) Font families with sub-encoding setting implement -(textcomp) only a restricted character set as indicated. -(textcomp) Family '?' is the default used for unknown fonts. -(textcomp) See the documentation for details. -Package textcomp Info: Setting ? sub-encoding to TS1/1 on input line 79. -(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def -File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file -Now handling font encoding TS1 ... -... processing UTF-8 mapping file for font encoding TS1 -(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.dfu -File: ts1enc.dfu 2017/01/28 v1.1t UTF-8 support for inputenc - defining Unicode char U+00A2 (decimal 162) - defining Unicode char U+00A3 (decimal 163) - defining Unicode char U+00A4 (decimal 164) - defining Unicode char U+00A5 (decimal 165) - defining Unicode char U+00A6 (decimal 166) - defining Unicode char U+00A7 (decimal 167) - defining Unicode char U+00A8 (decimal 168) - defining Unicode char U+00A9 (decimal 169) - defining Unicode char U+00AA (decimal 170) - defining Unicode char U+00AC (decimal 172) - defining Unicode char U+00AE (decimal 174) - defining Unicode char U+00AF (decimal 175) - defining Unicode char U+00B0 (decimal 176) - defining Unicode char U+00B1 (decimal 177) - defining Unicode char U+00B2 (decimal 178) - defining Unicode char U+00B3 (decimal 179) - defining Unicode char U+00B4 (decimal 180) - defining Unicode char U+00B5 (decimal 181) - defining Unicode char U+00B6 (decimal 182) - defining Unicode char U+00B7 (decimal 183) - defining Unicode char U+00B9 (decimal 185) - defining Unicode char U+00BA (decimal 186) - defining Unicode char U+00BC (decimal 188) - defining Unicode char U+00BD (decimal 189) - defining Unicode char U+00BE (decimal 190) - defining Unicode char U+00D7 (decimal 215) - defining Unicode char U+00F7 (decimal 247) - defining Unicode char U+0192 (decimal 402) - defining Unicode char U+02C7 (decimal 711) - defining Unicode char U+02D8 (decimal 728) - defining Unicode char U+02DD (decimal 733) - defining Unicode char U+0E3F (decimal 3647) - defining Unicode char U+2016 (decimal 8214) - defining Unicode char U+2020 (decimal 8224) - defining Unicode char U+2021 (decimal 8225) - defining Unicode char U+2022 (decimal 8226) - defining Unicode char U+2030 (decimal 8240) - defining Unicode char U+2031 (decimal 8241) - defining Unicode char U+203B (decimal 8251) - defining Unicode char U+203D (decimal 8253) - defining Unicode char U+2044 (decimal 8260) - defining Unicode char U+204E (decimal 8270) - defining Unicode char U+2052 (decimal 8274) - defining Unicode char U+20A1 (decimal 8353) - defining Unicode char U+20A4 (decimal 8356) - defining Unicode char U+20A6 (decimal 8358) - defining Unicode char U+20A9 (decimal 8361) - defining Unicode char U+20AB (decimal 8363) - defining Unicode char U+20AC (decimal 8364) - defining Unicode char U+20B1 (decimal 8369) - defining Unicode char U+2103 (decimal 8451) - defining Unicode char U+2116 (decimal 8470) - defining Unicode char U+2117 (decimal 8471) - defining Unicode char U+211E (decimal 8478) - defining Unicode char U+2120 (decimal 8480) - defining Unicode char U+2122 (decimal 8482) - defining Unicode char U+2126 (decimal 8486) - defining Unicode char U+2127 (decimal 8487) - defining Unicode char U+212E (decimal 8494) - defining Unicode char U+2190 (decimal 8592) - defining Unicode char U+2191 (decimal 8593) - defining Unicode char U+2192 (decimal 8594) - defining Unicode char U+2193 (decimal 8595) - defining Unicode char U+2329 (decimal 9001) - defining Unicode char U+232A (decimal 9002) - defining Unicode char U+2422 (decimal 9250) - defining Unicode char U+25E6 (decimal 9702) - defining Unicode char U+25EF (decimal 9711) - defining Unicode char U+266A (decimal 9834) -)) -LaTeX Info: Redefining \oldstylenums on input line 334. -Package textcomp Info: Setting cmr sub-encoding to TS1/0 on input line 349. -Package textcomp Info: Setting cmss sub-encoding to TS1/0 on input line 350. -Package textcomp Info: Setting cmtt sub-encoding to TS1/0 on input line 351. -Package textcomp Info: Setting cmvtt sub-encoding to TS1/0 on input line 352. -Package textcomp Info: Setting cmbr sub-encoding to TS1/0 on input line 353. -Package textcomp Info: Setting cmtl sub-encoding to TS1/0 on input line 354. -Package textcomp Info: Setting ccr sub-encoding to TS1/0 on input line 355. -Package textcomp Info: Setting ptm sub-encoding to TS1/4 on input line 356. -Package textcomp Info: Setting pcr sub-encoding to TS1/4 on input line 357. -Package textcomp Info: Setting phv sub-encoding to TS1/4 on input line 358. -Package textcomp Info: Setting ppl sub-encoding to TS1/3 on input line 359. -Package textcomp Info: Setting pag sub-encoding to TS1/4 on input line 360. -Package textcomp Info: Setting pbk sub-encoding to TS1/4 on input line 361. -Package textcomp Info: Setting pnc sub-encoding to TS1/4 on input line 362. -Package textcomp Info: Setting pzc sub-encoding to TS1/4 on input line 363. -Package textcomp Info: Setting bch sub-encoding to TS1/4 on input line 364. -Package textcomp Info: Setting put sub-encoding to TS1/5 on input line 365. -Package textcomp Info: Setting uag sub-encoding to TS1/5 on input line 366. -Package textcomp Info: Setting ugq sub-encoding to TS1/5 on input line 367. -Package textcomp Info: Setting ul8 sub-encoding to TS1/4 on input line 368. -Package textcomp Info: Setting ul9 sub-encoding to TS1/4 on input line 369. -Package textcomp Info: Setting augie sub-encoding to TS1/5 on input line 370. -Package textcomp Info: Setting dayrom sub-encoding to TS1/3 on input line 371. -Package textcomp Info: Setting dayroms sub-encoding to TS1/3 on input line 372. - -Package textcomp Info: Setting pxr sub-encoding to TS1/0 on input line 373. -Package textcomp Info: Setting pxss sub-encoding to TS1/0 on input line 374. -Package textcomp Info: Setting pxtt sub-encoding to TS1/0 on input line 375. -Package textcomp Info: Setting txr sub-encoding to TS1/0 on input line 376. -Package textcomp Info: Setting txss sub-encoding to TS1/0 on input line 377. -Package textcomp Info: Setting txtt sub-encoding to TS1/0 on input line 378. -Package textcomp Info: Setting lmr sub-encoding to TS1/0 on input line 379. -Package textcomp Info: Setting lmdh sub-encoding to TS1/0 on input line 380. -Package textcomp Info: Setting lmss sub-encoding to TS1/0 on input line 381. -Package textcomp Info: Setting lmssq sub-encoding to TS1/0 on input line 382. -Package textcomp Info: Setting lmvtt sub-encoding to TS1/0 on input line 383. -Package textcomp Info: Setting lmtt sub-encoding to TS1/0 on input line 384. -Package textcomp Info: Setting qhv sub-encoding to TS1/0 on input line 385. -Package textcomp Info: Setting qag sub-encoding to TS1/0 on input line 386. -Package textcomp Info: Setting qbk sub-encoding to TS1/0 on input line 387. -Package textcomp Info: Setting qcr sub-encoding to TS1/0 on input line 388. -Package textcomp Info: Setting qcs sub-encoding to TS1/0 on input line 389. -Package textcomp Info: Setting qpl sub-encoding to TS1/0 on input line 390. -Package textcomp Info: Setting qtm sub-encoding to TS1/0 on input line 391. -Package textcomp Info: Setting qzc sub-encoding to TS1/0 on input line 392. -Package textcomp Info: Setting qhvc sub-encoding to TS1/0 on input line 393. -Package textcomp Info: Setting futs sub-encoding to TS1/4 on input line 394. -Package textcomp Info: Setting futx sub-encoding to TS1/4 on input line 395. -Package textcomp Info: Setting futj sub-encoding to TS1/4 on input line 396. -Package textcomp Info: Setting hlh sub-encoding to TS1/3 on input line 397. -Package textcomp Info: Setting hls sub-encoding to TS1/3 on input line 398. -Package textcomp Info: Setting hlst sub-encoding to TS1/3 on input line 399. -Package textcomp Info: Setting hlct sub-encoding to TS1/5 on input line 400. -Package textcomp Info: Setting hlx sub-encoding to TS1/5 on input line 401. -Package textcomp Info: Setting hlce sub-encoding to TS1/5 on input line 402. -Package textcomp Info: Setting hlcn sub-encoding to TS1/5 on input line 403. -Package textcomp Info: Setting hlcw sub-encoding to TS1/5 on input line 404. -Package textcomp Info: Setting hlcf sub-encoding to TS1/5 on input line 405. -Package textcomp Info: Setting pplx sub-encoding to TS1/3 on input line 406. -Package textcomp Info: Setting pplj sub-encoding to TS1/3 on input line 407. -Package textcomp Info: Setting ptmx sub-encoding to TS1/4 on input line 408. -Package textcomp Info: Setting ptmj sub-encoding to TS1/4 on input line 409. -) (/usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty -Package: titlesec 2016/03/21 v2.10.2 Sectioning titles -\ttl@box=\box28 -\beforetitleunit=\skip62 -\aftertitleunit=\skip63 -\ttl@plus=\dimen115 -\ttl@minus=\dimen116 +\f@nch@headwidth=\skip59 +\f@nch@O@elh=\skip60 +\f@nch@O@erh=\skip61 +\f@nch@O@olh=\skip62 +\f@nch@O@orh=\skip63 +\f@nch@O@elf=\skip64 +\f@nch@O@erf=\skip65 +\f@nch@O@olf=\skip66 +\f@nch@O@orf=\skip67 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2020/02/02 v2.0n Standard LaTeX package +) +(/usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +Package: titlesec 2019/10/16 v2.13 Sectioning titles +\ttl@box=\box47 +\beforetitleunit=\skip68 +\aftertitleunit=\skip69 +\ttl@plus=\dimen147 +\ttl@minus=\dimen148 \ttl@toksa=\toks22 -\titlewidth=\dimen117 -\titlewidthlast=\dimen118 -\titlewidthfirst=\dimen119 -) (/usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +\titlewidth=\dimen149 +\titlewidthlast=\dimen150 +\titlewidthfirst=\dimen151 +) +(/usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty Package: tabulary 2014/06/11 v0.10 tabulary package (DPC) + (/usr/share/texlive/texmf-dist/tex/latex/tools/array.sty -Package: array 2016/10/06 v2.4d Tabular extension package (FMi) -\col@sep=\dimen120 -\extrarowheight=\dimen121 +Package: array 2019/08/31 v2.4l Tabular extension package (FMi) +\col@sep=\dimen152 +\ar@mcellbox=\box48 +\extrarowheight=\dimen153 \NC@list=\toks23 -\extratabsurround=\skip64 -\backup@length=\skip65 -) -\TY@count=\count104 -\TY@linewidth=\dimen122 -\tymin=\dimen123 -\tymax=\dimen124 -\TY@tablewidth=\dimen125 -) (/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty -Package: longtable 2014/10/28 v4.11 Multi-page Table package (DPC) -\LTleft=\skip66 -\LTright=\skip67 -\LTpre=\skip68 -\LTpost=\skip69 -\LTchunksize=\count105 -\LTcapwidth=\dimen126 -\LT@head=\box29 -\LT@firsthead=\box30 -\LT@foot=\box31 -\LT@lastfoot=\box32 -\LT@cols=\count106 -\LT@rows=\count107 -\c@LT@tables=\count108 -\c@LT@chunks=\count109 +\extratabsurround=\skip70 +\backup@length=\skip71 +\ar@cellbox=\box49 +) +\TY@count=\count192 +\TY@linewidth=\dimen154 +\tymin=\dimen155 +\tymax=\dimen156 +\TY@tablewidth=\dimen157 +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC) +\LTleft=\skip72 +\LTright=\skip73 +\LTpre=\skip74 +\LTpost=\skip75 +\LTchunksize=\count193 +\LTcapwidth=\dimen158 +\LT@head=\box50 +\LT@firsthead=\box51 +\LT@foot=\box52 +\LT@lastfoot=\box53 +\LT@cols=\count194 +\LT@rows=\count195 +\c@LT@tables=\count196 +\c@LT@chunks=\count197 \LT@p@ftn=\toks24 -) (/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +) +(/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages -\@vwid@box=\box33 -\sift@deathcycles=\count110 -\@vwid@loff=\dimen127 -\@vwid@roff=\dimen128 -) (./sphinxmulticell.sty +\@vwid@box=\box54 +\sift@deathcycles=\count198 +\@vwid@loff=\dimen159 +\@vwid@roff=\dimen160 +) +(./sphinxmulticell.sty Package: sphinxmulticell 2017/02/23 v1.6 better span rows and columns of a tabl e (Sphinx team) -\sphinx@TY@tablewidth=\dimen129 -) (/usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +\sphinx@TY@tablewidth=\dimen161 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty Package: makeidx 2014/09/29 v1.0m Standard LaTeX package -) (/usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +) +(/usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty Package: framed 2011/10/22 v 0.96: framed or shaded text with page breaks -\OuterFrameSep=\skip70 -\fb@frw=\dimen130 -\fb@frh=\dimen131 -\FrameRule=\dimen132 -\FrameSep=\dimen133 -) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +\OuterFrameSep=\skip76 +\fb@frw=\dimen162 +\fb@frh=\dimen163 +\FrameRule=\dimen164 +\FrameSep=\dimen165 +) +(/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + (/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg File: color.cfg 2016/01/02 v1.6 sample color configuration ) @@ -706,263 +285,283 @@ Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. -) (/usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty -Package: fancyvrb 2008/02/07 - -Style option: `fancyvrb' v2.7a, with DG/SPQR fixes, and firstline=lastline fix -<2008/02/07> (tvz) -\FV@CodeLineNo=\count111 -\FV@InFile=\read1 -\FV@TabBox=\box34 -\c@FancyVerbLine=\count112 -\FV@StepNumber=\count113 +) +(/usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2020/01/13 v3.5 verbatim text (tvz,hv) +\FV@CodeLineNo=\count199 +\FV@InFile=\read3 +\FV@TabBox=\box55 +\c@FancyVerbLine=\count266 +\FV@StepNumber=\count267 \FV@OutFile=\write3 -) (./footnotehyper-sphinx.sty -Package: footnotehyper-sphinx 2017/03/07 v1.6 hyperref aware footnote.sty for s +) +(./footnotehyper-sphinx.sty +Package: footnotehyper-sphinx 2017/10/27 v1.7 hyperref aware footnote.sty for s phinx (JFB) -\FNH@notes=\box35 -\FNH@width=\dimen134 -) (/usr/share/texlive/texmf-dist/tex/latex/float/float.sty +\FNH@notes=\box56 +\FNH@width=\dimen166 +) +(/usr/share/texlive/texmf-dist/tex/latex/float/float.sty Package: float 2001/11/08 v1.3d Float enhancements (AL) -\c@float@type=\count114 +\c@float@type=\count268 \float@exts=\toks25 -\float@box=\box36 +\float@box=\box57 \@float@everytoks=\toks26 -\@floatcapt=\box37 -) (/usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty -\wrapoverhang=\dimen135 -\WF@size=\dimen136 -\c@WF@wrappedlines=\count115 -\WF@box=\box38 +\@floatcapt=\box58 +) +(/usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +\wrapoverhang=\dimen167 +\WF@size=\dimen168 +\c@WF@wrappedlines=\count269 +\WF@box=\box59 \WF@everypar=\toks27 Package: wrapfig 2003/01/31 v 3.6 -) (/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +) +(/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +Rollback for package 'parskip' requested -> version 'v1'. + This corresponds to the release introduced on 2001-04-09. + +(/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip-2001-04-09.sty Package: parskip 2001/04/09 non-zero parskip adjustments -) (/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +)) +(/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty Package: alltt 1997/06/16 v2.0g defines alltt environment -) (/usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +) +(/usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba tim -) (/usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +) +(/usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty Package: capt-of 2009/12/29 v0.2 standard captions outside of floats -) (/usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +) +(/usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty Package: needspace 2010/09/12 v1.3d reserve vertical space -) (./sphinxhighlight.sty +) +(./sphinxhighlight.sty Package: sphinxhighlight 2016/05/29 stylesheet for highlighting with pygments -) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty -Package: kvoptions 2016/05/16 v3.12 Key value format for package options (HO) -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty -Package: kvsetkeys 2016/05/16 v1.17 Key value parser (HO) -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty -Package: infwarerr 2016/05/16 v1.4 Providing info/warning/error messages (HO) -) (/usr/share/texlive/texmf-dist/tex/generic/oberdiek/etexcmds.sty -Package: etexcmds 2016/05/16 v1.6 Avoid name clashes with e-TeX commands (HO) -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifluatex.sty -Package: ifluatex 2016/05/16 v1.4 Provides the ifluatex switch (HO) -Package ifluatex Info: LuaTeX not detected. -) -Package etexcmds Info: Could not find \expanded. -(etexcmds) That can mean that you are not using pdfTeX 1.50 or -(etexcmds) that some package has redefined \expanded. -(etexcmds) In the latter case, load this package earlier. -))) -\sphinxverbatimsep=\dimen137 -\sphinxverbatimborder=\dimen138 -\sphinxshadowsep=\dimen139 -\sphinxshadowsize=\dimen140 -\sphinxshadowrule=\dimen141 -\spx@notice@border=\dimen142 -\spx@image@box=\box39 -\c@literalblock=\count116 -\spx@Verbatim@TitleBox=\box40 -\sphinxcontinuationbox=\box41 -\sphinxvisiblespacebox=\box42 -\py@argswidth=\skip71 -\lineblockindentation=\skip72 -\DUlineblockindent=\skip73 -) (/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty -Package: geometry 2010/09/12 v5.6 Page Geometry -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty -Package: ifpdf 2017/03/15 v3.2 Provides the ifpdf switch -) (/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifvtex.sty -Package: ifvtex 2016/05/16 v1.6 Detect VTeX and its facilities (HO) -Package ifvtex Info: VTeX not detected. -) (/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty -Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional -) -\Gm@cnth=\count117 -\Gm@cntv=\count118 -\c@Gm@tempcnt=\count119 -\Gm@bindingoffset=\dimen143 -\Gm@wd@mp=\dimen144 -\Gm@odd@mp=\dimen145 -\Gm@even@mp=\dimen146 -\Gm@layoutwidth=\dimen147 -\Gm@layoutheight=\dimen148 -\Gm@layouthoffset=\dimen149 -\Gm@layoutvoffset=\dimen150 +) +(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +)) +\sphinxverbatimsep=\dimen169 +\sphinxverbatimborder=\dimen170 +\sphinxshadowsep=\dimen171 +\sphinxshadowsize=\dimen172 +\sphinxshadowrule=\dimen173 +\spx@notice@border=\dimen174 +\spx@image@box=\box60 +\spx@image@maxheight=\dimen175 +\c@literalblock=\count270 +\sphinxcontinuationbox=\box61 +\sphinxvisiblespacebox=\box62 +\sphinxVerbatim@TitleBox=\box63 +\py@argswidth=\skip77 +\lineblockindentation=\skip78 +\DUlineblockindent=\skip79 +) +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2019/11/07 v1.0c TeX engine tests +)) +\Gm@cnth=\count271 +\Gm@cntv=\count272 +\c@Gm@tempcnt=\count273 +\Gm@bindingoffset=\dimen176 +\Gm@wd@mp=\dimen177 +\Gm@odd@mp=\dimen178 +\Gm@even@mp=\dimen179 +\Gm@layoutwidth=\dimen180 +\Gm@layoutheight=\dimen181 +\Gm@layouthoffset=\dimen182 +\Gm@layoutvoffset=\dimen183 \Gm@dimlist=\toks28 -) (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty -Package: hyperref 2018/02/06 v6.86b Hypertext links for LaTeX -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty -Package: hobsub-hyperref 2016/05/16 v1.14 Bundle oberdiek, subset hyperref (HO) - -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty -Package: hobsub-generic 2016/05/16 v1.14 Bundle oberdiek, subset generic (HO) -Package: hobsub 2016/05/16 v1.14 Construct package bundles (HO) -Package hobsub Info: Skipping package `infwarerr' (already loaded). -Package hobsub Info: Skipping package `ltxcmds' (already loaded). -Package hobsub Info: Skipping package `ifluatex' (already loaded). -Package hobsub Info: Skipping package `ifvtex' (already loaded). -Package: intcalc 2016/05/16 v1.2 Expandable calculations with integers (HO) -Package hobsub Info: Skipping package `ifpdf' (already loaded). -Package hobsub Info: Skipping package `etexcmds' (already loaded). -Package hobsub Info: Skipping package `kvsetkeys' (already loaded). -Package: kvdefinekeys 2016/05/16 v1.4 Define keys (HO) -Package: pdftexcmds 2018/01/21 v0.26 Utility functions of pdfTeX for LuaTeX (HO -) -Package pdftexcmds Info: LuaTeX not detected. +) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO +) + +(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) Package pdftexcmds Info: \pdf@primitive is available. Package pdftexcmds Info: \pdf@ifprimitive is available. Package pdftexcmds Info: \pdfdraftmode found. -Package: pdfescape 2016/05/16 v1.14 Implements pdfTeX's escape features (HO) -Package: bigintcalc 2016/05/16 v1.4 Expandable calculations on big integers (HO ) -Package: bitset 2016/05/16 v1.2 Handle bit-vector datatype (HO) -Package: uniquecounter 2016/05/16 v1.3 Provide unlimited unique counter (HO) +(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) ) -Package hobsub Info: Skipping package `hobsub' (already loaded). -Package: letltxmacro 2016/05/16 v1.5 Let assignment for LaTeX macros (HO) -Package: hopatch 2016/05/16 v1.3 Wrapper for package hooks (HO) -Package: xcolor-patch 2016/05/16 xcolor patch -Package: atveryend 2016/05/16 v1.9 Hooks at the very end of document (HO) -Package atveryend Info: \enddocument detected (standard20110627). -Package: atbegshi 2016/06/09 v1.18 At begin shipout hook (HO) -Package: refcount 2016/05/16 v3.5 Data extraction from label references (HO) -Package: hycolor 2016/05/16 v1.8 Color options for hyperref/bookmark (HO) -) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty -Package: auxhook 2016/05/16 v1.4 Hooks for auxiliary files (HO) -) -\@linkdim=\dimen151 -\Hy@linkcounter=\count120 -\Hy@pagecounter=\count121 +(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen184 +\Hy@linkcounter=\count274 +\Hy@pagecounter=\count275 + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def -File: pd1enc.def 2018/02/06 v6.86b Hyperref: PDFDocEncoding definition (HO) +File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO) Now handling font encoding PD1 ... ... no UTF-8 mapping file for font encoding PD1 ) -\Hy@SavedSpaceFactor=\count122 -(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg -File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive +(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) ) -Package hyperref Info: Option `unicode' set `true' on input line 4383. +\Hy@SavedSpaceFactor=\count276 +\pdfmajorversion=\count277 +Package hyperref Info: Option `unicode' set `true' on input line 4421. + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def -File: puenc.def 2018/02/06 v6.86b Hyperref: PDF Unicode definition (HO) +File: puenc.def 2020/01/14 v7.00d Hyperref: PDF Unicode definition (HO) Now handling font encoding PU ... ... no UTF-8 mapping file for font encoding PU ) -Package hyperref Info: Option `colorlinks' set `true' on input line 4383. -Package hyperref Info: Option `breaklinks' set `true' on input line 4383. -Package hyperref Info: Hyper figures OFF on input line 4509. -Package hyperref Info: Link nesting OFF on input line 4514. -Package hyperref Info: Hyper index ON on input line 4517. -Package hyperref Info: Plain pages OFF on input line 4524. -Package hyperref Info: Backreferencing OFF on input line 4529. +Package hyperref Info: Option `colorlinks' set `true' on input line 4421. +Package hyperref Info: Option `breaklinks' set `true' on input line 4421. +Package hyperref Info: Hyper figures OFF on input line 4547. +Package hyperref Info: Link nesting OFF on input line 4552. +Package hyperref Info: Hyper index ON on input line 4555. +Package hyperref Info: Plain pages OFF on input line 4562. +Package hyperref Info: Backreferencing OFF on input line 4567. Package hyperref Info: Implicit mode ON; LaTeX internals redefined. -Package hyperref Info: Bookmarks ON on input line 4762. -\c@Hy@tempcnt=\count123 +Package hyperref Info: Bookmarks ON on input line 4800. +\c@Hy@tempcnt=\count278 + (/usr/share/texlive/texmf-dist/tex/latex/url/url.sty -\Urlmuskip=\muskip11 +\Urlmuskip=\muskip17 Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. ) -LaTeX Info: Redefining \url on input line 5115. -\XeTeXLinkMargin=\dimen152 -\Fld@menulength=\count124 -\Field@Width=\dimen153 -\Fld@charsize=\dimen154 -Package hyperref Info: Hyper figures OFF on input line 6369. -Package hyperref Info: Link nesting OFF on input line 6374. -Package hyperref Info: Hyper index ON on input line 6377. -Package hyperref Info: backreferencing OFF on input line 6384. -Package hyperref Info: Link coloring ON on input line 6387. -Package hyperref Info: Link coloring with OCG OFF on input line 6394. -Package hyperref Info: PDF/A mode OFF on input line 6399. -LaTeX Info: Redefining \ref on input line 6439. -LaTeX Info: Redefining \pageref on input line 6443. -\Hy@abspage=\count125 -\c@Item=\count126 -\c@Hfootnote=\count127 +LaTeX Info: Redefining \url on input line 5159. +\XeTeXLinkMargin=\dimen185 + +(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count279 +\Field@Width=\dimen186 +\Fld@charsize=\dimen187 +Package hyperref Info: Hyper figures OFF on input line 6430. +Package hyperref Info: Link nesting OFF on input line 6435. +Package hyperref Info: Hyper index ON on input line 6438. +Package hyperref Info: backreferencing OFF on input line 6445. +Package hyperref Info: Link coloring ON on input line 6448. +Package hyperref Info: Link coloring with OCG OFF on input line 6455. +Package hyperref Info: PDF/A mode OFF on input line 6460. +LaTeX Info: Redefining \ref on input line 6500. +LaTeX Info: Redefining \pageref on input line 6504. + +(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO) +) +\Hy@abspage=\count280 +\c@Item=\count281 +\c@Hfootnote=\count282 ) Package hyperref Info: Driver (autodetected): hpdftex. + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def -File: hpdftex.def 2018/02/06 v6.86b Hyperref driver for pdfTeX -\Fld@listcount=\count128 -\c@bookmark@seq@number=\count129 -(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty -Package: rerunfilecheck 2016/05/16 v1.8 Rerun checks for auxiliary files (HO) +File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO) +Package atveryend Info: \enddocument detected (standard20110627). +) +\Fld@listcount=\count283 +\c@bookmark@seq@number=\count284 + +(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 -82. +86. +) +\Hy@SectionHShift=\skip80 ) -\Hy@SectionHShift=\skip74 -) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty Package: hypcap 2016/05/16 v1.12 Adjusting the anchors of captions (HO) ) \@indexfile=\write4 \openout4 = `phil.idx'. + Writing index file phil.idx +(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode +\l__kernel_color_stack_int=\count285 +\l__pdf_internal_box=\box64 +) (./phil.aux) \openout1 = `phil.aux'. -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 64. -LaTeX Font Info: ... okay on input line 64. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 64. -LaTeX Font Info: ... okay on input line 64. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 64. -LaTeX Font Info: ... okay on input line 64. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 64. -LaTeX Font Info: ... okay on input line 64. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 64. -LaTeX Font Info: ... okay on input line 64. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 64. -LaTeX Font Info: ... okay on input line 64. -LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 64. -LaTeX Font Info: Try loading font information for TS1+cmr on input line 64. -(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd -File: ts1cmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions -) -LaTeX Font Info: ... okay on input line 64. -LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 64. -LaTeX Font Info: ... okay on input line 64. -LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 64. -LaTeX Font Info: ... okay on input line 64. -LaTeX Font Info: Try loading font information for T1+ptm on input line 64. -(/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ptm.fd +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 67. +LaTeX Font Info: ... okay on input line 67. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 67. +LaTeX Font Info: ... okay on input line 67. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 67. +LaTeX Font Info: ... okay on input line 67. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 67. +LaTeX Font Info: ... okay on input line 67. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 67. +LaTeX Font Info: ... okay on input line 67. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 67. +LaTeX Font Info: ... okay on input line 67. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 67. +LaTeX Font Info: ... okay on input line 67. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 67. +LaTeX Font Info: ... okay on input line 67. +LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 67. +LaTeX Font Info: ... okay on input line 67. +LaTeX Font Info: Trying to load font information for T1+ptm on input line 67 +. + (/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ptm.fd File: t1ptm.fd 2001/06/04 font definitions for T1/ptm. -) (/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +) +(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii [Loading MPS to PDF converter (version 2006.09.02).] -\scratchcounter=\count130 -\scratchdimen=\dimen155 -\scratchbox=\box43 -\nofMPsegments=\count131 -\nofMParguments=\count132 +\scratchcounter=\count286 +\scratchdimen=\dimen188 +\scratchbox=\box65 +\nofMPsegments=\count287 +\nofMParguments=\count288 \everyMPshowfont=\toks29 -\MPscratchCnt=\count133 -\MPscratchDim=\dimen156 -\MPnumerator=\count134 -\makeMPintoPDFobject=\count135 +\MPscratchCnt=\count289 +\MPscratchDim=\dimen189 +\MPnumerator=\count290 +\makeMPintoPDFobject=\count291 \everyMPtoPDFconversion=\toks30 -) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty -Package: epstopdf-base 2016/05/15 v2.6 Base part for package epstopdf -(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty -Package: grfext 2016/05/16 v1.2 Manage graphics extensions (HO) -) +) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 -38. -Package grfext Info: Graphics extension search list: -(grfext) [.pdf,.png,.jpg,.mps,.jpeg,.jbig2,.jb2,.PDF,.PNG,.JPG,.JPE -G,.JBIG2,.JB2,.eps] -(grfext) \AppendGraphicsExtensions on input line 456. +85. + (/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv e @@ -1001,74 +600,67 @@ e * \@reversemarginfalse * (1in=72.27pt=25.4mm, 1cm=28.453pt) -\AtBeginShipoutBox=\box44 -Package hyperref Info: Link coloring ON on input line 64. +\AtBeginShipoutBox=\box66 +Package hyperref Info: Link coloring ON on input line 67. (/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty -Package: nameref 2016/05/21 v2.44 Cross-referencing by name of section -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty -Package: gettitlestring 2016/05/16 v1.5 Cleanup title references (HO) +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) ) -\c@section@level=\count136 +\c@section@level=\count292 ) -LaTeX Info: Redefining \ref on input line 64. -LaTeX Info: Redefining \pageref on input line 64. -LaTeX Info: Redefining \nameref on input line 64. +LaTeX Info: Redefining \ref on input line 67. +LaTeX Info: Redefining \pageref on input line 67. +LaTeX Info: Redefining \nameref on input line 67. + (./phil.out) (./phil.out) \@outlinefile=\write5 \openout5 = `phil.out'. -Package hyperref Info: Option `pageanchor' set `false' on input line 67. -LaTeX Font Info: Try loading font information for T1+phv on input line 67. +Package hyperref Info: Option `pageanchor' set `false' on input line 70. +LaTeX Font Info: Trying to load font information for T1+phv on input line 70 +. + (/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1phv.fd File: t1phv.fd 2001/06/04 scalable font definitions for T1/phv. ) -LaTeX Font Info: Font shape `T1/phv/bx/n' in size <10> not available -(Font) Font shape `T1/phv/b/n' tried instead on input line 67. -LaTeX Font Info: Font shape `T1/phv/bx/n' in size <24.88> not available -(Font) Font shape `T1/phv/b/n' tried instead on input line 67. -LaTeX Font Info: Font shape `T1/phv/bx/it' in size <10> not available -(Font) Font shape `T1/phv/b/it' tried instead on input line 67. LaTeX Font Info: Font shape `T1/phv/b/it' in size <10> not available -(Font) Font shape `T1/phv/b/sl' tried instead on input line 67. -LaTeX Font Info: Font shape `T1/phv/bx/it' in size <17.28> not available -(Font) Font shape `T1/phv/b/it' tried instead on input line 67. +(Font) Font shape `T1/phv/b/sl' tried instead on input line 70. LaTeX Font Info: Font shape `T1/phv/b/it' in size <17.28> not available -(Font) Font shape `T1/phv/b/sl' tried instead on input line 67. -LaTeX Font Info: Font shape `T1/phv/bx/n' in size <17.28> not available -(Font) Font shape `T1/phv/b/n' tried instead on input line 67. +(Font) Font shape `T1/phv/b/sl' tried instead on input line 70. <><><><> -LaTeX Font Info: Try loading font information for U+msa on input line 67. +LaTeX Font Info: Trying to load font information for U+msa on input line 70. + + (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd File: umsa.fd 2013/01/14 v3.01 AMS symbols A ) -LaTeX Font Info: Try loading font information for U+msb on input line 67. +LaTeX Font Info: Trying to load font information for U+msb on input line 70. + + (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd File: umsb.fd 2013/01/14 v3.01 AMS symbols B -) -LaTeX Font Info: Font shape `T1/phv/bx/n' in size <12> not available -(Font) Font shape `T1/phv/b/n' tried instead on input line 67. -[1 +) [1 {/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] [2 -] -LaTeX Font Info: Font shape `T1/phv/bx/n' in size <14.4> not available -(Font) Font shape `T1/phv/b/n' tried instead on input line 67. -(./phil.toc -LaTeX Font Info: Font shape `T1/ptm/bx/n' in size <10> not available -(Font) Font shape `T1/ptm/b/n' tried instead on input line 2. -) + +] (./phil.toc) \tf@toc=\write6 \openout6 = `phil.toc'. -[1 + [1 ] [2 ] Chapter 1. -Underfull \hbox (badness 10000) in paragraph at lines 74--76 +Underfull \hbox (badness 10000) in paragraph at lines 80--82 \T1/ptm/m/n/10 phil is a suite of pro-grams for rea-son-ing with hi-er-ar-chi-c al prob-a-bilis-tic logic pro-grams (HPLP) [] @@ -1079,11 +671,14 @@ al prob-a-bilis-tic logic pro-grams (HPLP) ] Chapter 2. -LaTeX Font Info: Try loading font information for T1+pcr on input line 86. +LaTeX Font Info: Trying to load font information for T1+pcr on input line 91 +. (/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1pcr.fd File: t1pcr.fd 2001/06/04 font definitions for T1/pcr. ) -LaTeX Font Info: Try loading font information for TS1+ptm on input line 96. +LaTeX Font Info: Trying to load font information for TS1+ptm on input line 1 +01. + (/usr/share/texlive/texmf-dist/tex/latex/psnfss/ts1ptm.fd File: ts1ptm.fd 2001/06/04 font definitions for TS1/ptm. ) [3] [4] @@ -1102,17 +697,10 @@ Chapter 5. Chapter 6. [11 -] -LaTeX Font Info: Font shape `T1/pcr/bx/n' in size <9> not available -(Font) Font shape `T1/pcr/b/n' tried instead on input line 393. -[12] +] [12] LaTeX Font Info: Font shape `T1/pcr/m/it' in size <9> not available -(Font) Font shape `T1/pcr/m/sl' tried instead on input line 501. -[13] -Overfull \vbox (1.12761pt too high) detected at line 577 - [] - -[14] [15] [16] [17] [18] [19] [20 +(Font) Font shape `T1/pcr/m/sl' tried instead on input line 477. + [13] [14] [15] [16] [17] [18] [19] [20 ] Chapter 7. @@ -1131,26 +719,26 @@ Chapter 10. [27] [28 ] (./phil.ind) -Package atveryend Info: Empty hook `BeforeClearDocument' on input line 925. -[29 +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 872. + [29 ] -Package atveryend Info: Empty hook `AfterLastShipout' on input line 925. -(./phil.aux) -Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 925. -Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 925. +Package atveryend Info: Empty hook `AfterLastShipout' on input line 872. + (./phil.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 872. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 872. Package rerunfilecheck Info: File `phil.out' has not changed. -(rerunfilecheck) Checksum: 1915D9B1351E5383040D738821C16B9B;1945. -Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 925. +(rerunfilecheck) Checksum: AF45D09D682C6230517004752CC8B727;1944. +Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 872. ) Here is how much of TeX's memory you used: - 13694 strings out of 492982 - 188664 string characters out of 6134896 - 299715 words of memory out of 5000000 - 16863 multiletter control sequences out of 15000+600000 - 49144 words of font info for 70 fonts, out of 8000000 for 9000 + 13506 strings out of 481239 + 190374 string characters out of 5920376 + 485088 words of memory out of 5000000 + 28374 multiletter control sequences out of 15000+600000 + 580564 words of font info for 82 fonts, out of 8000000 for 9000 1142 hyphenation exceptions out of 8191 - 37i,11n,45p,791b,468s stack positions out of 5000i,500n,10000p,200000b,80000s + 38i,11n,49p,943b,490s stack positions out of 5000i,500n,10000p,200000b,80000s {/usr/share/texlive/texmf-dist/fonts/enc/dvips/base/8r.enc} -Output written on phil.pdf (33 pages, 178910 bytes). +Output written on phil.pdf (33 pages, 177240 bytes). PDF statistics: - 393 PDF objects out of 1000 (max. 8388607) - 337 compressed objects within 4 object streams - 94 named destinations out of 1000 (max. 500000) + 367 PDF objects out of 1000 (max. 8388607) + 311 compressed objects within 4 object streams + 71 named destinations out of 1000 (max. 500000) 165 words of extra memory for PDF output out of 10000 (max. 10000000) diff --git a/packs_lib/phil/docs/_build/latex/phil.out b/packs_lib/phil/docs/_build/latex/phil.out index 8847739d2f..8a997b33b3 100644 --- a/packs_lib/phil/docs/_build/latex/phil.out +++ b/packs_lib/phil/docs/_build/latex/phil.out @@ -15,4 +15,4 @@ \BOOKMARK [0][-]{chapter.8}{\376\377\000M\000a\000n\000u\000a\000l\000\040\000i\000n\000\040\000P\000D\000F}{}% 15 \BOOKMARK [0][-]{chapter.9}{\376\377\000L\000i\000c\000e\000n\000s\000e}{}% 16 \BOOKMARK [0][-]{chapter.10}{\376\377\000R\000e\000f\000e\000r\000e\000n\000c\000e\000s}{}% 17 -\BOOKMARK [0][-]{chapter*.16}{\376\377\000B\000i\000b\000l\000i\000o\000g\000r\000a\000p\000h\000y}{}% 18 +\BOOKMARK [0][-]{chapter*.3}{\376\377\000B\000i\000b\000l\000i\000o\000g\000r\000a\000p\000h\000y}{}% 18 diff --git a/packs_lib/phil/docs/_build/latex/phil.pdf b/packs_lib/phil/docs/_build/latex/phil.pdf index 5ff9fb363db0af2595b5758f88d5a4c00a50e61d..87aa52e64a770f5f0458b1e37f6303ac130d2bce 100644 GIT binary patch delta 57719 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 diff --git a/packs_lib/phil/docs/_build/latex/phil.tex b/packs_lib/phil/docs/_build/latex/phil.tex index b00d55896f..e381b6ca45 100644 --- a/packs_lib/phil/docs/_build/latex/phil.tex +++ b/packs_lib/phil/docs/_build/latex/phil.tex @@ -5,23 +5,17 @@ \let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen \fi \sphinxpxdimen=.75bp\relax +\PassOptionsToPackage{warn}{textcomp} \usepackage[utf8]{inputenc} \ifdefined\DeclareUnicodeCharacter - \ifdefined\DeclareUnicodeCharacterAsOptional - \DeclareUnicodeCharacter{"00A0}{\nobreakspace} - \DeclareUnicodeCharacter{"2500}{\sphinxunichar{2500}} - \DeclareUnicodeCharacter{"2502}{\sphinxunichar{2502}} - \DeclareUnicodeCharacter{"2514}{\sphinxunichar{2514}} - \DeclareUnicodeCharacter{"251C}{\sphinxunichar{251C}} - \DeclareUnicodeCharacter{"2572}{\textbackslash} - \else - \DeclareUnicodeCharacter{00A0}{\nobreakspace} - \DeclareUnicodeCharacter{2500}{\sphinxunichar{2500}} - \DeclareUnicodeCharacter{2502}{\sphinxunichar{2502}} - \DeclareUnicodeCharacter{2514}{\sphinxunichar{2514}} - \DeclareUnicodeCharacter{251C}{\sphinxunichar{251C}} - \DeclareUnicodeCharacter{2572}{\textbackslash} - \fi +% support both utf8 and utf8x syntaxes +\edef\sphinxdqmaybe{\ifdefined\DeclareUnicodeCharacterAsOptional\string"\fi} + \DeclareUnicodeCharacter{\sphinxdqmaybe00A0}{\nobreakspace} + \DeclareUnicodeCharacter{\sphinxdqmaybe2500}{\sphinxunichar{2500}} + \DeclareUnicodeCharacter{\sphinxdqmaybe2502}{\sphinxunichar{2502}} + \DeclareUnicodeCharacter{\sphinxdqmaybe2514}{\sphinxunichar{2514}} + \DeclareUnicodeCharacter{\sphinxdqmaybe251C}{\sphinxunichar{251C}} + \DeclareUnicodeCharacter{\sphinxdqmaybe2572}{\textbackslash} \fi \usepackage{cmap} \usepackage[T1]{fontenc} @@ -29,8 +23,9 @@ \usepackage{babel} \usepackage{times} \usepackage[Bjarne]{fncychap} -\usepackage[dontkeepoldnames]{sphinx} +\usepackage{sphinx} +\fvset{fontsize=\small} \usepackage{geometry} % Include hyperref last. @@ -40,12 +35,21 @@ % Set up styles of URL: it should be placed after hyperref. \urlstyle{same} -\addto\captionsenglish{\renewcommand{\figurename}{Fig.}} -\addto\captionsenglish{\renewcommand{\tablename}{Table}} +\addto\captionsenglish{\renewcommand{\figurename}{Fig.\@ }} +\makeatletter +\def\fnum@figure{\figurename\thefigure{}} +\makeatother +\addto\captionsenglish{\renewcommand{\tablename}{Table }} +\makeatletter +\def\fnum@table{\tablename\thetable{}} +\makeatother \addto\captionsenglish{\renewcommand{\literalblockname}{Listing}} \addto\captionsenglish{\renewcommand{\literalblockcontinuedname}{continued from previous page}} \addto\captionsenglish{\renewcommand{\literalblockcontinuesname}{continues on next page}} +\addto\captionsenglish{\renewcommand{\sphinxnonalphabeticalgroupname}{Non-alphabetical}} +\addto\captionsenglish{\renewcommand{\sphinxsymbolsname}{Symbols}} +\addto\captionsenglish{\renewcommand{\sphinxnumbersname}{Numbers}} \addto\extrasenglish{\def\pageautorefname{page}} @@ -54,24 +58,26 @@ \title{phil Documentation} -\date{Mar 13, 2020} +\date{Dec 20, 2021} \release{1.0.0} \author{Arnaud Nguembang Fadja, Fabrizio Riguzzi} \newcommand{\sphinxlogo}{\vbox{}} \renewcommand{\releasename}{Release} \makeindex - \begin{document} -\maketitle +\pagestyle{empty} +\sphinxmaketitle +\pagestyle{plain} \sphinxtableofcontents +\pagestyle{normal} \phantomsection\label{\detokenize{index::doc}} \chapter{Introduction} -\label{\detokenize{index:introduction}}\label{\detokenize{index:phil-on-swish-manual-swi-prolog-version}} -phil is a suite of programs for reasoning with hierarchical probabilistic logic programs (HPLP) \phantomsection\label{\detokenize{index:id1}}{\hyperref[\detokenize{index:ngulamrig17-plp-iw}]{\sphinxcrossref{{[}NguembangFadjaLR17{]}}}}. +\label{\detokenize{index:introduction}} +phil is a suite of programs for reasoning with hierarchical probabilistic logic programs (HPLP) \sphinxcite{index:fadja2021learning}\sphinxcite{index:ngulamrig17-plp-iw}. It allows both inference and learning. phil is available only for SWI-Prolog. phil is part of cplint on SWISH web application available at \sphinxurl{http://cplint.eu}. @@ -82,7 +88,6 @@ \chapter{Installation} phil is distributed as a \sphinxhref{http://www.swi-prolog.org/pack/list?p=phil}{pack} of \sphinxhref{http://www.swi-prolog.org/}{SWI-Prolog}. To install it, use -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYGZdl{} swipl ?\PYGZhy{} pack\PYGZus{}install(phil). @@ -103,7 +108,6 @@ \section{Requirements} They are installed automatically when installing pack \sphinxtitleref{phil} or can be installed manually as follows -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYGZdl{} swipl ?\PYGZhy{} pack\PYGZus{}install(auc). @@ -112,7 +116,6 @@ \section{Requirements} You can upgrade the pack with -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYGZdl{} swipl ?\PYGZhy{} pack\PYGZus{}upgrade(phil). @@ -123,7 +126,6 @@ \section{Requirements} \section{Example of use} \label{\detokenize{index:example-of-use}} -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYGZdl{} cd \PYGZlt{}pack\PYGZgt{}/phil/prolog/examples \PYGZdl{} swipl @@ -134,7 +136,6 @@ \section{Example of use} \section{Testing the installation} \label{\detokenize{index:testing-the-installation}} -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYGZdl{} swipl ?\PYGZhy{} [library(phil\PYGZus{}test/test)]. @@ -149,19 +150,17 @@ \section{Datasets} \chapter{Syntax} \label{\detokenize{index:syntax}} -phil allows the definition of discrete probability distributions. It performs inference, parameter and structure learning on Hierarchical Probabilistic Logic Programs (HPLPs) \phantomsection\label{\detokenize{index:id2}}{\hyperref[\detokenize{index:ngulamrig17-plp-iw}]{\sphinxcrossref{{[}NguembangFadjaLR17{]}}}}. +phil allows the definition of discrete probability distributions. It performs inference, parameter and structure learning on Hierarchical Probabilistic Logic Programs (HPLPs), see \sphinxcite{index:fadja2021learning}. -HPLPs are restrictions of Logic programs with annotated disjunctions LPADs (\phantomsection\label{\detokenize{index:id3}}{\hyperref[\detokenize{index:venver03-tr}]{\sphinxcrossref{{[}VV03{]}}}}\phantomsection\label{\detokenize{index:id4}}{\hyperref[\detokenize{index:venver04-iclp04-ic}]{\sphinxcrossref{{[}VVB04{]}}}}). A HPLP is a set of annotated clauses whose head contain a single atom annotated with a probability. For the rest, the usual syntax of Prolog is used. +HPLPs are restrictions of Logic programs with annotated disjunctions LPADs (\sphinxcite{index:venver03-tr}\sphinxcite{index:venver04-iclp04-ic}). A HPLP is a set of annotated clauses whose head contain a single atom annotated with a probability. For the rest, the usual syntax of Prolog is used. A general HPLP clause has the following form: -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{h}\PYG{p}{:}\PYG{n}{p}\PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{BodyInput}\PYG{p}{,} \PYG{n}{b1}\PYG{p}{,}\PYG{n}{b2}\PYG{o}{.}\PYG{o}{.}\PYG{o}{.}\PYG{p}{,}\PYG{n}{bn}\PYG{o}{.} \end{sphinxVerbatim} -where \sphinxcode{BodyInput} is a conjunction of predicates called input predicates, that are defined by certain facts and rules, and the \sphinxcode{bi} are predicates non explicitly defined in the data called hidden predicates. Each hidden predicate is described by a set of clauses in a level immediately bellow. e.g \sphinxcode{b1} can be described as follows: +where \sphinxcode{\sphinxupquote{BodyInput}} is a conjunction of predicates called input predicates, that are defined by certain facts and rules, and the \sphinxcode{\sphinxupquote{bi}} are predicates non explicitly defined in the data called hidden predicates. Each hidden predicate is described by a set of clauses in a level immediately bellow. e.g \sphinxcode{\sphinxupquote{b1}} can be described as follows: -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{b1}\PYG{p}{:}\PYG{n}{p1\PYGZus{}1}\PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{BodyInput1}\PYG{p}{,} \PYG{n}{b1\PYGZus{}11}\PYG{p}{,}\PYG{n}{b1\PYGZus{}12}\PYG{o}{.}\PYG{o}{.}\PYG{o}{.}\PYG{p}{,}\PYG{n}{b1\PYGZus{}1m}\PYG{o}{.} \PYG{n}{b1}\PYG{p}{:}\PYG{n}{p1\PYGZus{}2}\PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{BodyInput2}\PYG{p}{,} \PYG{n}{b1\PYGZus{}21}\PYG{p}{,}\PYG{n}{b1\PYGZus{}22}\PYG{o}{.}\PYG{o}{.}\PYG{o}{.}\PYG{p}{,}\PYG{n}{b1\PYGZus{}2m}\PYG{o}{.} @@ -170,12 +169,11 @@ \chapter{Syntax} \PYG{n}{b1}\PYG{p}{:}\PYG{n}{p1\PYGZus{}k}\PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{BodyInputk}\PYG{p}{,} \PYG{n}{b1\PYGZus{}k1}\PYG{p}{,}\PYG{n}{b1\PYGZus{}k2}\PYG{o}{.}\PYG{o}{.}\PYG{o}{.}\PYG{p}{,}\PYG{n}{b1\PYGZus{}km}\PYG{o}{.} \end{sphinxVerbatim} -Each \sphinxcode{b1\_ij} is also described by a set clauses in the layer immediately bellow. This creates an hierarchy among predicates and clauses. Programs having this structure are called hierarchical probabilistic logic programs. The predicate in the head of clauses in the first layer is called \sphinxcode{target} or \sphinxcode{output} predicate which is the predicate we are interested in predicting. -The \sphinxcode{p1\_i} are numeric expressions representing probabilities. -It is up to the user to ensure that their are legal, i.e. they are greater than zero and less than one. The first clause above states that if the conjunction of the input and the hidden predicates in the body is true, then the head is true is true with probability \sphinxcode{p} otherwise, the head is false with probability \sphinxcode{1-p}. Note that, hidden predicates in the body of clauses in the programs are all different. +Each \sphinxcode{\sphinxupquote{b1\_ij}} is also described by a set clauses in the layer immediately bellow. This creates an hierarchy among predicates and clauses. Programs having this structure are called hierarchical probabilistic logic programs. The predicate in the head of clauses in the first layer is called \sphinxcode{\sphinxupquote{target}} or \sphinxcode{\sphinxupquote{output}} predicate which is the predicate we are interested in predicting. +The \sphinxcode{\sphinxupquote{p1\_i}} are numeric expressions representing probabilities. +It is up to the user to ensure that their are legal, i.e. they are greater than zero and less than one. The first clause above states that if the conjunction of the input and the hidden predicates in the body is true, then the head is true is true with probability \sphinxcode{\sphinxupquote{p}} otherwise, the head is false with probability \sphinxcode{\sphinxupquote{1-p}}. Note that, hidden predicates in the body of clauses in the programs are all different. If the clause has an empty body, it can be represented like this: -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{h}\PYG{p}{:}\PYG{n}{p}\PYG{o}{.} \end{sphinxVerbatim} @@ -183,21 +181,18 @@ \chapter{Syntax} If the clause is annotated with probability 1, the annotation can be omitted and the clause takes the form of a normal prolog clause, i.e.: -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{h} \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{Body}\PYG{o}{.} \end{sphinxVerbatim} stands for: -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{h}\PYG{p}{:}\PYG{l+m+mi}{1} \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{Body}\PYG{o}{.} \end{sphinxVerbatim} -The following example inspired from the UWCSE dataset used in \phantomsection\label{\detokenize{index:id5}}{\hyperref[\detokenize{index:kok2005learning}]{\sphinxcrossref{{[}KD05{]}}}} is represented as (file \sphinxhref{http://cplint.eu/e/phil/uwcse.pl}{uwcse.pl}) +The following example inspired from the UWCSE dataset used in \sphinxcite{index:kok2005learning} is represented as (file \sphinxhref{http://cplint.eu/e/phil/uwcse.pl}{uwcse.pl}) -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{advisedby}\PYG{p}{(}\PYG{n}{A}\PYG{p}{,}\PYG{n}{B}\PYG{p}{)}\PYG{p}{:}\PYG{l+m+mf}{0.3} \PYG{p}{:}\PYG{o}{\PYGZhy{}}\PYG{n}{student}\PYG{p}{(}\PYG{n}{A}\PYG{p}{)}\PYG{p}{,}\PYG{n}{professor}\PYG{p}{(}\PYG{n}{B}\PYG{p}{)}\PYG{p}{,}\PYG{n}{project}\PYG{p}{(}\PYG{n}{A}\PYG{p}{,}\PYG{n}{C}\PYG{p}{)}\PYG{p}{,}\PYG{n}{project}\PYG{p}{(}\PYG{n}{B}\PYG{p}{,}\PYG{n}{C}\PYG{p}{)}\PYG{p}{,}\PYG{n}{hid\PYGZus{}1}\PYG{p}{(}\PYG{n}{A}\PYG{p}{,}\PYG{n}{B}\PYG{p}{,}\PYG{n}{C}\PYG{p}{)}\PYG{o}{.} \PYG{n}{advisedby}\PYG{p}{(}\PYG{n}{A}\PYG{p}{,}\PYG{n}{B}\PYG{p}{)}\PYG{p}{:}\PYG{l+m+mf}{0.6} \PYG{p}{:}\PYG{o}{\PYGZhy{}}\PYG{n}{student}\PYG{p}{(}\PYG{n}{A}\PYG{p}{)}\PYG{p}{,}\PYG{n}{professor}\PYG{p}{(}\PYG{n}{B}\PYG{p}{)}\PYG{p}{,}\PYG{n}{ta}\PYG{p}{(}\PYG{n}{C}\PYG{p}{,}\PYG{n}{A}\PYG{p}{)}\PYG{p}{,}\PYG{n}{taughtby}\PYG{p}{(}\PYG{n}{C}\PYG{p}{,}\PYG{n}{B}\PYG{p}{)}\PYG{o}{.} @@ -230,17 +225,16 @@ \chapter{Semantics} The probability of a world is the product of the probabilities associated to the heads of each selected ground clause. The probability of a ground atom (the query) is given by the sum of the probabilities of the worlds where the query is true. -If the HPLP contains function symbols, the definition is more complex, see \phantomsection\label{\detokenize{index:id6}}{\hyperref[\detokenize{index:dblp-journals-ai-poole97}]{\sphinxcrossref{{[}Poo97{]}}}}\phantomsection\label{\detokenize{index:id7}}{\hyperref[\detokenize{index:dblp-journals-jair-satok01}]{\sphinxcrossref{{[}SK01{]}}}}. +If the HPLP contains function symbols, the definition is more complex, see \sphinxcite{index:dblp-journals-ai-poole97}\sphinxcite{index:dblp-journals-jair-satok01}. \chapter{Inference} \label{\detokenize{index:inference}} -phil answers queries using the module phil. It performs exact inference using a program transformation technique. Each program is converted to a set of arithmetic circuits (ACs) or deep neural networks using a modified version of PITA \phantomsection\label{\detokenize{index:id8}}{\hyperref[\detokenize{index:rig14-cj-ij}]{\sphinxcrossref{{[}Rig14{]}}}} with tabling and answer subsumption \phantomsection\label{\detokenize{index:id9}}{\hyperref[\detokenize{index:rigswi10-iclp10-ic}]{\sphinxcrossref{{[}RS10{]}}}} as described in \phantomsection\label{\detokenize{index:id10}}{\hyperref[\detokenize{index:ngulamrig17-plp-iw}]{\sphinxcrossref{{[}NguembangFadjaLR17{]}}}}. +phil answers queries using the module phil. It performs exact inference using a program transformation technique. Each program is converted to a set of arithmetic circuits (ACs) or deep neural networks using a modified version of PITA \sphinxcite{index:rig14-cj-ij} with tabling and answer subsumption \sphinxcite{index:rigswi10-iclp10-ic} as described in \sphinxcite{index:fadja2021learning}\sphinxcite{index:ngulamrig17-plp-iw}. -For answering queries, you have to prepare a Prolog file where you first load the inference module \sphinxcode{phil}, initialize it with the directive \sphinxcode{:- phil} and then enclose the hierarchical program clauses in \sphinxcode{:-begin\_in.} and \sphinxcode{:-end\_in.} or enclose the clauses in \sphinxcode{in({[}\textless{}clauses\textgreater{}{]})}. -For example, the uwcse program above can be stored in \sphinxhref{http://cplint.eu/e/phil/uwcse.pl}{uwcse.pl} for performing inference with \sphinxcode{phil} as follows +For answering queries, you have to prepare a Prolog file where you first load the inference module \sphinxcode{\sphinxupquote{phil}}, initialize it with the directive \sphinxcode{\sphinxupquote{:- phil}} and then enclose the hierarchical program clauses in \sphinxcode{\sphinxupquote{:-begin\_in.}} and \sphinxcode{\sphinxupquote{:-end\_in.}} or enclose the clauses in \sphinxcode{\sphinxupquote{in({[}\textless{}clauses\textgreater{}{]})}}. +For example, the uwcse program above can be stored in \sphinxhref{http://cplint.eu/e/phil/uwcse.pl}{uwcse.pl} for performing inference with \sphinxcode{\sphinxupquote{phil}} as follows -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{use\PYGZus{}module}\PYG{p}{(}\PYG{n}{library}\PYG{p}{(}\PYG{n}{phil}\PYG{p}{)}\PYG{p}{)}\PYG{o}{.} \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{phil}\PYG{o}{.} @@ -264,38 +258,34 @@ \chapter{Inference} \PYG{n}{end}\PYG{p}{(}\PYG{n}{model}\PYG{p}{(}\PYG{n}{ai}\PYG{p}{)}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} -You can also have (non-probabilistic) clauses outside \sphinxcode{:-begin/end\_in.} which can be enclosed in \sphinxcode{bg(\textless{}list of terms representing clauses\textgreater{}).} +You can also have (non-probabilistic) clauses outside \sphinxcode{\sphinxupquote{:-begin/end\_in.}} which can be enclosed in \sphinxcode{\sphinxupquote{bg(\textless{}list of terms representing clauses\textgreater{}).}} These are considered as database clauses. To run a query, you can simply load the Prolog file, for example \sphinxhref{http://cplint.eu/e/phil/uwcse.pl}{uwcse.pl}, as: -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] ?\PYGZhy{} [uwcse]. \end{sphinxVerbatim} or: -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYGZdl{} swipl uwcse.pl \end{sphinxVerbatim} and run the query: -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] ?\PYGZhy{} inference\PYGZus{}hplp(advisedby(harry,ben),ai,Prob). \end{sphinxVerbatim} -where \sphinxcode{advisedby(harry,ben)} is the atom for the target predicate, \sphinxcode{ai} the interpretation or the model where the query is run and \sphinxcode{Prob} stores the computed probability. For also generating the arithmetic circuit, run the query: +where \sphinxcode{\sphinxupquote{advisedby(harry,ben)}} is the atom for the target predicate, \sphinxcode{\sphinxupquote{ai}} the interpretation or the model where the query is run and \sphinxcode{\sphinxupquote{Prob}} stores the computed probability. For also generating the arithmetic circuit, run the query: -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] ?\PYGZhy{} inference\PYGZus{}hplp(advisedby(harry,ben),ai,Prob,Circuit). \end{sphinxVerbatim} -where \sphinxcode{Circuit} stores the arithmetic circuit as a Prolog term. +where \sphinxcode{\sphinxupquote{Circuit}} stores the arithmetic circuit as a Prolog term. \chapter{Learning} @@ -306,10 +296,10 @@ \chapter{Learning} PHIL for Parameter learning for HIerarchical probabilistic Logic programs. Given an input HPLP, PHIL learns its parameters from data. Two versions of PHIL are implemented: \begin{itemize} \item {} -DPHIL (Deep PHIL) \phantomsection\label{\detokenize{index:id11}}{\hyperref[\detokenize{index:nguriglam18-plp-iw}]{\sphinxcrossref{{[}NFRL18b{]}}}} performs gradient descent over the ACs. Two regularizations of DPHIL are implemented: L1 and L2 regularizations as used in the deep learning community. +DPHIL (Deep PHIL) \sphinxcite{index:nguriglam18-plp-iw} performs gradient descent over the ACs. Two regularizations of DPHIL are implemented: L1 and L2 regularizations as used in the deep learning community. \item {} -EMPHIL (Expectation Maximization PHIL) \phantomsection\label{\detokenize{index:id12}}{\hyperref[\detokenize{index:fadja2018expectation}]{\sphinxcrossref{{[}NFRL18a{]}}}} performs EM. Three regularizations of EMPHIL are implemented: besides the previous two regularizations, a regularization based on Bayesian update of the parameters is also implemented. +EMPHIL (Expectation Maximization PHIL) \sphinxcite{index:fadja2018expectation} performs EM. Three regularizations of EMPHIL are implemented: besides the previous two regularizations, a regularization based on Bayesian update of the parameters is also implemented. \end{itemize} @@ -342,28 +332,25 @@ \section{Input} The preamble must come first, the order of the other parts can be changed. -For example, consider the Bongard problems of \phantomsection\label{\detokenize{index:id13}}{\hyperref[\detokenize{index:raelae95-alt95}]{\sphinxcrossref{{[}DRVL95{]}}}}. \sphinxhref{http://cplint.eu/e/phil/bongard.pl}{bongard.pl} and \sphinxhref{http://cplint.eu/e/phil/bongardkeys.pl}{bongardkeys.pl} represent a Bongard problem for SLEAHP. +For example, consider the Bongard problems of \sphinxcite{index:raelae95-alt95}. \sphinxhref{http://cplint.eu/e/phil/bongard.pl}{bongard.pl} and \sphinxhref{http://cplint.eu/e/phil/bongardkeys.pl}{bongardkeys.pl} represent a Bongard problem for SLEAHP. \subsection{Preamble} \label{\detokenize{index:preamble}} In the preamble, the PHIL library is loaded with (\sphinxhref{http://cplint.eu/e/phil/bongard.pl}{bongard.pl}): -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{use\PYGZus{}module}\PYG{p}{(}\PYG{n}{library}\PYG{p}{(}\PYG{n}{phil}\PYG{p}{)}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} Now you can initialize with -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{phil}\PYG{o}{.} \end{sphinxVerbatim} At this point you can start setting parameters for SLEAHP such as for example -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{set\PYGZus{}hplp}\PYG{p}{(}\PYG{n}{megaex\PYGZus{}bottom}\PYG{p}{,}\PYG{l+m+mi}{10}\PYG{p}{)}\PYG{o}{.} \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{set\PYGZus{}hplp}\PYG{p}{(}\PYG{n}{rate}\PYG{p}{,}\PYG{l+m+mf}{0.95}\PYG{p}{)}\PYG{o}{.} @@ -379,26 +366,23 @@ \subsection{Background and Initial hierarchical program} \label{\detokenize{index:background-and-initial-hierarchical-program}} Now you can specify the background knowledge with a fact of the form -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{bg}\PYG{p}{(}\PYG{o}{\PYGZlt{}}\PYG{n+nb}{list} \PYG{n}{of} \PYG{n}{terms} \PYG{n}{representing} \PYG{n}{clauses}\PYG{o}{\PYGZgt{}}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} where the clauses must be deterministic. -Alternatively, you can specify a set of clauses by including them in a section between \sphinxcode{:- begin\_bg.} and \sphinxcode{:- end\_bg.} +Alternatively, you can specify a set of clauses by including them in a section between \sphinxcode{\sphinxupquote{:- begin\_bg.}} and \sphinxcode{\sphinxupquote{:- end\_bg.}} Moreover, you can specify an initial program with a fact of the form -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{o+ow}{in}\PYG{p}{(}\PYG{o}{\PYGZlt{}}\PYG{n+nb}{list} \PYG{n}{of} \PYG{n}{terms} \PYG{n}{representing} \PYG{n}{clauses}\PYG{o}{\PYGZgt{}}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} The initial program is used in parameter learning for providing the structure. -Remember to enclose each clause in parentheses because \sphinxcode{:-} has the highest precedence. +Remember to enclose each clause in parentheses because \sphinxcode{\sphinxupquote{:-}} has the highest precedence. For example, \sphinxhref{http://cplint.eu/e/bongard.pl}{bongard.pl} has the initial program -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{o+ow}{in}\PYG{p}{(}\PYG{p}{[}\PYG{p}{(}\PYG{n}{pos}\PYG{p}{:}\PYG{l+m+mf}{0.197575} \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{circle}\PYG{p}{(}\PYG{n}{A}\PYG{p}{)}\PYG{p}{,} @@ -411,9 +395,8 @@ \subsection{Background and Initial hierarchical program} \PYG{n}{circle}\PYG{p}{(}\PYG{n}{B}\PYG{p}{)}\PYG{p}{)}\PYG{p}{]}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} -Alternatively, you can specify an input program in a section between \sphinxcode{:- begin\_in.} and \sphinxcode{:- end\_in.} as for example +Alternatively, you can specify an input program in a section between \sphinxcode{\sphinxupquote{:- begin\_in.}} and \sphinxcode{\sphinxupquote{:- end\_in.}} as for example -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{begin\PYGZus{}in}\PYG{o}{.} @@ -430,7 +413,7 @@ \subsection{Background and Initial hierarchical program} \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{end\PYGZus{}in}\PYG{o}{.} \end{sphinxVerbatim} -If you specify both a \sphinxcode{in/1} fact and a section, the clauses of the two will be combined. +If you specify both a \sphinxcode{\sphinxupquote{in/1}} fact and a section, the clauses of the two will be combined. The annotations of the head atoms of the initial program can be probabilities, as in the example above. In parameter learning, the learning procedure can start with the initial parameters in the program. In this case, it is up to the user to ensure that there are values between 0 and 1. In the case of structure learning, the initial program is not necessary. @@ -440,7 +423,6 @@ \subsection{Language Bias} The language bias part contains the declarations of the input and output predicates. Note that the hidden predicates are not declared since there are automatically generated. The output predicate is declared as -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{output}\PYG{p}{(}\PYG{o}{\PYGZlt{}}\PYG{n}{predicate}\PYG{o}{\PYGZgt{}}\PYG{o}{/}\PYG{o}{\PYGZlt{}}\PYG{n}{arity}\PYG{o}{\PYGZgt{}}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} @@ -450,7 +432,6 @@ \subsection{Language Bias} Input predicates are those whose atoms you are not interested in predicting. You can declare input predicates with -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n+nb}{input}\PYG{p}{(}\PYG{o}{\PYGZlt{}}\PYG{n}{predicate}\PYG{o}{\PYGZgt{}}\PYG{o}{/}\PYG{o}{\PYGZlt{}}\PYG{n}{arity}\PYG{o}{\PYGZgt{}}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} @@ -459,58 +440,51 @@ \subsection{Language Bias} Then, for structure learning you have to specify the language bias by means of mode declarations in the style of \sphinxhref{https://www.doc.ic.ac.uk/~shm/progol.html}{Progol}. -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{modeh}\PYG{p}{(}\PYG{o}{\PYGZlt{}}\PYG{n}{recall}\PYG{o}{\PYGZgt{}}\PYG{p}{,}\PYG{o}{\PYGZlt{}}\PYG{n}{predicate}\PYG{o}{\PYGZgt{}}\PYG{p}{(}\PYG{o}{\PYGZlt{}}\PYG{n}{arg1}\PYG{o}{\PYGZgt{}}\PYG{p}{,}\PYG{o}{.}\PYG{o}{.}\PYG{o}{.}\PYG{p}{)}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} specifies the atoms that can appear in the head of clauses. In hierarchical programs only the ouput and the hidden predicates can appear in the head of clauses. -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{modeb}\PYG{p}{(}\PYG{o}{\PYGZlt{}}\PYG{n}{recall}\PYG{o}{\PYGZgt{}}\PYG{p}{,}\PYG{o}{\PYGZlt{}}\PYG{n}{predicate}\PYG{o}{\PYGZgt{}}\PYG{p}{(}\PYG{o}{\PYGZlt{}}\PYG{n}{arg1}\PYG{o}{\PYGZgt{}}\PYG{p}{,}\PYG{o}{.}\PYG{o}{.}\PYG{o}{.}\PYG{p}{)}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} -specifies the atoms that can appear in the body of clauses. \sphinxcode{\textless{}recall\textgreater{}} can be an integer or \sphinxcode{*}. \sphinxcode{\textless{}recall\textgreater{}} indicates how many atoms for the predicate specification are retained in the bottom clause during a saturation step. \sphinxcode{*} stands for all those that are found. +specifies the atoms that can appear in the body of clauses. \sphinxcode{\sphinxupquote{\textless{}recall\textgreater{}}} can be an integer or \sphinxcode{\sphinxupquote{*}}. \sphinxcode{\sphinxupquote{\textless{}recall\textgreater{}}} indicates how many atoms for the predicate specification are retained in the bottom clause during a saturation step. \sphinxcode{\sphinxupquote{*}} stands for all those that are found. Otherwise the indicated number of atoms are randomly chosen. Arguments of the form -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{o}{+}\PYG{o}{\PYGZlt{}}\PYG{n+nb}{type}\PYG{o}{\PYGZgt{}} \end{sphinxVerbatim} -specifies that the argument should be an input variable of type \sphinxcode{\textless{}type\textgreater{}}, i.e., a variable replacing a \sphinxcode{+\textless{}type\textgreater{}} argument in the head or a \sphinxcode{-\textless{}type\textgreater{}} argument in a preceding literal in the current hypothesized clause. +specifies that the argument should be an input variable of type \sphinxcode{\sphinxupquote{\textless{}type\textgreater{}}}, i.e., a variable replacing a \sphinxcode{\sphinxupquote{+\textless{}type\textgreater{}}} argument in the head or a \sphinxcode{\sphinxupquote{-\textless{}type\textgreater{}}} argument in a preceding literal in the current hypothesized clause. Another argument form is -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZlt{}}\PYG{n+nb}{type}\PYG{o}{\PYGZgt{}} \end{sphinxVerbatim} -for specifying that the argument should be a output variable of type \sphinxcode{\textless{}type\textgreater{}}. +for specifying that the argument should be a output variable of type \sphinxcode{\sphinxupquote{\textless{}type\textgreater{}}}. Any variable can replace this argument, either input or output. The only constraint on output variables is that those in the head of a clause must appear as output variables in an atom in the body. Other forms are -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{c+c1}{\PYGZsh{}\PYGZlt{}type\PYGZgt{}} \end{sphinxVerbatim} -for specifying an argument which should be replaced by a constant of type \sphinxcode{\textless{}type\textgreater{}} in the bottom clause but should not be used for replacing input variables of the following literals when building the bottom clause or +for specifying an argument which should be replaced by a constant of type \sphinxcode{\sphinxupquote{\textless{}type\textgreater{}}} in the bottom clause but should not be used for replacing input variables of the following literals when building the bottom clause or -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{o}{\PYGZhy{}}\PYG{c+c1}{\PYGZsh{}\PYGZlt{}type\PYGZgt{}} \end{sphinxVerbatim} -for specifying an argument which should be replaced by a constant of type \sphinxcode{\textless{}type\textgreater{}} in the bottom clause and that should be used for replacing input variables of the following literals when building the bottom clause. +for specifying an argument which should be replaced by a constant of type \sphinxcode{\sphinxupquote{\textless{}type\textgreater{}}} in the bottom clause and that should be used for replacing input variables of the following literals when building the bottom clause. -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{o}{\PYGZlt{}}\PYG{n}{constant}\PYG{o}{\PYGZgt{}} \end{sphinxVerbatim} @@ -519,7 +493,6 @@ \subsection{Language Bias} An example of language bias for the Bongard domain is -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{output}\PYG{p}{(}\PYG{n}{pos}\PYG{o}{/}\PYG{l+m+mi}{0}\PYG{p}{)}\PYG{o}{.} @@ -538,10 +511,9 @@ \subsection{Language Bias} \PYG{n}{modeb}\PYG{p}{(}\PYG{o}{*}\PYG{p}{,}\PYG{n}{config}\PYG{p}{(}\PYG{o}{+}\PYG{n}{obj}\PYG{p}{,}\PYG{o}{\PYGZhy{}}\PYG{c+c1}{\PYGZsh{}dir)).} \end{sphinxVerbatim} -SLEAHP also requires facts for the \sphinxcode{determination/2} Aleph-style predicate that indicate which predicates can appear in the body of clauses. +SLEAHP also requires facts for the \sphinxcode{\sphinxupquote{determination/2}} Aleph-style predicate that indicate which predicates can appear in the body of clauses. For example -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{determination}\PYG{p}{(}\PYG{n}{pos}\PYG{o}{/}\PYG{l+m+mi}{0}\PYG{p}{,}\PYG{n}{triangle}\PYG{o}{/}\PYG{l+m+mi}{1}\PYG{p}{)}\PYG{o}{.} \PYG{n}{determination}\PYG{p}{(}\PYG{n}{pos}\PYG{o}{/}\PYG{l+m+mi}{0}\PYG{p}{,}\PYG{n}{square}\PYG{o}{/}\PYG{l+m+mi}{1}\PYG{p}{)}\PYG{o}{.} @@ -550,16 +522,15 @@ \subsection{Language Bias} \PYG{n}{determination}\PYG{p}{(}\PYG{n}{pos}\PYG{o}{/}\PYG{l+m+mi}{0}\PYG{p}{,}\PYG{n}{config}\PYG{o}{/}\PYG{l+m+mi}{2}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} -state that \sphinxcode{triangle/1} can appear in the body of clauses for \sphinxcode{pos/0}. +state that \sphinxcode{\sphinxupquote{triangle/1}} can appear in the body of clauses for \sphinxcode{\sphinxupquote{pos/0}}. \subsection{Example Interpretations} \label{\detokenize{index:example-interpretations}} The last part of the file contains the data. You can specify data with two modalities: models and keys. -In the models case, you specify an example model (or interpretation or mega-example) as a list of Prolog facts initiated by \sphinxcode{begin(model(\textless{}name\textgreater{})).} and terminated by \sphinxcode{end(model(\textless{}name\textgreater{})).} as in +In the models case, you specify an example model (or interpretation or mega-example) as a list of Prolog facts initiated by \sphinxcode{\sphinxupquote{begin(model(\textless{}name\textgreater{})).}} and terminated by \sphinxcode{\sphinxupquote{end(model(\textless{}name\textgreater{})).}} as in -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{begin}\PYG{p}{(}\PYG{n}{model}\PYG{p}{(}\PYG{l+m+mi}{2}\PYG{p}{)}\PYG{p}{)}\PYG{o}{.} \PYG{n}{pos}\PYG{o}{.} @@ -577,13 +548,12 @@ \subsection{Example Interpretations} \end{sphinxVerbatim} The facts in the interpretation are loaded in SWI-Prolog database by adding an extra initial argument equal to the name of the model. -After each interpretation is loaded, a fact of the form \sphinxcode{int(\textless{}id\textgreater{})} is asserted, where \sphinxcode{id} is the name of the interpretation. +After each interpretation is loaded, a fact of the form \sphinxcode{\sphinxupquote{int(\textless{}id\textgreater{})}} is asserted, where \sphinxcode{\sphinxupquote{id}} is the name of the interpretation. This can be used in order to retrieve the list of interpretations. Alternatively, with the keys modality, you can directly write the facts and the first argument will be interpreted as a model identifier. The above interpretation in the keys modality is -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{pos}\PYG{p}{(}\PYG{l+m+mi}{2}\PYG{p}{)}\PYG{o}{.} \PYG{n}{triangle}\PYG{p}{(}\PYG{l+m+mi}{2}\PYG{p}{,}\PYG{n}{o5}\PYG{p}{)}\PYG{o}{.} @@ -599,14 +569,13 @@ \subsection{Example Interpretations} \end{sphinxVerbatim} which is contained in the \sphinxhref{http://cplint.eu/e/phil/bongardkeys.pl}{bongardkeys.pl}. -This is also how model \sphinxcode{2} above is stored in SWI-Prolog database. +This is also how model \sphinxcode{\sphinxupquote{2}} above is stored in SWI-Prolog database. The two modalities, models and keys, can be mixed in the same file. -Facts for \sphinxcode{int/1} are not asserted for interpretations in the key modality but can be added by the user explicitly. +Facts for \sphinxcode{\sphinxupquote{int/1}} are not asserted for interpretations in the key modality but can be added by the user explicitly. Note that you can add background knowledge that is not probabilistic directly to the file writing clauses taking into account the model argument. -For example (\sphinxcode{carc.pl}), available in \sphinxhref{https://github.com/ArnaudFadja/phil\_datasets}{phil\_datasets}, contains +For example (\sphinxcode{\sphinxupquote{carc.pl}}), available in \sphinxhref{https://github.com/ArnaudFadja/phil\_datasets}{phil\_datasets}, contains -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] connected(\PYGZus{}M,Ring1,Ring2):\PYGZhy{} Ring1 \PYGZbs{}= Ring2, @@ -619,9 +588,8 @@ \subsection{Example Interpretations} where the first argument of all atoms is the model. -Then you must indicate how examples are divided in folds with facts of the form: \sphinxcode{fold(\textless{}fold\_name\textgreater{},\textless{}list of model identifiers\textgreater{})}, as for example +Then you must indicate how examples are divided in folds with facts of the form: \sphinxcode{\sphinxupquote{fold(\textless{}fold\_name\textgreater{},\textless{}list of model identifiers\textgreater{})}}, as for example -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{fold}\PYG{p}{(}\PYG{n}{train}\PYG{p}{,}\PYG{p}{[}\PYG{l+m+mi}{2}\PYG{p}{,}\PYG{l+m+mi}{3}\PYG{p}{,}\PYG{o}{.}\PYG{o}{.}\PYG{o}{.}\PYG{p}{]}\PYG{p}{)}\PYG{o}{.} \PYG{n}{fold}\PYG{p}{(}\PYG{n}{test}\PYG{p}{,}\PYG{p}{[}\PYG{l+m+mi}{490}\PYG{p}{,}\PYG{l+m+mi}{491}\PYG{p}{,}\PYG{o}{.}\PYG{o}{.}\PYG{o}{.}\PYG{p}{]}\PYG{p}{)}\PYG{o}{.} @@ -629,15 +597,13 @@ \subsection{Example Interpretations} As the input file is a Prolog program, you can define intentionally the folds as in -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{fold}\PYG{p}{(}\PYG{n+nb}{all}\PYG{p}{,}\PYG{n}{F}\PYG{p}{)}\PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{findall}\PYG{p}{(}\PYG{n}{I}\PYG{p}{,}\PYG{n+nb}{int}\PYG{p}{(}\PYG{n}{I}\PYG{p}{)}\PYG{p}{,}\PYG{n}{F}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} -\sphinxcode{fold/2} is dynamic so you can also write +\sphinxcode{\sphinxupquote{fold/2}} is dynamic so you can also write -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{fold}\PYG{p}{(}\PYG{n+nb}{all}\PYG{p}{,}\PYG{n}{F}\PYG{p}{)}\PYG{p}{,} \PYG{n}{sample\PYGZus{}hplp}\PYG{p}{(}\PYG{l+m+mi}{4}\PYG{p}{,}\PYG{n}{F}\PYG{p}{,}\PYG{n}{FTr}\PYG{p}{,}\PYG{n}{FTe}\PYG{p}{)}\PYG{p}{,} @@ -645,9 +611,9 @@ \subsection{Example Interpretations} \PYG{k}{assert}\PYG{p}{(}\PYG{n}{fold}\PYG{p}{(}\PYG{n}{rand\PYGZus{}test}\PYG{p}{,}\PYG{n}{FTe}\PYG{p}{)}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} -which however must be inserted after the input interpretations otherwise the facts for \sphinxcode{int/1} will not be available and the fold \sphinxcode{all} would be empty. -This command uses \sphinxcode{sample\_hplp(N,List,Sampled,Rest)} exported from \sphinxcode{phil} that samples \sphinxcode{N} elements from \sphinxcode{List} and returns the sampled elements in \sphinxcode{Sampled} and the rest in \sphinxcode{Rest}. -If \sphinxcode{List} has \sphinxcode{N} elements or less, \sphinxcode{Sampled} is equal to \sphinxcode{List} and \sphinxcode{Rest} is empty. +which however must be inserted after the input interpretations otherwise the facts for \sphinxcode{\sphinxupquote{int/1}} will not be available and the fold \sphinxcode{\sphinxupquote{all}} would be empty. +This command uses \sphinxcode{\sphinxupquote{sample\_hplp(N,List,Sampled,Rest)}} exported from \sphinxcode{\sphinxupquote{phil}} that samples \sphinxcode{\sphinxupquote{N}} elements from \sphinxcode{\sphinxupquote{List}} and returns the sampled elements in \sphinxcode{\sphinxupquote{Sampled}} and the rest in \sphinxcode{\sphinxupquote{Rest}}. +If \sphinxcode{\sphinxupquote{List}} has \sphinxcode{\sphinxupquote{N}} elements or less, \sphinxcode{\sphinxupquote{Sampled}} is equal to \sphinxcode{\sphinxupquote{List}} and \sphinxcode{\sphinxupquote{Rest}} is empty. \section{Commands} @@ -657,16 +623,14 @@ \subsection{Parameter Learning} \label{\detokenize{index:parameter-learning}} To execute PHIL, prepare an input file as indicated above and call -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] ?\PYGZhy{} induce\PYGZus{}hplp\PYGZus{}par(+List\PYGZus{}of\PYGZus{}folds:list,\PYGZhy{}P:list). \end{sphinxVerbatim} -where \sphinxcode{\textless{}list of folds\textgreater{}} is a list of the folds for training and \sphinxcode{P} will contain the input program with updated parameters. +where \sphinxcode{\sphinxupquote{\textless{}list of folds\textgreater{}}} is a list of the folds for training and \sphinxcode{\sphinxupquote{P}} will contain the input program with updated parameters. -For example \sphinxhref{http://cplint.eu/e/phil/bongard.pl}{bongard.pl}, you can perform parameter learning on the \sphinxcode{train} fold with +For example \sphinxhref{http://cplint.eu/e/phil/bongard.pl}{bongard.pl}, you can perform parameter learning on the \sphinxcode{\sphinxupquote{train}} fold with -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] ?\PYGZhy{} induce\PYGZus{}hplp\PYGZus{}par([train],P). \end{sphinxVerbatim} @@ -676,78 +640,70 @@ \subsection{Structure Learning} \label{\detokenize{index:structure-learning}} To execute SLEAHP, prepare an input file in the editor panel as indicated above and call -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] ?\PYGZhy{} induce\PYGZus{}hplp(+List\PYGZus{}of\PYGZus{}folds:list,\PYGZhy{}P:list). \end{sphinxVerbatim} -where \sphinxcode{List\_of\_folds} is a list of the folds for training and \sphinxcode{P} will contain the learned program. +where \sphinxcode{\sphinxupquote{List\_of\_folds}} is a list of the folds for training and \sphinxcode{\sphinxupquote{P}} will contain the learned program. -For example \sphinxhref{http://cplint.eu/e/phil/bongard.pl}{bongard.pl}, you can perform structure learning on the \sphinxcode{train} fold with +For example \sphinxhref{http://cplint.eu/e/phil/bongard.pl}{bongard.pl}, you can perform structure learning on the \sphinxcode{\sphinxupquote{train}} fold with -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] ?\PYGZhy{} induce\PYGZus{}hplp([train],P). \end{sphinxVerbatim} -A program can also be tested on a test set with \sphinxcode{test\_hplp/7} as described below. +A program can also be tested on a test set with \sphinxcode{\sphinxupquote{test\_hplp/7}} as described below. -Between two executions of \sphinxcode{induce\_hplp/2} you should exit SWI-Prolog to have a clean database. +Between two executions of \sphinxcode{\sphinxupquote{induce\_hplp/2}} you should exit SWI-Prolog to have a clean database. \subsection{Testing} \label{\detokenize{index:testing}} A program can also be tested on a test set in SLEAHP with -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{test\PYGZus{}hplp}\PYG{p}{(}\PYG{o}{+}\PYG{n}{Program}\PYG{p}{:}\PYG{n+nb}{list}\PYG{p}{,}\PYG{o}{+}\PYG{n}{List\PYGZus{}of\PYGZus{}folds}\PYG{p}{:}\PYG{n+nb}{list}\PYG{p}{,}\PYG{o}{\PYGZhy{}}\PYG{n}{LL}\PYG{p}{:}\PYG{n+nb}{float}\PYG{p}{,}\PYG{o}{\PYGZhy{}}\PYG{n}{AUCROC}\PYG{p}{:}\PYG{n+nb}{float}\PYG{p}{,}\PYG{o}{\PYGZhy{}}\PYG{n}{ROC}\PYG{p}{:}\PYG{n+nb}{list}\PYG{p}{,}\PYG{o}{\PYGZhy{}}\PYG{n}{AUCPR}\PYG{p}{:}\PYG{n+nb}{float}\PYG{p}{,}\PYG{o}{\PYGZhy{}}\PYG{n}{PR}\PYG{p}{:}\PYG{n+nb}{list}\PYG{p}{)} \PYG{o+ow}{is} \PYG{n}{det} \end{sphinxVerbatim} -where \sphinxcode{Program} is a list of terms representing clauses and \sphinxcode{List\_of\_folds} is a list of folds. +where \sphinxcode{\sphinxupquote{Program}} is a list of terms representing clauses and \sphinxcode{\sphinxupquote{List\_of\_folds}} is a list of folds. -\sphinxcode{test\_hplp/7} returns the log likelihood of the test examples in \sphinxcode{LL}, the Area Under the ROC curve in \sphinxcode{AUCROC}, a dictionary containing the list of points (in the form of Prolog pairs \sphinxcode{x-y}) of the ROC curve in \sphinxcode{ROC}, the Area Under the PR curve in \sphinxcode{AUCPR}, a dictionary containing the list of points of the PR curve in \sphinxcode{PR}. +\sphinxcode{\sphinxupquote{test\_hplp/7}} returns the log likelihood of the test examples in \sphinxcode{\sphinxupquote{LL}}, the Area Under the ROC curve in \sphinxcode{\sphinxupquote{AUCROC}}, a dictionary containing the list of points (in the form of Prolog pairs \sphinxcode{\sphinxupquote{x-y}}) of the ROC curve in \sphinxcode{\sphinxupquote{ROC}}, the Area Under the PR curve in \sphinxcode{\sphinxupquote{AUCPR}}, a dictionary containing the list of points of the PR curve in \sphinxcode{\sphinxupquote{PR}}. -Then you can draw the curves in \sphinxcode{phil} using C3.js as follows +Then you can draw the curves in \sphinxcode{\sphinxupquote{phil}} using C3.js as follows -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{n}{compute\PYGZus{}areas\PYGZus{}diagrams}\PYG{p}{(}\PYG{o}{+}\PYG{n}{ExampleList}\PYG{p}{:}\PYG{n+nb}{list}\PYG{p}{,}\PYG{o}{\PYGZhy{}}\PYG{n}{AUCROC}\PYG{p}{:}\PYG{n+nb}{float}\PYG{p}{,}\PYG{o}{\PYGZhy{}}\PYG{n}{ROC}\PYG{p}{:}\PYG{n+nb}{dict}\PYG{p}{,}\PYG{o}{\PYGZhy{}}\PYG{n}{AUCPR}\PYG{p}{:}\PYG{n+nb}{float}\PYG{p}{,}\PYG{o}{\PYGZhy{}}\PYG{n}{PR}\PYG{p}{:}\PYG{n+nb}{dict}\PYG{p}{)} \PYG{o+ow}{is} \PYG{n}{det} \end{sphinxVerbatim} -(from pack \sphinxhref{http://www.swi-prolog.org/pack/list?p=auc}{auc.pl}) that takes as input a list \sphinxcode{ExampleList} of pairs probability-literal. +(from pack \sphinxhref{http://www.swi-prolog.org/pack/list?p=auc}{auc.pl}) that takes as input a list \sphinxcode{\sphinxupquote{ExampleList}} of pairs probability-literal. -For example, to test on fold \sphinxcode{test} the program learned on fold \sphinxcode{train} you can run the query +For example, to test on fold \sphinxcode{\sphinxupquote{test}} the program learned on fold \sphinxcode{\sphinxupquote{train}} you can run the query -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] ?\PYGZhy{} induce\PYGZus{}hplp\PYGZus{}par([train],P), test\PYGZus{}hplp(P,[test],LL,AUCROC,ROC,AUCPR,PR). \end{sphinxVerbatim} -Or you can test the input program on the fold \sphinxcode{test} with +Or you can test the input program on the fold \sphinxcode{\sphinxupquote{test}} with -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] ?\PYGZhy{} in(P),test\PYGZus{}hplp(P,[test],LL,AUCROC,ROC,AUCPR,PR). \end{sphinxVerbatim} -In \sphinxcode{phil} on SWISH, by including +In \sphinxcode{\sphinxupquote{phil}} on SWISH, by including -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{use\PYGZus{}rendering}\PYG{p}{(}\PYG{n}{c3}\PYG{p}{)}\PYG{o}{.} \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{use\PYGZus{}rendering}\PYG{p}{(}\PYG{n}{lpad}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} -in the code before \sphinxcode{:- phil.} the curves will be shown as graphs using C3.js and the output program will be pretty printed. +in the code before \sphinxcode{\sphinxupquote{:- phil.}} the curves will be shown as graphs using C3.js and the output program will be pretty printed. \section{Hyper-parameters for Learning} \label{\detokenize{index:hyper-parameters-for-learning}} Hyper-parameters are set with commands of the form -\fvset{hllines={, ,}}% \begin{sphinxVerbatim}[commandchars=\\\{\}] \PYG{p}{:}\PYG{o}{\PYGZhy{}} \PYG{n}{set\PYGZus{}hplp}\PYG{p}{(}\PYG{o}{\PYGZlt{}}\PYG{n}{parameter}\PYG{o}{\PYGZgt{}}\PYG{p}{,}\PYG{o}{\PYGZlt{}}\PYG{n}{value}\PYG{o}{\PYGZgt{}}\PYG{p}{)}\PYG{o}{.} \end{sphinxVerbatim} @@ -758,61 +714,61 @@ \section{Hyper-parameters for Learning} PHIL hyper-parameters \begin{itemize} \item {} -\sphinxcode{algorithmType} (values: \sphinxcode{\{dphil,emphil\}}, default value: \sphinxcode{dphil}): defines the parameter learning algorithm. +\sphinxcode{\sphinxupquote{algorithmType}} (values: \sphinxcode{\sphinxupquote{\{dphil,emphil\}}}, default value: \sphinxcode{\sphinxupquote{dphil}}): defines the parameter learning algorithm. \item {} -\sphinxcode{maxIter\_phil} (values: integer, default value: 1000): maximum number of iteration of PHIL. If set to -1, no maximum number of iterations is imposed. +\sphinxcode{\sphinxupquote{maxIter\_phil}} (values: integer, default value: 1000): maximum number of iteration of PHIL. If set to -1, no maximum number of iterations is imposed. \item {} -\sphinxcode{epsilon\_deep} (values: real, default value: 0.0001): if the difference in the log likelihood in two successive PHIL (DPHIL and EMPHIL) iteration is smaller than \sphinxcode{epsilon\_deep}, then PHIL stops. +\sphinxcode{\sphinxupquote{epsilon\_deep}} (values: real, default value: 0.0001): if the difference in the log likelihood in two successive PHIL (DPHIL and EMPHIL) iteration is smaller than \sphinxcode{\sphinxupquote{epsilon\_deep}}, then PHIL stops. \item {} -\sphinxcode{epsilon\_deep\_fraction} (values: real, default value: 0.00001): if the difference in the log likelihood in two successive PHIL iteration is smaller than \sphinxcode{epsilon\_deep\_fraction*(-current log likelihood)}, then PHIL stops. +\sphinxcode{\sphinxupquote{epsilon\_deep\_fraction}} (values: real, default value: 0.00001): if the difference in the log likelihood in two successive PHIL iteration is smaller than \sphinxcode{\sphinxupquote{epsilon\_deep\_fraction*(-current log likelihood)}}, then PHIL stops. \item {} -\sphinxcode{seed} (values: seed(integer) or seed(random), default value \sphinxcode{seed(3032)}): seed for the Prolog random functions, see \sphinxhref{http://www.swi-prolog.org/pldoc/man?predicate=set\_random/1}{SWI-Prolog manual} . +\sphinxcode{\sphinxupquote{seed}} (values: seed(integer) or seed(random), default value \sphinxcode{\sphinxupquote{seed(3032)}}): seed for the Prolog random functions, see \sphinxhref{http://www.swi-prolog.org/pldoc/man?predicate=set\_random/1}{SWI-Prolog manual} . \item {} -\sphinxcode{setSeed} (values: \sphinxcode{\{no,yes\}}, default value: \sphinxcode{no}): if \sphinxcode{yes}, the value of \sphinxcode{c\_seed} is used as seed for randomly initializing the probabilities in PHIL otherwise the actual clock value is used. +\sphinxcode{\sphinxupquote{setSeed}} (values: \sphinxcode{\sphinxupquote{\{no,yes\}}}, default value: \sphinxcode{\sphinxupquote{no}}): if \sphinxcode{\sphinxupquote{yes}}, the value of \sphinxcode{\sphinxupquote{c\_seed}} is used as seed for randomly initializing the probabilities in PHIL otherwise the actual clock value is used. \item {} -\sphinxcode{c\_seed} (values: unsigned integer, default value 21344)): seed for the C random functions if \sphinxcode{setSeed} is set to \sphinxcode{yes}. +\sphinxcode{\sphinxupquote{c\_seed}} (values: unsigned integer, default value 21344)): seed for the C random functions if \sphinxcode{\sphinxupquote{setSeed}} is set to \sphinxcode{\sphinxupquote{yes}}. \item {} -\sphinxcode{useInitParams} (values: \sphinxcode{\{no,yes\}}, default value: \sphinxcode{no}): if \sphinxcode{yes} the initial parameters during the learning are the ones indicated in the program. Otherwise, the initial parameters are generated randomly using the clock seed. +\sphinxcode{\sphinxupquote{useInitParams}} (values: \sphinxcode{\sphinxupquote{\{no,yes\}}}, default value: \sphinxcode{\sphinxupquote{no}}): if \sphinxcode{\sphinxupquote{yes}} the initial parameters during the learning are the ones indicated in the program. Otherwise, the initial parameters are generated randomly using the clock seed. \item {} -\sphinxcode{logzero} (values: negative real, default value \(\log(0.000001)\)): value assigned to \(\log(0)\). +\sphinxcode{\sphinxupquote{logzero}} (values: negative real, default value \(\log(0.000001)\)): value assigned to \(\log(0)\). \item {} -\sphinxcode{zero} (values: real, default value \(0.000001\)): value assigned to \(0\). +\sphinxcode{\sphinxupquote{zero}} (values: real, default value \(0.000001\)): value assigned to \(0\). \item {} -\sphinxcode{max\_initial\_weight} (values: real number , default value: 0.5): weights in DPHIL are randomly initialized with values in the interval {[}-max\_initial\_weight, max\_initial\_weight{]}. +\sphinxcode{\sphinxupquote{max\_initial\_weight}} (values: real number , default value: 0.5): weights in DPHIL are randomly initialized with values in the interval {[}-max\_initial\_weight, max\_initial\_weight{]}. \item {} -\sphinxcode{adam\_params} (values: list of four values {[}learningRate, beta1, beta2, epsilon{]}, default value: {[}0.001,0.9,0.999,1e-8{]}): provides Adam’s hyper-parameters. +\sphinxcode{\sphinxupquote{adam\_params}} (values: list of four values {[}learningRate, beta1, beta2, epsilon{]}, default value: {[}0.001,0.9,0.999,1e-8{]}): provides Adam’s hyper-parameters. \item {} -\sphinxcode{batch\_strategy} (values: \sphinxcode{minibatch(size)}, \sphinxcode{stoch\_minibatch(size)}, \sphinxcode{batch}, default value: \sphinxcode{minibatch(10)}): defines the gradient descent strategy in DPHIL. If set to \sphinxcode{minibatch(size)} the mini batch strategy with batch size \sphinxcode{size} is used i.e at each iteration, \sphinxcode{size} arithmetic circuits (ACs) are used to compute the gradients. If set to \sphinxcode{batch} the whole set of ACs are used to compute the gradients. \sphinxcode{stoch\_minibatch(size)} is a modified version of mini batch in which at each iteration, \sphinxcode{size} ACs are randomly selected for computing the gradients. +\sphinxcode{\sphinxupquote{batch\_strategy}} (values: \sphinxcode{\sphinxupquote{minibatch(size)}}, \sphinxcode{\sphinxupquote{stoch\_minibatch(size)}}, \sphinxcode{\sphinxupquote{batch}}, default value: \sphinxcode{\sphinxupquote{minibatch(10)}}): defines the gradient descent strategy in DPHIL. If set to \sphinxcode{\sphinxupquote{minibatch(size)}} the mini batch strategy with batch size \sphinxcode{\sphinxupquote{size}} is used i.e at each iteration, \sphinxcode{\sphinxupquote{size}} arithmetic circuits (ACs) are used to compute the gradients. If set to \sphinxcode{\sphinxupquote{batch}} the whole set of ACs are used to compute the gradients. \sphinxcode{\sphinxupquote{stoch\_minibatch(size)}} is a modified version of mini batch in which at each iteration, \sphinxcode{\sphinxupquote{size}} ACs are randomly selected for computing the gradients. \item {} -\sphinxcode{saveStatistics} (values: \sphinxcode{\{no,yes\}}, default value: \sphinxcode{no}): if \sphinxcode{yes}, the statistics (evolution of the likelihood and other values) during parameter learning are saved in a folder whose name is the value of \sphinxcode{statistics\_folder} hyper-parameter. +\sphinxcode{\sphinxupquote{saveStatistics}} (values: \sphinxcode{\sphinxupquote{\{no,yes\}}}, default value: \sphinxcode{\sphinxupquote{no}}): if \sphinxcode{\sphinxupquote{yes}}, the statistics (evolution of the likelihood and other values) during parameter learning are saved in a folder whose name is the value of \sphinxcode{\sphinxupquote{statistics\_folder}} hyper-parameter. \item {} -\sphinxcode{statistics\_folder} (values: string , default value: \sphinxcode{statistics}): folder where to save the statistics if \sphinxcode{saveStatistics} is set to \sphinxcode{yes}. +\sphinxcode{\sphinxupquote{statistics\_folder}} (values: string , default value: \sphinxcode{\sphinxupquote{statistics}}): folder where to save the statistics if \sphinxcode{\sphinxupquote{saveStatistics}} is set to \sphinxcode{\sphinxupquote{yes}}. \item {} -\sphinxcode{regularized} (values: \sphinxcode{\{no,yes\}} , default value: \sphinxcode{no}): if set to \sphinxcode{yes} regularization is enabled. +\sphinxcode{\sphinxupquote{regularized}} (values: \sphinxcode{\sphinxupquote{\{no,yes\}}} , default value: \sphinxcode{\sphinxupquote{no}}): if set to \sphinxcode{\sphinxupquote{yes}} regularization is enabled. \item {} -\sphinxcode{regularizationType} (values: integer in \sphinxcode{{[}0,3{]}} , default value: \sphinxcode{0}): \sphinxcode{0} to disable regularization, \sphinxcode{1}, \sphinxcode{2} and \sphinxcode{3} for L1, L2 and Bayesian regularization respectively. +\sphinxcode{\sphinxupquote{regularizationType}} (values: integer in \sphinxcode{\sphinxupquote{{[}0,3{]}}} , default value: \sphinxcode{\sphinxupquote{0}}): \sphinxcode{\sphinxupquote{0}} to disable regularization, \sphinxcode{\sphinxupquote{1}}, \sphinxcode{\sphinxupquote{2}} and \sphinxcode{\sphinxupquote{3}} for L1, L2 and Bayesian regularization respectively. \item {} -\sphinxcode{gamma} (values: real number, default value: \sphinxcode{10}): regularization coefficient for L1 and L2. Is equal to the Dirichlet coefficient \sphinxcode{a} for Bayesian regularization. +\sphinxcode{\sphinxupquote{gamma}} (values: real number, default value: \sphinxcode{\sphinxupquote{10}}): regularization coefficient for L1 and L2. Is equal to the Dirichlet coefficient \sphinxcode{\sphinxupquote{a}} for Bayesian regularization. \item {} -\sphinxcode{gammaCount} (values:real number , default value: 0): Dirichlet coefficient \sphinxcode{b} for Bayesian regularization and typically 0 for L1 and l2 regularization. +\sphinxcode{\sphinxupquote{gammaCount}} (values:real number , default value: 0): Dirichlet coefficient \sphinxcode{\sphinxupquote{b}} for Bayesian regularization and typically 0 for L1 and l2 regularization. \end{itemize} @@ -820,40 +776,40 @@ \section{Hyper-parameters for Learning} SLEAHP hyper-parameters \begin{itemize} \item {} -\sphinxcode{megaex\_bottom} (values: integer, default value: 1, valid for SLEAHP): number of mega-examples on which to build the bottom clauses. +\sphinxcode{\sphinxupquote{megaex\_bottom}} (values: integer, default value: 1, valid for SLEAHP): number of mega-examples on which to build the bottom clauses. \item {} -\sphinxcode{initial\_clauses\_per\_megaex} (values: integer, default value: 1, valid for SLEAHP): number of bottom clauses to build for each mega-example (or model or interpretation). +\sphinxcode{\sphinxupquote{initial\_clauses\_per\_megaex}} (values: integer, default value: 1, valid for SLEAHP): number of bottom clauses to build for each mega-example (or model or interpretation). \item {} -\sphinxcode{d} (values: integer, default value: 1, valid for SLEAHP): number of saturation steps when building the bottom clause. +\sphinxcode{\sphinxupquote{d}} (values: integer, default value: 1, valid for SLEAHP): number of saturation steps when building the bottom clause. \item {} -\sphinxcode{neg\_ex} (values: \sphinxcode{given}, \sphinxcode{cw}, default value: \sphinxcode{cw}): if set to \sphinxcode{given}, the negative examples in training and testing are taken from the test folds interpretations, i.e., those examples \sphinxcode{ex} stored as \sphinxcode{neg(ex)}; if set to \sphinxcode{cw}, the negative examples in training and testing are generated according to the closed world assumption, i.e., all atoms for target predicates that are not positive examples. The set of all atoms is obtained by collecting the set of constants for each type of the arguments of the target predicate, so the target predicates must have at least one fact for \sphinxcode{modeh/2} or \sphinxcode{modeb/2} also for parameter learning. +\sphinxcode{\sphinxupquote{neg\_ex}} (values: \sphinxcode{\sphinxupquote{given}}, \sphinxcode{\sphinxupquote{cw}}, default value: \sphinxcode{\sphinxupquote{cw}}): if set to \sphinxcode{\sphinxupquote{given}}, the negative examples in training and testing are taken from the test folds interpretations, i.e., those examples \sphinxcode{\sphinxupquote{ex}} stored as \sphinxcode{\sphinxupquote{neg(ex)}}; if set to \sphinxcode{\sphinxupquote{cw}}, the negative examples in training and testing are generated according to the closed world assumption, i.e., all atoms for target predicates that are not positive examples. The set of all atoms is obtained by collecting the set of constants for each type of the arguments of the target predicate, so the target predicates must have at least one fact for \sphinxcode{\sphinxupquote{modeh/2}} or \sphinxcode{\sphinxupquote{modeb/2}} also for parameter learning. \item {} -\sphinxcode{probability} (values:real number in \sphinxcode{{[}0,1{]}} , default value: \sphinxcode{1.0}): initial value which indicates the probability to go from the current layer to the next when generating the initial HPLP. +\sphinxcode{\sphinxupquote{probability}} (values:real number in \sphinxcode{\sphinxupquote{{[}0,1{]}}} , default value: \sphinxcode{\sphinxupquote{1.0}}): initial value which indicates the probability to go from the current layer to the next when generating the initial HPLP. \item {} -\sphinxcode{rate} (values: real number in \sphinxcode{{[}0,1{]}}, default value: \sphinxcode{0.95}): at each layer during the tree generation, the probability to go deeper is equal to \sphinxcode{probability=probability*rate}. The deeper the layer the lower is the probability to go deeper. +\sphinxcode{\sphinxupquote{rate}} (values: real number in \sphinxcode{\sphinxupquote{{[}0,1{]}}}, default value: \sphinxcode{\sphinxupquote{0.95}}): at each layer during the tree generation, the probability to go deeper is equal to \sphinxcode{\sphinxupquote{probability=probability*rate}}. The deeper the layer the lower is the probability to go deeper. \item {} -\sphinxcode{min\_probability} (values: real number in \sphinxcode{{[}0,1{]}}, default value: \sphinxcode{1e-5}): probability threshold under which a clause is dropped out. +\sphinxcode{\sphinxupquote{min\_probability}} (values: real number in \sphinxcode{\sphinxupquote{{[}0,1{]}}}, default value: \sphinxcode{\sphinxupquote{1e-5}}): probability threshold under which a clause is dropped out. \item {} -\sphinxcode{use\_all\_mega\_examples} (values: \sphinxcode{\{no,yes\}} , default value:\sphinxcode{yes}): if set to \sphinxcode{yes} all the the bottom clauses are used to create the tree otherwise only one of them is used (typically the first). +\sphinxcode{\sphinxupquote{use\_all\_mega\_examples}} (values: \sphinxcode{\sphinxupquote{\{no,yes\}}} , default value:\sphinxcode{\sphinxupquote{yes}}): if set to \sphinxcode{\sphinxupquote{yes}} all the the bottom clauses are used to create the tree otherwise only one of them is used (typically the first). \item {} -\sphinxcode{saveHPLP} (values: \sphinxcode{\{no,yes\}}, default value: \sphinxcode{no}): if set to \sphinxcode{yes} the initial and the learned hierarchical programs are saved in the current folder. +\sphinxcode{\sphinxupquote{saveHPLP}} (values: \sphinxcode{\sphinxupquote{\{no,yes\}}}, default value: \sphinxcode{\sphinxupquote{no}}): if set to \sphinxcode{\sphinxupquote{yes}} the initial and the learned hierarchical programs are saved in the current folder. \item {} -\sphinxcode{saveFile} (values: string, default value: “hplp”): file name where to save the initial hierarchical programs if \sphinxcode{saveHPLP} is set to \sphinxcode{yes}. If the file name is \sphinxcode{hplp}, the learned program is saved in file \sphinxcode{hplp\_learned}. +\sphinxcode{\sphinxupquote{saveFile}} (values: string, default value: “hplp”): file name where to save the initial hierarchical programs if \sphinxcode{\sphinxupquote{saveHPLP}} is set to \sphinxcode{\sphinxupquote{yes}}. If the file name is \sphinxcode{\sphinxupquote{hplp}}, the learned program is saved in file \sphinxcode{\sphinxupquote{hplp\_learned}}. \item {} -\sphinxcode{max\_layer} (values: integer, default value: -1): maximum layer of clauses. If set to -1, no maximum is imposed. +\sphinxcode{\sphinxupquote{max\_layer}} (values: integer, default value: -1): maximum layer of clauses. If set to -1, no maximum is imposed. \item {} -\sphinxcode{verbosity} (values: integer in \sphinxcode{{[}1,3{]}}, default value: \sphinxcode{1}): level of verbosity of the algorithms. +\sphinxcode{\sphinxupquote{verbosity}} (values: integer in \sphinxcode{\sphinxupquote{{[}1,3{]}}}, default value: \sphinxcode{\sphinxupquote{1}}): level of verbosity of the algorithms. \end{itemize} @@ -862,9 +818,9 @@ \section{Hyper-parameters for Learning} \chapter{Example Files} \label{\detokenize{index:example-files}} -The \sphinxcode{pack/phil/prolog/examples} folder in SWI-Prolog home contains some example programs. -The subfolder \sphinxcode{learning} contains some learning examples. -The \sphinxcode{pack/phil/docs} folder contains this manual in latex, html and pdf. +The \sphinxcode{\sphinxupquote{pack/phil/prolog/examples}} folder in SWI-Prolog home contains some example programs. +The subfolder \sphinxcode{\sphinxupquote{learning}} contains some learning examples. +The \sphinxcode{\sphinxupquote{pack/phil/docs}} folder contains this manual in latex, html and pdf. \chapter{Manual in PDF} @@ -882,40 +838,31 @@ \chapter{References} \label{\detokenize{index:references}} -\begin{sphinxthebibliography}{NguembangFadjaLR17} -\bibitem[DRVL95]{\detokenize{DRVL95}}{\phantomsection\label{\detokenize{index:raelae95-alt95}} +\begin{sphinxthebibliography}{Nguemban} +\bibitem[DRVL95]{index:raelae95-alt95} L. De Raedt and W. Van Laer. Inductive constraint logic. In \sphinxstyleemphasis{Proceedings of the 6th Conference on Algorithmic Learning Theory (ALT 1995)}, volume 997 of LNAI, 80\textendash{}94. Fukuoka, Japan, 1995. Springer. -} -\bibitem[KD05]{\detokenize{KD05}}{\phantomsection\label{\detokenize{index:kok2005learning}} +\bibitem[FRL21]{index:fadja2021learning} +Arnaud Nguembang Fadja, Fabrizio Riguzzi, and Evelina Lamma. Learning hierarchical probabilistic logic programs. \sphinxstyleemphasis{Machine Learning}, pages 1\textendash{}57, 2021. +\bibitem[KD05]{index:kok2005learning} Stanley Kok and Pedro Domingos. Learning the structure of markov logic networks. In \sphinxstyleemphasis{Proceedings of the 22nd international conference on Machine learning}, 441\textendash{}448. 2005. -} -\bibitem[NFRL18a]{\detokenize{NFRL18a}}{\phantomsection\label{\detokenize{index:fadja2018expectation}} +\bibitem[NFRL18a]{index:fadja2018expectation} Arnaud Nguembang Fadja, Fabrizio Riguzzi, and Evelina Lamma. Expectation maximization in deep probabilistic logic programming. In \sphinxstyleemphasis{International Conference of the Italian Association for Artificial Intelligence}, 293\textendash{}306. Springer, 2018. -} -\bibitem[NFRL18b]{\detokenize{NFRL18b}}{\phantomsection\label{\detokenize{index:nguriglam18-plp-iw}} +\bibitem[NFRL18b]{index:nguriglam18-plp-iw} Arnaud Nguembang Fadja, Fabrizio Riguzzi, and Evelina Lamma. Learning the parameters of deep probabilistic logic programs. In Elena Bellodi and Tom Schrijvers, editors, \sphinxstyleemphasis{Probabilistic Logic Programming (PLP 2018)}, volume 2219 of CEUR Workshop Proceedings, 9\textendash{}14. Aachen, Germany, 2018. Sun SITE Central Europe. URL: \sphinxurl{http://ceur-ws.org/Vol-2219/paper2.pdf}. -} -\bibitem[Poo97]{\detokenize{Poo97}}{\phantomsection\label{\detokenize{index:dblp-journals-ai-poole97}} +\bibitem[Poo97]{index:dblp-journals-ai-poole97} David Poole. The independent choice logic for modelling multiple agents under uncertainty. \sphinxstyleemphasis{Artificial Intelligence}, 94(1-2):7\textendash{}56, 1997. -} -\bibitem[Rig14]{\detokenize{Rig14}}{\phantomsection\label{\detokenize{index:rig14-cj-ij}} +\bibitem[Rig14]{index:rig14-cj-ij} Fabrizio Riguzzi. Speeding up inference for probabilistic logic programs. \sphinxstyleemphasis{CJ\_J}, 57(3):347\textendash{}363, 2014. \sphinxhref{https://doi.org/10.1093/comjnl/bxt096}{doi:10.1093/comjnl/bxt096}. -} -\bibitem[RS10]{\detokenize{RS10}}{\phantomsection\label{\detokenize{index:rigswi10-iclp10-ic}} +\bibitem[RS10]{index:rigswi10-iclp10-ic} Fabrizio Riguzzi and Terrance Swift. Tabling and Answer Subsumption for Reasoning on Logic Programs with Annotated Disjunctions. In \sphinxstyleemphasis{Technical Communications of the International Conference on Logic Programming}, volume 7 of Leibniz International Proceedings in Informatics (LIPIcs), 162\textendash{}171. Schloss Dagstuhl\textendash{}Leibniz-Zentrum fuer Informatik, 2010. \sphinxhref{https://doi.org/10.4230/LIPIcs.ICLP.2010.162}{doi:10.4230/LIPIcs.ICLP.2010.162}. -} -\bibitem[SK01]{\detokenize{SK01}}{\phantomsection\label{\detokenize{index:dblp-journals-jair-satok01}} +\bibitem[SK01]{index:dblp-journals-jair-satok01} Taisuke Sato and Yoshitaka Kameya. Parameter learning of logic programs for symbolic-statistical modeling. \sphinxstyleemphasis{J. Artif. Intell. Res.}, 15:391\textendash{}454, 2001. -} -\bibitem[VV03]{\detokenize{VV03}}{\phantomsection\label{\detokenize{index:venver03-tr}} +\bibitem[VV03]{index:venver03-tr} J. Vennekens and S. Verbaeten. Logic programs with annotated disjunctions. Technical Report CW386, K. U. Leuven, 2003. -} -\bibitem[VVB04]{\detokenize{VVB04}}{\phantomsection\label{\detokenize{index:venver04-iclp04-ic}} +\bibitem[VVB04]{index:venver04-iclp04-ic} J. Vennekens, S. Verbaeten, and M. Bruynooghe. Logic programs with annotated disjunctions. In \sphinxstyleemphasis{International Conference on Logic Programming}, volume 3131 of LNCS, 195\textendash{}209. Springer, 2004. -} -\bibitem[NguembangFadjaLR17]{\detokenize{NguembangFadjaLR17}}{\phantomsection\label{\detokenize{index:ngulamrig17-plp-iw}} +\bibitem[NguembangFadjaLR17]{index:ngulamrig17-plp-iw} Arnaud Nguembang Fadja, Evelina Lamma, and Fabrizio Riguzzi. Deep probabilistic logic programming. In Christian Theil Have and Riccardo Zese, editors, \sphinxstyleemphasis{PLP17\_B}, volume 1916 of CEUR\_S, 3\textendash{}14. Sun SITE Central Europe, 2017. -} \end{sphinxthebibliography} diff --git a/packs_lib/phil/docs/_build/latex/phil.toc b/packs_lib/phil/docs/_build/latex/phil.toc index d6570d6fe0..56bec7e8ab 100644 --- a/packs_lib/phil/docs/_build/latex/phil.toc +++ b/packs_lib/phil/docs/_build/latex/phil.toc @@ -1,26 +1,26 @@ \babel@toc {english}{} -\contentsline {chapter}{\numberline {1}Introduction}{1}{chapter.1} -\contentsline {chapter}{\numberline {2}Installation}{3}{chapter.2} -\contentsline {section}{\numberline {2.1}Requirements}{3}{section.2.1} -\contentsline {section}{\numberline {2.2}Example of use}{3}{section.2.2} -\contentsline {section}{\numberline {2.3}Testing the installation}{3}{section.2.3} -\contentsline {section}{\numberline {2.4}Datasets}{4}{section.2.4} -\contentsline {chapter}{\numberline {3}Syntax}{5}{chapter.3} -\contentsline {chapter}{\numberline {4}Semantics}{7}{chapter.4} -\contentsline {chapter}{\numberline {5}Inference}{9}{chapter.5} -\contentsline {chapter}{\numberline {6}Learning}{11}{chapter.6} -\contentsline {section}{\numberline {6.1}Input}{11}{section.6.1} -\contentsline {subsection}{\numberline {6.1.1}Preamble}{11}{subsection.6.1.1} -\contentsline {subsection}{\numberline {6.1.2}Background and Initial hierarchical program}{12}{subsection.6.1.2} -\contentsline {subsection}{\numberline {6.1.3}Language Bias}{13}{subsection.6.1.3} -\contentsline {subsection}{\numberline {6.1.4}Example Interpretations}{14}{subsection.6.1.4} -\contentsline {section}{\numberline {6.2}Commands}{16}{section.6.2} -\contentsline {subsection}{\numberline {6.2.1}Parameter Learning}{16}{subsection.6.2.1} -\contentsline {subsection}{\numberline {6.2.2}Structure Learning}{16}{subsection.6.2.2} -\contentsline {subsection}{\numberline {6.2.3}Testing}{16}{subsection.6.2.3} -\contentsline {section}{\numberline {6.3}Hyper-parameters for Learning}{17}{section.6.3} -\contentsline {chapter}{\numberline {7}Example Files}{21}{chapter.7} -\contentsline {chapter}{\numberline {8}Manual in PDF}{23}{chapter.8} -\contentsline {chapter}{\numberline {9}License}{25}{chapter.9} -\contentsline {chapter}{\numberline {10}References}{27}{chapter.10} -\contentsline {chapter}{Bibliography}{29}{chapter*.16} +\contentsline {chapter}{\numberline {1}Introduction}{1}{chapter.1}% +\contentsline {chapter}{\numberline {2}Installation}{3}{chapter.2}% +\contentsline {section}{\numberline {2.1}Requirements}{3}{section.2.1}% +\contentsline {section}{\numberline {2.2}Example of use}{3}{section.2.2}% +\contentsline {section}{\numberline {2.3}Testing the installation}{3}{section.2.3}% +\contentsline {section}{\numberline {2.4}Datasets}{4}{section.2.4}% +\contentsline {chapter}{\numberline {3}Syntax}{5}{chapter.3}% +\contentsline {chapter}{\numberline {4}Semantics}{7}{chapter.4}% +\contentsline {chapter}{\numberline {5}Inference}{9}{chapter.5}% +\contentsline {chapter}{\numberline {6}Learning}{11}{chapter.6}% +\contentsline {section}{\numberline {6.1}Input}{11}{section.6.1}% +\contentsline {subsection}{\numberline {6.1.1}Preamble}{11}{subsection.6.1.1}% +\contentsline {subsection}{\numberline {6.1.2}Background and Initial hierarchical program}{12}{subsection.6.1.2}% +\contentsline {subsection}{\numberline {6.1.3}Language Bias}{13}{subsection.6.1.3}% +\contentsline {subsection}{\numberline {6.1.4}Example Interpretations}{14}{subsection.6.1.4}% +\contentsline {section}{\numberline {6.2}Commands}{16}{section.6.2}% +\contentsline {subsection}{\numberline {6.2.1}Parameter Learning}{16}{subsection.6.2.1}% +\contentsline {subsection}{\numberline {6.2.2}Structure Learning}{16}{subsection.6.2.2}% +\contentsline {subsection}{\numberline {6.2.3}Testing}{16}{subsection.6.2.3}% +\contentsline {section}{\numberline {6.3}Hyper-parameters for Learning}{17}{section.6.3}% +\contentsline {chapter}{\numberline {7}Example Files}{21}{chapter.7}% +\contentsline {chapter}{\numberline {8}Manual in PDF}{23}{chapter.8}% +\contentsline {chapter}{\numberline {9}License}{25}{chapter.9}% +\contentsline {chapter}{\numberline {10}References}{27}{chapter.10}% +\contentsline {chapter}{Bibliography}{29}{chapter*.3}% diff --git a/packs_lib/phil/docs/_build/latex/python.ist b/packs_lib/phil/docs/_build/latex/python.ist index 687d26cd45..70536a6683 100644 --- a/packs_lib/phil/docs/_build/latex/python.ist +++ b/packs_lib/phil/docs/_build/latex/python.ist @@ -3,11 +3,14 @@ headings_flag 1 heading_prefix " \\bigletter " preamble "\\begin{sphinxtheindex} -\\def\\bigletter#1{{\\Large\\sffamily#1}\\nopagebreak\\vspace{1mm}} +\\let\\bigletter\\sphinxstyleindexlettergroup +\\let\\spxpagem \\sphinxstyleindexpagemain +\\let\\spxentry \\sphinxstyleindexentry +\\let\\spxextra \\sphinxstyleindexextra " postamble "\n\n\\end{sphinxtheindex}\n" -symhead_positive "{Symbols}" -numhead_positive "{Numbers}" +symhead_positive "{\\sphinxsymbolsname}" +numhead_positive "{\\sphinxnumbersname}" diff --git a/packs_lib/phil/docs/_build/latex/sphinx.sty b/packs_lib/phil/docs/_build/latex/sphinx.sty index 5ceb05e197..de6664cd1f 100644 --- a/packs_lib/phil/docs/_build/latex/sphinx.sty +++ b/packs_lib/phil/docs/_build/latex/sphinx.sty @@ -6,7 +6,7 @@ % \NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesPackage{sphinx}[2017/12/12 v1.6.6 LaTeX package (Sphinx markup)] +\ProvidesPackage{sphinx}[2019/01/12 v1.8.4 LaTeX package (Sphinx markup)] % provides \ltx@ifundefined % (many packages load ltxcmds: graphicx does for pdftex and lualatex but @@ -39,7 +39,7 @@ \@ifclassloaded{memoir}{}{\RequirePackage{fancyhdr}} % for \text macro and \iffirstchoice@ conditional even if amsmath not loaded \RequirePackage{amstext} -\RequirePackage[warn]{textcomp} +\RequirePackage{textcomp}% "warn" option issued from template \RequirePackage{titlesec} \@ifpackagelater{titlesec}{2016/03/15}% {\@ifpackagelater{titlesec}{2016/03/21}% @@ -82,11 +82,26 @@ % User interface to set-up whitespace before and after tables: \newcommand*\sphinxtablepre {0pt}% \newcommand*\sphinxtablepost{\medskipamount}% +% Space from caption baseline to top of table or frame of literal-block \newcommand*\sphinxbelowcaptionspace{.5\sphinxbaselineskip}% % as one can not use \baselineskip from inside longtable (it is zero there) % we need \sphinxbaselineskip, which defaults to \baselineskip \def\sphinxbaselineskip{\baselineskip}% -% These commands are inserted by the table templates +% The following is to ensure that, whether tabular(y) or longtable: +% - if a caption is on top of table: +% a) the space between its last baseline and the top rule of table is +% exactly \sphinxbelowcaptionspace +% b) the space from last baseline of previous text to first baseline of +% caption is exactly \parskip+\baselineskip+ height of a strut. +% c) the caption text will wrap at width \LTcapwidth (4in) +% - make sure this works also if "caption" package is loaded by user +% (with its width or margin option taking place of \LTcapwidth role) +% TODO: obtain same for caption of literal block: a) & c) DONE, b) TO BE DONE +% +% To modify space below such top caption, adjust \sphinxbelowcaptionspace +% To add or remove space above such top caption, adjust \sphinxtablepre: +% notice that \abovecaptionskip, \belowcaptionskip, \LTpre are **ignored** +% A. Table with longtable \def\sphinxatlongtablestart {\par \vskip\parskip @@ -95,42 +110,76 @@ \LTpre\z@skip\LTpost\z@skip % set to zero longtable's own skips \edef\sphinxbaselineskip{\dimexpr\the\dimexpr\baselineskip\relax\relax}% }% -\def\sphinxatlongtableend{\prevdepth\z@\vskip\sphinxtablepost\relax}% +% Compatibility with caption package +\def\sphinxthelongtablecaptionisattop{% + \spx@ifcaptionpackage{\noalign{\vskip-\belowcaptionskip}}{}% +}% +% Achieves exactly \sphinxbelowcaptionspace below longtable caption \def\sphinxlongtablecapskipadjust - {\dimexpr-\dp\strutbox-\sphinxbaselineskip+\sphinxbelowcaptionspace\relax}% -% Now for tables not using longtable -\def\sphinxattablestart - {\par - \vskip\dimexpr\sphinxtablepre\relax - }% + {\dimexpr-\dp\strutbox + -\spx@ifcaptionpackage{\abovecaptionskip}{\sphinxbaselineskip}% + +\sphinxbelowcaptionspace\relax}% +\def\sphinxatlongtableend{\prevdepth\z@\vskip\sphinxtablepost\relax}% +% B. Table with tabular or tabulary +\def\sphinxattablestart{\par\vskip\dimexpr\sphinxtablepre\relax}% \let\sphinxattableend\sphinxatlongtableend -% longtable's wraps captions to a maximal width of \LTcapwidth -% so we do the same for all tables +% This is used by tabular and tabulary templates \newcommand*\sphinxcapstartof[1]{% \vskip\parskip \vbox{}% force baselineskip for good positioning by capstart of hyperanchor + % hyperref puts the anchor 6pt above this baseline; in case of caption + % this baseline will be \ht\strutbox above first baseline of caption \def\@captype{#1}% \capstart -% move back vertically to compensate space inserted by next paragraph +% move back vertically, as tabular (or its caption) will compensate \vskip-\baselineskip\vskip-\parskip }% -\newcommand\sphinxcaption[2][\LTcapwidth]{% +\def\sphinxthecaptionisattop{% locate it after \sphinxcapstartof + \spx@ifcaptionpackage + {\caption@setposition{t}% + \vskip\baselineskip\vskip\parskip % undo those from \sphinxcapstartof + \vskip-\belowcaptionskip % anticipate caption package skip + % caption package uses a \vbox, not a \vtop, so "single line" case + % gives different result from "multi-line" without this: + \nointerlineskip + }% + {}% +}% +\def\sphinxthecaptionisatbottom{% (not finalized; for template usage) + \spx@ifcaptionpackage{\caption@setposition{b}}{}% +}% +% The aim of \sphinxcaption is to apply to tabular(y) the maximal width +% of caption as done by longtable +\def\sphinxtablecapwidth{\LTcapwidth}% +\newcommand\sphinxcaption{\@dblarg\spx@caption}% +\long\def\spx@caption[#1]#2{% \noindent\hb@xt@\linewidth{\hss - \vtop{\@tempdima\dimexpr#1\relax + \vtop{\@tempdima\dimexpr\sphinxtablecapwidth\relax % don't exceed linewidth for the caption width \ifdim\@tempdima>\linewidth\hsize\linewidth\else\hsize\@tempdima\fi % longtable ignores \abovecaptionskip/\belowcaptionskip, so do the same here - \abovecaptionskip\z@skip - \belowcaptionskip\z@skip - \caption[{#2}]% + \abovecaptionskip\sphinxabovecaptionskip % \z@skip + \belowcaptionskip\sphinxbelowcaptionskip % \z@skip + \caption[{#1}]% {\strut\ignorespaces#2\ifhmode\unskip\@finalstrut\strutbox\fi}% }\hss}% \par\prevdepth\dp\strutbox }% -\newcommand\sphinxaftercaption -{% this default definition serves with a caption *above* a table, to make sure - % its last baseline is \sphinxbelowcaptionspace above table top - \nobreak +\def\sphinxabovecaptionskip{\z@skip}% Do not use! Flagged for removal +\def\sphinxbelowcaptionskip{\z@skip}% Do not use! Flagged for removal +% This wrapper of \abovecaptionskip is used in sphinxVerbatim for top +% caption, and with another value in sphinxVerbatimintable +% TODO: To unify space above caption of a code-block with the one above +% caption of a table/longtable, \abovecaptionskip must not be used +% This auxiliary will get renamed and receive a different meaning +% in future. +\def\spx@abovecaptionskip{\abovecaptionskip}% +% Achieve \sphinxbelowcaptionspace below a caption located above a tabular +% or a tabulary +\newcommand\sphinxaftertopcaption +{% + \spx@ifcaptionpackage + {\par\prevdepth\dp\strutbox\nobreak\vskip-\abovecaptionskip}{\nobreak}% \vskip\dimexpr\sphinxbelowcaptionspace\relax \vskip-\baselineskip\vskip-\parskip }% @@ -158,8 +207,10 @@ } % For highlighted code. \RequirePackage{fancyvrb} -\fvset{fontsize=\small} \define@key{FV}{hllines}{\def\sphinx@verbatim@checkifhl##1{\in@{, ##1,}{#1}}} +% sphinxVerbatim must be usable by third party without requiring hllines set-up +\def\sphinxresetverbatimhllines{\def\sphinx@verbatim@checkifhl##1{\in@false}} +\sphinxresetverbatimhllines % For hyperlinked footnotes in tables; also for gathering footnotes from % topic and warning blocks. Also to allow code-blocks in footnotes. \RequirePackage{footnotehyper-sphinx} @@ -169,7 +220,13 @@ % For floating figures in the text. Better to load after float. \RequirePackage{wrapfig} % Separate paragraphs by space by default. -\RequirePackage{parskip} +\IfFileExists{parskip-2001-04-09.sty}% since September 2018 TeXLive update +% new parskip.sty, but let it rollback to old one. +% hopefully TeX installation not broken and LaTeX kernel not too old + {\RequirePackage{parskip}[=v1]} +% standard one from 1989. Admittedly \section of article/book gives possibly +% anomalous spacing, but we can't require September 2018 release for some time. + {\RequirePackage{parskip}} % For parsed-literal blocks. \RequirePackage{alltt} % Display "real" single quotes in literal blocks. @@ -177,15 +234,18 @@ % control caption around literal-block \RequirePackage{capt-of} \RequirePackage{needspace} - +% LaTeX 2018-04-01 and later provides \@removefromreset +\ltx@ifundefined{@removefromreset} + {\RequirePackage{remreset}} + {}% avoid warning % to make pdf with correct encoded bookmarks in Japanese % this should precede the hyperref package -\ifx\kanjiskip\undefined +\ifx\kanjiskip\@undefined % for non-Japanese: make sure bookmarks are ok also with lualatex \PassOptionsToPackage{pdfencoding=unicode}{hyperref} \else \RequirePackage{atbegshi} - \ifx\ucs\undefined + \ifx\ucs\@undefined \ifnum 42146=\euc"A4A2 \AtBeginShipoutFirst{\special{pdf:tounicode EUC-UCS2}} \else @@ -196,7 +256,7 @@ \fi \fi -\ifx\@jsc@uplatextrue\undefined\else +\ifx\@jsc@uplatextrue\@undefined\else \PassOptionsToPackage{setpagesize=false}{hyperref} \fi @@ -229,7 +289,7 @@ \SetupKeyvalOptions{prefix=spx@opt@} % use \spx@opt@ prefix % Sphinx legacy text layout: 1in margins on all four sides -\ifx\@jsc@uplatextrue\undefined +\ifx\@jsc@uplatextrue\@undefined \DeclareStringOption[1in]{hmargin} \DeclareStringOption[1in]{vmargin} \DeclareStringOption[.5in]{marginpar} @@ -240,9 +300,11 @@ \DeclareStringOption[.5\dimexpr\inv@mag in\relax]{marginpar} \fi -\DeclareBoolOption{dontkeepoldnames} % \ifspx@opt@dontkeepoldnames = \iffalse \DeclareStringOption[0]{maxlistdepth}% \newcommand*\spx@opt@maxlistdepth{0} - +\DeclareStringOption[-1]{numfigreset} +\DeclareBoolOption[false]{nonumfigreset} +\DeclareBoolOption[false]{mathnumfig} +% \DeclareBoolOption[false]{usespart}% not used % dimensions, we declare the \dimen registers here. \newdimen\sphinxverbatimsep \newdimen\sphinxverbatimborder @@ -269,8 +331,11 @@ % verbatim \DeclareBoolOption[true]{verbatimwithframe} \DeclareBoolOption[true]{verbatimwrapslines} -\DeclareBoolOption[false]{verbatimhintsturnover} +\DeclareBoolOption[true]{verbatimhintsturnover} \DeclareBoolOption[true]{inlineliteralwraps} +\DeclareStringOption[t]{literalblockcappos} +\DeclareStringOption[r]{verbatimcontinuedalign} +\DeclareStringOption[r]{verbatimcontinuesalign} % parsed literal \DeclareBoolOption[true]{parsedliteralwraps} % \textvisiblespace for compatibility with fontspec+XeTeX/LuaTeX @@ -341,6 +406,9 @@ \ProcessKeyvalOptions* % don't allow use of maxlistdepth via \sphinxsetup. \DisableKeyvalOption{sphinx}{maxlistdepth} +\DisableKeyvalOption{sphinx}{numfigreset} +\DisableKeyvalOption{sphinx}{nonumfigreset} +\DisableKeyvalOption{sphinx}{mathnumfig} % user interface: options can be changed midway in a document! \newcommand\sphinxsetup[1]{\setkeys{sphinx}{#1}} @@ -425,7 +493,7 @@ % % fix the double index and bibliography on the table of contents % in jsclasses (Japanese standard document classes) -\ifx\@jsc@uplatextrue\undefined\else +\ifx\@jsc@uplatextrue\@undefined\else \renewenvironment{sphinxtheindex} {\cleardoublepage\phantomsection \begin{theindex}} @@ -433,12 +501,12 @@ \renewenvironment{sphinxthebibliography}[1] {\cleardoublepage% \phantomsection % not needed here since TeXLive 2010's hyperref - \begin{thebibliography}{1}} + \begin{thebibliography}{#1}} {\end{thebibliography}} \fi % disable \@chappos in Appendix in pTeX -\ifx\kanjiskip\undefined\else +\ifx\kanjiskip\@undefined\else \let\py@OldAppendix=\appendix \renewcommand{\appendix}{ \py@OldAppendix @@ -452,11 +520,16 @@ {\newenvironment {sphinxthebibliography}{\begin{thebibliography}}{\end{thebibliography}}% } - {}% else clause of ifundefined + {}% else clause of \ltx@ifundefined \ltx@ifundefined{sphinxtheindex} {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}% - {}% else clause of ifundefined + {}% else clause of \ltx@ifundefined +% for usage with xindy: this string gets internationalized in preamble +\newcommand*{\sphinxnonalphabeticalgroupname}{} +% redefined in preamble, headings for makeindex produced index +\newcommand*{\sphinxsymbolsname}{} +\newcommand*{\sphinxnumbersname}{} %% COLOR (general) % @@ -478,38 +551,61 @@ \sloppy \hbadness = 5000 % don't print trivial gripes -\pagestyle{empty} % start this way - +% Use \pagestyle{normal} as the primary pagestyle for text. % Redefine the 'normal' header/footer style when using "fancyhdr" package: -% Note: this presupposes "twoside". If "oneside" class option, there will be warnings. -\ltx@ifundefined{fancyhf}{}{ - % Use \pagestyle{normal} as the primary pagestyle for text. - \fancypagestyle{normal}{ +\@ifpackageloaded{fancyhdr}{% + \ltx@ifundefined{c@chapter} + {% no \chapter, "howto" (non-Japanese) docclass + \fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[C]{{\py@HeaderFamily\thepage}} + \renewcommand{\headrulewidth}{0pt} + \renewcommand{\footrulewidth}{0pt} + } + % Same as 'plain', this way we can use it in template + % FIXME: shouldn't this have a running header with Name and Release like 'manual'? + \fancypagestyle{normal}{ + \fancyhf{} + \fancyfoot[C]{{\py@HeaderFamily\thepage}} + \renewcommand{\headrulewidth}{0pt} + \renewcommand{\footrulewidth}{0pt} + } + }% + {% classes with \chapter command + \fancypagestyle{normal}{ \fancyhf{} -% (for \py@HeaderFamily cf "TITLES") + % FIXME: this presupposes "twoside". + % If "oneside" class option, there are warnings in LaTeX log. \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}} \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}} \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}} - \fancyhead[LE,RO]{{\py@HeaderFamily \@title, \py@release}} + \fancyhead[LE,RO]{{\py@HeaderFamily \@title\sphinxheadercomma\py@release}} \renewcommand{\headrulewidth}{0.4pt} \renewcommand{\footrulewidth}{0.4pt} % define chaptermark with \@chappos when \@chappos is available for Japanese \ltx@ifundefined{@chappos}{} {\def\chaptermark##1{\markboth{\@chapapp\space\thechapter\space\@chappos\space ##1}{}}} - } + } % Update the plain style so we get the page number & footer line, % but not a chapter or section title. This is to keep the first - % page of a chapter and the blank page between chapters `clean.' - \fancypagestyle{plain}{ + % page of a chapter `clean.' + \fancypagestyle{plain}{ \fancyhf{} \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}} \renewcommand{\headrulewidth}{0pt} \renewcommand{\footrulewidth}{0.4pt} + } + } + } + {% no fancyhdr: memoir class + % Provide default for 'normal' style simply as an alias of 'plain' style + % This way we can use \pagestyle{normal} in LaTeX template + \def\ps@normal{\ps@plain} + % Users of memoir class are invited to redefine 'normal' style in preamble } -} % geometry -\ifx\kanjiskip\undefined +\ifx\kanjiskip\@undefined \PassOptionsToPackage{% hmargin={\unexpanded{\spx@opt@hmargin}},% vmargin={\unexpanded{\spx@opt@vmargin}},% @@ -531,7 +627,7 @@ \newcommand*\sphinxtextlinesja[1]{% \numexpr\@ne+\dimexpr\paperheight-\topskip-\tw@\dimexpr#1\relax\relax/ \baselineskip\relax}% - \ifx\@jsc@uplatextrue\undefined\else + \ifx\@jsc@uplatextrue\@undefined\else % the way we found in order for the papersize special written by % geometry in the dvi file to be correct in case of jsbook class \ifnum\mag=\@m\else % do nothing special if nomag class option or 10pt @@ -548,7 +644,7 @@ }{geometry}% \AtBeginDocument {% update a dimension used by the jsclasses - \ifx\@jsc@uplatextrue\undefined\else\fullwidth\textwidth\fi + \ifx\@jsc@uplatextrue\@undefined\else\fullwidth\textwidth\fi % for some reason, jreport normalizes all dimensions with \@settopoint \@ifclassloaded{jreport} {\@settopoint\textwidth\@settopoint\textheight\@settopoint\marginparwidth} @@ -626,10 +722,38 @@ \setbox\spx@image@box\box\voidb@x % clear memory \includegraphics[#1,width=\linewidth]{#2}% \else + \setbox\spx@image@box\box\voidb@x % clear memory \includegraphics[#1]{#2}% \fi \fi } +% \sphinxsafeincludegraphics resizes images larger than the line width, +% or taller than about the text height (whether or not height/width options +% were used). This is requested to avoid a crash with \MakeFramed as used by +% sphinxShadowBox (topic/contents) and sphinxheavybox (admonitions), and also +% by sphinxVerbatim (but a priori no image inclusion there). +\newdimen\spx@image@maxheight +% default maximal setting will get reduced by sphinxShadowBox/sphinxheavybox +\AtBeginDocument{\spx@image@maxheight\textheight} +\newcommand*{\sphinxsafeincludegraphics}[2][]{% + \gdef\spx@includegraphics@options{#1}% + \setbox\spx@image@box\hbox{\includegraphics[#1,draft]{#2}}% + \in@false + \ifdim \wd\spx@image@box>\linewidth + \g@addto@macro\spx@includegraphics@options{,width=\linewidth}% + \in@true + \fi + % no rotation, no need to worry about depth + \ifdim \ht\spx@image@box>\spx@image@maxheight + \g@addto@macro\spx@includegraphics@options{,height=\spx@image@maxheight}% + \in@true + \fi + \ifin@ + \g@addto@macro\spx@includegraphics@options{,keepaspectratio}% + \fi + \setbox\spx@image@box\box\voidb@x % clear memory + \expandafter\includegraphics\expandafter[\spx@includegraphics@options]{#2}% +}% %% FIGURE IN TABLE @@ -639,8 +763,22 @@ \sphinxsetvskipsforfigintablecaption \begin{minipage}{#1}% }{\end{minipage}} -% store original \caption macro for use with figures in longtable and tabulary -\AtBeginDocument{\let\spx@originalcaption\caption} +% store the original \caption macro for usage with figures inside longtable +% and tabulary cells. Make sure we get the final \caption in presence of +% caption package, whether the latter was loaded before or after sphinx. +\AtBeginDocument{% + \let\spx@originalcaption\caption + \@ifpackageloaded{caption} + {\let\spx@ifcaptionpackage\@firstoftwo + \caption@AtBeginDocument*{\let\spx@originalcaption\caption}% +% in presence of caption package, drop our own \sphinxcaption whose aim was to +% ensure same width of caption to all kinds of tables (tabular(y), longtable), +% because caption package has its own width (or margin) option + \def\sphinxcaption{\caption}% + }% + {\let\spx@ifcaptionpackage\@secondoftwo}% +} +% tabulary expands twice contents, we need to prevent double counter stepping \newcommand*\sphinxfigcaption {\ifx\equation$%$% this is trick to identify tabulary first pass \firstchoice@false\else\firstchoice@true\fi @@ -649,6 +787,11 @@ {\abovecaptionskip\smallskipamount \belowcaptionskip\smallskipamount} + +%% CITATIONS +% +\protected\def\sphinxcite{\cite} + %% FOOTNOTES % % Support large numbered footnotes in minipage @@ -657,6 +800,111 @@ \def\thempfootnote{\arabic{mpfootnote}} +%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS +\ltx@ifundefined{c@chapter} + {\newcounter{literalblock}}% + {\newcounter{literalblock}[chapter]% + \def\theliteralblock{\ifnum\c@chapter>\z@\arabic{chapter}.\fi + \arabic{literalblock}}% + }% +\ifspx@opt@nonumfigreset + \ltx@ifundefined{c@chapter}{}{% + \@removefromreset{figure}{chapter}% + \@removefromreset{table}{chapter}% + \@removefromreset{literalblock}{chapter}% + \ifspx@opt@mathnumfig + \@removefromreset{equation}{chapter}% + \fi + }% + \def\thefigure{\arabic{figure}}% + \def\thetable {\arabic{table}}% + \def\theliteralblock{\arabic{literalblock}}% + \ifspx@opt@mathnumfig + \def\theequation{\arabic{equation}}% + \fi +\else +\let\spx@preAthefigure\@empty +\let\spx@preBthefigure\@empty +% \ifspx@opt@usespart % <-- LaTeX writer could pass such a 'usespart' boolean +% % as sphinx.sty package option +% If document uses \part, (triggered in Sphinx by latex_toplevel_sectioning) +% LaTeX core per default does not reset chapter or section +% counters at each part. +% But if we modify this, we need to redefine \thechapter, \thesection to +% include the part number and this will cause problems in table of contents +% because of too wide numbering. Simplest is to do nothing. +% \fi +\ifnum\spx@opt@numfigreset>0 + \ltx@ifundefined{c@chapter} + {} + {\g@addto@macro\spx@preAthefigure{\ifnum\c@chapter>\z@\arabic{chapter}.}% + \g@addto@macro\spx@preBthefigure{\fi}}% +\fi +\ifnum\spx@opt@numfigreset>1 + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{literalblock}{section}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{section}% + \fi + \g@addto@macro\spx@preAthefigure{\ifnum\c@section>\z@\arabic{section}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\ifnum\spx@opt@numfigreset>2 + \@addtoreset{figure}{subsection}% + \@addtoreset{table}{subsection}% + \@addtoreset{literalblock}{subsection}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{subsection}% + \fi + \g@addto@macro\spx@preAthefigure{\ifnum\c@subsection>\z@\arabic{subsection}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\ifnum\spx@opt@numfigreset>3 + \@addtoreset{figure}{subsubsection}% + \@addtoreset{table}{subsubsection}% + \@addtoreset{literalblock}{subsubsection}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{subsubsection}% + \fi + \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubsection>\z@\arabic{subsubsection}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\ifnum\spx@opt@numfigreset>4 + \@addtoreset{figure}{paragraph}% + \@addtoreset{table}{paragraph}% + \@addtoreset{literalblock}{paragraph}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{paragraph}% + \fi + \g@addto@macro\spx@preAthefigure{\ifnum\c@subparagraph>\z@\arabic{subparagraph}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\ifnum\spx@opt@numfigreset>5 + \@addtoreset{figure}{subparagraph}% + \@addtoreset{table}{subparagraph}% + \@addtoreset{literalblock}{subparagraph}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{subparagraph}% + \fi + \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubparagraph>\z@\arabic{subsubparagraph}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\expandafter\g@addto@macro +\expandafter\spx@preAthefigure\expandafter{\spx@preBthefigure}% +\let\thefigure\spx@preAthefigure +\let\thetable\spx@preAthefigure +\let\theliteralblock\spx@preAthefigure +\g@addto@macro\thefigure{\arabic{figure}}% +\g@addto@macro\thetable{\arabic{table}}% +\g@addto@macro\theliteralblock{\arabic{literalblock}}% + \ifspx@opt@mathnumfig + \let\theequation\spx@preAthefigure + \g@addto@macro\theequation{\arabic{equation}}% + \fi +\fi + + %% LITERAL BLOCKS % % Based on use of "fancyvrb.sty"'s Verbatim. @@ -671,20 +919,7 @@ \let\OriginalVerbatim \Verbatim \let\endOriginalVerbatim\endVerbatim -% if the available space on page is less than \literalblockneedspace, insert pagebreak -\newcommand{\sphinxliteralblockneedspace}{5\baselineskip} -\newcommand{\sphinxliteralblockwithoutcaptionneedspace}{1.5\baselineskip} - % for captions of literal blocks -% also define `\theH...` macros for hyperref -\newcounter{literalblock} -\ltx@ifundefined{c@chapter} - {\@addtoreset{literalblock}{section} - \def\theliteralblock {\ifnum\c@section>\z@ \thesection.\fi\arabic{literalblock}} - \def\theHliteralblock {\theHsection.\arabic{literalblock}}} - {\@addtoreset{literalblock}{chapter} - \def\theliteralblock {\ifnum\c@chapter>\z@ \thechapter.\fi\arabic{literalblock}} - \def\theHliteralblock {\theHchapter.\arabic{literalblock}}} % at start of caption title \newcommand*{\fnum@literalblock}{\literalblockname\nobreakspace\theliteralblock} % this will be overwritten in document preamble by Babel translation @@ -694,56 +929,33 @@ % analogous to \listoffigures, but for the code listings (foo = chosen title.) \newcommand*{\ext@literalblock}{lol} -% The title (caption) is specified from outside as macro \sphinxVerbatimTitle. -% \sphinxVerbatimTitle is reset to empty after each use of Verbatim. -\newcommand*\sphinxVerbatimTitle {} -% This box to typeset the caption before framed.sty multiple passes for framing. -\newbox\spx@Verbatim@TitleBox -% Holder macro for labels of literal blocks. Set-up by LaTeX writer. -\newcommand*\sphinxLiteralBlockLabel {} -\newcommand*\sphinxSetupCaptionForVerbatim [1] -{% - \needspace{\sphinxliteralblockneedspace}% -% insert a \label via \sphinxLiteralBlockLabel -% reset to normal the color for the literal block caption -% the caption inserts \abovecaptionskip whitespace above itself (usually 10pt) -% there is also \belowcaptionskip but it is usually zero, hence the \smallskip - \def\sphinxVerbatimTitle - {\py@NormalColor - \captionof{literalblock}{\sphinxLiteralBlockLabel #1}\smallskip }% -} -\newcommand*\sphinxSetupCodeBlockInFootnote {% - \fvset{fontsize=\footnotesize}\let\caption\sphinxfigcaption - \sphinxverbatimwithminipagetrue % reduces vertical spaces - % we counteract float.sty's \caption which does \@normalsize - \let\normalsize\footnotesize\let\@parboxrestore\relax - \abovecaptionskip \smallskipamount \belowcaptionskip \z@skip} - \newif\ifspx@inframed % flag set if we are already in a framed environment % if forced use of minipage encapsulation is needed (e.g. table cells) \newif\ifsphinxverbatimwithminipage \sphinxverbatimwithminipagefalse -\long\def\spx@colorbox #1#2#3{% -% let the framing obey the current indentation (adapted from framed.sty's code). + +% Framing macro for use with framed.sty's \FrameCommand +% - it obeys current indentation, +% - frame is \fboxsep separated from the contents, +% - the contents use the full available text width, +% - #1 = color of frame, #2 = color of background, +% - #3 = above frame, #4 = below frame, #5 = within frame, +% - #3 and #4 must be already typeset boxes; they must issue \normalcolor +% or similar, else, they are under scope of color #1 +\long\def\spx@fcolorbox #1#2#3#4#5{% \hskip\@totalleftmargin \hskip-\fboxsep\hskip-\fboxrule - \spx@fcolorbox{VerbatimBorderColor}{VerbatimColor}{#1}{#2}{#3}% + % use of \color@b@x here is compatible with both xcolor.sty and color.sty + \color@b@x {\color{#1}\spx@CustomFBox{#3}{#4}}{\color{#2}}{#5}% \hskip-\fboxsep\hskip-\fboxrule \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth -} -% use of \color@b@x here is compatible with both xcolor.sty and color.sty -\long\def\spx@fcolorbox #1#2#3#4% - {\color@b@x {\color{#1}\spx@VerbatimFBox{#3}{#4}}{\color{#2}}}% -% Frame drawing macro -% #1 = used by default for title above frame, may contain "continued" hint -% #2 = for material underneath frame, used for "continues on next page" hint -% #3 = actual contents with background color -\long\def\spx@VerbatimFBox#1#2#3{% - \leavevmode +}% +% #1 = for material above frame, such as a caption or a "continued" hint +% #2 = for material below frame, such as a caption or "continues on next page" +% #3 = actual contents, which will be typeset with a background color +\long\def\spx@CustomFBox#1#2#3{% \begingroup \setbox\@tempboxa\hbox{{#3}}% inner braces to avoid color leaks - \hbox - {\lower\dimexpr\fboxrule+\dp\@tempboxa\hbox{% - \vbox{#1% above frame + \vbox{#1% above frame % draw frame border _latest_ to avoid pdf viewer issue \kern\fboxrule \hbox{\kern\fboxrule @@ -756,42 +968,43 @@ \hrule\@height\fboxrule \kern\dimexpr\ht\@tempboxa+\dp\@tempboxa\relax \hrule\@height\fboxrule - #2% below frame - }% - }% - }% + #2% below frame + }% \endgroup -} - -% Customize framed.sty \MakeFramed to glue caption to literal block -% and add optional hint "continued on next page" -\def\spx@Verbatim@FrameCommand - {\spx@colorbox\spx@Verbatim@Title{}}% -% Macros for a frame with page breaks: -\def\spx@Verbatim@FirstFrameCommand - {\spx@colorbox\spx@Verbatim@Title\spx@Verbatim@Continues}% -\def\spx@Verbatim@MidFrameCommand - {\spx@colorbox\spx@Verbatim@Continued\spx@Verbatim@Continues}% -\def\spx@Verbatim@LastFrameCommand - {\spx@colorbox\spx@Verbatim@Continued{}}% - -\def\spx@Verbatim@Title{% hide width from framed.sty measuring - \moveright\dimexpr\fboxrule+.5\wd\@tempboxa - \hb@xt@\z@{\hss\unhcopy\spx@Verbatim@TitleBox\hss}% }% -\def\spx@Verbatim@Continued{% - \moveright\dimexpr\fboxrule+\wd\@tempboxa-\fboxsep - \hb@xt@\z@{\hss - {\normalcolor\sphinxstylecodecontinued\literalblockcontinuedname}}% +\def\spx@fcolorbox@put@c#1{% hide width from framed.sty measuring + \moveright\dimexpr\fboxrule+.5\wd\@tempboxa\hb@xt@\z@{\hss#1\hss}% +}% +\def\spx@fcolorbox@put@r#1{% right align with contents, width hidden + \moveright\dimexpr\fboxrule+\wd\@tempboxa-\fboxsep\hb@xt@\z@{\hss#1}% }% -\def\spx@Verbatim@Continues{% - \moveright\dimexpr\fboxrule+\wd\@tempboxa-\fboxsep - \hb@xt@\z@{\hss - {\normalcolor\sphinxstylecodecontinues\literalblockcontinuesname}}% +\def\spx@fcolorbox@put@l#1{% left align with contents, width hidden + \moveright\dimexpr\fboxrule+\fboxsep\hb@xt@\z@{#1\hss}% }% +% +\def\sphinxVerbatim@Continued + {\csname spx@fcolorbox@put@\spx@opt@verbatimcontinuedalign\endcsname + {\normalcolor\sphinxstylecodecontinued\literalblockcontinuedname}}% +\def\sphinxVerbatim@Continues + {\csname spx@fcolorbox@put@\spx@opt@verbatimcontinuesalign\endcsname + {\normalcolor\sphinxstylecodecontinues\literalblockcontinuesname}}% +\def\sphinxVerbatim@Title + {\spx@fcolorbox@put@c{\unhcopy\sphinxVerbatim@TitleBox}}% +\let\sphinxVerbatim@Before\@empty +\let\sphinxVerbatim@After\@empty % Defaults are redefined in document preamble according to language \newcommand*\literalblockcontinuedname{continued from previous page}% \newcommand*\literalblockcontinuesname{continues on next page}% +% +\def\spx@verbatimfcolorbox{\spx@fcolorbox{VerbatimBorderColor}{VerbatimColor}}% +\def\sphinxVerbatim@FrameCommand + {\spx@verbatimfcolorbox\sphinxVerbatim@Before\sphinxVerbatim@After}% +\def\sphinxVerbatim@FirstFrameCommand + {\spx@verbatimfcolorbox\sphinxVerbatim@Before\sphinxVerbatim@Continues}% +\def\sphinxVerbatim@MidFrameCommand + {\spx@verbatimfcolorbox\sphinxVerbatim@Continued\sphinxVerbatim@Continues}% +\def\sphinxVerbatim@LastFrameCommand + {\spx@verbatimfcolorbox\sphinxVerbatim@Continued\sphinxVerbatim@After}% % For linebreaks inside Verbatim environment from package fancyvrb. \newbox\sphinxcontinuationbox @@ -849,8 +1062,40 @@ {\kern\fontdimen2\font}% }% +% if the available space on page is less than \literalblockneedspace, insert pagebreak +\newcommand{\sphinxliteralblockneedspace}{5\baselineskip} +\newcommand{\sphinxliteralblockwithoutcaptionneedspace}{1.5\baselineskip} +% The title (caption) is specified from outside as macro \sphinxVerbatimTitle. +% \sphinxVerbatimTitle is reset to empty after each use of Verbatim. +\newcommand*\sphinxVerbatimTitle {} +% This box to typeset the caption before framed.sty multiple passes for framing. +\newbox\sphinxVerbatim@TitleBox +% This is a workaround to a "feature" of French lists, when literal block +% follows immediately; usable generally (does only \par then), a priori... +\newcommand*\sphinxvspacefixafterfrenchlists{% + \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi +} +% Holder macro for labels of literal blocks. Set-up by LaTeX writer. +\newcommand*\sphinxLiteralBlockLabel {} +\newcommand*\sphinxSetupCaptionForVerbatim [1] +{% + \sphinxvspacefixafterfrenchlists + \needspace{\sphinxliteralblockneedspace}% +% insert a \label via \sphinxLiteralBlockLabel +% reset to normal the color for the literal block caption + \def\sphinxVerbatimTitle + {\py@NormalColor\sphinxcaption{\sphinxLiteralBlockLabel #1}}% +} +\newcommand*\sphinxSetupCodeBlockInFootnote {% + \fvset{fontsize=\footnotesize}\let\caption\sphinxfigcaption + \sphinxverbatimwithminipagetrue % reduces vertical spaces + % we counteract (this is in a group) the \@normalsize from \caption + \let\normalsize\footnotesize\let\@parboxrestore\relax + \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}% +} % needed to create wrapper environments of fancyvrb's Verbatim \newcommand*{\sphinxVerbatimEnvironment}{\gdef\FV@EnvironName{sphinxVerbatim}} +\newcommand*{\sphinxverbatimsmallskipamount}{\smallskipamount} % serves to implement line highlighting and line wrapping \newcommand\sphinxFancyVerbFormatLine[1]{% \expandafter\sphinx@verbatim@checkifhl\expandafter{\the\FV@CodeLineNo}% @@ -879,17 +1124,12 @@ \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}% \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}% }% -% Sphinx <1.5 optional argument was in fact mandatory. It is now really -% optional and handled by original Verbatim. \newenvironment{sphinxVerbatim}{% - % quit horizontal mode if we are still in a paragraph - \par - % list starts new par, but we don't want it to be set apart vertically - \parskip\z@skip % first, let's check if there is a caption \ifx\sphinxVerbatimTitle\empty - \addvspace\z@% counteract possible previous negative skip (French lists!) - \smallskip + \sphinxvspacefixafterfrenchlists + \parskip\z@skip + \vskip\sphinxverbatimsmallskipamount % there was no caption. Check if nevertheless a label was set. \ifx\sphinxLiteralBlockLabel\empty\else % we require some space to be sure hyperlink target from \phantomsection @@ -897,24 +1137,48 @@ \needspace{\sphinxliteralblockwithoutcaptionneedspace}% \phantomsection\sphinxLiteralBlockLabel \fi - \let\spx@Verbatim@Title\@empty \else - % non-empty \sphinxVerbatimTitle has label inside it (in case there is one) - \setbox\spx@Verbatim@TitleBox + \parskip\z@skip + \if t\spx@opt@literalblockcappos + \vskip\spx@abovecaptionskip + \def\sphinxVerbatim@Before + {\sphinxVerbatim@Title\nointerlineskip + \kern\dimexpr-\dp\strutbox+\sphinxbelowcaptionspace + % if no frame (code-blocks inside table cells), remove + % the "verbatimsep" whitespace from the top (better visually) + \ifspx@opt@verbatimwithframe\else-\sphinxverbatimsep\fi + % caption package adds \abovecaptionskip vspace, remove it + \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax}% + \else + \vskip\sphinxverbatimsmallskipamount + \def\sphinxVerbatim@After + {\nointerlineskip\kern\dimexpr\dp\strutbox + \ifspx@opt@verbatimwithframe\else-\sphinxverbatimsep\fi + \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax + \sphinxVerbatim@Title}% + \fi + \def\@captype{literalblock}% + \capstart + % \sphinxVerbatimTitle must reset color + \setbox\sphinxVerbatim@TitleBox \hbox{\begin{minipage}{\linewidth}% + % caption package may detect wrongly if top or bottom, so we help it + \spx@ifcaptionpackage + {\caption@setposition{\spx@opt@literalblockcappos}}{}% \sphinxVerbatimTitle \end{minipage}}% \fi + \global\let\sphinxLiteralBlockLabel\empty + \global\let\sphinxVerbatimTitle\empty \fboxsep\sphinxverbatimsep \fboxrule\sphinxverbatimborder - % setting borderwidth to zero is simplest for no-frame effect with same pagebreaks \ifspx@opt@verbatimwithframe\else\fboxrule\z@\fi - \let\FrameCommand \spx@Verbatim@FrameCommand - \let\FirstFrameCommand\spx@Verbatim@FirstFrameCommand - \let\MidFrameCommand \spx@Verbatim@MidFrameCommand - \let\LastFrameCommand \spx@Verbatim@LastFrameCommand + \let\FrameCommand \sphinxVerbatim@FrameCommand + \let\FirstFrameCommand\sphinxVerbatim@FirstFrameCommand + \let\MidFrameCommand \sphinxVerbatim@MidFrameCommand + \let\LastFrameCommand \sphinxVerbatim@LastFrameCommand \ifspx@opt@verbatimhintsturnover\else - \let\spx@Verbatim@Continued\@empty - \let\spx@Verbatim@Continues\@empty + \let\sphinxVerbatim@Continued\@empty + \let\sphinxVerbatim@Continues\@empty \fi \ifspx@opt@verbatimwrapslines % fancyvrb's Verbatim puts each input line in (unbreakable) horizontal boxes. @@ -941,13 +1205,21 @@ \def\@toodeep {\advance\@listdepth\@ne}% % The list environment is needed to control perfectly the vertical space. % Note: \OuterFrameSep used by framed.sty is later set to \topsep hence 0pt. - % - if caption: vertical space above caption = (\abovecaptionskip + D) with - % D = \baselineskip-\FrameHeightAdjust, and then \smallskip above frame. - % - if no caption: (\smallskip + D) above frame. By default D=6pt. - % Use trivlist rather than list to avoid possible "too deeply nested" error. + % - if caption: distance from last text baseline to caption baseline is + % A+(B-F)+\ht\strutbox, A = \abovecaptionskip (default 10pt), B = + % \baselineskip, F is the framed.sty \FrameHeightAdjust macro, default 6pt. + % Formula valid for F < 10pt. + % - distance of baseline of caption to top of frame is like for tables: + % \sphinxbelowcaptionspace (=0.5\baselineskip) + % - if no caption: distance of last text baseline to code frame is S+(B-F), + % with S = \sphinxverbatimtopskip (=\smallskip) + % - and distance from bottom of frame to next text baseline is + % \baselineskip+\parskip. + % The \trivlist is used to avoid possible "too deeply nested" error. \itemsep \z@skip \topsep \z@skip - \partopsep \z@skip% trivlist will set \parsep to \parskip = zero (see above) + \partopsep \z@skip + % trivlist will set \parsep to \parskip = zero % \leftmargin will be set to zero by trivlist \rightmargin\z@ \parindent \z@% becomes \itemindent. Default zero, but perhaps overwritten. @@ -983,10 +1255,12 @@ {% don't use a frame if in a table cell \spx@opt@verbatimwithframefalse \sphinxverbatimwithminipagetrue - % counteract longtable redefinition of caption + % the literal block caption uses \sphinxcaption which is wrapper of \caption, + % but \caption must be modified because longtable redefines it to work only + % for the own table caption, and tabulary has multiple passes \let\caption\sphinxfigcaption - % reduce above caption space if in a table cell - \abovecaptionskip\smallskipamount + % reduce above caption skip + \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}% \def\sphinxVerbatimEnvironment{\gdef\FV@EnvironName{sphinxVerbatimintable}}% \begin{sphinxVerbatim}} {\end{sphinxVerbatim}} @@ -1099,6 +1373,12 @@ % could nest if LaTeX writer authorized it \newenvironment{sphinxShadowBox} {\def\FrameCommand {\spx@ShadowFBox }% + \advance\spx@image@maxheight + -\dimexpr2\sphinxshadowrule + +2\sphinxshadowsep + +\sphinxshadowsize + +\baselineskip\relax + \let\sphinxincludegraphics\sphinxsafeincludegraphics % configure framed.sty not to add extra vertical spacing \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}% % the \trivlist will add the vertical spacing on top and bottom which is @@ -1149,10 +1429,9 @@ {\parskip\z@skip\noindent}% } {% - \par % counteract previous possible negative skip (French lists!): % (we can't cancel that any earlier \vskip introduced a potential pagebreak) - \ifdim\lastskip<\z@\vskip-\lastskip\fi + \sphinxvspacefixafterfrenchlists \nobreak\vbox{\noindent\kern\@totalleftmargin {\color{spx@notice@bordercolor}% \rule[\dimexpr.4\baselineskip-\spx@notice@border\relax] @@ -1182,6 +1461,11 @@ \newenvironment{sphinxheavybox}{\par \setlength{\FrameRule}{\spx@notice@border}% \setlength{\FrameSep}{\dimexpr.6\baselineskip-\FrameRule\relax} + \advance\spx@image@maxheight + -\dimexpr2\FrameRule + +2\FrameSep + +\baselineskip\relax % will happen again if nested, needed indeed! + \let\sphinxincludegraphics\sphinxsafeincludegraphics % configure framed.sty's parameters to obtain same vertical spacing % as for "light" boxes. We need for this to manually insert parskip glue and % revert a skip done by framed before the frame. @@ -1252,14 +1536,6 @@ \begin{sphinx#1}{#2}} % workaround some LaTeX "feature" of \end command {\edef\spx@temp{\noexpand\end{sphinx\spx@noticetype}}\spx@temp} -% use of ``notice'' is for backwards compatibility and will be removed in -% Sphinx 1.7. -\newenvironment{notice} - {\sphinxdeprecationwarning {notice}{1.6}{1.7}{% - This document was probably built with a Sphinx extension using ``notice''^^J - environment. At Sphinx 1.7, ``notice'' environment will be removed. Please^^J - report to extension author to use ``sphinxadmonition'' instead.^^J% - ****}\begin{sphinxadmonition}}{\end{sphinxadmonition}} %% PYTHON DOCS MACROS AND ENVIRONMENTS @@ -1275,18 +1551,26 @@ % \date{}. This allows the date to reflect the document's date and % release to specify the release that is documented. % -\newcommand{\py@release}{} -\newcommand{\version}{} -\newcommand{\shortversion}{} +\newcommand{\py@release}{\releasename\space\version} +\newcommand{\version}{}% part of \py@release, used by title page and headers +% \releaseinfo is used on titlepage (sphinxmanual.cls, sphinxhowto.cls) \newcommand{\releaseinfo}{} -\newcommand{\releasename}{Release} -\newcommand{\release}[1]{% - \renewcommand{\py@release}{\releasename\space\version}% - \renewcommand{\version}{#1}} -\newcommand{\setshortversion}[1]{% - \renewcommand{\shortversion}{#1}} -\newcommand{\setreleaseinfo}[1]{% - \renewcommand{\releaseinfo}{#1}} +\newcommand{\setreleaseinfo}[1]{\renewcommand{\releaseinfo}{#1}} +% this is inserted via template and #1=release config variable +\newcommand{\release}[1]{\renewcommand{\version}{#1}} +% this is defined by template to 'releasename' latex_elements key +\newcommand{\releasename}{} +% Fix issue in case release and releasename deliberately left blank +\newcommand{\sphinxheadercomma}{, }% used in fancyhdr header definition +\newcommand{\sphinxifemptyorblank}[1]{% +% test after one expansion of macro #1 if contents is empty or spaces + \if&\expandafter\@firstofone\detokenize\expandafter{#1}&% + \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}% +\AtBeginDocument {% + \sphinxifemptyorblank{\releasename} + {\sphinxifemptyorblank{\version}{\let\sphinxheadercomma\empty}{}} + {}% +}% % Allow specification of the author's address separately from the % author's name. This can be used to format them differently, which @@ -1333,8 +1617,8 @@ % \newenvironment{productionlist}{% % \def\sphinxoptional##1{{\Large[}##1{\Large]}} - \def\production##1##2{\\\sphinxcode{##1}&::=&\sphinxcode{##2}}% - \def\productioncont##1{\\& &\sphinxcode{##1}}% + \def\production##1##2{\\\sphinxcode{\sphinxupquote{##1}}&::=&\sphinxcode{\sphinxupquote{##2}}}% + \def\productioncont##1{\\& &\sphinxcode{\sphinxupquote{##1}}}% \parindent=2em \indent \setlength{\LTpre}{0pt}% @@ -1415,16 +1699,13 @@ %% TEXT STYLING % -% Some custom font markup commands. -% *** the macros without \sphinx prefix are still defined farther down *** -\protected\def\sphinxstrong#1{{\textbf{#1}}} % to obtain straight quotes we execute \@noligs as patched by upquote, and % \scantokens is needed in cases where it would be too late for the macro to % first set catcodes and then fetch its argument. We also make the contents % breakable at non-escaped . , ; ? ! / using \sphinxbreaksviaactive. % the macro must be protected if it ends up used in moving arguments, % in 'alltt' \@noligs is done already, and the \scantokens must be avoided. -\protected\def\sphinxcode#1{{\def\@tempa{alltt}% +\protected\def\sphinxupquote#1{{\def\@tempa{alltt}% \ifx\@tempa\@currenvir\else \ifspx@opt@inlineliteralwraps \sphinxbreaksviaactive\let\sphinxafterbreak\empty @@ -1435,16 +1716,20 @@ \let\do@noligs\sphinx@do@noligs \@noligs\endlinechar\m@ne\everyeof{}% (<- in case inside \sphinxhref) \expandafter\scantokens - \fi {\texttt{#1}}}} + \fi {{#1}}}}% extra brace pair to fix end-space gobbling issue... \def\sphinx@do@noligs #1{\catcode`#1\active\begingroup\lccode`\~`#1\relax \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1 }}} \def\sphinx@literal@nolig@list {\do\`\do\<\do\>\do\'\do\-}% -\protected\def\sphinxbfcode#1{\sphinxcode{\bfseries{}#1}} +% Some custom font markup commands. +\protected\def\sphinxstrong#1{\textbf{#1}} +\protected\def\sphinxcode#1{\texttt{#1}} +\protected\def\sphinxbfcode#1{\textbf{\sphinxcode{#1}}} \protected\def\sphinxemail#1{\textsf{#1}} \protected\def\sphinxtablecontinued#1{\textsf{#1}} \protected\def\sphinxtitleref#1{\emph{#1}} \protected\def\sphinxmenuselection#1{\emph{#1}} +\protected\def\sphinxguilabel#1{\emph{#1}} \protected\def\sphinxaccelerator#1{\underline{#1}} \protected\def\sphinxcrossref#1{\emph{#1}} \protected\def\sphinxtermref#1{\emph{#1}} @@ -1452,69 +1737,54 @@ \long\protected\def\sphinxoptional#1{% {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}} -\ifspx@opt@dontkeepoldnames\else - \let\spx@alreadydefinedlist\@empty - \typeout{** (sphinx) defining (legacy) text style macros without \string\sphinx\space prefix} - \typeout{** if clashes with packages, do not set latex_keep_old_macro_names=True - in conf.py} - \@for\@tempa:=code,strong,bfcode,email,tablecontinued,titleref,% - menuselection,accelerator,crossref,termref,optional\do - {% first, check if command with no prefix already exists - \ltx@ifundefined{\@tempa}{% - % give it the meaning defined so far with \sphinx prefix - \expandafter\let\csname\@tempa\expandafter\endcsname - \csname sphinx\@tempa\endcsname - % redefine the \sphinx prefixed macro to expand to non-prefixed one - \expandafter\def\csname sphinx\@tempa\expandafter\endcsname - \expandafter{\csname\@tempa\endcsname}% - }{\edef\spx@alreadydefinedlist{\spx@alreadydefinedlist{\@tempa}}}% - }% - \ifx\spx@alreadydefinedlist\@empty\else - \expandafter\@tfor\expandafter\@tempa\expandafter:\expandafter=\spx@alreadydefinedlist\do - {% emit warning now - \PackageWarning{sphinx}{not redefining already existing \@backslashchar\@tempa\space!^^J% - Anyhow, Sphinx mark-up uses only \string\sphinx\@tempa.}% - % and also at end of log for better visibility - \expandafter\sphinxdeprecationwarning\expandafter{\csname\@tempa\endcsname}{1.6}{1.7} - {\sphinxdeprecatedmacro already existed at Sphinx loading time! Not redefined!^^J - Sphinx mark-up uses only \string\sphinx\expandafter\@gobble\sphinxdeprecatedmacro.^^J - Note: if this warning is about macro \string\strong, it presumably results^^J - from fontspec 2.6 having defined it prior to Sphinx. No need for alarm!}% - }% - \fi - \sphinxdeprecationwarning{latex_keep_old_macro_names=True}{1.6}{1.7}{}% -\fi - % additional customizable styling -% FIXME: convert this to package options ? -\protected\def\sphinxstyleindexentry {\texttt} -\protected\def\sphinxstyleindexextra #1{ \emph{(#1)}} -\protected\def\sphinxstyleindexpageref {, \pageref} -\protected\def\sphinxstyletopictitle #1{\textbf{#1}\par\medskip} +\def\sphinxstyleindexentry #1{\texttt{#1}} +\def\sphinxstyleindexextra #1{ (\emph{#1})} +\def\sphinxstyleindexpageref #1{, \pageref{#1}} +\def\sphinxstyleindexpagemain#1{\textbf{#1}} +\protected\def\spxentry#1{#1}% will get \let to \sphinxstyleindexentry in index +\protected\def\spxextra#1{#1}% will get \let to \sphinxstyleindexextra in index +\def\sphinxstyleindexlettergroup #1% + {{\Large\sffamily#1}\nopagebreak\vspace{1mm}} +\def\sphinxstyleindexlettergroupDefault #1% + {{\Large\sffamily\sphinxnonalphabeticalgroupname}\nopagebreak\vspace{1mm}} +\protected\def\sphinxstyletopictitle #1{\textbf{#1}\par\medskip} \let\sphinxstylesidebartitle\sphinxstyletopictitle -\protected\def\sphinxstyleothertitle {\textbf} +\protected\def\sphinxstyleothertitle #1{\textbf{#1}} \protected\def\sphinxstylesidebarsubtitle #1{~\\\textbf{#1} \smallskip} % \text.. commands do not allow multiple paragraphs -\let\sphinxstylethead\empty -\protected\def\sphinxstyletheadfamily {\ifx\sphinxstylethead\empty\sffamily\fi} -\AtBeginDocument{\ifx\sphinxstylethead\empty\else -\sphinxdeprecationwarning{\sphinxstylethead}{1.6}{1.7}{% - \string\sphinxstyletheadfamily\space replaces it - (it defaults to \string\sffamily) to allow use^^J - with multiple paragraphs. Backwards compatibility is maintained, but please^^J - move customization into \string\sphinxstyletheadfamily\space - in time for 1.7.^^J - And if you do it now, you will spare yourself this warning!}\fi} -\protected\def\sphinxstyleemphasis {\emph} +\protected\def\sphinxstyletheadfamily {\sffamily} +\protected\def\sphinxstyleemphasis #1{\emph{#1}} \protected\def\sphinxstyleliteralemphasis#1{\emph{\sphinxcode{#1}}} -\protected\def\sphinxstylestrong {\textbf} -\protected\def\sphinxstyleliteralstrong {\sphinxbfcode} -\protected\def\sphinxstyleabbreviation {\textsc} -\protected\def\sphinxstyleliteralintitle {\sphinxcode} +\protected\def\sphinxstylestrong #1{\textbf{#1}} +\protected\def\sphinxstyleliteralstrong#1{\sphinxbfcode{#1}} +\protected\def\sphinxstyleabbreviation #1{\textsc{#1}} +\protected\def\sphinxstyleliteralintitle#1{\sphinxcode{#1}} \newcommand*\sphinxstylecodecontinued[1]{\footnotesize(#1)}% \newcommand*\sphinxstylecodecontinues[1]{\footnotesize(#1)}% % figure legend comes after caption and may contain arbitrary body elements \newenvironment{sphinxlegend}{\par\small}{\par} +% reduce hyperref "Token not allowed in a PDF string" warnings on PDF builds +\AtBeginDocument{\pdfstringdefDisableCommands{% +% all "protected" macros possibly ending up in section titles should be here + \let\sphinxstyleemphasis \@firstofone + \let\sphinxstyleliteralemphasis \@firstofone + \let\sphinxstylestrong \@firstofone + \let\sphinxstyleliteralstrong \@firstofone + \let\sphinxstyleabbreviation \@firstofone + \let\sphinxstyleliteralintitle \@firstofone + \let\sphinxupquote \@firstofone + \let\sphinxstrong \@firstofone + \let\sphinxcode \@firstofone + \let\sphinxbfcode \@firstofone + \let\sphinxemail \@firstofone + \let\sphinxcrossref \@firstofone + \let\sphinxtermref \@firstofone +}} + +% For curly braces inside \index macro +\def\sphinxleftcurlybrace{\{} +\def\sphinxrightcurlybrace{\}} % Declare Unicode characters used by linux tree command to pdflatex utf8/utf8x \def\spx@bd#1#2{% diff --git a/packs_lib/phil/docs/_build/latex/sphinxhowto.cls b/packs_lib/phil/docs/_build/latex/sphinxhowto.cls index 90680fdee2..d4a38d4f52 100644 --- a/packs_lib/phil/docs/_build/latex/sphinxhowto.cls +++ b/packs_lib/phil/docs/_build/latex/sphinxhowto.cls @@ -3,7 +3,7 @@ % \NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{sphinxhowto}[2017/03/26 v1.6 Document class (Sphinx HOWTO)] +\ProvidesClass{sphinxhowto}[2018/12/22 v1.8.3 Document class (Sphinx howto)] % 'oneside' option overriding the 'twoside' default \newif\if@oneside @@ -25,11 +25,12 @@ % reset these counters in your preamble. % \setcounter{secnumdepth}{2} +\setcounter{tocdepth}{2}% i.e. section and subsection % Change the title page to look a bit better, and fit in with the fncychap % ``Bjarne'' style a bit better. % -\renewcommand{\maketitle}{% +\newcommand{\sphinxmaketitle}{% \noindent\rule{\textwidth}{1pt}\par \begingroup % for PDF information dictionary \def\endgraf{ }\def\and{\& }% @@ -45,7 +46,7 @@ {\Large \begin{tabular}[t]{c} \@author - \end{tabular}}\par + \end{tabular}\kern-\tabcolsep}\par \vspace{25pt} \@date \par \py@authoraddress \par @@ -65,12 +66,7 @@ \vspace{12pt} } -\@ifundefined{fancyhf}{ - \pagestyle{plain}}{ - \pagestyle{normal}} % start this way; change for -\pagenumbering{arabic} % ToC & chapters - -\thispagestyle{empty} +\pagenumbering{arabic} % Fix the bibliography environment to add an entry to the Table of % Contents. @@ -79,7 +75,7 @@ % \newenvironment{sphinxthebibliography}[1]{% % \phantomsection % not needed here since TeXLive 2010's hyperref - \begin{thebibliography}{1}% + \begin{thebibliography}{#1}% \addcontentsline{toc}{section}{\ifdefined\refname\refname\else\ifdefined\bibname\bibname\fi\fi}}{\end{thebibliography}} diff --git a/packs_lib/phil/docs/_build/latex/sphinxmanual.cls b/packs_lib/phil/docs/_build/latex/sphinxmanual.cls index 5b3d183cb7..864fce080e 100644 --- a/packs_lib/phil/docs/_build/latex/sphinxmanual.cls +++ b/packs_lib/phil/docs/_build/latex/sphinxmanual.cls @@ -3,7 +3,7 @@ % \NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{sphinxmanual}[2017/03/26 v1.6 Document class (Sphinx manual)] +\ProvidesClass{sphinxmanual}[2018/12/22 v1.8.3 Document class (Sphinx manual)] % chapters starting at odd pages (overridden by 'openany' document option) \PassOptionsToClass{openright}{\sphinxdocclass} @@ -33,7 +33,7 @@ % Change the title page to look a bit better, and fit in with the fncychap % ``Bjarne'' style a bit better. % -\renewcommand{\maketitle}{% +\newcommand{\sphinxmaketitle}{% \let\spx@tempa\relax \ifHy@pageanchor\def\spx@tempa{\Hy@pageanchortrue}\fi \hypersetup{pageanchor=false}% avoid duplicate destination warnings @@ -55,7 +55,7 @@ {\LARGE \begin{tabular}[t]{c} \@author - \end{tabular} + \end{tabular}\kern-\tabcolsep \par} \vfill\vfill {\large @@ -69,13 +69,14 @@ \setcounter{footnote}{0}% \let\thanks\relax\let\maketitle\relax %\gdef\@thanks{}\gdef\@author{}\gdef\@title{} + \clearpage + \ifdefined\sphinxbackoftitlepage\sphinxbackoftitlepage\fi \if@openright\cleardoublepage\else\clearpage\fi \spx@tempa } \newcommand{\sphinxtableofcontents}{% \pagenumbering{roman}% - \pagestyle{plain}% \begingroup \parskip \z@skip \tableofcontents @@ -83,7 +84,6 @@ % before resetting page counter, let's do the right thing. \if@openright\cleardoublepage\else\clearpage\fi \pagenumbering{arabic}% - \ifdefined\fancyhf\pagestyle{normal}\fi } % This is needed to get the width of the section # area wide enough in the @@ -99,7 +99,7 @@ \newenvironment{sphinxthebibliography}[1]{% \if@openright\cleardoublepage\else\clearpage\fi % \phantomsection % not needed here since TeXLive 2010's hyperref - \begin{thebibliography}{1}% + \begin{thebibliography}{#1}% \addcontentsline{toc}{chapter}{\bibname}}{\end{thebibliography}} % Same for the indices. diff --git a/packs_lib/phil/docs/index.rst b/packs_lib/phil/docs/index.rst index bf5e3f558f..d149859974 100644 --- a/packs_lib/phil/docs/index.rst +++ b/packs_lib/phil/docs/index.rst @@ -13,7 +13,7 @@ phil on SWISH Manual - SWI-Prolog Version Introduction ============ -phil is a suite of programs for reasoning with hierarchical probabilistic logic programs (HPLP) :cite:`NguLamRig17-PLP-IW`. +phil is a suite of programs for reasoning with hierarchical probabilistic logic programs (HPLP) :cite:`fadja2021learning,NguLamRig17-PLP-IW`. It allows both inference and learning. phil is available only for SWI-Prolog. phil is part of cplint on SWISH web application available at ``_. @@ -72,7 +72,7 @@ Other machine learning datasets are available in pack `phil_datasets ])`. diff --git a/packs_lib/phil/docs/newbib.bib b/packs_lib/phil/docs/newbib.bib index e102620f5a..b8633755b8 100644 --- a/packs_lib/phil/docs/newbib.bib +++ b/packs_lib/phil/docs/newbib.bib @@ -350,3 +350,12 @@ @inproceedings{fadja2018expectation year={2018}, organization={Springer} } + +@article{fadja2021learning, + title={Learning hierarchical probabilistic logic programs}, + author={Fadja, Arnaud Nguembang and Riguzzi, Fabrizio and Lamma, Evelina}, + journal={Machine Learning}, + pages={1--57}, + year={2021}, + publisher={Springer} +} diff --git a/packs_lib/phil/lib/x86_64-linux/phil.so b/packs_lib/phil/lib/x86_64-linux/phil.so index b37aa449c799c8e32e5f7a8e2139d9a78a2098bf..1c5c03e7fa841d8828f46b3aff918bbc01d59ffa 100755 GIT binary patch literal 113416 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 z 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§81clqB( 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 GjsFFCdu|*6 literal 141464 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 TCT;WSUwydI=Q4child = new_node(val, type)); } +// Free all aritmetic circuits +void free_nodes (node **nodes_ex, int lenNodes) +{ + for (int i = 0; i < lenNodes; i++) + { + free(nodes_ex[i]); + } + free(nodes_ex); +} + void printTree(node *root, FILE *f) { node *n = NULL; @@ -241,8 +259,8 @@ void construct_leaves_node(node **leaves_node, int lenRules) // Converts an arithmetic circuit (a term prolog) into n-aries tree in C node *convertACToTree(term_t AC) { - int ret, ind, arity, i, j, lenNodes1; - size_t lenNodes; + int ret, ind, j, lenNodes1; + size_t lenNodes, arity, i; atom_t name; char *type; term_t current_term, current_List_term, temp_term; @@ -658,16 +676,18 @@ int getTrees(term_t Nodes, node ***nodes_ex, int *lenNodes) // ++++++++++++++++++++++++ Gradient descent functions ++++++++++++++++++++++++++ // Creates if it does not exist the directory for the dataset and also create the necessary files -void openFilesGD(char *statisticsFolder, FILE **probsFile, FILE **weightsFile, FILE **Moments0File, FILE **Moments1File, FILE **lls) +void openFilesGD(char *statisticsFolder_base, FILE **probsFile, FILE **weightsFile, FILE **Moments0File, FILE **Moments1File, FILE **lls) { struct stat st = {0}; + char statisticsFolder[MaxName]; char statisticsFolder2[MaxName]; char nameFileProbs[MaxName] = "./"; char nameFileWeights[MaxName] = "./"; char nameFileClls[MaxName] = "./"; char nameFileMoments0[MaxName] = "./"; char nameFileMoments1[MaxName] = "./"; - strcpy(statisticsFolder2, statisticsFolder); + strcpy(statisticsFolder2, statisticsFolder_base); + strcpy(statisticsFolder, statisticsFolder_base); strcat(statisticsFolder, "_Statistics/GD"); // create the directory to save information if (stat(statisticsFolder, &st) == -1) @@ -1202,18 +1222,26 @@ double dphil(node **Nodes, int lenNodes, int MaxIteration, double Probabilities[ // ++++++++++++++++++++++++ Expectation Maximization functions ++++++++++++++++++++++++++ + // Creates if it does not exist the directory for the dataset and also create the necessary files -void openFilesEM(char *statisticsFolder, FILE **probsFile, FILE **expectationsFile, FILE **expectationsFile0, FILE **countsFile, FILE **lls) +void openFilesEM(char *statisticsFolder_base, FILE **probsFile, FILE **expectationsFile, FILE **expectationsFile0, FILE **countsFile, FILE **lls) { + // FILE *fp; + // printMessage(fp,"Enter in openFilesEM\n"); + //const char * em_stat_folder = "_Statistics/EM"; + //static const char em_stat_folder[] = "_Statistics/EM"; struct stat st = {0}; + char statisticsFolder[MaxName]; char statisticsFolder2[MaxName]; char nameFileProbs[MaxName] = "./"; char nameFileExpects[MaxName] = "./"; char nameFileExpects0[MaxName] = "./"; char nameFileCount[MaxName] = "./"; char nameFileClls[MaxName] = "./"; - strcpy(statisticsFolder2, statisticsFolder); + strcpy(statisticsFolder, statisticsFolder_base); + strcpy(statisticsFolder2, statisticsFolder_base); strcat(statisticsFolder, "_Statistics/EM"); + // snprintf(statisticsFolder, sizeof(statisticsFolder), "%s%s", statisticsFolder_base, em_stat_folder); // create the directory to save information if (stat(statisticsFolder, &st) == -1) { @@ -1925,6 +1953,9 @@ static foreign_t pl_dphil(term_t Nodes, term_t Params, term_t StopCond, term_t F CLL = dphil(nodes_ex, lenNodes, MaxIter, Probabilities, Weights, NR, EA, ER, Eta, Beta1, Beta2, Adam_hat, Max_W, BatchSize, strategy, statisticsFolder, save, seeded, seed, TypeReg, Gamma); // return the CLL and the learned probabilities // return the CLL and the learned probabilies ret = setResults(CLL, Probabilities, NR, &CLLFinal, &ProbFinal); + free(Probabilities); + free(Weights); + free_nodes(nodes_ex,lenNodes); return ret; } @@ -1957,6 +1988,13 @@ static foreign_t pl_emphil(term_t Nodes, term_t Params, term_t RegParams, term_t CLL = emphil(nodes_ex, lenNodes, Probabilities, Expectations, Expectations0, NR, MaxIter, EA, ER, statisticsFolder, save, seeded, seed, TypeReg, Gamma, GammaCount); // return the CLL and the learned probabilities ret = setResults(CLL, Probabilities, NR, &CLLFinal, &ProbFinal); + if (Init == 1) + free(InitParameters); + free(Probabilities); + // free(Counts); + free(Expectations); + free(Expectations0); + free_nodes(nodes_ex,lenNodes); return ret; } // Given a single AC Circuit, the list of parameters and the number of rules NR, evaluates the AC @@ -1976,6 +2014,7 @@ static foreign_t pl_forward(term_t Circuit, term_t Parameters, term_t NR, term_t // return the computed value ret = PL_put_float(out, root->value); ret = PL_unify(Output, out); + free(Probabilities); return ret; } diff --git a/packs_lib/phil/phil.o b/packs_lib/phil/phil.o index e8590624a84cc7e188ec8921f5c70ec92290a8ae..783b3f3a361052be80f29b075375ae38463ee0e6 100644 GIT binary patch literal 166376 zcmeFad3+Q_`Ul)S(>Vyp1Q88~8Z@r)0^*r?CX%odoVWpkBuh9#5+IlZb3i~y0!fr{ zj3z1yYgBf;FnMp@*$*MN`nf{KcS<^Soo;^y@ z_XiLA+mF`3`Ywl7H8O$><=lth7yj~de`Zb2 zvU^ZgL00hf$&>7AGCoxk@FE6F$6 zu9byTT^BuXaD=WKj;1~qJYaWW>M!99Qok!rc1hq)4Q>_P9mXg6``>%e5<>T)zqNjz z^p$T=c1k?%15#M#uY8FGlujIwLcJd^$CIdE`A+Wv13)j{{*`a~+xXk`m9KE4-ejHV zcmb{BP-pa)emN;^7daNRQy_SNXmUNdLF?UMVG6etYsMg{q+qQ6f?LEG>t<+E*1u3cij`|e%uDt>|gaoWYB#@JCCqhe7(rq^V ztxHl;jojc1_4EB5*(u4-kuCd!*(r&@M}JfuS=lkwI0QKUP(ey!n%w~dp+HJu{cu@I}tQnhZ=80b;6 z9Iit{C=Is#rP(RztrwbE!Es3qkNO4NA3D0#T5j&YOWLv2h)eEJF;pV#i^yn>gBJv#Fds`9HW-=J}cy=h2NKLwR^WRak~M>DL2irMPO4hB+21aOPb zdY%-`jFEagC`CGqXB`DMWRWUw`X``vSw9t11+rSVn)_b<0oiB=jC>pX!OPRLGnS-` zXn3V}6^gO_lfKr2jU&DJxXtcdj{-+}v*}%pN4~Z@zz3P!*BEViM38+o(H~-&XZwBC zJNBQ<<6G%ibdbcOSfk1G? zQBkPjC8b(eL*mqF$lsV%yh*kj@vrw08Zxhr%B!NX|2V}bSCZu`vNjWMr`f#087SWH z3f^7=D`S}_AU3=u_+TF36hyNtewHmsiLWd#nO#2+IoT;m3f{6LWq{GJpKLL?y{9oT z!BIRKeMjN3BHmwIXCz+x#O?>!8a!de~{zHqyT0Sw&Riw z{-w;6Lvc1nLoqdy0CYB2n)!=g&z)IhFdVo9#>8;SW{8 z;)`E}sqx@LJp^UO7`z8jCZ-BBm97Q=%nC(s6G9`V^UDL>ZrNF z&D_Gd!L9s6t;h-l;Th$)7&;~;fO$^nLSeCT&}-dqHlE=x-GzQf0%h;U@VwU#sKok= zr<7uVY~QtLS8nKhHb$C)h*@pc3^A9m=ldA@OFvV?Gc&6kGG?2CnVj}7n$p4Yl^tj9 z?+gS#gx|48HCkXCuxD`rOw`{)jcQgv;|Ee{J+@)OU*rZ4@gz?A3b)PEfIk3Zj?$37 zv ztTx$1M9<--6{h%tWEu+=!N0rNHEo1v*b_}*CCC=~MQ;+zMn@jCI1ux1>RR6rYizy$ zVAe!Y?jG_Ly>=ra1CH6+v)*6Gh?@z;0`zM4Z|H~oAFb%od1Sp>zb;5g;<>idJz$@h zqz}jnUg|GBVw)OFD=QS+-qUnW8u`6Iker;d0N523$qmIJY_O9SCbFU&BP-*C=GS1i z1HxKAqCGKx!H}r0QkH$b(@Q-rkdpM*qp2@+6l3Ah@oY*a!2j_-?C*FaWevfDFiqA3 znj33}0N{iY08h!}DpGx?wWTCuu&3u3`OK8heEFOypPll#Mn2ccXODdDkWT{(bpO`2 zltiRQjTY}oc&7{C`SO)eS~Qdu4$2-4<)DUgSi*_hMAX9E%jX#R%#_dh^4TJvo$|Rx zKG(_T9{D^dp9b{9^yM=dPjH%#Y`Tc+nRr)%&6RL~do+|C8p=)wWekYX#YP}ZH22vV zlj=+AE9&Yckb0K?nfi*-y3xPRMpGsGgZaXFwH`(&=@IB4fTkwx20Gw-@$^48IZj7`2l#@0+>;20%Q^#~%AL5A^hot~$*aLoZA6j&4W;~i#)Qv_(WJbE* z-jgs%l-{fH9A1a(eOWGi z;{Bn^m}G8fsi2(;Z7{^IARO>iGbcH{l>QWJtK1-uH=vx8_VMIwP|oToIwGc)7h_t2 z>0?g&i%n&n*%=@C+Mb6Pr0;Buq+t^9tvobz! zxXVwA`e(?-IZEi#5QcFrj^_&M1;24};FFUuzh!{aoKor*P-gan@7UaDca#baG?*F$ zTp$r`c7eoPCp+U4U;BG#|K5vfR9EpT8n5081h)(SkMRm2Du1XgWfgb`gl4DIVDJvNIR7xkF6j2(JgYd~squ~zHc46h4TiO%An2?&);YYv(gRGT;AOr@20WuCj zqalwJxIqC3Fzv6A_K4nv_|%uqGWDymSh9TW2OM*_aQGpDqx*!xv;PalA^N2z zY71nXo8oJ`j)b`!WdD<$ff;kd4TPL1l^nfhVJKmFvi9&iu9{Jacj850xVdPj)e^6G z(y0K#XPf;JaVi%MTdKI@uV|n6*}f_4VcC2^Nd#{&H9~ZA1EQSUuqfLg;}q?$HC^m4 zeGOshj+D31CI3q^5?Vj`61}u;LGVtvP&9JRVTwF|LI#PofS6C|u^O8Hfi%ct2@O6# zV+b?~7?#H8H=L`YOTN^N;DW##7msc@3uq3zig!pIk4lIhkc)}!4f|i7-3i(+&i0Mo zR{N@?hSJ9V&6>U1>r0;DA;cB@ArSoMq})=>e?CuwN6yz)n(e!qW`F`ZtbfBt-kdZ9 z515zMbhEyg)TH=98MU+#_^^{f*_RksY{iYPE4Esf%IC%O%x&EopPTW1!(-H!oj$DM zM>1?F$Rc>jW+zs&znp#`<2zsbc$iCA9oif&Yl@6M@wQl20X<$v;Rvl;RP=}vY_8!^ zEl7rLi~(h;#3k#WE|=-Fe%8jH-Z_!$5r6xOzP7z^K(uhBm=aqBf=T}*W0(C3%6N&4 z1DY>MMU#|CW)L0u4PZzjw1~*ilvAi>Nrj(Mgz44B71{@VHAYQJb zxYiYPJDw<@6TU+`0WaYlOnw76_Z0B?9(7RSmGLe^|Ikp_!cxOMP~*J_HnUTb$ZfUu zm`Grk1{+P=@P^$7+?_os+Ko!xq4Y?4L;2UB&mF$&_oCl@<(tsM)W9C%UuX%fFgsSj z2Ow@%yaNS$xZn*VP|(+YEbckj`Mv37SdV`zmRsP_xT3@QUIrw1aNa-7j@QZgkBw^k z)7;k0JO*HliqFMZkh^u*r9dTzL+P?MKlr@mg zte-63Jihj~U|>KEPy?#oP=r0h;&)I7o-iI7qL>aaynvwP3ZZt?hkETlLEo?97|E-j&GsGhnt#KGmf!r=?r*a( zo$$(ANYW{dF%Y4hV>u>oSba{ zD6h`F?$;uIM$ENe&DNHfv(4X8zH_RI>Q8g#U0f2ifJnSuD>L?gs4^?#Jzx7_Sn>Xl z=-*6e^`WJY@P^Cm&dIr@*r;`yDy^v*B`vUkshaQ&iJ?QH?JT$A4%k5VRht4u%k?*R;G*RU1P-a z{#5a-S_RZUCnM4NEn+%;i-&ah)YH-N2Xz!8Bg(k^dkiX}96!zM1EIXkoZudRXeF@$ zP3EkEr6Br~?+P&L@a??d4%)x&n7j^CyFhSq zOCWex5>*<^S>X>(Ud5&Tp+A!*gdH*@5XxEa59Mvk34Y)YP40n3z$%um<-8*e>%ovR z49Ufj23QbwiI~eH4Jh#(kv!6{4g#!&s5zZnm^vst1RPf4T_ijS)ENj(ZrPf%25o}* z&gi#8?WEML?K5%5Sc4f9vmDI14~D+NcU=-9FDNJHO2V^p4QadZn6?79yq4LWK$*M( z^j1;K8+V1m7)pho3SVaHCbFkYB2wEhCA zrVle_R!EOz2hgHWXEa5w)D($1<~6LBY3rzy`h(L}aYvP%6n$$|UT|k1h>;3AA!2u? zx80eC$maC5UqjAsy*++GOgS|j#MSlw={r&n#N7X|7|(xlKf$$?z?%!SpMaPV#x6Qx z=xi-u4)Oo*BebQggSVjlg8z^A5e_)}2x`MBFIY~?PXBt|OUTK?(XE^~XA4NoD|kYa+9o>yuUF<15@=Nv<0>PO_iTX8{ok zDrs*l0AK7W{2pFOkZ!#Yy9sn81=|R|Hi{4Awl1X|h9-Wc9fpOGn+swcE~m(R_U~u+ z7mkIqkbYX0i?Y7}Q{i^$-Nz1!N1KQZ1?4Z*8H6_`VGjXe94;Ak_kb2b92U@K=r~_3 z!b0LOoIJ@uA!v3kiP$sn-Bbkg0mkaQEsUYhr9CZ(bc*G7rd)sm5pGjUEz!i3s8;a$b=ibmUN!X8R z-DHVAP3LdbvX|n>YW^?Iuly)C-&;S&wnah8e9~(pMky>>sl`X2#XGXlO|fZ>4GNsj zqot+4bORzl6eGsIh1{?R&_;znh%JTvd9pvy2C5Sg<-p(pPVpSz&bPSCEHedq^tvVxo8Mp>0uo2!%M4yd6~D#1RkAr9(riC=cC zB>enQyy63OQ*X!)?r{XBMYxJTa#K01_}Z?4{v*9pp~Ur+Yr%{qlZ97!Kf>Seg}JHwgnrdZ6P* zj*103+IY*3sY0kRN=7~#AX-A4I#-x<>b#L%+l?tL;D=ghz94EekDeEZ>age|u zjs#x1xd>ivOX(4i8&lTd#UB!3LgciitOY>u+qyZQ24)ucM&7_C!S~qt_Tf6^*MXf( zT}mt{Fvb!s_o+K=xT5_I$8#Lxj&%$Bn?zp-@sKIxM3fDFO>JGZe&+$lR!V(p>vxD! z(!N)Hp2Tnc&a6KkMgVug<;8bOC``_dAuJ=8*U;DlsBfAw(cp|K>g2*sDd{X+w7@|G zF^bB_0KUqZdU z(ST#6bQob%c>UC$5jCUm8#bGGzu@ca;45%^;0cVdHt57?c}_>e5qw5sw`W6{eD{YE zJH}FY%6f-G%J1iHwdk`civ8}UrxD2bPyH!`u#pkA0%0@3fv|<1u<;%(YL7oQlxyJKTb z?xrP!!3x|4RXV$A6KEfew$9R!$;)8`n-T7%EwvZ0o0iPGX*h2|hgJ4LpCJJgL}NO2j*pUY^&CYAQxim$@kfp5s} zkjr~-Z_<9&Wthn$w1It@RD2y&yc1+llnN0#Apb(Z8*>Ce5SlBZuZQp~1pcTOsQmkw zN1%)dcVk`#T05x4uEIPW`*=!D+SH<5F`xno`*^VCsbR1IS%mikh_tctH~DUO9rBA07VVw(=|^X0?D2K{ z2^^uC6%W(u0^MAFKxA$~bvXt;EFvn<7`Bz#uLDvpa~L|$U=wGKYv_C88!;ZLPI%p`N% z(R(g5sGX;`C$kuMU~90So9>7B;(JjXyUD}HPFt-MG6|fFLMZ-_(|`P-!8HEF+lSar zh8|xeOTiQn?Ym*|Q4Rg25YUep=b#`u>-_;7r(hpbDw>Jnyhtu)%E{1#-1x%@g@$gF z!x-Y;fwApbGPeI6F`tM3&XYv3c@PL0X+2^d85+>i{$hPHa|e3(yy$cUta%T_+DiV8 zc1qsf1VMR{B_KN*@I8(rEXL1CFqxfXLOA9EtJxrD1E-L3kp2jNAEFN0hQ;Py@n*O9 zFhI(hBD>eN`p4HrNsFu&>8z#G&bvL;T&iUa-<**g|qDYkNpw?!g3<7F{- zQ)hda)4abMP8e16g}i^YOI)m{u$-ZZP1Y2DDGtsY*rlJ9!y{7GYy+*aH_ zLfRLtsId7%SQu5X|C{k{{S=%h4p~WFAg)4PGXth_WJEAG#+f_z-t(0=;$<>WYjxhtpt)A{^M)n zMg_WaRA~CYc+dlf=&ke#bLu{@bruOHVKMX$7<^pu5CKo!Lc`OS5CWY`&1TrAPiJhc zCfX0CzvBg!BBlUtU~!`uh8nly4>eEOys&}Hf(hCra8ic8+1UXBdw}x~a4BtV)P{vq zfe)K6lvJlH{>WKj9;H~rE0BO#ME1tTfj~x?L?5%eXJn>vs5u|J9CuTkvjH(11L_7o8IWX*s*fhA$;IF3st zVN6QQyuxj2z{L3X2O`H0YG;q?Pc$dZ2@UlJcLcX*V>Oh7_z}WhyXr@^{?FrUyNfFQpSQjd zAE(xzqpt&qZzwok*2Ashz-)aHqtMXlPz;}#;KLi>e8b`f`reK^P}WwG4L$Hc59Vf9rehKHQu|3sJVxtgA3wW=+na zxx1LP<80Wn&uK9m2;IkPIUKQ|SC^&)@`%Hk1pq-70 zBJxJ?vJmKS?eL%@WVLERDB-^Lhta6n!QMddD-plV#_`&Ns-E~jM_J0;01h9K-dXpw z_Mh*^${Ne_Pic9&6FIcdUx6owRdAStmhmkF$I)6p#b7eIED>Tf7(gSfs8JW8QLunx zV{=6nph{qT1nEk1!shkJQ%nnjoB~`_eE^UaywL$+dZN>84q!#z2yI{v&ZU9PvrUdG zbu3A#3_X<+538Uk!Fa71AUXwqk%1#Gk2^L^8IX5r{} zc7}=<;3SLhrWaYp(FkVvu6s_r7vocx>z=?n&9%lr!+F7jSn6QqnH~I5sSoYUJB@Vy zg`53A))X|10lD&7Kl5>iY0*dHLLEq>#}-Y;2mMJVIHDs-+kEX5e3h*LI%pVBmTdqe z%zO^0rcliQ-7^=3zvYVJdkHL9=Yp zvm)}2N1kmq;7Xae%dSx?9SWl9D0XR5ieVUsNs%y&nPeF0LVcmz*eb{lkV|&J)|b=% zn(yYlsD}-qH-kqy;TMI;b4Q}naDM7Qjr5i&x)RevV_NXb4@_% z(fzx%0h0F<_!l^^fy2jdCS#uRuK>cDt)Hu)B!4AIT{T&LK8TuA$zjYT)@9_5n23zx zW#^}hf`Pook0Ikt2z6pQ_A@c#? zHsvMQ5hMzE;BN|SnUEL(tDu&~DNqr2<4pR=9qxn_Kfe?xl4=UjvmDyX-XxO zI9nyM%1Wwc%q^)Wt)z_!%uYtZ%S-A@=T53vTn-@VcTzpnT|Q?Kl66SVDk;61RPyWW zaHUjLR9DQR!bV+vP3hc{I_#DMT>u0PXbf{u}3) zms0cBRI@(ZX;_nxH^G=#KBu9wq_$!)<0h9^m!N6N!ol^hvkL=h$;Piss;WvZB>RXc zDsawDj#f4~aL$EB$%R~Oc5O*1@kPd3-dIvKzp}h8d6vivwxU!*YR(UN|0_p1KqJvbFCYM&!mNrz>*Fgem9J=zI-cwRr4x6l~ zuPCWR1C}K(M7iYpxi&BvN}hwh1|C$8`}y({%NWEzM+GHUy;lpHp8lU7#uo0on(%K3XDygndhSKZ6 zQAu_37{a2f2V>&pZRWt~}HA${O7k=`Sp2kDEsb*KKwcncmaIOg&VXY_ye$sU3C z!`S;a2>is%$$Y&b%f)BT9sT>~+P-;GrgzBaMVU!wWfy!m^0Z7@57Fmqw9|zv%JCVe z1h>ei0p{pxR_W2y1B90Veoo%#a;FQ>36ik%n4B8Jh%roZ<3>8&c$!Er>iXQT-VEc| zc=Fpuh80s$U2hyKiXH3WW!bToc*Ki`Nqg?bu^t|nj*aKXKmvKXhEBjkyx%f(y#0Qw z_I{g&bNes{=Z@h{*;PYl+htb|ciz_wqxTErMGcQ1@8mo+!g=2^lHPq5W|PMXUN7Qz zizVc;-Zzh<+H~fvgri>u=vVkN5@Y(uPe*aqT}#|mXI`p($2_|Gvl zXY|-};&^^266g0jLg*rK0VfhgBApXSB9Xy~WRbX#6R9F`5huoo#KoLQ7l}(aktq_H zobZc87ANvW;&M(DibVFYG1$HXeDnROyDBjGqS#(I&M$-MQ5#H{#q5ZEkCE-r2;eT>21q{W^w@C*ObQv7cn%kB64;8J9> zjrHp}rpA8XrosQIy}v%>VIsT^w@Yrt?Qi%y)$ozguxWKB42$nVT`X?GiAPlt>mreI zR2RLA#F@T7B9SN(XAPuTZ<0uiK57vXBSd1%QSC@1i^SRe$WT*6;#?-3DiRq-QIn4m ziAx6ULLyxxE=$~tM5aiLA96kv;unc4I8i7P0Zz;niK633f<|K~^_<`1m0Q3g1k5x~ zNbCm}!l-6)JiW`r$b?aN7c!YAakD2~T0h?~Pv#6Eg_*($!MJ(K(L+&QFmC>e6X~Ks z3C{KQGknAYH<5X&m)=iCHO6W2R9ipjUtE`!R~hE%F{B~~$e3ruR)ClT^bro{oEZ)M ztbVK9=u{7*j|xLiq?-F(Z4M%WZ=+BQ*%~9o+@s!3HBw7!>WoW?$`^z~FUBys^}ooZ zM0~7->RC5))(I-hNS$A^(72J%FHkUno?2Nm$CyhQSEvjl6+?|NgJ3gkSSC`&fTfi*=#^rxBQtBdB`>LY^uYLoP|uyj0{>*m>7Fc}XJg20M@61XqM6xH?;4 zJ)p3Rb3oka_r7RXP7HWK=#mQzY!``lsQ~u|UeL3-CkA|{LxQg;i*5!dxrGL7GyC-e zn5Gw^X5Vx{=vM^J13zqmr%Idc=GM!iJg$UWR!~a!Od>E1M-sV%4ZND5j)60`15Wb{ zB*b>gBkhV3z9*Udodl(EL~`UY2U6;30&{nun~{Y-!`#O~aC$Y0`3_ij17^|~i^TOL z3~2xWra9ShMW$I`rkmyj9Wv1z<1Tf1v{DyDDMi0{!xz;RQO~(iN*LTpUW=olOkLgb z#q2(PfI-8tVZ0WX!kts*NZ7eLEcVKYK>M{0l4uik7`(S(ydKw&NULkel@rs9H{y7} z@OC}hoKRa{k2JS|!r^jn#`S04B7q4t4fV!baS1wow2ipPVr|`1H@~Jo>%>zB%@j~I zPBxiFNMu`e#yKfYP6H-Pf0PBAsh|fx=3W$XuL9w&7K>KpbJ>qJ)4P?Q%%ieJSJM%+x2-9xkIG+2L`=e z2UU6~jX>V6uT}bFkv=TakH_(B+1u4ZO>7vC$Bm#a?(JHk(kF{_XER&SI=2N$*l^vd zB&b|H?2Hh_cG;zX$RJZ`WENqv$#fnL5Eu5?MD(g0B^DbdIyN&OtdneU#W4 z1wQH&!#F76dWYC`B_`-FSTgS>GJG!-z-)fq~kk6q)uWhtE~t# z9!ZHip0{f!1fJ-@%-cqyp0vH+y@TFn+4@x*HLuqm4&eIY^6yq7X?q zS(TQ3wMV68U)`+IqeS1`rqbt%^gl$pUG?Q1DlPl+PL-B@d5=nu5`BB0NMEOV&%q|{ z!`DaY>(|G*`a1RN6{=q!ZlZp@LiOtw(XUrT>DMb%zg_`XP+x*FCs3<+(_!Y>XNXt^+8j@#z%pb=rEc&UK+O`3b`g7 z7K^@mY22;UG1L`{{(5QL-8u;KDiUcec?M5cyiE3pWTH&|LnM=Aawk>e=}MN#4@ELn z^8b}iJ{g!GZ}8%r-sxhEWx5@vgdL?zz_2XgZbV60_VOsOu~A`zbY^&tF;@8^Il~zn zcdCxVb!NMH<8nD_?s22=N#o-B(c*^Y5u86RZiq-rpEWKnRivfQ8W(r5NUv)if?qW> z#>M4|v^IC4wcD4+YMtC!<~SBgNP}^Zom>!mf@nxLoDB1pNZhS?J~M%*3vwdh?Mi~f zDzdtgZ?hcg`B26UqM)}c9tbq6X8*R0{hNj96QJ-ke_U1r&EMDCJU8CKUm;;g{xO1;f8 zP2lzrE_kPL#x!TecCB|8UYdf%rzk9@d#s)bE?;t0vSHk&D%isnu;W*AD)Os^T+S^q zIfFMP?LHbncrMAdV%HIk)R6!xVi7|PL3Qa(h%#Xkk!_5YW%{%YLMr$
    3mpR64w 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 Sx1V|5kI18cqrw09_WuXB#QpdH diff --git a/packs_lib/phil/phil.so b/packs_lib/phil/phil.so index b37aa449c799c8e32e5f7a8e2139d9a78a2098bf..1c5c03e7fa841d8828f46b3aff918bbc01d59ffa 100755 GIT binary patch literal 113416 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 z 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§81clqB( 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 GjsFFCdu|*6 literal 141464 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 TCT;WSUwydI=Q4 retract_all(ThBGRef), retract_all(ClBGRef) @@ -587,13 +601,24 @@ length(DB,NEx), abolish_all_tables, M:local_setting(group,G), - %trace, derive_circuit_groupatoms(DB,M,NEx,G,[],Nodes0,0,CLL0,_LE,[]),!, maplist(remove_p,Nodes0,Nodes), M:local_setting(algorithmType,Algorithm), M:local_setting(maxIter_phil,MaxIter), M:local_setting(epsilon_deep,EA), M:local_setting(epsilon_deep_fraction,ER), + M:local_setting(saveArthmeticCircuit,SaveCircuits), + (SaveCircuits=all-> + M:local_setting(trainingCircuitFile,CircuitFile), + writefile(Nodes,CircuitFile) + ; + ( SaveCircuits=training -> + M:local_setting(trainingCircuitFile,CircuitFile), + writefile(Nodes,CircuitFile) + ; + true + ) + ), StopCond=[MaxIter,EA,ER], M:local_setting(statistics_folder,Statistics_folder), M:local_setting(saveStatistics,Save), @@ -612,6 +637,7 @@ ; Params=[NR,ZERO,Seeded,Seed,Init] ), + format3(M,'Initial CLL on PHIL ~f */~n',[CLL0]), retract_all(Th0Ref), retract_all(R1Ref), @@ -710,7 +736,6 @@ ), length(DB,NMegaEx), M:local_setting(megaex_bottom, NumMB), - %trace, (NMegaEx >= NumMB -> true ; @@ -843,7 +868,6 @@ getTree(Body,[],BodyTrees), Tree=t(Head,BodyTrees) ; - %trace, Bod=[Head|Body], getTree(Bod,[],BodyTrees), length(BodyTrees, LTree), @@ -992,7 +1016,6 @@ assert(getIndex(1)), generateHPLPloop(MaxLayer,1,InitLevel,[h([Head,'',Prob],Forest)],[],HPLP1,0,Level), retractall(getIndex(_Index1)), - %trace, removeHidden(HPLP1,HPLP11,[HeadFunctor],_), reduce([],HPLP11,0,[],HPLP), %HPLP=HPLP11, @@ -1054,7 +1077,6 @@ ), %atom_concat(PathIndex1,Index,PathIndexNew), getHidden(Hidden,Pred2,PathIndexNew,HiddenNew), - %trace, getRate(Rate), ProbNew is Prob*Rate, Temp=[h([HiddenNew,PathIndexNew,ProbNew],ForestChild)], @@ -1344,12 +1366,12 @@ writeList(List,FileName):- open(FileName,write, Stream), - writeList1(Stream,List), + writeList1(List,Stream), close(Stream). - writeList1(_,[]). - writeList1(Stream,[HeadList|RestList]):- + writeList1([],_). + writeList1([HeadList|RestList],Stream):- writeln(Stream,HeadList), - writeList1(Stream,RestList). + writeList1(RestList,Stream). %! writeClause @@ -1361,7 +1383,7 @@ copy_term(List,ListCopy), numbervars((ListCopy,_ListVar),0,_V), writeln(Stream,"Learned Program"), - writeClause1(Stream,ListCopy), + writeClause1(ListCopy,Stream), close(Stream). @@ -1371,11 +1393,11 @@ writeln(user_output,"Learned Program"), writeClause1(user_output,ListCopy). - writeClause1(_,[]). - writeClause1(Stream,[HeadList|RestList]):- + writeClause1([],_). + writeClause1([HeadList|RestList],Stream):- write(Stream,HeadList), writeln(Stream,"."), - writeClause1(Stream,RestList). + writeClause1(RestList,Stream). /*update_theory_par([],[],[]). @@ -2879,31 +2901,6 @@ setting_sc(M:P,V):- M:local_setting(P,V). -extract_vars_list(L,[],V):- - rb_new(T), - extract_vars_tree(L,T,T1), - rb_keys(T1,V). - -extract_vars_term(Variable, Var0, Var1) :- - var(Variable), !, - (rb_lookup(Variable, Var0,_) -> - Var1 = Var0 - ; - rb_insert(Var0,Variable,1,Var1) - ). - -extract_vars_term(Term, Var0, Var1) :- - Term=..[_F|Args], - extract_vars_tree(Args, Var0, Var1). - - - -extract_vars_tree([], Var, Var). - -extract_vars_tree([Term|Tail], Var0, Var1) :- - extract_vars_term(Term, Var0, Var), - extract_vars_tree(Tail, Var, Var1). - difference([],_,[]). @@ -2999,7 +2996,7 @@ append([phil:onec(AC)],BodyList1,BodyList2), list2and(BodyList2,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_probs(HeadList,Probs), maplist(to_tabled_head_list,M,HeadList,HeadList1), (M:local_setting(single_var,true)-> @@ -3041,7 +3038,7 @@ process_body_db(BodyList,and([N]),ACAnd, DB,[],_Vars,BodyList1,Module,M), list2and(BodyList1,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_probs(HeadList,Probs), maplist(to_tabled_head_list(M),HeadList,HeadList1), (M:local_setting(single_var,true)-> @@ -3057,7 +3054,7 @@ process_body(BodyList,and([N]),ACAnd,[],_Vars,BodyList1,Module,M), list2and(BodyList1,Body1), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_probs(HeadList,Probs), maplist(to_tabled_head_list(M),HeadList,HeadList1), (M:local_setting(single_var,true)-> @@ -3083,7 +3080,6 @@ append([phil:onec(AC)],BodyList2,BodyList3), list2and(BodyList3,Body1), add_ac_arg(H,ACAnd,Module,Head1), - %trace, to_tabled(M,Head1,Head2), Clauses=[(Head2 :- Body1)]. @@ -3143,7 +3139,7 @@ append([phil:onec(AC)],BodyList2,BodyList3), list2and(BodyList3,Body2), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs),%***test single_var (M:local_setting(single_var,true)-> @@ -3164,7 +3160,7 @@ append([phil:onec(AC)],BodyList2,BodyList3), list2and(BodyList3,Body2), append(HeadList,BodyList,List), - extract_vars_list(List,[],VC), + term_variables(List,VC), get_next_rule_number(M,R), get_probs(HeadList,Probs),%***test single_var (M:local_setting(single_var,true)-> @@ -3174,12 +3170,9 @@ ). - - term_expansion_int((Head :- Body),M,(Clauses,[def_rule(Head,BodyList,true)])) :- % definite clause senza DB %M:local_setting(compiling,on), - %trace, ((Head:-Body) \= ((system:term_expansion(_,_)) :- _ )),!, list2and(BodyList, Body), process_body(BodyList,AC,AC1,[],_Vars,BodyList2,Module,M), @@ -3189,8 +3182,39 @@ Clauses=(Head1 :- Body2). + term_expansion_int(Head,M, ((Head1:-phil:onec(Env,One)),[def_rule(Head,[],true)])) :- + M:local_setting(compiling,on), + M:local_setting(depth_bound,true), + %definite fact with db + (Head \= ((system:term_expansion(_,_) ):- _ )), + (Head\= end_of_file),!, + add_bdd_arg_db(Head,Env,One,_DB,_Module,Head1). + + term_expansion_int(Head,M, ((Head1:-phil:onec(Env,One)),[def_rule(Head,[],true)])) :- + M:local_setting(compiling,on), + %definite fact without db + (Head \= ((system:term_expansion(_,_) ):- _ )), + (Head\= end_of_file),!, + add_bdd_arg(Head,Env,One,_Module,Head1). + add_bdd_arg_db(A,Env,BDD,DB,A1):- + A=..[P|Args], + append(Args,[DB,Env,BDD],Args1), + A1=..[P|Args1]. + + + add_bdd_arg(A,Env,BDD,Module,A1):- + A=..[P|Args], + append(Args,[Env,BDD],Args1), + A1=..[P,Module|Args1]. + + + add_bdd_arg_db(A,Env,BDD,DB,Module,A1):- + A=..[P|Args], + append(Args,[DB,Env,BDD],Args1), + A1=..[P,Module|Args1]. + add_bdd_arg(A,BDD,A1):- A=..[P|Args], @@ -3244,7 +3268,20 @@ test_1fold(F,M,LGOrd,Pos,Neg,CLL1):- find_ex(F,M,LG,Pos,Neg), - compute_CLL_atoms(LG,M,0,0,CLL1,LG1), + format("Test: Positive examples=~g, Negative examples=~g ~n",[Pos,Neg]), + compute_CLL_atoms(LG,M,0,0,CLL1,LG1,[],Nodes), + M:local_setting(saveArthmeticCircuit,SaveCircuits), + (SaveCircuits=all-> + M:local_setting(testingCircuitFile,CircuitFile), + writefile(Nodes,CircuitFile) + ; + ( SaveCircuits=testing -> + M:local_setting(testingCircuitFile,CircuitFile), + writefile(Nodes,CircuitFile) + ; + true + ) + ), keysort(LG1,LGOrd). @@ -3420,35 +3457,35 @@ member(H,Co), neg_ex(T,M,TT,At1,C). -compute_CLL_atoms([],_M,_N,CLL,CLL,[]):-!. +compute_CLL_atoms([],_M,_N,CLL,CLL,[],Nodes,Nodes):-!. -compute_CLL_atoms([],_M,_N,CLL,CLL,[]):-!. +compute_CLL_atoms([],_M,_N,CLL,CLL,[],Nodes,Nodes):-!. -compute_CLL_atoms([\+ H|T],M,N,CLL0,CLL1,[PG- (\+ H)|T1]):-!, +compute_CLL_atoms([\+ H|T],M,N,CLL0,CLL1,[PG- (\+ H)|T1],Nodes0,Nodes):-!, findall(P,M:rule(_R,[_:P|_],_BL,_Lit),LR), abolish_all_tables, get_node(H,M,Circuit),!, - %writeln(Circuit), + CircuitNew = not(Circuit), + append(Nodes0,[CircuitNew],Nodes0_New), length(LR,NR), forward(Circuit,LR,NR,PG), PG1 is 1-PG, (PG1=:=0.0-> - setting_sc(logzero,LZ), + M:local_setting(logzero,LZ), CLL2 is CLL0+LZ ; CLL2 is CLL0+ log(PG1) ), N1 is N+1, - compute_CLL_atoms(T,M,N1,CLL2,CLL1,T1). + compute_CLL_atoms(T,M,N1,CLL2,CLL1,T1,Nodes0_New,Nodes). -compute_CLL_atoms([H|T],M,N,CLL0,CLL1,[PG-H|T1]):- +compute_CLL_atoms([H|T],M,N,CLL0,CLL1,[PG-H|T1],Nodes0,Nodes):- findall(P,M:rule(_R,[_:P|_],_BL,_Lit),LR), abolish_all_tables, get_node(H,M,Circuit),!, + append(Nodes0,[Circuit],Nodes0_New), length(LR,NR), forward(Circuit,LR,NR,PG), - %writeln(Circuit), - (PG=:=0.0-> M:local_setting(logzero,LZ), CLL2 is CLL0+LZ @@ -3456,7 +3493,7 @@ CLL2 is CLL0+ log(PG) ), N1 is N+1, - compute_CLL_atoms(T,M,N1,CLL2,CLL1,T1). + compute_CLL_atoms(T,M,N1,CLL2,CLL1,T1,Nodes0_New,Nodes). diff --git a/packs_sys/logicmoo_agi/prolog/episodic_memory/adv_spider.pl b/packs_sys/logicmoo_agi/prolog/episodic_memory/adv_spider.pl index 5cee40b2a0..321882fc09 100755 --- a/packs_sys/logicmoo_agi/prolog/episodic_memory/adv_spider.pl +++ b/packs_sys/logicmoo_agi/prolog/episodic_memory/adv_spider.pl @@ -82,6 +82,16 @@ S1 gets the name of the tool from column 1 row 1 and finds a tool with the same name to offer the user. "). +map_of(tool_table, +"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Column 1 | Column 2 % + %--------------+---------------% + % | % + % | % + % | % + % | % + % | % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"). example_mentalese(translating_english_to_event_calc, " "). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/arc-dsl/solvers.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/arc-dsl/solvers.pl index 0ecf6431e4..dcc6b17c10 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/arc-dsl/solvers.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/arc-dsl/solvers.pl @@ -1,4 +1,3 @@ - /* from typing import ( @@ -285,8 +284,8 @@ ]. l_solve('3af2c5a8', IN, OUT) :- [ f(vmirror, IN:'Piece', X1:'Piece'), - f(hconcat, IN:'Grid', X1:'Grid', X2:'Grid'), - f(hmirror, X2:'Piece', X3:'Piece'), + f(hconcat, IN:'Grid', X1:'Grid', X2:'Grid'), + f(hmirror, X2:'Piece', X3:'Piece'), f(vconcat, X2:'Grid', X3:'Grid', OUT:'Grid') ]. l_solve('44f52bb0', IN, OUT) :- diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/induction/h_muarc_aleph.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/induction/h_muarc_aleph.pl index 4705e9ceb4..f9b6c5db8a 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/induction/h_muarc_aleph.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/induction/h_muarc_aleph.pl @@ -1,3 +1,361 @@ +/** +?- aleph_sample:induce_tree(Program). +*/ +%:- module(aleph_sample,[]). + +:- if(current_module(trill)). +:- set_prolog_flag_until_eof(trill_term_expansion,false). +:- endif. + +:- use_module(library(logicmoo_utils)). + +%:- use_module(h_muarc_alephlib). +%:- use_module(aleph). +:- use_module(library(slipcover)). + +:- if(current_predicate(use_rendering/1)). +:- use_rendering(prolog). +:- endif. + +%:- aleph. +:- sc. +:-style_check(-discontiguous). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% specify tree type + +/* +:- aleph_set(tree_type,model). +:- aleph_set(evalfn,mse). +:- aleph_set(minpos,2). % minimum examples in leaf for splitting +:- aleph_set(mingain,0.01). % toy example needs this to be low +:- aleph_set(dependent,2). % second argument of f/2 is to predicted +:- aleph_set(verbosity,10). +%:- aleph_set(mingain,-1e10). +*/ + +:- aleph_set(verbosity, 2). +:- aleph_set(interactive, false). +:- aleph_set(i,10). +:- aleph_set(clauselength,10). +:- aleph_set(nodes,10000). + +% specify predicate definition to use for model construction +:- model(zendo/1). + +output(zendo/1). +input_cw(piece/2). +input_cw(lhs/1). +input_cw(lhs/1). +input_cw(color/2). +input_cw(cenGX/2). +input_cw(cenGY/2). +input_cw(size/2). +input_cw(shape/2). + + +:- modeh(*,[zendo(#state)],[lhs/1,rhs/1]). +:- modeb(*,piece(+state,-piece)). +:- modeb(*,lhs(#piece)). +:- modeb(*,rhs(-piece)). +:- modeb(*,color(+piece,#color)). +:- modeb(*,size(+piece,-size_nat900)). +:- modeb(*,shape(+piece,#shape_id)). +%:- modeb(*,position(+piece,-hv_nat30,-hv_nat30)). +%:- modeb(*,rotation(+piece,-rot_xform)). +%:- modeb(*,orientation(+piece,#orientation)). +:- modeb(*,cenGX(+piece,-hv_nat30)). +:- modeb(*,cenGY(+piece,-hv_nat30)). +%:- modeb(*,contact(+piece,-piece)). +%:- modeb(*,child(+piece,-piece)). +:- modeb(*,my_geq(+hv_nat30,#hv_nat30)). +:- modeb(*,my_leq(+hv_nat30,#hv_nat30)). +%:- modeb(*,my_gt(+hv_nat30,#hv_nat30)). +%:- modeb(*,my_lt(+hv_nat30,#hv_nat30)). +:- modeb(*,my_add(+hv_nat30,+hv_nat30,-hv_nat30)). +:- modeb(*,my_mult(+hv_nat30,#hv_nat30,-hv_nat30)). + + +:- determination(zendo/1,piece/2). +:- determination(zendo/1,color/2). +:- determination(zendo/1,size/2). +:- determination(zendo/1,cenGX/2). +:- determination(zendo/1,cenGY/2). +:- determination(zendo/1,shape/2). +:- determination(zendo/1,rhs/1). +:- determination(zendo/1,lhs/1). +%:- determination(rhs/1,lhs/1). +%:- determination(zendo/1,position/3). +%:- determination(zendo/1,rotation/2). +%:- determination(zendo/1,orientation/2). +%:- determination(zendo/1,contact/2). +%:- determination(zendo/1,child/2). +:- determination(zendo/1,my_geq/2). +:- determination(zendo/1,my_leq/2). +:- determination(zendo/1,my_gt/2). +:- determination(zendo/1,my_lt/2). +:- determination(zendo/1,my_add/3). +:- determination(zendo/1,my_mult/3). + +:- lazy_evaluate(my_geq/2). +:- lazy_evaluate(my_leq/2). +:- lazy_evaluate(my_gt/2). +:- lazy_evaluate(my_lt/2). +%:- aleph_set(clauselength,5). + +:-begin_bg. + + +my_add(A,B,C) :- nonvar(A), nonvar(B), between(1,30,A),between(1,30,B), C is A+B. +my_add(A,B,C) :- nonvar(A), nonvar(C), between(1,30,A),between(1,30,B), B is C-A. +my_add(A,B,C) :- nonvar(C), nonvar(B), between(1,30,A),between(1,30,B), A is C-B. + + +my_mult(A,B,C) :- nonvar(A), nonvar(B), between(1,30,A),between(1,30,B), integer(A), integer(B), C is A*B. +my_mult(A,B,C) :- nonvar(A), nonvar(C), between(1,30,A),between(1,30,B), \+(A=0), integer(A), integer(C), B is C/A. +my_mult(A,B,C) :- nonvar(C), nonvar(B), between(1,30,A),between(1,30,B), \+(B=0), integer(B), integer(C), A is C/B. + + + +nlist([]). +nlist([_|_]). + + +% definition to use during lazy evaluation +my_leq([P,N],Value):- + !, + sort_values(ascending,N,N1), + sort_values(descending,P,P1), + find_threshold_leq(P1,N1,Value). +% definition to use during normal evaluation +my_leq(X,Value):- + number(X), number(Value), !, + X =< Value. +% definition to use during construction of bottom clause +my_leq(X,X). + + +find_threshold_leq([P|Ps],[N|Ns],X):- + N =< P, !, + find_threshold_leq(Ps,[N|Ns],X). +find_threshold_leq([P|Ps],[N|Ns],X):- + X is (P+N)/2. + +% definition to use during lazy evaluation +my_geq([P,N],Value):- + !, + sort_values(descending,N,N1), + sort_values(ascending,P,P1), + find_threshold_geq(P1,N1,Value). +% definition to use during normal evaluation +my_geq(X,Value):- + number(X), number(Value), !, + X >= Value. +% definition to use during construction of bottom clause +my_geq(X,X). + + +find_threshold_geq([P|Ps],[N|Ns],X):- + P =< N, !, + find_threshold_geq(Ps,[N|Ns],X). +find_threshold_geq([P|_],[N|_],X):- + X is (P+N)/2. + + +% definition to use during lazy evaluation +my_lt([P,N],Value):- + !, + sort_values(ascending,N,N1), + sort_values(descending,P,P1), + find_threshold_lt(P1,N1,Value). +% definition to use during normal evaluation +my_lt(X,Value):- + number(X), number(Value), !, + X >= Value. +% definition to use during construction of bottom clause +my_lt(X,X). + +find_threshold_lt([P|Ps],[N|Ns],X):- + N < P, !, + find_threshold_lt(Ps,[N|Ns],X). +find_threshold_lt([P|_],[N|_],X):- + X is (P+N)/2. + +% definition to use during lazy evaluation +my_gt([P,N],Value):- + !, + sort_values(descending,N,N1), + sort_values(ascending,P,P1), + find_threshold_gt(P1,N1,Value). +% definition to use during normal evaluation +my_gt(X,Value):- + number(X), number(Value), !, + X >= Value. +% definition to use during construction of bottom clause +my_gt(X,X). + +find_threshold_gt([P|Ps],[N|Ns],X):- + P < N, !, + find_threshold_gt(Ps,[N|Ns],X). +find_threshold_gt([P|_],[N|_],X):- + X is (P+N)/2. + + + +sort_values(ascending,L,L1):- + sort(L,L1). +sort_values(descending,L,L1):- + sort(L,L0), + reverse(L0,L1). + + + + +%my_geq(A,A). +my_geq(A,B) :- nonvar(B), !, A>=B. +%my_leq(A,A). +my_leq(A,B) :- nonvar(B), !, A=B. +%my_lt(A,A). +my_lt(A,B) :- nonvar(B), !, A +?- induce(Program). +*/ +:-end_bg. + +%:- begin_in. + +% Training #1 +begin(model(0)). +pos. +piece(0,obj_515_t_a79310a0_trn_0_in). +lhs(obj_515_t_a79310a0_trn_0_in). +cenGX(obj_515_t_a79310a0_trn_0_in,1). +cenGY(obj_515_t_a79310a0_trn_0_in,1). +color(obj_515_t_a79310a0_trn_0_in,cyan). +size(obj_515_t_a79310a0_trn_0_in,4). +shape(obj_515_t_a79310a0_trn_0_in,sid1111). + +piece(0,obj_737_t_a79310a0_trn_0_out). +rhs(obj_737_t_a79310a0_trn_0_out). +cenGX(obj_737_t_a79310a0_trn_0_out,1). +cenGY(obj_737_t_a79310a0_trn_0_out,2). +color(obj_737_t_a79310a0_trn_0_out,red). +size(obj_737_t_a79310a0_trn_0_out,4). +shape(obj_737_t_a79310a0_trn_0_out,sid1111). +end(model(0)). + +% Training #2 +begin(model(1)). +pos. +pos(1). +piece(1,obj_592_t_a79310a0_trn_1_in). +lhs(obj_592_t_a79310a0_trn_1_in). +cenGX(obj_592_t_a79310a0_trn_1_in,2). +cenGY(obj_592_t_a79310a0_trn_1_in,1). +color(obj_592_t_a79310a0_trn_1_in,cyan). +size(obj_592_t_a79310a0_trn_1_in,1). +shape(obj_592_t_a79310a0_trn_1_in,sid2222). + +piece(1,obj_40_t_a79310a0_trn_1_out). +rhs(obj_40_t_a79310a0_trn_1_out). +cenGX(obj_40_t_a79310a0_trn_1_out,2). +cenGY(obj_40_t_a79310a0_trn_1_out,2). +color(obj_40_t_a79310a0_trn_1_out,red). +size(obj_40_t_a79310a0_trn_1_out,1). +shape(obj_40_t_a79310a0_trn_1_out,sid2222). +end(model(1)). + + +% Training #3 +begin(model(2)). +pos. +piece(2,obj_107_t_a79310a0_trn_2_in). +lhs(obj_107_t_a79310a0_trn_2_in). +cenGX(obj_107_t_a79310a0_trn_2_in,2). +cenGY(obj_107_t_a79310a0_trn_2_in,2). +color(obj_107_t_a79310a0_trn_2_in,cyan). +size(obj_107_t_a79310a0_trn_2_in,3). +shape(obj_107_t_a79310a0_trn_2_in,sid1111). + +piece(2,obj_354_t_a79310a0_trn_2_out). +rhs(obj_354_t_a79310a0_trn_2_out). +cenGX(obj_354_t_a79310a0_trn_2_out,2). +cenGY(obj_354_t_a79310a0_trn_2_out,3). +color(obj_354_t_a79310a0_trn_2_out,red). +size(obj_354_t_a79310a0_trn_2_out,3). +shape(obj_354_t_a79310a0_trn_2_out,sid1111). +end(model(2)). + + +% Test #1 +piece(10,obj_105_t_a79310a0_tst_0_in). +lhs(obj_105_t_a79310a0_tst_0_in). +cenGX(obj_105_t_a79310a0_tst_0_in,2). +cenGY(obj_105_t_a79310a0_tst_0_in,1). +color(obj_105_t_a79310a0_tst_0_in,cyan). +size(obj_105_t_a79310a0_tst_0_in,4). +shape(obj_105_t_a79310a0_tst_0_in,sid3333). + +rhs(obj_245_t_a79310a0_tst_0_out). +% must predict output +/* +piece(10,obj_245_t_a79310a0_tst_0_out). +cenGX(obj_245_t_a79310a0_tst_0_out,2). +cenGY(obj_245_t_a79310a0_tst_0_out,2). +color(obj_245_t_a79310a0_tst_0_out,red). +size(obj_245_t_a79310a0_tst_0_out,4). +shape(obj_245_t_a79310a0_tst_0_out,sid3333). +*/ + +%:- end_in. +:-end_bg. + +%:-begin_in_pos. +zendo(0). +zendo(1). +zendo(2). +zendo(10). +%:-end_in_pos. +:-begin_in_neg. + +:-end_in_neg. + + + +%:- fixup_exports. + +%:- module(user). +%:- user:ensure_loaded('../kaggle_arc'). +%:- module(aleph_sample). +:- wdmsg("% try: ?- aleph_sample:induce_tree(Program),!,pp(Program). "). + +aa:- nodebug,notrace,cls,(aleph_sample:induce_tree(Program)),notrace,!,pp(Program). + +end_of_file. + + % Simple illustration of constructing tree-based models within Aleph % To run do the following: % a. Load Aleph @@ -29,21 +387,6 @@ % = -x + 1 ( x > -0.5) % adding more examples rectifies this: see wedge.f -/** -?- induce_tree(Program). -*/ - -:- include(kaggle_arc_header). - -:- if(current_module(trill)). -:- set_prolog_flag_until_eof(trill_term_expansion,false). -:- endif. - -:- use_module(library(aleph)). -:- if(current_predicate(use_rendering/1)). -:- use_rendering(prolog). -:- endif. -:- aleph. %%%%%%%%%%%%%%%%%%%%%%%%%%%% % specify tree type @@ -85,35 +428,35 @@ % Background lteq(X,Y):- - var(Y), !, - X = Y. + var(Y), !, + X = Y. lteq(X,Y):- - number(X), number(Y), - X =< Y. + number(X), number(Y), + X =< Y. % definition for model construction (parameter estimation) predict(X,Y,[M,C,Sd]):- - list(X), - list(Y), !, - l_regress1(Y,X,M,C,Sd). +list(X), +list(Y), !, +l_regress1(Y,X,M,C,Sd). % definition for prediction predict(X,Y,[M,C,_]):- - number(X), var(Y), !, - Y is M*X + C. +number(X), var(Y), !, +Y is M*X + C. % definition for model checking predict(X,Y,[M,C,Sd]):- - number(Y), number(X), !, - Y1 is M*X + C, - Diff is Y - Y1, - abs_val(Diff,ADiff), - ADiff =< 3*Sd. +number(Y), number(X), !, +Y1 is M*X + C, +Diff is Y - Y1, +abs_val(Diff,ADiff), +ADiff =< 3*Sd. % very simple univariate linear regression l_regress1([YVals|_],[XVals|_],M,C,0.0):- - YVals = [Y1,Y2|_], - XVals = [X1,X2|_], - M is (Y2-Y1)/(X2-X1), - C is Y1 - M*X1. + YVals = [Y1,Y2|_], + XVals = [X1,X2|_], + M is (Y2-Y1)/(X2-X1), + C is Y1 - M*X1. %%%%%%%%%%%%%%%%%%%%%%%%%%%% % Constraints @@ -142,7 +485,7 @@ f(-1.0,0.0). f(-0.5,0.5). - f(-0.25,0.75). % adding this results in the correct theory +% f(-0.25,0.75). % adding this results in the correct theory f(0.0,1.0). f(0.5,0.5). f(1.0,0.0). @@ -152,5 +495,5 @@ :-end_in_neg. -:- fixup_exports. + diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/induction/h_muarc_alephlib.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/induction/h_muarc_alephlib.pl index 3a5cce26b0..db4ff66398 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/induction/h_muarc_alephlib.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/induction/h_muarc_alephlib.pl @@ -159,7 +159,7 @@ system:term_expansion((:- aleph), []) :- prolog_load_context(module, M), - arc_assert(aleph_input_mod(M)),!, + assert(aleph_input_mod(M)),!, initialize(M). aleph_module(M):-aleph_input_mod(M),!. @@ -172,7 +172,7 @@ % aleph:aleph_manual(Man), % write('Manual: '), % write(Man), nl, nl, - aleph:aleph_version(V), aleph:set(version,V,M), aleph:reset(M), + aleph:aleph_version(V), aleph:aleph_set_m(version,V,M), aleph:reset(M), %findall(local_setting(P,V),default_setting_sc(P,V),L), %assert_all(L,M,_), M:dynamic((pos_on/0,neg_on/0,bg_on/0,incneg/1,incpos/1,in/1,bgc/1,bg/1)), @@ -203,26 +203,27 @@ '$aleph_determination'/2, '$aleph_search_seen'/2)), M:dynamic((prune/1,cost/3,example/3,aleph_portray/1)), + M:multifile((prune/1,cost/3,example/3,aleph_portray/1)), style_check(-discontiguous), aleph:init(swi,M), - arc_assert(M:(reduce:-reduce(_))), - arc_assert(M:(induce_constraints:-induce_constraints(_))), - arc_assert(M:(induce_modes:-induce_modes(_))), - arc_assert(M:(induce_incremental:-induce_incremental(_))), - arc_assert(M:(induce_clauses:-induce_clauses(_))), - arc_assert(M:(induce:-induce(_))), - arc_assert(M:(induce_tree:-induce_tree(_))), - arc_assert(M:(induce_max:-induce_max(_))), - arc_assert(M:(induce_cover:-induce_cover(_))), - arc_assert(M:(induce_theory:-induce_theory(_))), - arc_assert(M:(induce_features:-induce_features(_))), - arc_assert(M:(rdhyp:-rdhyp(_))), - arc_assert(M:(sphyp:-sphyp_i(_))), - arc_assert(M:(addgcws:-addgcws_i(_))), - arc_assert(M:(rmhyp:-rmhyp_i(_))), - arc_assert(M:(addhyp:-addhyp_i(_))), - arc_assert(M:(covers:-covers(_))), - arc_assert(M:(coversn:-coversn(_))), + assert(M:(reduce:-reduce(_))), + assert(M:(induce_constraints:-induce_constraints(_))), + assert(M:(induce_modes:-induce_modes(_))), + assert(M:(induce_incremental:-induce_incremental(_))), + assert(M:(induce_clauses:-induce_clauses(_))), + assert(M:(induce:-induce(_))), + assert(M:(induce_tree:-induce_tree(_))), + assert(M:(induce_max:-induce_max(_))), + assert(M:(induce_cover:-induce_cover(_))), + assert(M:(induce_theory:-induce_theory(_))), + assert(M:(induce_features:-induce_features(_))), + assert(M:(rdhyp:-rdhyp(_))), + assert(M:(sphyp:-sphyp_i(_))), + assert(M:(addgcws:-addgcws_i(_))), + assert(M:(rmhyp:-rmhyp_i(_))), + assert(M:(addhyp:-addhyp_i(_))), + assert(M:(covers:-covers(_))), + assert(M:(coversn:-coversn(_))), aleph:clean_up(M), retractall(M:example(_,_,_)), @@ -232,7 +233,7 @@ system:term_expansion((:- begin_bg), []) :- prolog_load_context(module, M), aleph_input_mod(M),!, - arc_assert(M:bg_on). + assert(M:bg_on). system:term_expansion(C, C) :- C\= (:- end_bg), @@ -249,14 +250,14 @@ % (M:bg(BG0)-> % retract(M:bg(BG0)), % my_append(BG0,L,BG), - % arc_assert(M:bg(BG)) + % assert(M:bg(BG)) % ; % assert_all(L,M,_) % ). system:term_expansion((:- begin_in_pos), []) :- prolog_load_context(module, M), aleph_input_mod(M),!, - arc_assert(M:pos_on), + assert(M:pos_on), clean_up_examples(pos,M), asserta(M:'$aleph_global'(size,size(pos,0))). @@ -277,9 +278,9 @@ % retract(M:in(IN0)),% % % my_append(IN0,L,IN), -% arc_assert(M:in(IN)) +% assert(M:in(IN)) % ; -% arc_assert(M:in(L)) +% assert(M:in(L)) % ). %%%%%% @@ -287,7 +288,7 @@ system:term_expansion((:- begin_in_neg), []) :- prolog_load_context(module, M), aleph_input_mod(M),!, - arc_assert(M:neg_on), + assert(M:neg_on), aleph:clean_up_examples(neg,M), asserta(M:'$aleph_global'(size,size(neg,0))). @@ -315,7 +316,7 @@ system:term_expansion(:- aleph_set(A,B), []) :- prolog_load_context(module, M), aleph_input_mod(M),!, - aleph:set(A,B,M). + aleph:aleph_set_m(A,B,M). system:term_expansion(:- determination(A,B), []) :- prolog_load_context(module, M), @@ -333,9 +334,9 @@ % retract(M:in(IN0)), % my_append(IN0,L,IN), -% arc_assert(M:in(IN)) +% assert(M:in(IN)) % ; -% arc_assert(M:in(L)) +% assert(M:in(L)) % ). system:term_expansion((:- aleph_read_all), []) :- prolog_load_context(module, M), @@ -367,9 +368,9 @@ asserta(M:'$aleph_global'(atoms_left,atoms_left(neg,ExN))), asserta(M:'$aleph_global'(last_example,last_example(neg,NN))), set_lazy_recalls(M), - (setting(prior,_,M) -> true; + (aleph_setting_m(prior,_,M) -> true; normalise_distribution([NP-pos,NN-neg],Prior), - set(prior,Prior,M) + aleph_set_m(prior,Prior,M) ). assert_all([],_M,[]). @@ -433,20 +434,20 @@ style_check(-discontiguous), M:dynamic(aleph_false/0), M:dynamic(example/3), - arc_assert((depth_bound_call(G,L,M):- + assert((depth_bound_call(G,L,M):- call_with_depth_limit(M:G,L,R), R \= depth_limit_exceeded)), (predicate_property(numbervars(_,_,_),built_in) -> true; - arc_assert((numbervars(A,B,C):- numbervars(A,'$VAR',B,C)))), - arc_assert((system(X):- shell(X))), - arc_assert((exists(X):- exists_file(X))), - arc_assert((aleph_reconsult(F):- consult(F))), - %arc_assert((aleph_random(X):- I = 1000000, X is float(random(I-1))/float(I))), + assert((numbervars(A,B,C):- numbervars(A,'$VAR',B,C)))), + assert((system(X):- shell(X))), + assert((exists(X):- exists_file(X))), + assert((aleph_reconsult(F):- consult(F))), + %assert((aleph_random(X):- I = 1000000, X is float(random(I-1))/float(I))), (predicate_property(thread_local(_),built_in) -> true; - arc_assert(thread_local(_))), + assert(thread_local(_))), (predicate_property(delete_file(_),built_in) -> true; - arc_assert(delete_file(_))). + assert(delete_file(_))). aleph_background_predicate(Lit,M):- predicate_property(M:Lit,P), @@ -539,7 +540,7 @@ retractall(M:'$aleph_local'(flatten_num,_)), asserta(M:'$aleph_local'(flatten_num,Last)), M:'$aleph_sat_atom'(_,_),!, - (setting(permute_bottom,Permute,M) -> true; Permute = false), + (aleph_setting_m(permute_bottom,Permute,M) -> true; Permute = false), flatten_atoms(Permute,Depth,MaxDepth,Last1,M). flatten(_,_,_,Last,M):- retract(M:'$aleph_local'(flatten_num,Last)), !. @@ -722,7 +723,7 @@ % modify the literal database: check if performing lazy evaluation % of bottom clause, and update input and output terms in literal add_lit(Last,Negated,FAtom,I,O,_,_,Last,M):- - setting(construct_bottom,CBot,M), + aleph_setting_m(construct_bottom,CBot,M), (CBot = false ; CBot = reduction), (Negated = true -> Lit = not(FAtom); Lit = FAtom), M:'$aleph_sat_litinfo'(_,0,Lit,I,O,_), !. @@ -904,13 +905,13 @@ % process continues until there is no change in the length of a clause % within an iteration. The algorithm is O(n^2). rm_nreduce(Last,N,M):- - setting(nreduce_bottom,true,M), !, + aleph_setting_m(nreduce_bottom,true,M), !, get_litnums(1,Last,BottomLits,M), M:'$aleph_global'(atoms,atoms(neg,Neg)), - setting(depth,Depth,M), - setting(prooftime,Time,M), - setting(proof_strategy,Proof,M), - setting(noise,Noise,M), + aleph_setting_m(depth,Depth,M), + aleph_setting_m(prooftime,Time,M), + aleph_setting_m(proof_strategy,Proof,M), + aleph_setting_m(noise,Noise,M), neg_reduce(BottomLits,Neg,Last,Depth/Time/Proof,Noise,M), get_marked(1,Last,Lits,M), length(Lits,N), @@ -1048,7 +1049,7 @@ % or produce outputs that are not used by any literal % controlled by setting flag check_useless rm_uselesslits(_,0,M):- - setting(check_useless,false,M), !. + aleph_setting_m(check_useless,false,M), !. rm_uselesslits(Last,N,M):- M:'$aleph_sat'(hovars,OVars), OVars \= [], !, @@ -1064,7 +1065,7 @@ % call user-defined predicate redundant/2 to remove redundant % literals from bottom clause. Redundancy checking only done on request rm_redundant(_,0,M):- - setting(check_redundant,false,M), !. + aleph_setting_m(check_redundant,false,M), !. rm_redundant(Last,N,M):- mark_redundant_lits(1,Last,M), get_marked(1,Last,Lits,M), @@ -1213,7 +1214,7 @@ split_vars(Depth,FAtom,I,O,C,SplitAtom,IVars,OVars,Equivs,M):- - setting(splitvars,true,M), !, + aleph_setting_m(splitvars,true,M), !, get_args(FAtom,I,[],IVarList), get_args(FAtom,O,[],OVarList), get_var_equivs(Depth,IVarList,OVarList,IVars,OVars0,Equivs0), @@ -1485,56 +1486,56 @@ get_search_settings(S,M):- functor(S,set,47), - setting(nodes,MaxNodes,M), arg(1,S,MaxNodes), - setting(explore,Explore,M), arg(2,S,Explore), - setting(refineop,RefineOp,M), arg(3,S,RefineOp), - setting(searchstrat,SearchStrat,M), setting(evalfn,EvalFn,M), + aleph_setting_m(nodes,MaxNodes,M), arg(1,S,MaxNodes), + aleph_setting_m(explore,Explore,M), arg(2,S,Explore), + aleph_setting_m(refineop,RefineOp,M), arg(3,S,RefineOp), + aleph_setting_m(searchstrat,SearchStrat,M), aleph_setting_m(evalfn,EvalFn,M), arg(4,S,SearchStrat/EvalFn), - (setting(greedy,Greedy,M)-> arg(5,S,Greedy); arg(5,S,false)), - setting(verbosity,Verbose,M), arg(6,S,Verbose), - setting(clauselength,CLength,M), arg(7,S,CLength), - setting(caching,Cache,M), arg(8,S,Cache), - (setting(prune_defs,Prune,M)-> arg(9,S,Prune); arg(9,S,false)), - setting(lazy_on_cost,LCost,M), arg(10,S,LCost), - setting(lazy_on_contradiction,LContra,M), arg(11,S,LContra), - setting(lazy_negs,LNegs,M), arg(12,S,LNegs), - setting(minpos,MinPos,M), arg(13,S,MinPos), - setting(depth,Depth,M), arg(14,S,Depth), - setting(cache_clauselength,CCLim,M), arg(15,S,CCLim), + (aleph_setting_m(greedy,Greedy,M)-> arg(5,S,Greedy); arg(5,S,false)), + aleph_setting_m(verbosity,Verbose,M), arg(6,S,Verbose), + aleph_setting_m(clauselength,CLength,M), arg(7,S,CLength), + aleph_setting_m(caching,Cache,M), arg(8,S,Cache), + (aleph_setting_m(prune_defs,Prune,M)-> arg(9,S,Prune); arg(9,S,false)), + aleph_setting_m(lazy_on_cost,LCost,M), arg(10,S,LCost), + aleph_setting_m(lazy_on_contradiction,LContra,M), arg(11,S,LContra), + aleph_setting_m(lazy_negs,LNegs,M), arg(12,S,LNegs), + aleph_setting_m(minpos,MinPos,M), arg(13,S,MinPos), + aleph_setting_m(depth,Depth,M), arg(14,S,Depth), + aleph_setting_m(cache_clauselength,CCLim,M), arg(15,S,CCLim), (M:'$aleph_global'(size,size(pos,PSize))-> arg(16,S,PSize); arg(16,S,0)), - setting(noise,Noise,M), arg(17,S,Noise), - setting(minacc,MinAcc,M), arg(18,S,MinAcc), - setting(minscore,MinScore,M), arg(19,S,MinScore), + aleph_setting_m(noise,Noise,M), arg(17,S,Noise), + aleph_setting_m(minacc,MinAcc,M), arg(18,S,MinAcc), + aleph_setting_m(minscore,MinScore,M), arg(19,S,MinScore), (M:'$aleph_global'(size,size(rand,RSize))-> arg(20,S,RSize); arg(20,S,0)), - setting(mingain,MinGain,M), arg(21,S,MinGain), - setting(search,Search,M), arg(22,S,Search), + aleph_setting_m(mingain,MinGain,M), arg(21,S,MinGain), + aleph_setting_m(search,Search,M), arg(22,S,Search), findall(PN/PA,M:'$aleph_global'(lazy_evaluate,lazy_evaluate(PN/PA)),LazyPreds), arg(23,S,LazyPreds), (M:'$aleph_global'(size,size(neg,NSize))-> arg(24,S,NSize); arg(24,S,0)), - setting(openlist,OSize,M), arg(25,S,OSize), - setting(check_redundant,RCheck,M), arg(26,S,RCheck), + aleph_setting_m(openlist,OSize,M), arg(25,S,OSize), + aleph_setting_m(check_redundant,RCheck,M), arg(26,S,RCheck), (M:'$aleph_sat'(eq,Eq) -> arg(27,S,Eq); arg(27,S,false)), (M:'$aleph_sat'(hovars,HOVars) -> arg(28,S,HOVars); arg(28,S,_HOVars)), - setting(prooftime,PTime,M), arg(29,S,PTime), - setting(construct_bottom,CBott,M), arg(30,S,CBott), + aleph_setting_m(prooftime,PTime,M), arg(29,S,PTime), + aleph_setting_m(construct_bottom,CBott,M), arg(30,S,CBott), (get_ovars1(false,1,HIVars,M) -> arg(31,S,HIVars); arg(31,S,[])), - setting(language,Lang,M), arg(32,S,Lang), - setting(splitvars,Split,M), arg(33,S,Split), - setting(proof_strategy,Proof,M), arg(34,S,Proof), - setting(portray_search,VSearch,M), arg(35,S,VSearch), - setting(searchtime,Time,M), arg(36,S,Time), - setting(optimise_clauses,Optim,M), arg(37,S,Optim), - setting(newvars,NewV,M), arg(38,S,NewV), - (setting(rls_type,RlsType,M) -> arg(39,S,RlsType);arg(39,S,false)), - setting(minposfrac,MinPosFrac,M), arg(40,S,MinPosFrac), - (setting(recursion,_Recursion,M) -> true; _Recursion = false), + aleph_setting_m(language,Lang,M), arg(32,S,Lang), + aleph_setting_m(splitvars,Split,M), arg(33,S,Split), + aleph_setting_m(proof_strategy,Proof,M), arg(34,S,Proof), + aleph_setting_m(portray_search,VSearch,M), arg(35,S,VSearch), + aleph_setting_m(searchtime,Time,M), arg(36,S,Time), + aleph_setting_m(optimise_clauses,Optim,M), arg(37,S,Optim), + aleph_setting_m(newvars,NewV,M), arg(38,S,NewV), + (aleph_setting_m(rls_type,RlsType,M) -> arg(39,S,RlsType);arg(39,S,false)), + aleph_setting_m(minposfrac,MinPosFrac,M), arg(40,S,MinPosFrac), + (aleph_setting_m(recursion,_Recursion,M) -> true; _Recursion = false), prolog_type(Prolog), arg(41,S,Prolog), - setting(interactive,Interactive,M), arg(42,S,Interactive), - setting(lookahead,LookAhead,M), arg(43,S,LookAhead), - (setting(construct_features,Features,M)-> arg(44,S,Features); arg(44,S,false)), - setting(max_features,FMax,M), arg(45,S,FMax), - setting(subsample,SS,M), arg(46,S,SS), - setting(subsamplesize,SSize,M), arg(47,S,SSize). + aleph_setting_m(interactive,Interactive,M), arg(42,S,Interactive), + aleph_setting_m(lookahead,LookAhead,M), arg(43,S,LookAhead), + (aleph_setting_m(construct_features,Features,M)-> arg(44,S,Features); arg(44,S,false)), + aleph_setting_m(max_features,FMax,M), arg(45,S,FMax), + aleph_setting_m(subsample,SS,M), arg(46,S,SS), + aleph_setting_m(subsamplesize,SSize,M), arg(47,S,SSize). % stop search from proceeding if certain % conditions are reached. These are: @@ -2062,17 +2063,17 @@ extract_pos(Label,P), extract_neg(Label,N), Acc is P/(P+N), - setting(noise,Noise,M), - setting(minacc,MinAcc,M), - setting(minpos,MinPos,M), + aleph_setting_m(noise,Noise,M), + aleph_setting_m(minacc,MinAcc,M), + aleph_setting_m(minpos,MinPos,M), (N > Noise; Acc < MinAcc; P < MinPos), !, fail. clause_ok(Clause,_,M):- M:prune(Clause), !, fail. clause_ok(Clause,_,M):- - setting(language,Lang,M), + aleph_setting_m(language,Lang,M), \+ lang_ok(Clause,Lang), !, fail. clause_ok(Clause,_,M):- - setting(newvars,NewVars,M), + aleph_setting_m(newvars,NewVars,M), \+ newvars_ok(Clause,NewVars), !, fail. clause_ok(_,_,_M). @@ -2250,7 +2251,7 @@ split_clause(CClause,CHead,CBody), example_saturated(CHead,M), store(stage,M), - set(stage,saturation,M), + aleph_set_m(stage,saturation,M), match_lazy_bottom1(CBody,M), reinstate(stage,M), match_bot_lits(AlephClause,[],Lits,M). @@ -2284,7 +2285,7 @@ match_mode(_,_,_M). flatten_matched_atoms(Loc,M):- - setting(i,IVal,M), + aleph_setting_m(i,IVal,M), (retract(M:'$aleph_sat'(botsize,BSize))-> true; BSize = 0), (retract(M:'$aleph_sat'(lastlit,Last))-> true ; Last = 0), (Loc = head -> @@ -2655,14 +2656,14 @@ record_clause(good,Label1,Clause,Node1,M). update_good(Label,Clause,M):- - setting(good,true,M), !, + aleph_setting_m(good,true,M), !, Label = [_,_,L|_], - setting(check_good,Flag,M), + aleph_setting_m(check_good,Flag,M), update_good(Flag,L,Label,Clause,M). update_good(_,_,_M). update_good(_,_,_,_,M):- - setting(goodfile,_,M), !. + aleph_setting_m(goodfile,_,M), !. update_good(true,L,Label,Clause,M):- M:'$aleph_good'(L,Label,Clause), !. update_good(_,L,Label,Clause,M):- @@ -2773,11 +2774,11 @@ % within randomised local search select_nextbest(rls,NodeRef,M):- retractall(M:'$aleph_search'(nextnode,_)), - setting(rls_type,Type,M), + aleph_setting_m(rls_type,Type,M), (retract(M:'$aleph_search'(rls_parentstats,stats(PStats,_,_))) -> true; true), (rls_nextbest(Type,PStats,NodeRef,Label,M) -> asserta(M:'$aleph_search'(rls_parentstats,stats(Label,[],[]))), - setting(rls_type,RlsType,M), + aleph_setting_m(rls_type,RlsType,M), (RlsType = rrr -> true; assertz(M:'$aleph_search'(nextnode,NodeRef))); @@ -2810,7 +2811,7 @@ aleph_remove_nth(N,Choices,NodeRef-Label,_), retractall(M:'$aleph_search_gain'(_,_,_,_)). rls_nextbest(wsat,PStats,NodeRef,Label,M):- - setting(walk,WProb,M), + aleph_setting_m(walk,WProb,M), aleph_random(P), P >= WProb, !, rls_nextbest(gsat,PStats,NodeRef,Label,M). @@ -2825,7 +2826,7 @@ aleph_remove_nth(N,Choices,NodeRef-Label,_), retractall(M:'$aleph_search_gain'(_,_,_,_)). rls_nextbest(anneal,[P,N|_],NodeRef,Label,M):- - setting(temperature,Temp,M), + aleph_setting_m(temperature,Temp,M), retract(M:'$aleph_search'(openlist,_)), asserta(M:'$aleph_search'(openlist,[])), findall(N-L,M:'$aleph_search_gain'(_,_,N,L),AllNodes), @@ -3250,7 +3251,7 @@ add_prune_cache(false,_M):- !. add_prune_cache(Entry,M):- - (M:'$aleph_global'(caching,set(caching,true))-> + (M:'$aleph_global'(caching,aleph_set_m(caching,true))-> functor(Entry,_,Arity), A1 is Arity - 2, arg(A1,Entry,Clause), @@ -3297,7 +3298,7 @@ % T R E E S construct_tree(Type,M):- - setting(searchtime,Time,M), + aleph_setting_m(searchtime,Time,M), Inf is inf, Time =\= Inf, SearchTime is integer(Time), @@ -3320,7 +3321,7 @@ get_start_distribution(Type,Distribution,M), asserta(M:'$aleph_search'(tree_startdistribution,d(Type,Distribution))), M:'$aleph_global'(atoms_left,atoms_left(pos,Pos)), - setting(dependent,Argno,M), + aleph_setting_m(dependent,Argno,M), p_message('constructing tree'), stopwatch(StartClock), get_search_settings(S,M), @@ -3337,17 +3338,17 @@ get_start_distribution(regression,0-[0,0],_M):- !. get_start_distribution(model,0-[0,0],M):- - setting(evalfn,mse,M), !. + aleph_setting_m(evalfn,mse,M), !. get_start_distribution(model,0-Distribution,M):- - setting(evalfn,accuracy,M), !, - (setting(classes,Classes,M) -> true; + aleph_setting_m(evalfn,accuracy,M), !, + (aleph_setting_m(classes,Classes,M) -> true; !, p_message('missing setting for classes'), fail), initialise_distribution(Classes,Distribution), !. get_start_distribution(Tree,0-Distribution,M):- (Tree = classification; Tree = class_probability), - (setting(classes,Classes,M) -> true; + (aleph_setting_m(classes,Classes,M) -> true; !, p_message('missing setting for classes'), fail), @@ -3375,7 +3376,7 @@ find_tree1(LeavesLeft,S,Type,Predict,M). prune_rules(S,Tree,Predict,M):- - setting(prune_tree,true,M), + aleph_setting_m(prune_tree,true,M), prune_rules1(Tree,S,Predict,M), !. prune_rules(_,_,_,_M). @@ -3420,7 +3421,7 @@ % estimate error using binomial distribution as done in C4.5 estimate_error(classification,Incorrect,Total,Error,M):- - setting(confidence,Conf,M), + aleph_setting_m(confidence,Conf,M), estimate_error(1.0/0.0,0.0/1.0,Conf,Total,Incorrect,Error). % estimate upper bound on sample std deviation by @@ -3429,7 +3430,7 @@ % variance is (n-1)s^2/X^2(alpha/2) =< var =< (n-1)s^2/X^2(1-alpha/2) estimate_error(regression,Sd,1,Sd,_M):- !. estimate_error(regression,Sd,N,Upper,M):- - (setting(confidence,Conf,M) -> true; Conf = 0.95), + (aleph_setting_m(confidence,Conf,M) -> true; Conf = 0.95), Alpha is 1.0 - Conf, DF is N - 1, Prob is 1 - Alpha/2, @@ -3437,7 +3438,7 @@ Upper is Sd*sqrt((N-1)/ChiSq). bound_error(classification,Error,Total,Lower,Upper,M):- - (setting(confidence,Alpha,M) -> true; Alpha = 0.95), + (aleph_setting_m(confidence,Alpha,M) -> true; Alpha = 0.95), approx_z(Alpha,Z), Lower is Error - Z*sqrt(Error*(1-Error)/Total), Upper is Error + Z*sqrt(Error*(1-Error)/Total). @@ -3501,7 +3502,7 @@ add_prediction(Tree,Clause,PredictArg,Examples,Clause1,M):- split_clause(Clause,Head,_), (Tree = model -> - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), add_model(Evalfn,Clause,PredictArg,Examples,Clause1,_,_,M); node_stats(Tree,Examples,PredictArg,Distribution,M), leaf_prediction(Tree,Distribution,Prediction,Error), @@ -3842,7 +3843,7 @@ % examine list of clauses to be specialised % generate an exception theory for each clause that covers negative examples gcws(M):- - setting(evalfn,EvalFn,M), + aleph_setting_m(evalfn,EvalFn,M), repeat, retract(M:'$aleph_search'(sphyp,hypothesis([P,N,L|T],Clause,PCover,NCover))), (PCover = _/_ -> label_create(pos,Clause,Label1,M), @@ -3857,8 +3858,8 @@ N1 = N), (N1 = 0 -> NewClause = Clause, NewLabel = [P1,N1,L|T]; MinAcc is P1/(2*P1 - 1), - set(minacc,MinAcc,M), - set(noise,N1,M), + aleph_set_m(minacc,MinAcc,M), + aleph_set_m(noise,N1,M), gcws(Clause,PCover1,NCover1,NewClause,M), L1 is L + 1, complete_label(EvalFn,NewClause,[P,0,L1],NewLabel,M)), @@ -3888,7 +3889,7 @@ % each clause obtained is added to list of clauses to be specialised cwinduce(M):- store(greedy,M), - set(greedy,true,M), + aleph_set_m(greedy,true,M), M:'$aleph_global'(atoms_left,atoms_left(pos,PosSet)), PosSet \= [], repeat, @@ -4087,7 +4088,7 @@ sat(uspec,Num,M), !. sat(Type,Num,M):- - setting(construct_bottom,false,M), !, + aleph_setting_m(construct_bottom,false,M), !, sat_prelims(M), M:example(Num,Type,Example), broadcast(start(sat(Num))), @@ -4097,7 +4098,7 @@ asserta(M:'$aleph_sat'(hovars,[])), broadcast(end(sat(Num, 0, 0.0))). sat(Type,Num,M):- - setting(construct_bottom,reduction,M), !, + aleph_setting_m(construct_bottom,reduction,M), !, sat_prelims(M), M:example(Num,Type,Example), broadcast(start(sat(Num))), @@ -4108,7 +4109,7 @@ asserta(M:'$aleph_sat'(hovars,HeadOVars)), broadcast(end(sat(Num, 0, 0.0))). sat(Type,Num,M):- - set(stage,saturation,M), + aleph_set_m(stage,saturation,M), sat_prelims(M), M:example(Num,Type,Example), broadcast(start(sat(Num))), @@ -4119,7 +4120,7 @@ integrate_args(unknown,Example,Output,M), stopwatch(StartClock), assertz(M:'$aleph_sat_atom'(Example,mode(Mode,Output,Input,Constants))), - M:'$aleph_global'(i,set(i,Ival)), + M:'$aleph_global'(i,aleph_set_m(i,Ival)), flatten(0,Ival,0,Last1,M), M:'$aleph_sat_litinfo'(1,_,Atom,_,_,_), get_vars(Atom,Output,HeadOVars), @@ -4167,7 +4168,7 @@ * Run a search on the current bottom clause, which can be obtained with the sat/1 command. */ reduce(M:Cl):- - setting(search,Search,M), + aleph_setting_m(search,Search,M), catch(reduce(Search,Cl,M),abort,reinstate_values(M)), !. reduce(Search,M):- @@ -4183,12 +4184,12 @@ retractall(M:'$aleph_search'(ibs_nodes,_)), retractall(M:'$aleph_search'(ibs_selected,_)), store_values([openlist,caching,explore],M), - set(openlist,1,M), - set(caching,true,M), - set(explore,true,M), + aleph_set_m(openlist,1,M), + aleph_set_m(caching,true,M), + aleph_set_m(explore,true,M), asserta(M:'$aleph_search'(ibs_rval,1.0)), asserta(M:'$aleph_search'(ibs_nodes,0)), - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), get_start_label(Evalfn,Label,M), (M:'$aleph_sat'(example,example(Num,Type)) -> M:example(Num,Type,Example), @@ -4198,7 +4199,7 @@ [],[])))), stopwatch(Start), repeat, - setting(openlist,OldOpen,M), + aleph_setting_m(openlist,OldOpen,M), p1_message('ibs beam width'), p_message(OldOpen), find_clause(bf,M), M:'$aleph_search'(current,current(_,Nodes0,[PC,NC|_]/_)), @@ -4210,7 +4211,7 @@ M:'$aleph_search'(selected,selected(BL,RCl,PCov,NCov)), NewOpen is 2*OldOpen, Nodes2 is Nodes0 + Nodes1, - set(openlist,NewOpen,M), + aleph_set_m(openlist,NewOpen,M), asserta(M:'$aleph_search'(ibs_rval,NewR)), asserta(M:'$aleph_search'(ibs_nodes,Nodes2)), ((NewR >= OldR; NewOpen > 512) -> true; @@ -4238,11 +4239,11 @@ retractall(M:'$aleph_search'(id_nodes,_)), retractall(M:'$aleph_search'(id_selected,_)), store_values([caching,clauselength],M), - setting(clauselength,MaxCLen,M), - set(clauselength,1,M), - set(caching,true,M), + aleph_setting_m(clauselength,MaxCLen,M), + aleph_set_m(clauselength,1,M), + aleph_set_m(caching,true,M), asserta(M:'$aleph_search'(id_nodes,0)), - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), get_start_label(Evalfn,Label,M), (M:'$aleph_sat'(example,example(Num,Type)) -> M:example(Num,Type,Example), @@ -4252,7 +4253,7 @@ [],[])))), stopwatch(Start), repeat, - setting(clauselength,OldCLen,M), + aleph_setting_m(clauselength,OldCLen,M), p1_message('id clauselength setting'), p_message(OldCLen), find_clause(df,M), M:'$aleph_search'(current,current(_,Nodes0,_)), @@ -4261,12 +4262,12 @@ M:'$aleph_search'(id_selected,selected([_,_,_,F1|_],_,_,_)), NewCLen is OldCLen + 1, Nodes2 is Nodes0 + Nodes1, - set(clauselength,NewCLen,M), + aleph_set_m(clauselength,NewCLen,M), M:'$aleph_search'(id_nodes,Nodes2), (F1 >= F -> true; retract(M:'$aleph_search'(id_selected,selected([_,_,_,F1|_],_,_,_))), asserta(M:'$aleph_search'(id_selected,selected([P,N,L,F|T],RCl,PCov,NCov))), - set(best,[P,N,L,F|T],M)), + aleph_set_m(best,[P,N,L,F|T],M)), NewCLen > MaxCLen, !, stopwatch(Stop), @@ -4289,11 +4290,11 @@ retractall(M:'$aleph_search'(ils_nodes,_)), retractall(M:'$aleph_search'(ils_selected,_)), store_values([caching,language],M), - set(searchstrat,bf,M), - set(language,1,M), - set(caching,true,M), + aleph_set_m(searchstrat,bf,M), + aleph_set_m(language,1,M), + aleph_set_m(caching,true,M), asserta(M:'$aleph_search'(ils_nodes,0)), - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), get_start_label(Evalfn,Label,M), (M:'$aleph_sat'(example,example(Num,Type)) -> M:example(Num,Type,Example), @@ -4303,7 +4304,7 @@ [],[])))), stopwatch(Start), repeat, - setting(language,OldLang,M), + aleph_setting_m(language,OldLang,M), p1_message('ils language setting'), p_message(OldLang), find_clause(bf,M), M:'$aleph_search'(current,current(_,Nodes0,_)), @@ -4312,12 +4313,12 @@ M:'$aleph_search'(ils_selected,selected([_,_,_,F1|_],_,_,_)), NewLang is OldLang + 1, Nodes2 is Nodes0 + Nodes1, - set(language,NewLang,M), + aleph_set_m(language,NewLang,M), asserta(M:'$aleph_search'(ils_nodes,Nodes2)), (F1 >= F -> true; retract(M:'$aleph_search'(ils_selected,selected([_,_,_,F1|_],_,_,_))), asserta(M:'$aleph_search'(ils_selected,selected([P,N,L,F|T],RCl,PCov,NCov))), - set(best,[P,N,L,F|T],M), + aleph_set_m(best,[P,N,L,F|T],M), fail), !, stopwatch(Stop), @@ -4341,24 +4342,24 @@ % the choice of these is specified by the parameter: rls_type % both annealing and GSAT employ random multiple restarts % and a limit on the number of moves -% the number of restarts is specified by set(tries,...) -% the number of moves is specified by set(moves,...) +% the number of restarts is specified by aleph_set_m(tries,...) +% the number of moves is specified by aleph_set_m(moves,...) % annealing currently restricted to using a fixed temperature -% the temperature is specified by set(temperature,...) +% the temperature is specified by aleph_set_m(temperature,...) % the use of a fixed temp. makes it equivalent to the Metropolis alg. % GSAT if given a ``random-walk probability'' performs Selman et als walksat -% the walk probability is specified by set(walk,...) +% the walk probability is specified by aleph_set_m(walk,...) % a walk probability of 0 is equivalent to doing standard GSAT reduce(rls,RBest,M):- !, - setting(tries,MaxTries,M), + aleph_setting_m(tries,MaxTries,M), MaxTries >= 1, store_values([caching,refine,refineop],M), - set(searchstrat,heuristic,M), - set(caching,true,M), - setting(refine,Refine,M), - (Refine \= false -> true; set(refineop,rls,M)), - setting(threads,Threads,M), + aleph_set_m(searchstrat,heuristic,M), + aleph_set_m(caching,true,M), + aleph_setting_m(refine,Refine,M), + (Refine \= false -> true; aleph_set_m(refineop,rls,M)), + aleph_setting_m(threads,Threads,M), rls_search(Threads, MaxTries, Time, Nodes, selected(BestLabel, RBest,PCover,NCover),M), add_hyp(BestLabel,RBest,PCover,NCover,M), @@ -4366,7 +4367,7 @@ p1_message('rls search time'), p_message(Time), p_message('rls best result'), pp_dclause(RBest,M), - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), show_stats(Evalfn,BestLabel), record_search_stats(RBest,Nodes,Time,M), noset(best,M), @@ -4379,27 +4380,27 @@ !, store_values([tries,moves,rls_type,clauselength_distribution],M), stopwatch(Start), - (setting(scs_sample,SampleSize,M) -> true; - setting(scs_percentile,K,M), + (aleph_setting_m(scs_sample,SampleSize,M) -> true; + aleph_setting_m(scs_percentile,K,M), K > 0.0, - setting(scs_prob,P,M), + aleph_setting_m(scs_prob,P,M), P < 1.0, SampleSize is integer(log(1-P)/log(1-K/100) + 1)), - (setting(scs_type,informed,M,M)-> - (setting(clauselength_distribution,_D,M,M) -> true; - setting(clauselength,CL,M), + (aleph_setting_m(scs_type,informed,M,M)-> + (aleph_setting_m(clauselength_distribution,_D,M,M) -> true; + aleph_setting_m(clauselength,CL,M), estimate_clauselength_distribution(CL,100,K,D,M), % max_in_list(D,Prob-Length), % p1_message('using clauselength distribution'), % p_message([Prob-Length]), - % set(clauselength_distribution,[Prob-Length])); + % aleph_set_m(clauselength_distribution,[Prob-Length])); p1_message('using clauselength distribution'), p_message(D), - set(clauselength_distribution,D,M)); + aleph_set_m(clauselength_distribution,D,M)); true), - set(tries,SampleSize,M), - set(moves,0,M), - set(rls_type,gsat,M), + aleph_set_m(tries,SampleSize,M), + aleph_set_m(moves,0,M), + aleph_set_m(rls_type,gsat,M), reduce(rls,M), stopwatch(Stop), Time is Stop - Start, @@ -4409,7 +4410,7 @@ p1_message('scs search time'), p_message(Time), p_message('scs best result'), pp_dclause(RBest,M), - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), show_stats(Evalfn,BestLabel), record_search_stats(RBest,Nodes,Time,M), p1_message('scs search time'), p_message(Time), @@ -4422,7 +4423,7 @@ reduce(ar,Cl,M):- !, clear_cache(M), - (setting(pos_fraction,PFrac,M) -> true; + (aleph_setting_m(pos_fraction,PFrac,M) -> true; p_message('value required for pos_fraction parameter'), fail), M:'$aleph_global'(atoms_left,atoms_left(pos,Pos)), @@ -4430,13 +4431,13 @@ interval_count(Pos,P), MinPos is PFrac*P, store_values([minpos,evalfn,explore,caching,minacc,good],M), - set(searchstrat,bf,M), - set(minpos,MinPos,M), - set(evalfn,coverage,M), - set(explore,true,M), - set(caching,true,M), - set(minacc,0.0,M), - set(good,true,M), + aleph_set_m(searchstrat,bf,M), + aleph_set_m(minpos,MinPos,M), + aleph_set_m(evalfn,coverage,M), + aleph_set_m(explore,true,M), + aleph_set_m(caching,true,M), + aleph_set_m(minacc,0.0,M), + aleph_set_m(good,true,M), asserta(M:'$aleph_global'(atoms_left,atoms_left(neg,[]))), find_clause(bf,M), show(good,M), @@ -4450,15 +4451,15 @@ reduce(ic,Cl,M):- !, store_values([minpos,minscore,evalfn,explore,refineop],M), - setting(refineop,RefineOp,M), - (RefineOp = false -> set(refineop,auto,M); true), - set(minpos,0,M), - set(searchstrat,bf,M), - set(evalfn,coverage,M), - set(explore,true,M), - setting(noise,N,M), + aleph_setting_m(refineop,RefineOp,M), + (RefineOp = false -> aleph_set_m(refineop,auto,M); true), + aleph_set_m(minpos,0,M), + aleph_set_m(searchstrat,bf,M), + aleph_set_m(evalfn,coverage,M), + aleph_set_m(explore,true,M), + aleph_setting_m(noise,N,M), MinScore is -N, - set(minscore,MinScore,M), + aleph_set_m(minscore,MinScore,M), find_clause(bf,Cl,M), reinstate_values([minpos,minscore,evalfn,explore,refineop],M). @@ -4480,8 +4481,8 @@ find_clause(Search,_Cl,M). find_clause(Search,RClause,M):- - set(stage,reduction,M), - set(searchstrat,Search,M), + aleph_set_m(stage,reduction,M), + aleph_set_m(searchstrat,Search,M), p_message('reduce'), reduce_prelims(L,P,N,M), asserta(M:'$aleph_search'(openlist,[])), @@ -4500,7 +4501,7 @@ add_hyp(L0,C0,P0,N0,M), (M:'$aleph_global'(max_set,max_set(Type,Num,Label1,ClauseNum))-> BestSoFar = Label1/ClauseNum; - (M:'$aleph_global'(best,set(best,Label2))-> + (M:'$aleph_global'(best,aleph_set_m(best,Label2))-> BestSoFar = Label2/0; BestSoFar = Label/0)), asserta(M:'$aleph_search'(best_label,BestSoFar)), @@ -4544,7 +4545,7 @@ add_hyp(BestLabel,RClause,PCover,NCover,M), p_message('best clause'), pp_dclause(RClause,M), - (setting(evalfn,Evalfn,M) -> true; Evalfn = coverage), + (aleph_setting_m(evalfn,Evalfn,M) -> true; Evalfn = coverage), show_stats(Evalfn,BestLabel), noset(stage,M), !. @@ -4556,23 +4557,23 @@ retractall(M:'$aleph_search'(rls_nodes,_)), retractall(M:'$aleph_search'(rls_parentstats,_)), retractall(M:'$aleph_search'(rls_selected,_)), - setting(tries,MaxTries,M), + aleph_setting_m(tries,MaxTries,M), MaxTries >= 1, store_values([caching,store_bottom],M), - set(caching,false,M), - set(store_bottom,true,M), + aleph_set_m(caching,false,M), + aleph_set_m(store_bottom,true,M), M:'$aleph_global'(atoms,atoms(pos,PosSet)), M:'$aleph_global'(atoms,atoms(neg,NegSet)), interval_count(PosSet,P0), interval_count(NegSet,N0), - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), complete_label(Evalfn,[0-[0,0,[],false]],[P0,N0,1],Label,M), asserta(M:'$aleph_search'(rls_selected,selected(Label,[0-[0,0,[],false]], PosSet,NegSet))), asserta(M:'$aleph_search'(rls_nodes,0)), asserta(M:'$aleph_search'(rls_restart,1)), get_search_settings(S,M), - set(best,Label,M), + aleph_set_m(best,Label,M), stopwatch(Start), repeat, retractall(M:'$aleph_search'(rls_parentstats,_)), @@ -4595,8 +4596,8 @@ (F1 >= F -> true; retract(M:'$aleph_search'(rls_selected,selected([_,_,_,F1|_],_,_,_))), asserta(M:'$aleph_search'(rls_selected,selected([P,N,L,F|T],RCl,PCov,NCov))), - set(best,[P,N,L,F|T],M)), - setting(best,BestSoFar,M), + aleph_set_m(best,[P,N,L,F|T],M)), + aleph_setting_m(best,BestSoFar,M), (R1 > MaxTries;discontinue_search(S,BestSoFar/_,Nodes2,M)), !, stopwatch(Stop), @@ -4685,10 +4686,10 @@ L = 0, asserta(M:'$aleph_sat'(lastlit,L))), (M:'$aleph_sat'(botsize,_B) -> true; B = 0, asserta(M:'$aleph_sat'(botsize,B))), - ((M:'$aleph_global'(lazy_evaluate,lazy_evaluate(_));setting(greedy,true,M))-> + ((M:'$aleph_global'(lazy_evaluate,lazy_evaluate(_));aleph_setting_m(greedy,true,M))-> M:'$aleph_global'(atoms_left,atoms_left(pos,P)); M:'$aleph_global'(atoms,atoms(pos,P))), - setting(evalfn,E,M), + aleph_setting_m(evalfn,E,M), (E = posonly -> NType = rand; NType = neg), M:'$aleph_global'(atoms_left,atoms_left(NType,N)), asserta(M:'$aleph_search'(nextnode,none)). @@ -4706,9 +4707,9 @@ retractall(M:'$aleph_search'(rls_nodes,_)), retractall(M:'$aleph_search'(rls_selected,_)), asserta(M:'$aleph_search'(rls_restart,1)), - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), get_start_label(Evalfn,Label,M), - set(best,Label,M), + aleph_set_m(best,Label,M), get_search_settings(S,M), arg(4,S,SearchStrat/_), (M:'$aleph_sat'(example,example(Num,Type)) -> @@ -4733,9 +4734,9 @@ _,_,_))), asserta(M:'$aleph_search'(rls_selected,selected(Best,RCl, PCov,NCov))), - set(best,Best,M) + aleph_set_m(best,Best,M) ), - setting(best,BestSoFar,M), + aleph_setting_m(best,BestSoFar,M), retract(M:'$aleph_search'(rls_nodes,Nodes1)), Nodes2 is Nodes0 + Nodes1, asserta(M:'$aleph_search'(rls_nodes,Nodes2)), @@ -4750,9 +4751,9 @@ retractall(M:'$aleph_search'(rls_restart,_)), retractall(M:'$aleph_search'(rls_nodes,_)), retractall(M:'$aleph_search'(rls_selected,_)), - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), get_start_label(Evalfn,Label,M), - set(best,Label,M), + aleph_set_m(best,Label,M), get_search_settings(S,M), arg(4,S,SearchStrat/_), (M:'$aleph_sat'(example,example(Num,Type)) -> @@ -4857,8 +4858,8 @@ [_,_,_,F1|_],_,_,_))), asserta(M:'$aleph_search'(rls_selected,selected(Best, RCl,PCov,NCov))), - set(best,Best,M)), - setting(best,BestSoFar,M), + aleph_set_m(best,Best,M)), + aleph_setting_m(best,BestSoFar,M), retract(M:'$aleph_search'(rls_nodes,Nodes1)), Nodes2 is Nodes + Nodes1, asserta(M:'$aleph_search'(rls_nodes,Nodes2)), @@ -4877,7 +4878,7 @@ * Constructs theories 1 clause at a time. */ induce_clauses(M:Program):- - setting(interactive,true,M), !, + aleph_setting_m(interactive,true,M), !, induce_incremental(M:Program). induce_clauses(M:Program):- induce(M:Program). @@ -4890,14 +4891,14 @@ */ induce(M:Program):- clean_up(M), - set(greedy,true,M), + aleph_set_m(greedy,true,M), retractall(M:'$aleph_global'(search_stats,search_stats(_,_))), M:'$aleph_global'(atoms_left,atoms_left(pos,PosSet)), PosSet \= [], store(portray_search,M), - set(portray_search,false,M), - setting(samplesize,S,M), - setting(abduce,Abduce,M), + aleph_set_m(portray_search,false,M), + aleph_setting_m(samplesize,S,M), + aleph_setting_m(abduce,Abduce,M), record_settings(M), stopwatch(StartClock), repeat, @@ -4906,7 +4907,7 @@ retractall(M:'$aleph_global'(besthyp,besthyp(_,_,_,_,_))), asserta(M:'$aleph_global'(besthyp,besthyp([-inf,0,1,-inf],0,(false),[],[]))), get_besthyp(Abduce,M), - (setting(gcws,true,M) -> sphyp(M), addgcws(M); addhyp(M)), + (aleph_setting_m(gcws,true,M) -> sphyp(M), addgcws(M); addhyp(M)), show_atoms_left(M), record_atoms_left(M), M:'$aleph_global'(atoms_left,atoms_left(pos,[])), @@ -5001,10 +5002,10 @@ M:'$aleph_global'(atoms,atoms(pos,PosSet)), PosSet \= [], store(portray_search,M), - set(portray_search,false,M), + aleph_set_m(portray_search,false,M), record_settings(M), stopwatch(StartClock), - set(maxcover,true,M), + aleph_set_m(maxcover,true,M), aleph_induce_max(PosSet,M), stopwatch(StopClock), Time is StopClock - StartClock, @@ -5027,7 +5028,7 @@ induce_max1(Finish,M):- M:'$aleph_local'(counter,S), S =< Finish, !, - (setting(resample,Resample,M) -> true; Resample = 1), + (aleph_setting_m(resample,Resample,M) -> true; Resample = 1), repeat, retract(M:'$aleph_local'(counter,Start)), gen_sample(Resample,pos,Start), @@ -5051,9 +5052,9 @@ M:'$aleph_global'(atoms,atoms(pos,PosSet)), PosSet \= [], store(portray_search,M), - set(portray_search,false,M), - setting(samplesize,S,M), - setting(abduce,Abduce,M), + aleph_set_m(portray_search,false,M), + aleph_setting_m(samplesize,S,M), + aleph_setting_m(abduce,Abduce,M), record_settings(M), stopwatch(StartClock), repeat, @@ -5104,9 +5105,9 @@ clean_up(M), retractall(M:'$aleph_global'(search_stats,search_stats(_,_))), store_values([interactive,portray_search,proof_strategy,mode],M), - set(portray_search,false,M), - set(proof_strategy,sld,M), - set(interactive,true,M), + aleph_set_m(portray_search,false,M), + aleph_set_m(proof_strategy,sld,M), + aleph_set_m(interactive,true,M), record_settings(M), stopwatch(StartClock), repeat, @@ -5163,7 +5164,7 @@ clean_up(M), retractall(M:'$aleph_global'(search_stats,search_stats(_,_))), store(evalfn,M), - set(evalfn,accuracy,M), + aleph_set_m(evalfn,accuracy,M), record_settings(M), find_theory(rls,_,M), reinstate(evalfn,M), @@ -5175,7 +5176,7 @@ clean_up(M), retractall(M:'$aleph_global'(search_stats,search_stats(_,_))), store(evalfn,M), - set(evalfn,accuracy,M), + aleph_set_m(evalfn,accuracy,M), record_settings(M), find_theory(rls,Program,M), reinstate(evalfn,M), @@ -5183,7 +5184,7 @@ record_total_stats(M), !. induce_theory(M:Program):- - setting(search,Search,M), + aleph_setting_m(search,Search,M), aleph_induce_theory(Search,Program,M). @@ -5204,10 +5205,10 @@ retractall(M:'$aleph_global'(search_stats,search_stats(_,_))), store_values([portray_search,search,construct_bottom,good,goodfile],M), noset(goodfile,M), - set(portray_search,false,M), - set(construct_bottom,false,M), - set(search,ic,M), - set(good,true,M), + aleph_set_m(portray_search,false,M), + aleph_set_m(construct_bottom,false,M), + aleph_set_m(search,ic,M), + aleph_set_m(good,true,M), sat(uspec,0,M), reduce(M:_), copy_constraints(Constraints,M), @@ -5244,14 +5245,14 @@ induce_features(M:Features):- clean_up(M), store_values([good,check_good,updateback,construct_features,samplesize,greedy,explore,lazy_on_contradiction],M), - set(good,true,M), - set(check_good,true,M), - set(updateback,false,M), - set(construct_features,true,M), - set(lazy_on_contradiction,true,M), - (setting(feature_construction,exhaustive,M) -> set(explore,true,M); + aleph_set_m(good,true,M), + aleph_set_m(check_good,true,M), + aleph_set_m(updateback,false,M), + aleph_set_m(construct_features,true,M), + aleph_set_m(lazy_on_contradiction,true,M), + (aleph_setting_m(feature_construction,exhaustive,M) -> aleph_set_m(explore,true,M); true), - setting(max_features,FMax,M), + aleph_setting_m(max_features,FMax,M), record_settings(M), stopwatch(StartClock), M:'$aleph_global'(atoms_left,atoms_left(pos,AtomsLeft)), @@ -5319,10 +5320,11 @@ */ induce_tree(M:Program):- clean_up(M), - setting(tree_type,Type,M), + aleph_setting_m(tree_type,Type,M), store_values([refine],M), - set(refine,auto,M), - setting(mingain,MinGain,M), + aleph_set_m(refine,auto,M), + aleph_set_m(refine,true,M), + aleph_setting_m(mingain,MinGain,M), (MinGain =< 0.0 -> err_message('inappropriate setting for mingain'), fail; @@ -5349,7 +5351,7 @@ M:'$aleph_global'(atoms_left,atoms_left(pos,PosSet)), PosSet \= [], store(resample,M), - set(resample,1,M), + aleph_set_m(resample,1,M), rsat(100,M), reinstate(resample,M). @@ -5377,7 +5379,7 @@ abgen(Atom,AbGen,M), once(retract(M:'$aleph_global'(hypothesis, hypothesis(Label,_,PCover,NCover)))), - arc_assert(M:'$aleph_global'(hypothesis, + assert(M:'$aleph_global'(hypothesis, hypothesis(Label,AbGen,PCover,NCover))), update_besthyp(Num,M); true), @@ -5385,8 +5387,8 @@ get_besthyp(_,M):- retract(M:'$aleph_global'(besthyp,besthyp(L,Num,H,PC,NC))), H \= false, !, - ((setting(samplesize,S,M),S>1)-> - setting(nodes,Nodes,M), + ((aleph_setting_m(samplesize,S,M),S>1)-> + aleph_setting_m(nodes,Nodes,M), show_clause(sample,L,H,Nodes,M), record_clause(sample,L,H,Nodes,M); true), @@ -5429,8 +5431,8 @@ % generate a new feature from a good clause gen_features(M):- aleph_abolish('$aleph_feature'/2,M), - (setting(dependent,PredictArg,M) -> true; PredictArg is 0), - (setting(minscore,FMin,M) -> true; FMin = -inf), + (aleph_setting_m(dependent,PredictArg,M) -> true; PredictArg is 0), + (aleph_setting_m(minscore,FMin,M) -> true; FMin = -inf), M:'$aleph_good'(_,Label,Clause), Label = [_,_,_,FE|_], arithmetic_expression_value(FE,F), @@ -5444,11 +5446,11 @@ gen_feature((Template:-Body),Label,Class,M), fail. gen_features(M):- - (setting(dependent,PredictArg,M) -> true; PredictArg is 0), - setting(good,true,M), - setting(goodfile,File,M), + (aleph_setting_m(dependent,PredictArg,M) -> true; PredictArg is 0), + aleph_setting_m(good,true,M), + aleph_setting_m(goodfile,File,M), aleph_open(File,read,Stream), - (setting(minscore,FMin,M) -> true; FMin = -inf), + (aleph_setting_m(minscore,FMin,M) -> true; FMin = -inf), repeat, read(Stream,Fact), (Fact = M:'$aleph_good'(_,Label,Clause) -> @@ -5638,7 +5640,7 @@ get_performance(M):- - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), (Evalfn = sd; Evalfn = mse), !. get_performance(M):- findall(Example,M:example(_,pos,Example),Pos), @@ -5655,11 +5657,11 @@ p1_message('Training set summary'), p_message([Tp,Fp,Fn,Tn]), fail. get_performance(M):- - (setting(test_pos,PFile,M) -> + (aleph_setting_m(test_pos,PFile,M) -> test(PFile,noshow,Tp,TotPos,M), Fn is TotPos - Tp; TotPos = 0, Tp = 0, Fn = 0), - (setting(test_neg,NFile,M) -> + (aleph_setting_m(test_neg,NFile,M) -> test(NFile,noshow,Fp,TotNeg,M), Tn is TotNeg - Fp; TotNeg = 0, Tn = 0, Fp = 0), @@ -5736,7 +5738,7 @@ Minf is -inf, asserta(M:'$aleph_search'(abgenhyp, hypothesis([Minf,0,1,Minf],[false],[],[]))), - setting(max_abducibles,Max,M), + aleph_setting_m(max_abducibles,Max,M), abgen(Fact,Max,AbGen,M), M:'$aleph_global'(hypothesis,hypothesis(Label,_,PCover,NCover)), Label = [_,_,LE,GainE|_], @@ -5767,7 +5769,7 @@ store_abduced_atoms(AbAtoms,AssertRefs,M); store_abduced_atoms(AbAtoms,M)), store(proof_strategy,M), - set(proof_strategy,sld,M), + aleph_set_m(proof_strategy,sld,M), gen_abduced_atoms(AbAtoms,AbGen,M), reinstate(proof_strategy,M), (Prolog = yap -> @@ -5925,7 +5927,7 @@ lazy_evaluate(LitNums,LazyPreds,Path,PosCover,NegCover,Lits,M). lazy_prove_negs(Lit,Clause,_,M):- - M:'$aleph_global'(lazy_negs,set(lazy_negs,true)), !, + M:'$aleph_global'(lazy_negs,aleph_set_m(lazy_negs,true)), !, M:'$aleph_global'(atoms,atoms(neg,NegCover)), lazy_prove(neg,Lit,Clause,NegCover,M). lazy_prove_negs(Lit,Clause,NegCover,M):- @@ -6087,7 +6089,7 @@ % implemented as described by Muggleton, ILP-96 condition_target(M):- - M:'$aleph_global'(condition,set(condition,true)), + M:'$aleph_global'(condition,aleph_set_m(condition,true)), add_generator(M), M:'$aleph_global'(modeh,modeh(_,Pred)), functor(Pred,Name,Arity), @@ -6101,7 +6103,7 @@ condition(SPred,M), fail. condition_target(M):- - \+(M:'$aleph_global'(condition,set(condition,true))), + \+(M:'$aleph_global'(condition,aleph_set_m(condition,true))), add_generator(M), !. condition_target(_M). @@ -6214,13 +6216,13 @@ M:'$aleph_local'(slp_samplenum,N), N > 0, !, retract(M:'$aleph_local'(slp_samplenum,N)), - set(gsamplesize,N,M), + aleph_set_m(gsamplesize,N,M), retract(M:'$aleph_global'(atoms,atoms(rand,_))), retract(M:'$aleph_global'(atoms_left,atoms_left(rand,_))), retract(M:'$aleph_global'(last_example,last_example(rand,_))), - arc_assert(M:'$aleph_global'(atoms,atoms(rand,[1-N]))), - arc_assert(M:'$aleph_global'(atoms_left,atoms_left(rand,[1-N]))), - arc_assert(M:'$aleph_global'(last_example,last_example(rand,N))). + assert(M:'$aleph_global'(atoms,atoms(rand,[1-N]))), + assert(M:'$aleph_global'(atoms_left,atoms_left(rand,[1-N]))), + assert(M:'$aleph_global'(last_example,last_example(rand,N))). update_gsample(_,_,_M). @@ -6290,7 +6292,7 @@ asserta(M:'$aleph_global'(slp_count,Clause,2)). find_posgain(PCover,P,M):- - M:'$aleph_global'(greedy,set(greedy,true)), !, + M:'$aleph_global'(greedy,aleph_set_m(greedy,true)), !, interval_count(PCover,P). find_posgain(PCover,P,M):- M:'$aleph_global'(atoms_left,atoms_left(pos,PLeft)), @@ -6302,8 +6304,8 @@ % S E A R C H I / O record_clause(good,Label,Clause,_,M):- - setting(good,true,M), - setting(goodfile_stream,Stream,M), !, + aleph_setting_m(good,true,M), + aleph_setting_m(goodfile_stream,Stream,M), !, set_output(Stream), Label = [_,_,L|_], aleph_writeq('$aleph_good'(L,Label,Clause)), write('.'), nl, @@ -6311,7 +6313,7 @@ set_output(user_output). record_clause(Flag,Label,Clause,Nodes,M):- Flag \= good, - setting(recordfile_stream,Stream,M), !, + aleph_setting_m(recordfile_stream,Stream,M), !, set_output(Stream), show_clause(Flag,Label,Clause,Nodes,M), flush_output(Stream), @@ -6319,7 +6321,7 @@ record_clause(_,_,_,_,_M). record_theory(Flag,Label,Clauses,Nodes,M):- - setting(recordfile_stream,Stream,M), !, + aleph_setting_m(recordfile_stream,Stream,M), !, set_output(Stream), show_theory(Label,Clauses,Nodes,Flag,M), flush_output(Stream), @@ -6327,7 +6329,7 @@ record_theory(_,_,_,_,_M). record_theory(Flag,Label,Clauses,Nodes,M):- - setting(recordfile_stream,Stream,M), !, + aleph_setting_m(recordfile_stream,Stream,M), !, set_output(Stream), show_theory(Label,Clauses,Nodes,Flag,M), flush_output(Stream), @@ -6335,7 +6337,7 @@ record_theory(_,_,_,_,_). record_sat_example(N,M):- - setting(recordfile_stream,Stream,M), !, + aleph_setting_m(recordfile_stream,Stream,M), !, set_output(Stream), p1_message('sat'), p_message(N), flush_output(Stream), @@ -6343,7 +6345,7 @@ record_sat_example(_,_M). record_search_stats(Clause,Nodes,Time,M):- - setting(recordfile_stream,Stream,M), !, + aleph_setting_m(recordfile_stream,Stream,M), !, set_output(Stream), p1_message('clauses constructed'), p_message(Nodes), p1_message('search time'), p_message(Time), @@ -6355,7 +6357,7 @@ record_search_stats(_,_,_,_M). record_tsearch_stats(Theory,Nodes,Time,M):- - setting(recordfile_stream,Stream,M), !, + aleph_setting_m(recordfile_stream,Stream,M), !, set_output(Stream), p1_message('theories constructed'), p_message(Nodes), p1_message('search time'), p_message(Time), @@ -6367,12 +6369,12 @@ record_tsearch_stats(_,_,_,_). record_theory(Time,M):- - setting(recordfile_stream,Stream,M), !, + aleph_setting_m(recordfile_stream,Stream,M), !, set_output(Stream), show(theory,M), p1_message('time taken'), p_message(Time), nl, - (M:'$aleph_global'(maxcover,set(maxcover,true))-> + (M:'$aleph_global'(maxcover,aleph_set_m(maxcover,true))-> show(theory/5,M), nl, show(max_set/4,M), nl, show(rules/1,M); @@ -6382,7 +6384,7 @@ record_theory(_,_M). record_features(Time,M):- - setting(recordfile_stream,Stream,M), !, + aleph_setting_m(recordfile_stream,Stream,M), !, set_output(Stream), show(features,M), p1_message('time taken'), p_message(Time), @@ -6391,9 +6393,9 @@ record_features(_,_). record_settings(M):- - setting(recordfile_stream,Stream,M), !, + aleph_setting_m(recordfile_stream,Stream,M), !, set_output(Stream), - (M:'$aleph_global'(os,set(os,unix)) -> + (M:'$aleph_global'(os,aleph_set_m(os,unix)) -> execute(date), execute(hostname); true), @@ -6409,7 +6411,7 @@ (Flag=sample-> p_message('selected from sample'); p_message('found clause'))), pp_dclause(Clause,M), - (setting(evalfn,Evalfn,M)-> true; Evalfn = coverage), + (aleph_setting_m(evalfn,Evalfn,M)-> true; Evalfn = coverage), show_stats(Evalfn,Label), p1_message('clause label'), p_message(Label), p1_message('clauses constructed'), p_message(Nodes), @@ -6421,7 +6423,7 @@ (Flag=sample-> p_message('selected from sample'); p_message('found theory'))), pp_dclauses(Clauses,M), - (setting(evalfn,Evalfn,M)-> true; Evalfn = accuracy), + (aleph_setting_m(evalfn,Evalfn,M)-> true; Evalfn = accuracy), show_stats(Evalfn,Label), p1_message('theory label'), p_message(Label), p1_message('theories constructed'), p_message(Nodes), @@ -6436,7 +6438,7 @@ asserta(M:'$aleph_global'(search_stats,search_stats(N1,T1))). record_total_stats(M):- - setting(recordfile_stream,Stream,M), !, + aleph_setting_m(recordfile_stream,Stream,M), !, set_output(Stream), show_total_stats(M), flush_output(Stream), @@ -6444,7 +6446,7 @@ record_total_stats(_M). record_atoms_left(M):- - setting(recordfile_stream,Stream,M), !, + aleph_setting_m(recordfile_stream,Stream,M), !, set_output(Stream), show_atoms_left(M), flush_output(Stream), @@ -6481,8 +6483,8 @@ % built-in refinement operator gen_auto_refine(M):- - (setting(autorefine,true,M) -> true; - set(autorefine,true,M), + (aleph_setting_m(autorefine,true,M) -> true; + aleph_set_m(autorefine,true,M), process_modes(M), process_determs(M)), !. @@ -6516,7 +6518,7 @@ find_mode(modeb,Name1/Arity1,Mode,M), copy_modeterms(Mode,Pred,Arity1), Determ = M:'$aleph_determination'(Name/Arity,Pred), - (Determ -> true; arc_assert(Determ)), + (Determ -> true; assert(Determ)), fail. process_determs(_M). @@ -6536,13 +6538,13 @@ get_o_links(O,Lit,VT,true,OGoals,M), get_i_links(I,Lit,VT,OGoals,IOGoals), get_c_links(C,Lit,IOGoals,Body), - arc_assert(M:Clause). + assert(M:Clause). add_ovars(Lit,O,M):- aleph_member(Pos/Type,O), tparg(Pos,Lit,V), (M:'$aleph_has_ovar'(Lit,V,Type,Pos)->true; - arc_assert(M:'$aleph_has_ovar'(Lit,V,Type,Pos))), + assert(M:'$aleph_has_ovar'(Lit,V,Type,Pos))), fail. add_ovars(_,_,_M). @@ -6550,7 +6552,7 @@ aleph_member(Pos/Type,I), tparg(Pos,Lit,V), (M:'$aleph_has_ivar'(Lit,V,Type,Pos)->true; - arc_assert(M:'$aleph_has_ivar'(Lit,V,Type,Pos))), + assert(M:'$aleph_has_ivar'(Lit,V,Type,Pos))), fail. add_ivars(_,_,_M). @@ -6558,7 +6560,7 @@ get_var_types(I,Lit,IVarTypes), get_var_types(O,Lit,OVarTypes), (M:'$aleph_has_vars'(Lit,IVarTypes,OVarTypes) -> true; - arc_assert(M:'$aleph_has_vars'(Lit,IVarTypes,OVarTypes))). + assert(M:'$aleph_has_vars'(Lit,IVarTypes,OVarTypes))). get_var_types([],_,[]). get_var_types([Pos/Type|PlaceTypes],Lit,[Var/Type|Rest]):- @@ -6686,7 +6688,7 @@ auto_refine((H:-B),(H1:-B1),M):- !, goals_to_list((H,B),LitList), - setting(clauselength,L,M), + aleph_setting_m(clauselength,L,M), length(LitList,ClauseLength), ClauseLength < L, aleph_get_lit(Lit,LitList,M), @@ -6694,10 +6696,10 @@ list_to_goals(LitList1,(H1,B1)), \+(M:prune((H1:-B1))), \+(tautology((H1:-B1),M)), - (setting(language,Lang,M) -> + (aleph_setting_m(language,Lang,M) -> lang_ok(Lang,H1,B1); true), - (setting(newvars,NewVars,M) -> + (aleph_setting_m(newvars,NewVars,M) -> newvars_ok(NewVars,H1,B1); true). auto_refine(Head,Clause,M):- @@ -6716,16 +6718,16 @@ auto_extend((H:-B),Lit,(H1:-B1),M):- !, goals_to_list((H,B),LitList), - setting(clauselength,L,M), + aleph_setting_m(clauselength,L,M), length(LitList,ClauseLength), ClauseLength < L, aleph_get_lit(Lit,LitList,M), aleph_append([Lit],LitList,LitList1), list_to_goals(LitList1,(H1,B1)), - (setting(language,Lang,M) -> + (aleph_setting_m(language,Lang,M) -> lang_ok(Lang,H1,B1); true), - (setting(newvars,NewVars,M) -> + (aleph_setting_m(newvars,NewVars,M) -> newvars_ok(NewVars,H1,B1); true), \+(tautology((H1:-B1),M)), @@ -6734,16 +6736,16 @@ auto_extend((H),Lit,(H1:-B1),M):- !, goals_to_list(H,LitList), - setting(clauselength,L,M), + aleph_setting_m(clauselength,L,M), length(LitList,ClauseLength), ClauseLength < L, aleph_get_lit(Lit,LitList,M), aleph_append([Lit],LitList,LitList1), list_to_goals(LitList1,(H1,B1)), - (setting(language,Lang,M) -> + (aleph_setting_m(language,Lang,M) -> lang_ok(Lang,H1,B1); true), - (setting(newvars,NewVars,M) -> + (aleph_setting_m(newvars,NewVars,M) -> newvars_ok(NewVars,H1,B1); true), \+(tautology((H1:-B1),M)), @@ -6806,12 +6808,12 @@ get_type_equivalences(Types,Equiv1,M), merge_equivalence_classes(Equiv1,Equiv,M), store_type_equivalences(Equiv,M), - setting(typeoverlap,Thresh,M), + aleph_setting_m(typeoverlap,Thresh,M), infer_modes(TypedPreds,Thresh,Types,Modes,M), infer_equalities(EqModes,M), Modes = [_|BodyModes], infer_negations(BodyModes,NegModes), - (setting(updateback,Update,M) -> true; Update = true), + (aleph_setting_m(updateback,Update,M) -> true; Update = true), p_message('found modes'), add_inferred_modes(Modes,Update,M), add_inferred_modes(EqModes,Update,M), @@ -7040,7 +7042,7 @@ % Each clause is drawn randomly. The length of the clause is % determined by: % (a) user-specified distribution over clauselengths -% using set(clauselength_distribution,Distribution); +% using aleph_set_m(clauselength_distribution,Distribution); % Distribution is a list of the form p1-1, p2-2,... % specifying that clauselength 1 has prob p1, etc. % Note: sum pi must = 1. This is not checked; or @@ -7058,14 +7060,14 @@ % bottom clause for Clause. If no bottom clause then E,T = 0 and Lits = [] % Clauses is in ascending order of clause length sample_clauses(N,Clauses,M):- - setting(construct_bottom,Bottom,M), + aleph_setting_m(construct_bottom,Bottom,M), sample_nclauses(Bottom,N,Clauses,M). sample_nclauses(false,N,Clauses,M):- !, gen_auto_refine(M), - (setting(clauselength_distribution,D,M) -> true; - setting(clauselength,CL,M), + (aleph_setting_m(clauselength_distribution,D,M) -> true; + aleph_setting_m(clauselength,CL,M), Uniform is 1.0/CL, distrib(1-CL,Uniform,D)), sample_nclauses_using_modes(N,D,CList,M), @@ -7074,8 +7076,8 @@ sample_nclauses(_,N,Clauses,M):- retractall(M:'$aleph_sat'(random,rselect(_))), (M:'$aleph_sat'(example,example(_,_)) -> true; rsat(M)), - setting(clauselength,CL,M), - (setting(clauselength_distribution,Universe,M) -> + aleph_setting_m(clauselength,CL,M), + (aleph_setting_m(clauselength_distribution,Universe,M) -> Sample is N; estimate_numbers(CL,1,400,Universe,M), (N > Universe -> Sample is Universe; Sample is N)), @@ -7101,10 +7103,10 @@ sample_clause_using_modes(D,L,Clause,M), \+(M:prune(Clause)), split_clause(Clause,Head,Body), - (setting(language,Lang,M) -> + (aleph_setting_m(language,Lang,M) -> lang_ok(Lang,Head,Body); true), - (setting(newvars,NewVars,M) -> + (aleph_setting_m(newvars,NewVars,M) -> newvars_ok(NewVars,Head,Body); true), !. @@ -7176,7 +7178,7 @@ M:'$aleph_sat'(example,example(Type,Example)), M:'$aleph_sat'(random,clauselength_distribution(Type,Example,L,T,K,D)), !. estimate_clauselength_distribution(L,T,K,D,M):- - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), estimate_clauselength_scores(L,T,Evalfn,[],S,M), select_good_clauses(S,K,Good), estimate_frequency(L,Good,Freq), @@ -7188,7 +7190,7 @@ estimate_clauselength_scores(0,_,_,S,S,_):- !. estimate_clauselength_scores(L,T,Evalfn,S1,S,M):- - set(clauselength_distribution,[1.0-L],M), + aleph_set_m(clauselength_distribution,[1.0-L],M), p1_message('Estimate scores of clauses with length'), p_message(L), sample_clauses(T,Clauses,M), estimate_scores(Clauses,Evalfn,S1,S2,M), @@ -7240,7 +7242,7 @@ % bounded by bot estimate_numbers(Total,M):- (M:'$aleph_sat'(example,example(_,_)) -> true; rsat(M)), - setting(clauselength,CL,M), + aleph_setting_m(clauselength,CL,M), estimate_numbers(CL,1,400,Total,M). % estimate_numbers(+L,+Trials,+Sample,-T,M) @@ -7398,10 +7400,10 @@ % numbervars(C1,0,_), % if accounting for variable renamings \+(M:prune(C)), split_clause(C,Head,Body), - (setting(language,Lang,M) -> + (aleph_setting_m(language,Lang,M) -> lang_ok(Lang,Head,Body); true), - (setting(newvars,NewVars,M) -> + (aleph_setting_m(newvars,NewVars,M) -> newvars_ok(NewVars,Head,Body); true), \+(M:'$aleph_sat'(random,rselect(C1))), !, @@ -7424,7 +7426,7 @@ % outside the mode language provided % needs a bottom clause to be constructed before it is meaningful % this can be done with the sat predicate for eg: sat(1) -% if set(store_bottom,true) then use stored bottom clause instead +% if aleph_set_m(store_bottom,true) then use stored bottom clause instead % if S is legal, then checks to see if previously generated legal % clauses exist for this bottom clause (these would have been generated % when trying to estimate the number of legal clause at each length) @@ -7572,7 +7574,7 @@ sample_clauses(1,[Clause],M), \+(old_move(clauses,Clause,M)). rls_refine(clauses,Clause1,Clause2,M):- - setting(moves,Max,M), + aleph_setting_m(moves,Max,M), MaxMoves is Max, once(retract(M:'$aleph_search'(rls_move,Mov))), Mov =< MaxMoves, @@ -7588,7 +7590,7 @@ once(theory_move(add_clause,[],Theory,M)), \+(old_move(theories,Theory,M)). rls_refine(theories,Theory1,Theory2,M):- - setting(moves,MaxMoves,M), + aleph_setting_m(moves,MaxMoves,M), once(retract(M:'$aleph_search'(rls_move,M))), M =< MaxMoves, p1_message('move'), p_message(M), @@ -7624,7 +7626,7 @@ C2 = L1-[E,T,Lits1,Clause1]. clause_move(add_lit,C1,C2,M):- C1 = L-[E,T,Lits,Clause], - setting(clauselength,CL,M), + aleph_setting_m(clauselength,CL,M), L < CL, (Lits = [] -> auto_refine(Clause,Clause1,M), @@ -7657,7 +7659,7 @@ aleph_delete(_,T1,T2), T2 \= []. theory_move(add_clause,T1,T2,M):- - setting(clauses,Max,M), + aleph_setting_m(clauses,Max,M), length(T1,L), L < Max, sample_clauses(1,[Clause],M), @@ -7672,7 +7674,7 @@ aleph_append([Clause1],T,T2). old_move(clauses,N-[_,_,L,C],M):- - (setting(cache_clauselength,N1,M) -> true; N1 = 3), + (aleph_setting_m(cache_clauselength,N1,M) -> true; N1 = 3), N =< N1, (L = [] -> clause_to_list(C,C1), @@ -7723,7 +7725,7 @@ % pretty print a definite clause pp_dclause(Clause,M):- - (M:'$aleph_global'(portray_literals,set(portray_literals,true))-> + (M:'$aleph_global'(portray_literals,aleph_set_m(portray_literals,true))-> pp_dclause(Clause,true,M); pp_dclause(Clause,false,M)). @@ -7746,7 +7748,7 @@ write(' if:'); write(' :-')), nl, - M:'$aleph_global'(print,set(print,N)), + M:'$aleph_global'(print,aleph_set_m(print,N)), print_lits(Body,Pretty,1,N,M). pp_dclause((Lit),Pretty,M):- @@ -7758,7 +7760,7 @@ % pretty print a definite clause list: head of list is + literal pp_dlist([],_M):- !. pp_dlist(Clause,M):- - (M:'$aleph_global'(portray_literals,set(portray_literals,true))-> + (M:'$aleph_global'(portray_literals,aleph_set_m(portray_literals,true))-> pp_dlist(Clause,true,M); pp_dlist(Clause,false,M)). @@ -7772,7 +7774,7 @@ write(' if:'); write(' :-')), nl, - M:'$aleph_global'(print,set(print,N)), + M:'$aleph_global'(print,aleph_set_m(print,N)), print_litlist(Body1,Pretty,1,N,M)). print_litlist([],_,_,_,_M). @@ -8558,7 +8560,7 @@ retractall(M:'$aleph_global'(hypothesis,hypothesis(_,_,_,_))). depth_bound_call(G,M):- - M:'$aleph_global'(depth,set(depth,D)), + M:'$aleph_global'(depth,aleph_set_m(depth,D)), call_with_depth_bound(G,D,M). call_with_depth_bound((H:-B),D,M):- @@ -8634,11 +8636,11 @@ N1 is N + 1, asserta(M:'$aleph_global'(size,size(Type,N1))), (Type \= neg -> - setting(skolemvars,Sk1,M), + aleph_setting_m(skolemvars,Sk1,M), skolemize(Example,Fact,Body,Sk1,SkolemVars), record_skolemized(Type,N1,SkolemVars,Fact,Body,M), (Sk1 = SkolemVars -> true; - set(skolemvars,SkolemVars,M)); + aleph_set_m(skolemvars,SkolemVars,M)); split_clause(Example,Head,Body), record_nskolemized(Type,N1,Head,Body,M)), !. @@ -8655,7 +8657,7 @@ M:'$aleph_global'(targetpred,targetpred(Name/Arity)), M:'$aleph_global'(determination,determination(Name/Arity,Name/Arity)), record_recursive_sat_call(Name/Arity,M), - set(recursion,true,M), + aleph_set_m(recursion,true,M), fail. check_recursive_calls(_M). @@ -8663,7 +8665,7 @@ M:'$aleph_global'(size,size(rand,N)), N > 0, !. check_posonly(M):- - setting(evalfn,posonly,M), + aleph_setting_m(evalfn,posonly,M), \+(M:'$aleph_global'(modeh,modeh(_,_))), p1_message('error'), p_message('missing modeh declaration in posonly mode'), !, @@ -8672,8 +8674,8 @@ retractall(M:'$aleph_global'(slp_count,_,_)), retractall(M:'$aleph_local'(slp_sample,_)), retractall(M:'$aleph_local'(slp_samplenum,_)), - setting(evalfn,posonly,M), - setting(gsamplesize,S,M), + aleph_setting_m(evalfn,posonly,M), + aleph_setting_m(gsamplesize,S,M), condition_target(M), M:'$aleph_global'(targetpred,targetpred(Name/Arity)), gsample(Name/Arity,S,M), !. @@ -8681,19 +8683,19 @@ check_prune_defs(M):- clause(M:prune(_),_), !, - set(prune_defs,true,M). + aleph_set_m(prune_defs,true,M). check_prune_defs(_M). check_auto_refine(M):- - (setting(construct_bottom,reduction,M);setting(construct_bottom,false,M)), - \+(setting(autorefine,true,M)), !, - (setting(refine,user,M) -> true; set(refine,auto,M)). + (aleph_setting_m(construct_bottom,reduction,M);aleph_setting_m(construct_bottom,false,M)), + \+(aleph_setting_m(autorefine,true,M)), !, + (aleph_setting_m(refine,user,M) -> true; aleph_set_m(refine,auto,M)). check_auto_refine(_M). check_user_search(M):- - setting(evalfn,user,M), + aleph_setting_m(evalfn,user,M), \+(cost_cover_required(M)), - set(lazy_on_cost,true,M), !. + aleph_set_m(lazy_on_cost,true,M), !. check_user_search(_M). check_abducibles(M):- @@ -8723,11 +8725,11 @@ set_lazy_recalls(_M). set_lazy_on_contradiction(_,_,M):- - M:'$aleph_global'(lazy_on_contradiction,set(lazy_on_contradiction,false)), !. + M:'$aleph_global'(lazy_on_contradiction,aleph_set_m(lazy_on_contradiction,false)), !. set_lazy_on_contradiction(P,N,M):- Tot is P + N, Tot >= 100, !, - set(lazy_on_contradiction,true,M). + aleph_set_m(lazy_on_contradiction,true,M). set_lazy_on_contradiction(_,_,_M). % The "pclause" trick: much more effective with the use of recorded/3 @@ -8754,7 +8756,7 @@ record_recursive_sat_call(Name/Arity,M):- functor(Head,Name,Arity), Clause = (Head:- - '$aleph_global'(stage,set(stage,saturation)), + '$aleph_global'(stage,aleph_set_m(stage,saturation)), '$aleph_sat'(example,example(Num,Type)), example(Num1,Type,Head), Num1 \= Num, !), % to prevent tautologies @@ -8908,7 +8910,7 @@ gen_featurenum(Feature1,M):- M:'$aleph_feature'(last_feature,Feature0), !, Feature1 is Feature0 + 1, - setting(max_features,FMax,M), + aleph_setting_m(max_features,FMax,M), Feature1 =< FMax, retract(M:'$aleph_feature'(last_feature,Feature0)), asserta(M:'$aleph_feature'(last_feature,Feature1)). @@ -8927,14 +8929,14 @@ index_clause(Hypothesis,ClauseIndex,Clause,M), (M:'$aleph_global'(example_selected,example_selected(_,Seed))-> true; PCover = [Seed-_|_]), - (setting(lazy_on_cost,true,M) -> + (aleph_setting_m(lazy_on_cost,true,M) -> nlits(Clause,L), label_create(Clause,Label,M), extract_pos(Label,PCover), extract_neg(Label,NCover), interval_count(PCover,PC), interval_count(NCover,NC), - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), complete_label(Evalfn,Clause,[PC,NC,L],NewLabel,M), assertz(M:'$aleph_global'(theory,theory(ClauseIndex, NewLabel/Seed,Clause, @@ -8946,15 +8948,15 @@ add_clause_to_background(ClauseIndex,M):- M:'$aleph_global'(theory,theory(ClauseIndex,Label/_,Clause,_,_)), - (setting(minpos,PMin,M) -> true; PMin = 1), + (aleph_setting_m(minpos,PMin,M) -> true; PMin = 1), Label = [PC,_,_,F|_], PC >= PMin, - setting(minscore,MinScore,M), + aleph_setting_m(minscore,MinScore,M), F >= MinScore, !, (retract(M:'$aleph_global'(rules,rules(Rules)))-> asserta(M:'$aleph_global'(rules,rules([ClauseIndex|Rules]))); asserta(M:'$aleph_global'(rules,rules([ClauseIndex])))), - (setting(updateback,Update,M) -> true; Update = true), + (aleph_setting_m(updateback,Update,M) -> true; Update = true), (Update = true -> assertz(M:Clause); true), !. add_clause_to_background(_,_M). @@ -8963,7 +8965,7 @@ update_theory(ClauseIndex,M), !, M:'$aleph_global'(theory,theory(ClauseIndex,_,_,PCover,NCover)), rm_seeds(pos,PCover,M), - (setting(evalfn,posonly,M) -> rm_seeds(rand,NCover,M); true), + (aleph_setting_m(evalfn,posonly,M) -> rm_seeds(rand,NCover,M); true), M:'$aleph_global'(atoms_left,atoms_left(pos,PLeft)), interval_count(PLeft,PL), p1_message('atoms left'), p_message(PL), @@ -8971,8 +8973,8 @@ rm_seeds(_M). rm_seeds(pos,PCover,M):- - setting(construct_features,true,M), - setting(feature_construction,exhaustive,M), !, + aleph_setting_m(construct_features,true,M), + aleph_setting_m(feature_construction,exhaustive,M), !, retract(M:'$aleph_global'(atoms_left,atoms_left(pos,OldIntervals))), (M:'$aleph_global'(example_selected,example_selected(_,Seed))-> true; PCover = [Seed-_|_]), @@ -9000,7 +9002,7 @@ % revise coversets of previous atoms worse_coversets(_,_,_,[],M):- - \+(M:'$aleph_global'(maxcover,set(maxcover,true))), !. + \+(M:'$aleph_global'(maxcover,aleph_set_m(maxcover,true))), !. worse_coversets([],_,_,[],_M). worse_coversets([Interval|Intervals],Type,Gain,Worse,M):- worse_coversets1(Interval,Type,Gain,W1,M), @@ -9045,13 +9047,13 @@ % gen_sample(+Type,+N,M) % select N random samples from the set of examples uncovered. Type is one of pos/neg % if N = 0 returns first example in Set -% resamples the equal example R times where set(resample,R) +% resamples the equal example R times where aleph_set_m(resample,R) gen_sample(Type,0,M):- !, M:'$aleph_global'(atoms_left,atoms_left(Type,[ExampleNum-_|_])), retractall(M:'$aleph_global'(example_selected,example_selected(_,_))), p1_message('select example'), p_message(ExampleNum), - (setting(resample,Resample,M) -> true; Resample = 1), + (aleph_setting_m(resample,Resample,M) -> true; Resample = 1), gen_sample(Resample,Type,ExampleNum,M). gen_sample(Type,SampleSize,M):- M:'$aleph_global'(atoms_left,atoms_left(Type,Intervals)), @@ -9060,7 +9062,7 @@ N is min(AtomsLeft,SampleSize), assertz(M:'$aleph_local'(sample_num,0)), retractall(M:'$aleph_global'(example_selected,example_selected(_,_))), - (setting(resample,Resample,M) -> true; Resample = 1), + (aleph_setting_m(resample,Resample,M) -> true; Resample = 1), repeat, M:'$aleph_local'(sample_num,S1), S is S1 + 1, @@ -9227,7 +9229,7 @@ label_create(Clause,Label,M):- M:'$aleph_global'(last_example,last_example(pos,Last1)), Type1 = pos, - (setting(evalfn,posonly,M) -> + (aleph_setting_m(evalfn,posonly,M) -> M:'$aleph_global'(last_example,last_example(rand,Last2)), Type2 = rand; M:'$aleph_global'(last_example,last_example(neg,Last2)), @@ -9242,9 +9244,9 @@ split_clause(Clause,Head,Body), nlits((Head,Body),Length), assertz(M:'$aleph_search'(pclause,pclause(Head,Body))), - setting(depth,Depth,M), - setting(prooftime,Time,M), - setting(proof_strategy,Proof,M), + aleph_setting_m(depth,Depth,M), + aleph_setting_m(prooftime,Time,M), + aleph_setting_m(proof_strategy,Proof,M), prove(Depth/Time/Proof,Type1,(Head:-Body),Set1,Cover1,_,M), prove(Depth/Time/Proof,Type2,(Head:-Body),Set2,Cover2,_,M), retractall(M:'$aleph_search'(pclause,_)), @@ -9253,9 +9255,9 @@ label_create(Clause,Type,Set,Label,M):- split_clause(Clause,Head,Body), assertz(M:'$aleph_search'(pclause,pclause(Head,Body))), - setting(depth,Depth,M), - setting(prooftime,Time,M), - setting(proof_strategy,Proof,M), + aleph_setting_m(depth,Depth,M), + aleph_setting_m(prooftime,Time,M), + aleph_setting_m(proof_strategy,Proof,M), prove(Depth/Time/Proof,Type,(Head:-Body,M),Set,Cover,_,M), retractall(M:'$aleph_search'(pclause,_)), (Type = pos -> @@ -9317,12 +9319,12 @@ extract_count(pos,Label,PC), extract_count(neg,Label,NC), concat(['Rule ',ClauseNum],RuleTag), - (setting(evalfn,posonly,M) -> + (aleph_setting_m(evalfn,posonly,M) -> concat(['Pos cover = ',PC,' Rand cover = ',NC],CoverTag); concat(['Pos cover = ',PC,' Neg cover = ',NC],CoverTag)), p1_message(RuleTag), p_message(CoverTag), pp_dclause(Clause,M), - setting(verbosity,V,M), + aleph_setting_m(verbosity,V,M), (V >= 2 -> p_message('positive examples covered'), label_print_examples(pos,Label,M), @@ -9334,7 +9336,7 @@ evalfn(Label,Val,M):- - (setting(evalfn,Eval,M)->true;Eval=coverage,M), + (aleph_setting_m(evalfn,Eval,M)->true;Eval=coverage,M), evalfn(Eval,Label,Val,M). evalfn_name(compression,'compression'). @@ -9388,7 +9390,7 @@ evalfn(pbayes,[P,N|_],Val,M):- (P = -inf -> Val is 0.5; Acc is P/(P+N), - setting(prior,PriorD,M), + aleph_setting_m(prior,PriorD,M), normalise_distribution(PriorD,NPriorD), aleph_member1(Prior-pos,NPriorD), (0 is Prior-Acc -> @@ -9401,7 +9403,7 @@ evalfn(auto_m,[P,N|_],Val,M):- (P = -inf -> Val is 0.5; Cover is P + N, - setting(prior,PriorD,M), + aleph_setting_m(prior,PriorD,M), normalise_distribution(PriorD,NPriorD), aleph_member1(Prior-pos,NPriorD), K is sqrt(Cover), @@ -9409,10 +9411,10 @@ evalfn(mestimate,[P,N|_],Val,M):- (P = -inf -> Val is 0.5; Cover is P + N, - setting(prior,PriorD,M), + aleph_setting_m(prior,PriorD,M), normalise_distribution(PriorD,NPriorD), aleph_member1(Prior-pos,NPriorD), - (setting(m,MM,M) -> K = MM; K is sqrt(Cover)), + (aleph_setting_m(m,MM,M) -> K = MM; K is sqrt(Cover)), Val is (P + K*Prior) / (Cover+K)), !. evalfn(_,_,X,_M):- X is -inf. @@ -9437,7 +9439,7 @@ extract_length([_,_,L|_],L). get_start_label(_,[0,0,0,F],M):- - (setting(interactive,true,M); setting(search,ic,M)), !, + (aleph_setting_m(interactive,true,M); aleph_setting_m(search,ic,M)), !, F is -inf. get_start_label(user,[1,0,2,F],_M):- !, F is -inf. get_start_label(entropy,[1,0,2,-0.5],_M):- !. @@ -9485,26 +9487,26 @@ broadcast(background(loaded)). read_examples(Pos,Neg,M):- - (setting(train_pos,PosF,M) -> - set(use_file_extensions,false,M), + (aleph_setting_m(train_pos,PosF,M) -> + aleph_set_m(use_file_extensions,false,M), read_examples_files(pos,PosF,_,M), noset(use_file_extensions,M); read_examples_files(pos,Pos,PosF,M), - set(train_pos,PosF,M) + aleph_set_m(train_pos,PosF,M) ), - (setting(train_neg,NegF,M) -> - set(use_file_extensions,false,M), + (aleph_setting_m(train_neg,NegF,M) -> + aleph_set_m(use_file_extensions,false,M), read_examples_files(neg,NegF,_,M), noset(use_file_extensions,M); read_examples_files(neg,Neg,NegF,M), - set(train_neg,NegF,M) + aleph_set_m(train_neg,NegF,M) ), M:'$aleph_global'(size,size(pos,P)), M:'$aleph_global'(size,size(neg,N)), set_lazy_recalls(M), - (setting(prior,_,M) -> true; + (aleph_setting_m(prior,_,M) -> true; normalise_distribution([P-pos,N-neg],Prior), - set(prior,Prior,M) + aleph_set_m(prior,Prior,M) ), reset_counts(M), asserta(M:'$aleph_global'(last_clause,last_clause(0))), @@ -9569,7 +9571,7 @@ read_examples_from_file(_,_,'?',_M). construct_name(_,Name,Name,M):- - setting(use_file_extensions,false,M), !. + aleph_setting_m(use_file_extensions,false,M), !. construct_name(Type,Prefix,Name,_M):- name(Prefix,PString), file_extension(Type,SString), @@ -9608,24 +9610,24 @@ asserta(M:'$aleph_global'(save, save(searchstate,size(neg,NSize)))); true), - (M:'$aleph_global'(noise,set(noise,Noise)) -> + (M:'$aleph_global'(noise,aleph_set_m(noise,Noise)) -> asserta(M:'$aleph_global'(save, - save(searchstate,set(noise,Noise)))); + save(searchstate,aleph_set_m(noise,Noise)))); true), - (M:'$aleph_global'(minacc,set(minacc,MinAcc)) -> + (M:'$aleph_global'(minacc,aleph_set_m(minacc,MinAcc)) -> asserta(M:'$aleph_global'(save, - save(searchstate,set(minacc,MinAcc)))); + save(searchstate,aleph_set_m(minacc,MinAcc)))); true). % store current bottom clause store(bottom,M):- !, - (M:'$aleph_global'(store_bottom,set(store_bottom,true)) -> + (M:'$aleph_global'(store_bottom,aleph_set_m(store_bottom,true)) -> store_bottom(M); true). store(Parameter,M):- - (M:'$aleph_global'(Parameter,set(Parameter,Value)) -> true; Value = unknown), + (M:'$aleph_global'(Parameter,aleph_set_m(Parameter,Value)) -> true; Value = unknown), retractall(M:'$aleph_global'(save,save(Parameter,_))), asserta(M:'$aleph_global'(save,save(Parameter,Value))). @@ -9686,16 +9688,16 @@ (M:'$aleph_global'(save,save(searchstate,size(neg,NSize))) -> asserta(M:'$aleph_global'(size,size(neg,NSize))); true), - (M:'$aleph_global'(save,save(searchstate,set(noise,Noise))) -> - set(noise,Noise,M); + (M:'$aleph_global'(save,save(searchstate,aleph_set_m(noise,Noise))) -> + aleph_set_m(noise,Noise,M); true), - (M:'$aleph_global'(save,save(searchstate,set(minacc,MinAcc))) -> - set(minacc,MinAcc,M); + (M:'$aleph_global'(save,save(searchstate,aleph_set_m(minacc,MinAcc))) -> + aleph_set_m(minacc,MinAcc,M); true), retractall(M:'$aleph_global'(save,save(searchstate,_))). reinstate(Parameter,M):- retract(M:'$aleph_global'(save,save(Parameter,Value))), !, - (Value = unknown -> noset(Parameter,M); set(Parameter,Value,M)). + (Value = unknown -> noset(Parameter,M); aleph_set_m(Parameter,Value,M)). reinstate(_,_M). % reinstate list of values of parameters @@ -9710,18 +9712,18 @@ M:'$aleph_global'(save,save(_,_)), repeat, retract(M:'$aleph_global'(save,save(Parameter,Value))), - (Value = unknown -> noset(Parameter,M) ; set(Parameter,Value,M)), + (Value = unknown -> noset(Parameter,M) ; aleph_set_m(Parameter,Value,M)), \+(M:'$aleph_global'(save,save(_,_))), !. reinstate_values(_M). reinstate_file_streams(M):- - setting(recordfile,File,M), - set(recordfile,File,M), + aleph_setting_m(recordfile,File,M), + aleph_set_m(recordfile,File,M), fail. reinstate_file_streams(M):- - setting(goodfile,File,M), - set(goodfile,File,M), + aleph_setting_m(goodfile,File,M), + aleph_set_m(goodfile,File,M), fail. reinstate_file_streams(_M). @@ -9734,7 +9736,7 @@ ((var(N),var(T)) -> M:'$aleph_sat'(example,example(N,T)); true), - (setting(store_bottom,true,M) -> + (aleph_setting_m(store_bottom,true,M) -> (M:'$aleph_sat'(stored,stored(N,T,Key)) -> Flag = false; concat([T,'_',N],Key), @@ -9749,19 +9751,19 @@ * Sets the value of a parameter. */ aleph_set(M:Variable,Value):- - set(Variable,Value,M). + aleph_set_m(Variable,Value,M). -set(Variable,Value,M):- +aleph_set_m(Variable,Value,M):- check_setting(Variable,Value), (Value = inf -> V is inf; (Value = +inf -> V is inf; (Value = -inf -> V is -inf; V = Value) ) ), - retractall(M:'$aleph_global'(Variable,set(Variable,_))), - assertz(M:'$aleph_global'(Variable,set(Variable,V))), - broadcast(set(Variable,V)), + retractall(M:'$aleph_global'(Variable,aleph_set_m(Variable,_))), + assertz(M:'$aleph_global'(Variable,aleph_set_m(Variable,V))), + broadcast(aleph_set_m(Variable,V)), special_consideration(Variable,Value,M). /** * aleph_setting(:Parameter:atomic,+Value:term) is det @@ -9769,13 +9771,13 @@ * Reads the value of a parameter. */ aleph_setting(M:Variable,Value):- - setting(Variable,Value,M). + aleph_setting_m(Variable,Value,M). -setting(Variable,Value,M):- +aleph_setting_m(Variable,Value,M):- nonvar(Variable), - M:'$aleph_global'(Variable,set(Variable,Value1)), !, + M:'$aleph_global'(Variable,aleph_set_m(Variable,Value1)), !, Value = Value1. -setting(Variable,Value,_M):- +aleph_setting_m(Variable,Value,_M):- default_setting(Variable,Value). noset(M:Variable):- @@ -9783,7 +9785,7 @@ noset(Variable,M):- nonvar(Variable), - retract(M:'$aleph_global'(Variable,set(Variable,Value))), !, + retract(M:'$aleph_global'(Variable,aleph_set_m(Variable,Value))), !, rm_special_consideration(Variable,Value,M), set_default(Variable,M). noset(_,_M). @@ -10016,7 +10018,7 @@ show(settings,M):- nl, p_message('settings'), - findall(P-V,M:'$aleph_global'(P,set(P,V)),L), + findall(P-V,M:'$aleph_global'(P,aleph_set_m(P,V)),L), sort(L,L1), aleph_member(Parameter-Value,L1), tab(8), write(Parameter=Value), nl, @@ -10044,7 +10046,7 @@ show(bottom,M):- nl, p_message('bottom clause'), - setting(verbosity,V,M), + aleph_setting_m(verbosity,V,M), V > 0, M:'$aleph_sat'(lastlit,Last), get_clause(1,Last,[],FlatClause,M), @@ -10107,18 +10109,18 @@ pp_dclause(C,M), fail. show(hypothesis,M):- - setting(portray_hypothesis,Pretty,M), + aleph_setting_m(portray_hypothesis,Pretty,M), aleph_portray(hypothesis,Pretty,M), fail. show(search,M):- - setting(portray_search,Pretty,M), + aleph_setting_m(portray_search,Pretty,M), aleph_portray(search,Pretty,M). show(good,M):- - setting(good,true,M), + aleph_setting_m(good,true,M), nl, p_message('good clauses'), - (setting(minscore,FMin,M) -> true; FMin is -inf), - setting(evalfn,Evalfn,M), + (aleph_setting_m(minscore,FMin,M) -> true; FMin is -inf), + aleph_setting_m(evalfn,Evalfn,M), M:'$aleph_good'(_,Label,Clause), Label = [_,_,_,F|_], F >= FMin, @@ -10126,11 +10128,11 @@ show_stats(Evalfn,Label), fail. show(good,M):- - setting(good,true,M), - setting(goodfile,File,M), + aleph_setting_m(good,true,M), + aleph_setting_m(goodfile,File,M), aleph_open(File,read,Stream), - (setting(minscore,FMin,M) -> true; FMin is -inf), - setting(evalfn,Evalfn,M), + (aleph_setting_m(minscore,FMin,M) -> true; FMin is -inf), + aleph_setting_m(evalfn,Evalfn,M), repeat, read(Stream,Fact), (Fact = M:'$aleph_good'(_,Label,Clause) -> @@ -10142,7 +10144,7 @@ close(Stream), ! ). show(features,M):- - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), (M:'$aleph_feature'(feature,_) -> true; gen_features(M)), p_message('features from good clauses'), @@ -10151,10 +10153,10 @@ pp_dclause(feature(Id,(Head:-Body)),M), fail. show(constraints,M):- - setting(good,true,M), + aleph_setting_m(good,true,M), nl, p_message('constraints'), - setting(noise,N,M), + aleph_setting_m(noise,N,M), FMin is -N, M:'$aleph_good'(_,Label,Clause), split_clause(Clause,false,_), @@ -10175,16 +10177,16 @@ pp_dclause((Pred:-Body),M), fail. show(train_pos,M):- - setting(portray_examples,Pretty,M), + aleph_setting_m(portray_examples,Pretty,M), aleph_portray(train_pos,Pretty,M). show(train_neg,M):- - setting(portray_examples,Pretty,M), + aleph_setting_m(portray_examples,Pretty,M), aleph_portray(train_neg,Pretty,M). show(test_pos,M):- - setting(portray_examples,Pretty,M), + aleph_setting_m(portray_examples,Pretty,M), aleph_portray(test_pos,Pretty,M). show(test_neg,M):- - setting(portray_examples,Pretty,M), + aleph_setting_m(portray_examples,Pretty,M), aleph_portray(test_neg,Pretty,M). show(_,_M). @@ -10201,7 +10203,7 @@ good_clauses(GC,M). good_clauses(GC,M):- - (setting(minscore,FMin,M) -> true; FMin is -inf), + (aleph_setting_m(minscore,FMin,M) -> true; FMin is -inf), findall(Clause, (M:'$aleph_good'(_,Label,Clause), Label = [_,_,_,F|_], @@ -10210,7 +10212,7 @@ % examples(?Type,?List) % show all examples numbers in List of Type examples(Type,List,M):- - setting(portray_literals,Pretty,M), + aleph_setting_m(portray_literals,Pretty,M), M:example(Num,Type,Atom), aleph_member1(Num,List), aleph_portray(Atom,Pretty,M), write('.'), nl, @@ -10238,12 +10240,12 @@ % write_rules/0 due to Mark Reid write_rules(M):- - setting(rulefile,File,M), + aleph_setting_m(rulefile,File,M), write_rules(File), !. write_rules(_M). write_features(M):- - setting(featurefile,File,M), + aleph_setting_m(featurefile,File,M), write_features(File,M), !. write_features(_M). @@ -10374,7 +10376,7 @@ M:'$aleph_sat'(example,example(Num,Type)), M:example(Num,Type,Example), retract(M:'$aleph_global'(hypothesis,hypothesis(_,_,_,_))), - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), complete_label(Evalfn,Example,[1,0,1],Label1,M), asserta(M:'$aleph_global'(hypothesis,hypothesis(Label1,(Example:-true),[Num-Num],[])))). @@ -10478,7 +10480,7 @@ % within a greedy search covers(P,M):- get_hyp(Hypothesis,M), - (setting(greedy,true,M) -> + (aleph_setting_m(greedy,true,M) -> M:'$aleph_global'(atoms,atoms_left(pos,Pos)); M:'$aleph_global'(atoms,atoms(pos,Pos))), label_create(Hypothesis,pos,Pos,Label,M), @@ -10492,7 +10494,7 @@ % within a greedy search coversn(N,M):- get_hyp(Hypothesis,M), - (setting(greedy,true,M) -> + (aleph_setting_m(greedy,true,M) -> M:'$aleph_global'(atoms_left,atoms_left(neg,Neg)); M:'$aleph_global'(atoms_left,atoms(neg,Neg))), label_create(Hypothesis,neg,Neg,Label,M), @@ -10505,7 +10507,7 @@ % as in covers/1, but returns list of examples covered and their count covers(PList,P,M):- get_hyp(Hypothesis,M), - (setting(greedy,true,M) -> + (aleph_setting_m(greedy,true,M) -> M:'$aleph_global'(atoms,atoms_left(pos,Pos)); M:'$aleph_global'(atoms,atoms(pos,Pos))), label_create(Hypothesis,pos,Pos,Label,M), @@ -10519,7 +10521,7 @@ % as in coversn/1, but returns list of examples covered and their count coversn(NList,N,M):- get_hyp(Hypothesis,M), - (setting(greedy,true,M) -> + (aleph_setting_m(greedy,true,M) -> M:'$aleph_global'(atoms_left,atoms_left(neg,Neg)); M:'$aleph_global'(atoms_left,atoms(neg,Neg))), label_create(Hypothesis,neg,Neg,Label,M), @@ -10547,7 +10549,7 @@ clear_cache(M), aleph_abolish('$aleph_global'/2,M), aleph_abolish(example/3,M), - arc_assert(M:example(0,uspec,aleph_false)), + assert(M:example(0,uspec,aleph_false)), set_default(_,M), !. @@ -10577,7 +10579,7 @@ retract(M:'$aleph_local'(total,T)). test_ex1(Exs,Flag,M):- - setting(portray_examples,Pretty,M), + aleph_setting_m(portray_examples,Pretty,M), member(Example,Exs), retract(M:'$aleph_local'(total,T0)), T1 is T0 + 1, @@ -10622,7 +10624,7 @@ test_file('?',_,_M):- !. test_file(File,Flag,M):- - setting(portray_examples,Pretty,M), + aleph_setting_m(portray_examples,Pretty,M), aleph_open(File,read,Stream), !, repeat, read(Stream,Example), @@ -10726,7 +10728,7 @@ set_default(A,M):- default_setting(A,B), - set(A,B,M), + aleph_set_m(A,B,M), fail. set_default(_,_M). @@ -10741,7 +10743,7 @@ prolog_type(P), (B > 1 -> (P = swi -> true; - err_message(set(threads,B)), + err_message(aleph_set_m(threads,B)), fail ); true @@ -10749,7 +10751,7 @@ check_setting(A,B):- set_def(A,_,_,Dom,_,_), !, (check_legal(Dom,B) -> true; - err_message(set(A,B))). + err_message(aleph_set_m(A,B))). check_setting(_,_). check_legal(int(L)-int(U),X):- @@ -11139,49 +11141,49 @@ % the following needed for compatibility with P-Progol special_consideration(search,ida,M):- - set(search,bf,M), set(evalfn,coverage,M), !. + aleph_set_m(search,bf,M), aleph_set_m(evalfn,coverage,M), !. special_consideration(search,compression,M):- - set(search,heuristic,M), set(evalfn,compression,M), !. + aleph_set_m(search,heuristic,M), aleph_set_m(evalfn,compression,M), !. special_consideration(search,posonly,M):- - set(search,heuristic,M), set(evalfn,posonly,M), !. + aleph_set_m(search,heuristic,M), aleph_set_m(evalfn,posonly,M), !. special_consideration(search,user,M):- - set(search,heuristic,M), set(evalfn,user,M), !. + aleph_set_m(search,heuristic,M), aleph_set_m(evalfn,user,M), !. special_consideration(refine,Refine,M):- - set(refineop,Refine,M), !. + aleph_set_m(refineop,Refine,M), !. special_consideration(refineop,auto,M):- gen_auto_refine(M), !. special_consideration(portray_literals,true,M):- - set(print,1,M), !. + aleph_set_m(print,1,M), !. special_consideration(record,true,M):- noset(recordfile_stream,M), - (setting(recordfile,F,M) -> + (aleph_setting_m(recordfile,F,M) -> aleph_open(F,my_append,Stream), - set(recordfile_stream,Stream,M); + aleph_set_m(recordfile_stream,Stream,M); true), !. special_consideration(record,false,M):- noset(recordfile_stream,M), !. special_consideration(recordfile,File,M):- noset(recordfile_stream,M), - (setting(record,true,M) -> + (aleph_setting_m(record,true,M) -> aleph_open(File,my_append,Stream), - set(recordfile_stream,Stream,M); + aleph_set_m(recordfile_stream,Stream,M); true), !. special_consideration(good,true,M):- noset(goodfile_stream,M), - (setting(goodfile,F,M) -> + (aleph_setting_m(goodfile,F,M) -> aleph_open(F,my_append,Stream), - set(goodfile_stream,Stream,M); + aleph_set_m(goodfile_stream,Stream,M); true), !. special_consideration(good,false,M):- noset(goodfile_stream,M), !. special_consideration(goodfile,File,M):- noset(goodfile_stream,M), - (setting(good,true,M) -> + (aleph_setting_m(good,true,M) -> aleph_open(File,my_append,Stream), - set(goodfile_stream,Stream,M); + aleph_set_m(goodfile_stream,Stream,M); true), !. special_consideration(minscore,_,M):- aleph_abolish('$aleph_feature'/2,M), !. @@ -11194,11 +11196,11 @@ rm_special_consideration(record,_,M):- noset(recordfile_stream,M), !. rm_special_consideration(recordfile_stream,_,M):- - (setting(recordfile_stream,S,M) -> close(S); true), !. + (aleph_setting_m(recordfile_stream,S,M) -> close(S); true), !. rm_special_consideration(good,_,M):- noset(goodfile_stream,M), !. rm_special_consideration(goodfile_stream,_,M):- - (setting(goodfile_stream,S,M) -> close(S); true), !. + (aleph_setting_m(goodfile_stream,S,M) -> close(S); true), !. rm_special_consideration(_,_,_M). @@ -11216,7 +11218,7 @@ retractall(M:'$aleph_global'(hypothesis,hypothesis(_,_,_,_))), extract_pos(Label,P), extract_neg(Label,N), - setting(evalfn,Evalfn,M), + aleph_setting_m(evalfn,Evalfn,M), complete_label(Evalfn,Clause,[PCount,NCount,L],Label1,M), asserta(M:'$aleph_global'(hypothesis,hypothesis(Label1,Clause,P,N))). @@ -11231,7 +11233,7 @@ fail. add_theory(_,_,PCover,NCover,M):- rm_seeds(pos,PCover,M), - (setting(evalfn,posonly,M) -> rm_seeds(rand,NCover,M); true), + (aleph_setting_m(evalfn,posonly,M) -> rm_seeds(rand,NCover,M); true), M:'$aleph_global'(atoms_left,atoms_left(pos,PLeft)), interval_count(PLeft,PL), p1_message('atoms left'), p_message(PL), !. @@ -11287,28 +11289,28 @@ M:aleph_portray(train_pos), !. aleph_portray(train_pos,_,M):- !, - setting(train_pos,File,M), + aleph_setting_m(train_pos,File,M), show_file(File). aleph_portray(train_neg,true,M):- M:aleph_portray(train_neg), !. aleph_portray(train_neg,_,M):- !, - setting(train_neg,File,M), + aleph_setting_m(train_neg,File,M), show_file(File). aleph_portray(test_pos,true,M):- M:aleph_portray(test_pos), !. aleph_portray(test_pos,_,M):- !, - setting(test_pos,File,M), + aleph_setting_m(test_pos,File,M), show_file(File). aleph_portray(test_neg,true,M):- M:aleph_portray(test_neg), !. aleph_portray(test_neg,_,M):- !, - setting(test_neg,File,M), + aleph_setting_m(test_neg,File,M), show_file(File). aleph_portray(Lit,true,M):- diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/induction/h_muarc_metagol.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/induction/h_muarc_metagol.pl index 7f1c8b425a..372d20974d 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/induction/h_muarc_metagol.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/induction/h_muarc_metagol.pl @@ -6,3 +6,260 @@ */ :- include(kaggle_arc_header). +/* +The task is to decide whether a machine should be fixed, sent back or is ok. +Machines dataset from The ACE Data Mining System User's Manual +https://dtai.cs.kuleuven.be/ACE/doc/ACEuser-1.2.16.pdf + +Downloaded from +https://dtai.cs.kuleuven.be/static/ACE/doc/ +*/ + +/** +?- induce_lm([train],P),test(P,[test],LL,AUCROC,ROC,AUCPR,PR). +?- induce_lm([train],P). +*/ + +:-use_module(library(lemur)). + +:- if(current_predicate(use_rendering/1)). +:- use_rendering(c3). +:- use_rendering(lpad). +:- endif. + +:-lemur. + +:- set_lm(depth_bound,false). +:- set_lm(neg_ex,given). +:- set_lm(mcts_iter,20). +:- set_lm(verbosity,1). + + +:- begin_in. +class(sendback):0.5 :- + worn(A), + not_replaceable(A). + +class(fix):0.6 :- + worn(A), + replaceable(A). + +class(ok):0.5 :- + not_worn(_A). +:- end_in. + +:- begin_bg. +component(C):- + replaceable(C). +component(C):- + not_replaceable(C). +replaceable(gear). +replaceable(wheel). +replaceable(chain). +not_replaceable(engine). +not_replaceable(control_unit). +not_worn(C):- + component(C), + \+ worn(C). +one_worn:- + worn(_). +none_worn:- + \+ one_worn. +:- end_bg. + +fold(train,[1,2,3,4,5,6,7,8,9,10]). + +fold(test,[11,12,13,14,15]). + +fold(all,F):- + fold(train,FTr), + fold(test,FTe), + append(FTr,FTe,F). + +:- fold(all,F), + sample(10,F,FTr,FTe), + assert(fold(rand_train,FTr)), + assert(fold(rand_test,FTe)). + +output(class_fix/0). +output(class_sendback/0). +output(class_ok/0). + +input_cw(replaceable/1). +input_cw(not_replaceable/1). +input_cw(worn/1). +input_cw(not_worn/1). +input_cw(none_worn/0). +%input(one_worn/0). + +determination(class/1,replaceable/1). +determination(class/1,not_replaceable/1). +determination(class/1,worn/1). +determination(class/1,not_worn/1). +determination(class/1,none_worn/0). + +class_fix(M):- + class(M,fix). + +class_sendback(M):- + class(M,sendback). + +class_ok(M):- + class(M,ok). + +neg(class_fix(M)):- + neg(class(M,fix)). + +neg(class_sendback(M)):- + neg(class(M,sendback)). + +neg(class_ok(M)):- + neg(class(M,ok)). + +modeh(*,class_fix). +modeh(*,class_ok). +modeh(*,class_sendback). + + +/*modeh(*,[class(fix),class(ok),class(sendback)], + [class(fix),class(ok),class(sendback)], + [replaceable/1,not_replaceable/1,worn/1]). +*/ + +modeb(*,not_replaceable(-comp)). +modeb(*,replaceable(-comp)). +modeb(*,worn(-comp)). +modeb(*,not_worn(-comp)). +modeb(*,none_worn). + +begin(model(1)). +testnr(1). +class(sendback). +neg(class(fix)). +neg(class(ok)). +worn(gear). +worn(engine). +end(model(1)). + +begin(model(2)). +testnr(2). +class(ok). +neg(class(sendback)). +neg(class(fix)). +end(model(2)). + +begin(model(3)). +testnr(3). +class(fix). +neg(class(sendback)). +neg(class(ok)). +worn(gear). +end(model(3)). + +begin(model(4)). +testnr(4). +class(sendback). +neg(class(fix)). +neg(class(ok)). +worn(engine). +end(model(4)). + +begin(model(5)). +testnr(5). +class(fix). +neg(class(sendback)). +neg(class(ok)). +worn(gear). +worn(chain). +end(model(5)). + +begin(model(6)). +testnr(6). +class(fix). +neg(class(sendback)). +neg(class(ok)). +worn(wheel). +end(model(6)). + +begin(model(7)). +testnr(7). +class(sendback). +neg(class(fix)). +neg(class(ok)). +worn(wheel). +worn(control_unit). +end(model(7)). + +begin(model(8)). +testnr(8). +class(ok). +neg(class(sendback)). +neg(class(fix)). +end(model(8)). + +begin(model(9)). +testnr(9). +class(fix). +neg(class(sendback)). +neg(class(ok)). +worn(wheel). +worn(chain). +end(model(9)). + +begin(model(10)). +testnr(10). +class(sendback). +neg(class(fix)). +neg(class(ok)). +worn(engine). +worn(chain). +end(model(10)). + +begin(model(11)). +testnr(11). +class(sendback). +neg(class(fix)). +neg(class(ok)). +worn(engine). +worn(control_unit). +end(model(11)). + +begin(model(12)). +testnr(12). +class(fix). +neg(class(sendback)). +neg(class(ok)). +worn(chain). +worn(wheel). +worn(gear). +end(model(12)). + +begin(model(13)). +testnr(13). +class(sendback). +neg(class(fix)). +neg(class(ok)). +worn(chain). +worn(wheel). +worn(gear). +worn(engine). +end(model(13)). + +begin(model(14)). +testnr(14). +class(ok). +neg(class(sendback)). +neg(class(fix)). +end(model(14)). + +begin(model(15)). +testnr(15). +class(fix). +neg(class(sendback)). +neg(class(ok)). +worn(wheel). +worn(gear). +end(model(15)). + + + diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc.pl index 9ffdc23318..944efab108 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc.pl @@ -5,10 +5,18 @@ unless permission or license is granted (contact at business@logicmoo.org) */ :- encoding(iso_latin_1). +:- if((prolog_load_context(module, M),assert(tmp:loading_arc_from(M)))). +:- module(kaggle_arc,[]). +:- '$set_source_module'(user). +:- endif. +:- multifile(swi_option:option/2). +:- dynamic(swi_option:option/2). +:- use_module(library(option)). + :- set_prolog_flag(stream_type_check,false). :- set_prolog_flag(never_pp_hook, true). %:- set_prolog_flag(xpce,false). -%:- set_prolog_flag(pce,false). +%:- set_prolog_flag(pce,false).f %:- set_prolog_flag(windows,false). %:- set_prolog_flag(gui_tracer,false). @@ -27,8 +35,8 @@ my_time(Goal):- time(Goal),flush_tee. :- export(plain_var/1). plain_var(V):- notrace((var(V), \+ attvar(V), \+ get_attr(V,ci,_))). -catch_log(G):- ignore(catch(notrace(G),E,((u_dmsg(E=G))))). -catch_nolog(G):- ignore(catch(notrace(G),E,nop(u_dmsg(E=G)))). +catch_nolog(G):- ignore(catch(notrace(G),E,once(true;nop(u_dmsg(E=G))))). +catch_log(G):- ignore(catch(notrace(G),E,((writeln(E=G),catch_nolog(ds))))). get_user_error(UE):- stream_property(UE,file_no(2)),!. get_user_error(UE):- stream_property(UE,alias(user_error)),!. @@ -153,7 +161,7 @@ forall(prolog:make_hook(before, Reload),true), notrace((ignore(update_changed_files1))), print_message(silent, make(reload(Reload))), - make:my_maplist(reload_file, Reload), + make:maplist(reload_file, Reload), print_message(silent, make(done(Reload))), forall(prolog:make_hook(after, Reload),true). @@ -320,7 +328,7 @@ -arc_setval(O,List):- is_list(List),!,my_maplist(arc_setval(O),List). +arc_setval(O,List):- is_list(List),!,maplist(arc_setval(O),List). arc_setval(O,Map):- get_map_pairs(Map,_Type,Pairs),!,my_maplist(arc_setval(O),Pairs). arc_setval(O,N=V):- !, arc_setval(O,N,V). arc_setval(O,N-V):- !, arc_setval(O,N,V). @@ -717,7 +725,9 @@ :- luser_default(no_diags,false). :- luser_default(no_individuator, f). :- luser_default(grid_size_only,true). -:- luser_default(cmd,test_easy). +%:- luser_default(cmd,test_easy). +%:- luser_default(cmd,learn_ilp). +:- luser_default(cmd,solve_via_scene_change). :- luser_default(cmd2,print_all_info_for_test). %:- luser_default(cmd2,test_show_grid_objs). :- luser_default(use_individuated_cache,true). @@ -741,11 +751,11 @@ test_secret_data:- u_dmsg(todo_test_secret_data). -save_arcathon_runner:- qsave_program('logicmoo_arcathon_runner',[stand_alone(true),verbose(true),toplevel(run_arcathon),goal(run_arcathon),% class(runtime), +save_arcathon_runner:- qsave_program('bin/logicmoo_arcathon_runner',[stand_alone(true),verbose(true),toplevel(run_arcathon),goal(run_arcathon),% class(runtime), class(runtime),obfuscate(true)]). -save_arcathon_runner_dbg:- qsave_program('logicmoo_arcathon_runner_dbg',[stand_alone(true),verbose(true),toplevel(run_arcathon),goal(run_arcathon),% class(runtime), +save_arcathon_runner_dbg:- qsave_program('bin/logicmoo_arcathon_runner_dbg',[stand_alone(true),verbose(true),toplevel(run_arcathon),goal(run_arcathon),% class(runtime), class(development),obfuscate(false)]). -save_arcathon_runner_devel:- qsave_program('logicmoo_arcathon_runner_devel',[stand_alone(true),verbose(true),goal(demo),class(development),obfuscate(false)]), +save_arcathon_runner_devel:- qsave_program('bin/logicmoo_arcathon_runner_devel',[stand_alone(true),verbose(true),goal(demo),class(development),obfuscate(false)]), save_arcathon_runner_dbg, save_arcathon_runner. test_compile_arcathon:- save_arcathon_runner_devel. @@ -836,16 +846,26 @@ :- set_current_test(v('1d398264')). :- luser_default(task,v('1d398264')). :- luser_default(task,v('37d3e8b2')). + */ -create_group_dmiles:- must_det_ll((create_group(dmiles,[ - 'e41c6fd3','0a2355a6', - '37d3e8b2','ea32f347', +create_group_dmiles:- + must_det_ll((create_group(dmiles_nsn,[ + 'e41c6fd3','ea32f347','37d3e8b2','0a2355a6', 'b230c067','a61f2674','d2abd087','08ed6ac7']))), + %must_det_ll((create_group(dmiles_nsn2,[ + % 'a61f2674','0a2355a6', 'a61ba2ce', 'ea32f347', 'a79310a0', '37d3e8b2', 'e41c6fd3', 'b230c067', '0d3d703e', '08ed6ac7']))), + must_det_ll((create_group(dmiles,[ + + 'e41c6fd3','ea32f347', + '37d3e8b2','0a2355a6', + 'a79310a0','103eff5b', + '33b52de3','d2abd087','08ed6ac7', '1b60fb0c','1d398264', '0d3d703e','626c0bcc', '5582e5ca','25d487eb', '32e9702f','f8b3ba0a', 'b230c067','a61ba2ce', - '29c11459','a61f2674']))). + '29c11459','a61f2674']))), + set_current_test('0a2355a6'). :- initialization(create_group_dmiles). %:- noguitracer. % :- set_current_test(t('0d3d703e')). % :- set_current_test(t('5582e5ca')). @@ -856,4 +876,6 @@ %:- demo. :- current_prolog_flag(argv,C),(member('-l',C)->initialize;true). :- initialization(scan_uses_test_id). - +%:- use_module('./induction/h_muarc_alephlib'). +%:- consult('./induction/h_muarc_aleph'). +%:- tmp:loading_arc_from(M),'$set_source_module'(M). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_boards.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_boards.pl index e8a7fea6a7..4f9f81b756 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_boards.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_boards.pl @@ -79,7 +79,7 @@ %ignore(retract(saved_training(TestID))), %ignore(retract(process_test(TestID))), - time((locally(nb_setval(use_individuated_cache,true), + time((with_individuated_cache(true, (( gen_gids(TestID), compute_all_test_hints(TestID)), @@ -109,16 +109,22 @@ print_hybrid_grid(G):- io_side_effects,into_grid_free(G,O),grid_to_norm(Ops,O,N), (O\==N->print_side_by_side([ops(Ops)],G,N); print_grid(O)). +individuate_all_pairs_from_hints(TestID):- + with_individuated_cache(true, + with_pair_mode(whole_test, + individuate_pairs_from_hints(TestID))). + individuate_pairs_from_hints(TestID):- arc_assert(individuate_test_grids(TestID)), - forall(kaggle_arc(TestID,ExampleNum,In,Out), - individuate_pair_here(TestID,ExampleNum,In,Out)). + forall((kaggle_arc(TestID,ExampleNum,In,Out),ExampleNum=(trn+_)), + must_det_ll((individuate_pair_here(TestID,ExampleNum,In,Out)))). individuate_pair_here(TestID,Trn+N1,In,Out):- Trn == trn, % no peeking - ndividuator(TestID,Trn+N1,complete,In,Out), - nop(train_for_objects_from_1pair(_{},TestID,[Trn,'i',N1,'o',N1],In,Out,_DictMid)). + must_det_ll((ndividuator(TestID,Trn+N1,complete,In,Out), + nop(train_for_objects_from_1pair(_{},TestID,[Trn,'i',N1,'o',N1],In,Out,_DictMid)))). + print_all_info_for_test:- notrace(print_all_info_for_test0). print_all_info_for_test0:- print_testinfo, @@ -149,7 +155,7 @@ append(G1,GS,GridL). -show_single_reduction_1(G):- reduce_grid(G,Ops,R),print_ss([G,R]),writeg(Ops). +show_single_reduction_1(G):- reduce_grid(G,Ops,R),print_ss(wqs(Ops),G,R),writeg(Ops). do_some_grids(Title,AB):- is_grid(AB),!,do_some_grids(Title,[AB]). do_some_grids(Title,AB):- into_grid_list(AB,GL), GL\==AB,!,do_some_grids(Title,GL). @@ -193,6 +199,9 @@ show_reduced_pairs(TestID), dash_chars. + + +show_reduced_io_fav(TestID):- var_ensure_test(TestID,I,O,show_reduced_io_fav(I^O)),!. show_reduced_io_fav(I^O):- get_current_test(TestID),\+ \+ do_some_grids(TestID,I^O), show_reduced_io(I^O). show_reduced_outputs(TestSpec):- var_ensure_test(TestSpec,TestID), @@ -203,10 +212,10 @@ findall(ExampleNum=Grid,kaggle_arc(TestID,ExampleNum,Grid,_),Grids), do_some_grids('INPUT'(TestID),Grids). -show_reduced_pairs(TestID):- - with_test_pairs(TestID,ExampleNum,I,O, +show_reduced_pairs(TestSpec):- var_ensure_test(TestSpec,TestID), + forall(with_test_pairs(TestID,ExampleNum,I,O, (print_side_by_side(green,I,orig_in(TestID,ExampleNum),_,O,orig_out(TestID,ExampleNum)), - forall(do_some_grids(TestID,I^O),true))). + forall(do_some_grids(TestID,I^O),true))),true). show_reduced_io_rarely(_):- \+ get_pair_mode(single_pair),!. @@ -215,22 +224,21 @@ show_reduced_io_rarely(IO):- forall(show_reduced_io(IO),true). -show_reduced_io(TestSpec):- var_ensure_test(TestSpec,TestID), - with_test_pairs(TestID,_ExampleNum,I,O,show_reduced_io(I^O)). +show_reduced_io(TestSpec):- var_ensure_test(TestSpec,I,O,show_reduced_io(I^O)),!. show_reduced_io(IO):- once(show_grid_call(reduce_cutaway(_),IO,NextIO)), if_t(((NextIO)\=@=(IO)), show_reduced_io(NextIO)). - %show_reduced_io(I^O):- maybe_easy(I,II,DidIn),same_reduction(DidIn,DidOut),maybe_easy(O,OO,DidOut), must_det_ll(print_side_by_side(green,II,DidIn,_,OO,DidOut)),!. +%show_reduced_io(I^O):- maybe_easy(I,II,DidIn),same_reduction(DidIn,DidOut),maybe_easy(O,OO,DidOut), must_det_ll(print_side_by_side(green,II,DidIn,_,OO,DidOut)),!. show_reduced_io(I0^O):- once(( grid_size(I0,H,V), grid_size(O,OH,OV))), - ((H>OH;V>OV) , grid_call_alters(trim_to_rect,I0,I)), - show_reduced_io(I^O). + ((H>OH;V>OV) , grid_call_alters(trim_to_rect,I0,I)), show_reduced_io(I^O). show_reduced_io(IO):- %OPS = [_,_|_], - once(show_grid_call(grid_to_norm(_),IO,NextIO)), + OPS = _, + once(show_grid_call(grid_to_norm(OPS),IO,NextIO)), if_t(((NextIO)\=@=(IO)), show_reduced_io(NextIO)). show_reduced_io(IO):- once(show_grid_call(mapgridish(remove_color_if_same(black),IO),IO,NextIO)), @@ -502,17 +510,30 @@ %dash_chars, %print_test(TestID), %wots(SS,my_maplist(ptv1,SComs)), - w_section(title(list_common_props),ptv1(cyan+magenta,SComs)), + w_section(title(list_common_props),ptv1s(cyan+magenta,SComs)), !. +my_sub_compound(_,C):- \+ compound(C),!,fail. +my_sub_compound(S,C):- my_sub_compound_0(E,C),S=E. +my_sub_compound_0(C,C). +my_sub_compound_0(E,L):- is_list(L),!,member(EE,L),compound(EE),my_sub_compound_0(E,EE). +my_sub_compound_0(E,[_|T]):- !, fail, compound(T),!,my_sub_compound_0(E,T). +my_sub_compound_0(E,C):- arg(_,C,EE),compound(EE),my_sub_compound_0(E,EE). with_li_pre(Goal):- with_tag(li,with_tag(pre,Goal)). %with_li_pre(Goal):- call(Goal). +ptv1s(Color,T):- \+ \+ ptv1(Color,T). + +ptv1(Color,T):- is_grid(T), !, print_grid(ptv1(Color),T). ptv1(Color,T):- is_list(T), !, my_maplist(ptv1(Color),T). ptv1(_Color,_=T):- T==[],!. +%ptv1(_Color,_=T):- compound(T),compound_name_arguments(T,_,[A]),A==[],!. %ptv1(_Color,_=T):- compound(T), T = each_object(_),!. -ptv1(_Color,_=T):- compound(T),compound_name_arguments(T,_,[A]),A==[],!. + +ptv1(Color,G):- my_sub_compound([H|T],G), + \+ \+ ((append(T,[],_)->is_grid([H|T]),print_grid([H|T]))),!, + subst(G,[H|T],printed_grid,GG),!,ptv1(Color,GG). ptv1(C1C2,T):- needs_bold(T),!,bold_print(ptv11(C1C2,T)),!. ptv1(C1C2,T):- ptv11(C1C2,T),!. @@ -521,7 +542,10 @@ ptv11(C1+C2,T):- !, format('~N'),wots(S,writeq(T)), (has_spec_value(T) -> color_print(C1,call(bold_print(write(S)))) ; color_print(C2,call(write(S)))). -ptv11(Color,T):- format('~N'),(has_spec_value(T) -> color_print(cyan,call(bold_print(print_tree(T)))) ; color_print(Color,call(print_tree(T)))). +ptv11(Color,T):- format('~N'), + (has_spec_value(T) -> + color_print(cyan,call(bold_print(print_tree(T)))) + ;color_print(Color,call(print_tree(T)))). has_spec_value(T):- ground(T),!. has_spec_value(V):- var(V),!,fail. @@ -632,6 +656,7 @@ %min_unifier_e(B,A,C):- compound(B),maybe_extract_values(B,BB), \+ maybe_extract_values(A,_), c_proportional(A,BB,AABB),must_min_unifier(AABB,B,C),!. min_unifier_e(_,_,_). +some_min_unifier(X,X):- \+ compound(X),!. some_min_unifier([A|List],Term):- some_min_unifier_3(A,List,Term). some_min_unifier_3(A,List,A):- my_maplist('=@='(A),List),!. @@ -653,7 +678,8 @@ min_unifier(A,B,D):- number(A),number(B),!,c_proportional(A,B,D). min_unifier(A,B,AA):- is_grid(A),is_grid(B),!,min_grid_unifier(A,B,AA),!. -min_unifier(A,B,AA):- is_list(A),is_list(B),!,min_list_unifier(A,B,AA),ignore((length(A,AL),length(B,AL),length(AA,AL))). +min_unifier(A,B,AA):- is_list(A),is_list(B),!,min_list_unifier(A,B,AA), + ignore((length(A,AL),length(B,AL),length(AA,AL))). min_unifier(A,B,AA):- is_cons(A),is_cons(B),!,min_list_unifier(A,B,AA),!. %min_unifier(A,B,C):- is_list(A),sort_safe(A,AA),A\==AA,!,min_unifier(B,AA,C). min_unifier(A,B,R):- compound(A),compound(B), @@ -672,8 +698,8 @@ min_list_unifier(A,B,A):- A=@=B,!. -min_list_unifier(A,B,_):- \+ compound(A);\+ compound(B),!. -min_list_unifier(A,B,AA):- is_list(A),is_list(B), sort_safe(A,AA),sort_safe(B,BB),BB=@=AA,!. +min_list_unifier(A,B,_):- ( \+ compound(A); \+ compound(B) ),!. +min_list_unifier(A,B,A):- is_list(A),is_list(B), sort_safe(A,AA),sort_safe(B,BB),BB=@=AA,!. min_list_unifier([A|AA],[B|BB],[A|CC]):- A=@=B,min_list_unifier(AA,BB,CC). min_list_unifier([A|AA],[B|BB],[C|CC]):- A\=@=B,min_list_unifier(AA,BB,CC),min_unifier(A,B,C),!. min_list_unifier(A,B,[EC|C]):- is_list(A),is_list(B), select_two(A,B,E1,E2,AA,BB), min_unifier(E1,E2,EC) ,!,min_list_unifier(AA,BB,C). @@ -695,12 +721,10 @@ ignore(kaggle_arc(TestID,ExampleNum,In,Out)), w_section(title(grid_hint_swap(IO,TestID>ExampleNum)), (maybe_compute_test_io_hints(IO,TestID,ExampleNum,In,Out), - ignore(print_single_pair(TestID,ExampleNum,In,Out)), - forall((arc_test_property(TestID,ExampleNum,P,V), - is_grid(V),sub_var(minus_overlapping_image,P)),print_grid(P,V)), + ignore(print_single_pair(TestID,ExampleNum,In,Out)), with_li_pre(((format('~N%% ~w: ',[IO])),!, forall((arc_test_property(TestID,ExampleNum,P,V)), - ignore(( ( \+ ((is_grid(V), grid_size(V,XX,YY), (XX>3;YY>3)))), ptv1(magenta+cyan,P=V)))))))). + ignore((ptv1s(magenta+cyan,P=V)))))))). grid_hint_swap_io(IO,In,Out,Hints):- grid_hint_recolor(IO,In,Out,Hints). @@ -777,12 +801,13 @@ %ensure_how(How):- var(How),!,member(How,[whole,i_pbox]). %ensure_how(How):- var(How),!,member(How,[whole,complete,i_pbox]). %ensure_how(How):- var(How),!,member(How,[whole,i_pbox,fg_shapes(nsew)]). -ensure_how(How):- var(How),!,member(How,[nsew,fg_shapes(nsew),colormass,fg_shapes(colormass),force_by_color,alone_dots]). -ensure_how(_How). +ensure_how(Grid,How):- var(How),!,indiv_how(Grid,How). +ensure_how(_Grid,_How). + %grid_to_objs(Grid,Objs):- findall(Obj,grid_to_objs(Grid,_,Obj),List),list_to_set(List,Objs). -grid_to_objs(Grid,Objs):- ensure_grid(Grid),individuate(complete,Grid,Objs). -grid_to_objs(Grid,How,Objs):- ensure_grid(Grid),ensure_how(How),individuate(How,Grid,Objs). +grid_to_objs(Grid,Objs):- grid_to_objs(Grid,complete,Objs). +grid_to_objs(Grid,How,Objs):- ensure_grid(Grid),ensure_how(Grid,How),in_cmt(individuate(How,Grid,Objs)). %grid_to_objs(Grid,Objs):- findall(Obj,grid_to_objs(Grid,complete,Obj),List),list_to_set(List,Objs). %grid_to_obj(Grid,Obj):- grid_to_objs(Grid,Objs),member(Obj,Objs). @@ -791,11 +816,12 @@ % one way to match or find an outlier is compressing things in sets minus one object.. the set that is second to the largest tells you what single object os the most differnt objs_shapes(Objs,In):- ensure_test(TestID),test_shapes(TestID,Objs,In). -test_shapes(_TestID, Objs,In):- member(Obj,Objs),object_grid(Obj,In), once(learn_hybrid_shape_board(obj_shapes,In)),fail. +test_shapes(_TestID, Objs,In):- member(Obj,Objs),object_grid(Obj,In), learn_hybrid_shape_board(obj_shapes,In),fail. test_shapes(TestID,_Objs,In):- ensure_test(TestID), get_hybrid_set(Set),!,member(In,Set). -learn_hybrid_shape_board(Why,Shape):- nop(dmsg(learn_hybrid_shape(Why,Shape))). +%learn_hybrid_shape_board(Why,Shape):- !, warn_skip((learn_hybrid_shape(Why,Shape))). +learn_hybrid_shape_board(Why,Shape):- learn_hybrid_shape(Why,Shape). grid_to_obj_other(VM,Grid,O):- other_grid(Grid,Grid2), grid_to_obj_other_grid(VM,Grid,Grid2,O). grid_to_obj_other_grid(VM,Grid,Grid2,O):- grid_to_objs(Grid2,Objs),grid_to_obj_other_objs(VM,Grid,Objs,O). @@ -1084,34 +1110,57 @@ save_the_alt_grids(TestID):- forall(ensure_test(TestID), forall(kaggle_arc(TestID,ExampleNum,I,O), - once(save_the_alt_grids(TestID,ExampleNum,[],I,O)))). + once(save_the_alt_grids(TestID,ExampleNum,[],I,O)))),!. save_the_alt_grids(TestID,ExampleNum):- arc_test_property(TestID,ExampleNum,has_blank_alt_grid,_),!. save_the_alt_grids(TestID,ExampleNum):- forall(kaggle_arc(TestID,ExampleNum,I,O), - once(save_the_alt_grids(TestID,ExampleNum,[],I,O))). + once(save_the_alt_grids(TestID,ExampleNum,[],I,O))),!. save_the_alt_grids(TestID,ExampleNum,_,_,_):- arc_test_property(TestID,ExampleNum,iro(_),_),!. -save_the_alt_grids(TestID,ExampleNum,XForms,In,Out):- same_sizes(In,Out),!, - save_the_alt_grids_now(TestID,ExampleNum,XForms,In,Out). -save_the_alt_grids(TestID,ExampleNum,XForms,In,Out):- - some_norm(In,OpI,NIn), some_norm(Out,OpO,NOut), - once(NIn\=@=In;NOut\=@=Out), - same_sizes(NIn,NOut),!, - save_the_alt_grids_now(TestID,ExampleNum,[ops(OpI,OpO)|XForms],NIn,NOut). +save_the_alt_grids(TestID,ExampleNum,XForms,In,Out):- %same_sizes(In,Out), + !, + save_the_alt_grids_now(TestID,ExampleNum,XForms,In,Out),!. +save_the_alt_grids(TestID,ExampleNum,XForms,In,Out):- fail, + once((some_norm(In,OpI,NIn), print_ss(some_norm(OpI),In,NIn), + some_norm(Out,OpO,NOut), print_ss(some_norm(OpO),Out,NOut), + same_sizes(NIn,NOut), + once(NIn\=@=In;NOut\=@=Out))), + save_the_alt_grids_now(TestID,ExampleNum,[ops(OpI,OpO)|XForms],NIn,NOut),!. save_the_alt_grids(TestID,ExampleNum,_XForms,In,Out):- assert_test_property(TestID,ExampleNum,iro(none),In), assert_test_property(TestID,ExampleNum,ori(none),Out),!. save_the_alt_grids_now(TestID,ExampleNum,XForms,In,Out):- my_maplist(save_grid_calc(TestID,ExampleNum,XForms,In,Out), - [fg_intersectiond,fg_intersectiond_mono,cell_minus_cell,mono_cell_minus_cell]), - ignore(( \+ has_blank_alt_grid(TestID,ExampleNum))),!, + [common_after_reduce,fg_intersectiond,fg_intersectiond_mono,cell_minus_cell,mono_cell_minus_cell]), + %ignore(( \+ has_blank_alt_grid(TestID,ExampleNum))),!, my_maplist(save_grid_calc(TestID,ExampleNum,XForms,In,Out),[minus_overlapping_image,overlapping_image]). colors_of(O,Cs):- unique_fg_colors(O,Cs),!. +common_after_reduce(In,Out,New):- + reduce_grid_fixed(In,OpsIn,In2),check_ops(OpsIn,In2,In),print_ss(OpsIn,In,In2), + reduce_grid_fixed(Out,OpsOut,Out2),check_ops(OpsOut,Out2,Out),print_ss(OpsOut,Out,Out2), + print_ss(common_after_reduce,In2,Out2), + mapgrid(fg_intersectiond_mono,In2,Out2,New),!. + +reduce_grid_fixed(In,OpsIn,In3):- + must_det_ll(( + grav_rot(In,RotG,In1), + undo_p2(RotG,RotR), + check_ops(RotR,In1,In), + reduce_grid(In1,Ops,In2), + check_ops(Ops,In2,In1), + grav_rot(In2,RotG2,In3), + undo_p2(RotG2,RotR2), + append([RotR2|Ops],[RotR],OpsIn), + check_ops(OpsIn,In3,In), + !)),!. + +check_ops(Ops,In2,In3):- grid_call(Ops,In2,InC), !, InC =@= In3. + /*save_the_alt_grids_now2(TestID,ExampleNum,XForms,In,Out). save_the_alt_grids_now2(TestID,ExampleNum,XForms,In,Out):- must_det_ll(( @@ -1141,23 +1190,24 @@ ExtraColors = color_set(CsInO).add(CsOutO).rem(CsIn).rem(CsOut), OLIn=In.inv(unbind_color(ExtraColors)). -%32e9702f +%32e9702f %33b52de3 -save_grid_calc(TestID,ExampleNum,XForms,In,Out,Op):- - call(Op,In,Out,RIO), call(Op,Out,In,ROI),!, - assert_test_property(TestID,ExampleNum,iro([Op|XForms]),RIO), - assert_test_property(TestID,ExampleNum,ori([Op|XForms]),ROI), - print_ss(no(Op,TestID,ExampleNum,XForms),RIO,ROI). +save_grid_calc(TestID,ExampleNum,XForms,In,Out,Op):- + ignore((on_x_rtrace(call(Op,In,Out,RIO)), assert_test_property(TestID,ExampleNum,iro([Op|XForms]),RIO))), + ignore((on_x_rtrace(call(Op,Out,In,ROI)), assert_test_property(TestID,ExampleNum,ori([Op|XForms]),ROI))), + ignore((on_x_rtrace(print_ss(no(Op,TestID,ExampleNum,XForms),RIO,ROI)))). same_sizes([I|In],[O|Out]):- length(I,Cols),length(O,Cols),length(In,Rows0),length(Out,Rows0). + +some_norm(Out,[trim_to_rect|Op],NOut):- notrace((trim_to_rect(Out,Mid),Out\=@=Mid)),!,some_norm(Out,Op,NOut). +some_norm(Out,[grav_rot(Rot)],NOut):- once(grav_rot(Out,Rot,NOut)),Out\=@=NOut,!. some_norm(Out,[],Out). -some_norm(Out,[trim_to_rect|Op],NOut):- notrace((trim_to_rect(Out,Mid),Out\=@=Mid)),some_norm(Out,Op,NOut). -some_norm(Out,[grav_rot(Rot)],NOut):- grav_rot(Out,Rot,NOut),!. -has_blank_alt_grid(TestID,ExampleNum):- blank_alt_grid_count(TestID,ExampleNum,N),N>0. + +has_blank_alt_grid(TestID,ExampleNum):- blank_alt_grid_count(TestID,ExampleNum,N),!,N>0. blank_alt_grid_count(TestID,ExampleNum,N):- arc_test_property(TestID,ExampleNum,has_blank_alt_grid,N),!. diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_db.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_db.pl index b680fc3aa9..69a8f7605c 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_db.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_db.pl @@ -428,7 +428,7 @@ replace_local_point_color(Point,NewC,OldC,G,GO):- is_object(G), !, localpoints(G,Points), replace_in_points(Point,NewC,OldC,Points,RPoints), - %loc2D(G,OH,OV),offset_point(OH,OV,Point,LPoint),shape_rep(grav,G,NCPoints), my_maplist(replace_in_points(Point,NewC,OldC),NCPoints,RNCPoints),,shape_rep(grav,RNCPoints) + %loc2D(G,OH,OV),offset_point(OH,OV,Point,LPoint),shape_rep(grav,G,NCPoints), my_maplist(replace_in_points(Point,NewC,OldC),NCPoints,RNCPoints), ,shape_rep(grav,RNCPoints) setq(G,localpoints(RPoints),GO). replace_local_point_color(Point,NewC,OldC,G,GO):- trace_or_throw(unknown_target_type(replace_local_point_color(Point,NewC,OldC,G,GO))). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_domaintypes.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_domaintypes.pl index cf196d5189..e01afe68c7 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_domaintypes.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_domaintypes.pl @@ -170,8 +170,8 @@ decl_fill_color(X):- put_attr(X,ci,hollow(X)), freeze(X,(mv_peek1(X,V)->(var(V)->true;is_color(V));true)),decl_multivar(X). -decl_multivar(_). -%decl_multivar(X):- multivar:multivar(X). +decl_multivar(_):- !, fail, itrace. +decl_multivar(X):- multivar:multivar(X). decl_not_color(NC,GC):- is_bg_color(NC),!,decl_many_fg_colors(GC). decl_not_color(NC,GC):- decl_fill_color(GC),!,dif(GC,NC). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_explaination.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_explaination.pl index ec19b0bc7e..474d1cb8a8 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_explaination.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_explaination.pl @@ -468,6 +468,7 @@ c_ot(_P2,O,A):- var(O),!,A=O. %c_ot(P2,O,A):- term_contains_ansi(O),!,A=O. c_ot(_P2,O,A):- term_is_ansi(O),!,A=O. +c_ot(_,giz(O),giz(O)):- !. c_ot(P2,O,A):- lock_doing(c_ot,O,call(P2,O,A)),!. c_ot(_P2,O,A):- number(O),!,wots(A,bold_print(write(O))). c_ot(P2,-O,-A):- !, c_ot(P2,O,A). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_grid_size.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_grid_size.pl index 06bfbcc1d8..70e1623b64 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_grid_size.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_grid_size.pl @@ -175,19 +175,38 @@ ((I=@=CI,O=@=CO) -> call(Goal) ; setup_call_cleanup(set_current_pair(I,O),Goal, set_current_pair(CI,CO))). +%current_pair(I,O):- current_pair0(II,OO),II=I,OO=O. +current_pair(I,O):- (var(I)->luser_getval(input_grid,I);true), + must_det_ll((is_gridoid(I),other_grid(I,O))). + + +ensure_example_num(I,O):- + ignore(( + current_test_example(TestID,ExampleNum0), + ((ExampleNum=ExampleNum0;ExampleNum=_), kaggle_arc(TestID,ExampleNum,II,OO), + once((II=@=I,OO=@=O);(II=@=I,OO=@=O))), + set_example_num(ExampleNum))),!. + +set_current_pair(I,O):- + must_det_ll((ensure_example_num(I,O), + %luser_setval(input_grid,I), + %luser_setval(output_grid,O), + ensure_other_grid(I,O), + %set_target_grid(O), + other_grid(I,OOO),nop((OOO=@=O)))),!. + +%current_pair_io(I,O):- fail, current_test_example(TestID,ExampleNum), ground(ExampleNum),!, kaggle_arc(TestID,ExampleNum,I,O). +current_pair_io(I,O):- + current_test_example(TestID,ExampleNum), + kaggle_arc(TestID,ExampleNum,I,O), set_current_pair(I,O), (ground(ExampleNum)->!;true). - - -set_current_pair(I,O):- - luser_setval(input_grid,I), - luser_setval(output_grid,O),ensure_other_grid(I,O),set_target_grid(O), - must_det_ll((other_grid(I,OO),OO==O)). - -current_pair(I,O):- current_pair0(II,OO),II=I,OO=O. -current_pair0(I,O):- luser_getval(input_grid,I), is_gridoid(I),!, must_det_ll((other_grid(I,O))). -current_pair0(I,O):- current_test_example(TestID,ExampleNum), +/* +current_pair_io(I,O):- current_test_example(TestID,ExampleNum), + (luser_getval(input_grid,Was);Was=[]), setup_call_cleanup(true, - ((kaggle_arc(TestID,ExampleNum,I,O);fail),set_current_pair(I,O)), luser_setval(input_grid,[])). + ((kaggle_arc(TestID,ExampleNum,I,O);fail),set_current_pair(I,O)), + luser_setval(input_grid,Was)). +*/ % test_hint(ratio_between(mass,mass)). %ac0a08a4 increase_size_by_grid_mass(In,Out):- mass(In,Mass),increase_size(Mass,In,Out). @@ -196,14 +215,14 @@ -ratio_between(Unique_color_count,and(Mass,Area)):- !, current_pair(I,O), +ratio_between(Unique_color_count,and(Mass,Area)):- !, current_pair_io(I,O), call(Unique_color_count,I,UCC), ratio_about(Mass,UCC,I,O), ratio_about(Area,UCC,I,O). -ratio_between(Mass1,Mass2):- current_pair(I,O), call(Mass1,I,UCC), ratio_about(Mass2,UCC,I,O). +ratio_between(Mass1,Mass2):- current_pair_io(I,O), call(Mass1,I,UCC), ratio_about(Mass2,UCC,I,O). ratio_about(square(Area), UCC,I,O):- !, call(Area,I,IA), call(Area,O,OA), n_times(UCC^2,IA,OA). ratio_about(Mass, UCC,I,O):- call(Mass,I,IM), call(Mass,O,OM), n_times(UCC,IM,OM). -test_hint(How,P2):- must_det_ll((current_pair(I,O),call(P2,I,II),call(P2,O,OO))),call(How,II,OO). +test_hint(How,P2):- must_det_ll((current_pair_io(I,O),call(P2,I,II),call(P2,O,OO))),call(How,II,OO). test_hint(G):- current_predicate(_,G),!,call(G). mass_and_area(P2Mass,P2Area):- test_hint(P2Mass,mass),test_hint(P2Area,area). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_heuristics.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_heuristics.pl index bb69626da1..d3847fdc85 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_heuristics.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_heuristics.pl @@ -12,6 +12,177 @@ :- discontiguous learn_shapelib/7. :- discontiguous individuals_from_pair/9. + +i_pair(WasROptions,GridIn,GridOut):- WasROptions==complete, + catch((must_det_ll(( + check_for_refreshness, + ((var(GridIn);var(GridOut))-> current_pair_io(GridIn,GridOut) ; true), + maybe_name_the_pair(GridIn,GridOut,PairName), + notrace(((((guess_how(HOW,GridIn,GridOut,Stuff1,Stuff2), + guess_how_else(HOW_ELSE,Stuff1,Stuff2,InC,OutC)))))), + INDIV = [HOW|HOW_ELSE], + show_individuated_pair(PairName,INDIV,GridIn,GridOut,InC,OutC)))),_,fail),!. + +i_pair(ROptions,GridIn,GridOut):- + must_det_ll(( + check_for_refreshness, + maybe_name_the_pair(GridIn,GridOut,PairName), + individuate_pair(ROptions,GridIn,GridOut,InC,OutC), + show_individuated_pair(PairName,ROptions,GridIn,GridOut,InC,OutC))). + + + +maybe_optimize_objects(InC00,OutC00,InCR,OutCR):- + wots(S, + w_section(optimize_objects, (( + once((must_det_ll(( + remove_background_only_object(InC00,InC000), + remove_background_only_object(OutC00,OutC000), + extend_grp_proplist(InC000,InC0), + extend_grp_proplist(OutC000,OutC0), + maybe_fix_group(InC0,InCRFGBG), + maybe_fix_group(OutC0,OutCRFGBG), + mostly_fg_objs(InCRFGBG,InCR), + mostly_fg_objs(OutCRFGBG,OutCR), + nop((show_changes(InC0,InCR), + show_changes(OutC0,OutCR))))))))),ran_collapsed)), + ((InC00\=@=InCR;OutC00\=@=OutCR),(InCR\==[],OutCR\==[])),!, + write(S). + +optimize_objects(InC00,OutC00,InC,OutC):- + (maybe_optimize_objects(InC00,OutC00,InC,OutC)->true;(InC00=InC,OutC00=OutC)). + + + +show_individuated_pair(PairName,ROptions,GridIn,GridOfIn,InC,OutC):- + GridIn=@=GridOfIn,!, + must_det_ll(( + into_iog(InC,OutC,IndvS), + show_individuated_nonpair(PairName,ROptions,GridIn,GridOfIn,IndvS))). + +show_individuated_pair(PairName,ROptions,GridIn,GridOut,InC00,OutC00):- + maybe_optimize_objects(InC00,OutC00,InCR,OutCR),!, + show_individuated_pair(PairName,ROptions,GridIn,GridOut,InCR,OutCR),!. + + +show_individuated_pair(PairName,ROptions,GridIn,GridOut,InCB,OutCB):- + must_det_ll(( + grid_to_tid(GridIn,ID1), grid_to_tid(GridOut,ID2), + w_section(show_individuated_sections,(( + print_side_by_side(red,GridIn,gridIn(ROptions,ID1,PairName),_,GridOut,gridOut(ID2)), + as_ngrid(GridIn,GridIn1),as_ngrid(GridOut,GridOut1), xfer_zeros(GridIn1,GridOut1), + print_side_by_side(yellow,GridIn1,ngridIn(ROptions,ID1,PairName),_,GridOut1,ngridOut(ID2)), + %trace, + grid_size(GridIn,IX,IY),grid_size(GridOut,OX,OY), + print_side_by_side(green,print_grid(IX,IY,InCB),before_rm_bg(ROptions,ID1,PairName),_,print_grid(OX,OY,OutCB),before_rm_bg(ID2)), + remove_background_only_object(InCB,InC),remove_background_only_object(OutCB,OutC), + %pp(InC), + print_side_by_side(green,InC,after_rm_bg(ROptions,ID1),_,OutC,objs(ID2)), + + if_t( \+ nb_current(menu_key,'i'), +(((((( + + show_indivs_side_by_side(inputs,InC), + show_indivs_side_by_side(outputs,OutC), + + %w_section(show_io_groups,show_io_groups(green,ROptions,ID1,InC,ID2,OutC)), + %show_io_groups(green,ROptions,ID1,InC,ID2,OutC), + =(InCR,InC), =(OutCR,OutC), + print_side_by_side(green,InC,lhs(ROptions,ID1),_,OutC,rhs(ROptions,ID2)), + true))), + + ((( + banner_lines(orange), %visible_order(InC,InCR), + if_t( once(true; \+ nb_current(menu_key,'i')), + + w_section(show_individuated_learning,must_det_ll(( + %when_in_html(if_wants_output_for(guess_some_relations,guess_some_relations(InC,OutC))), + %when_in_html(if_wants_output_for(sort_some_relations,sort_some_relations(InC,OutC))), + if_wants_output_for(learn_group_mapping, if_t(sub_var(trn,ID1), learn_group_mapping(InCR,OutCR))), + if_wants_output_for(learn_group_mapping_of_tst, if_t(sub_var(tst,ID1), learn_group_mapping(InCR,OutCR))), + + + if_wants_output_for(show_safe_assumed_mapped, show_safe_assumed_mapped), + if_wants_output_for(show_test_associatable_groups, + forall(member(In1,InC),show_test_associatable_groups(ROptions,ID1,In1,GridOut))), + + if_wants_output_for(try_each_using_training, + forall(try_each_using_training(InC,GridOut,RulesUsed,OurOut), + ignore(( + print_grid(try_each_using_training,OurOut), + nop(pp(RulesUsed)), + banner_lines(orange,2))))))))), + + banner_lines(orange,4))))))))))))),!, + if_wants_output_for(show_interesting_props, show_interesting_props(PairName,InC,OutC)),!. + + + + +show_indivs_side_by_side(W,InC):- \+ wants_html,!, + print_list_of(show_indiv(W),W,InC). +show_indivs_side_by_side(W,InC):- show_indivs_side_by_side_html(W,InC). + +show_indivs_side_by_side_html(W,InC):- + my_maplist(show_indiv_vert(W),InC,Vert), + print_table([Vert]). + +show_indiv_vert(W,Obj,TD):- wots(TD,show_indiv(W,Obj)). + + + +arc_spyable_keyboard_key(detect_pair_hints,'g'). +arc_spyable_keyboard_key(show_interesting_props,'y'). +arc_spyable_keyboard_key(show_safe_assumed_mapped,'j'). +arc_spyable_keyboard_key(learn_group_mapping,'o'). +arc_spyable_keyboard_key(learn_group_mapping_of_tst,'o'). +arc_spyable_keyboard_key(show_test_associatable_groups,'a'). +arc_spyable_keyboard_key(try_each_using_training,'u'). + + +show_test_associatable_groups(ROptions,ID1,InC,GridOut):- + print_grid(wqs(show_test_assocs(ROptions,ID1)),InC), + forall( + must_det_ll1((use_test_associatable_group(InC,Sols) + *-> show_result("Our Learned Sols", Sols,GridOut,_) + ; arcdbg_info(red,warn("No Learned Sols")))), + true). + + +show_group(ID1,InC):- + must_det_ll(( + length(InC,IL),g_display(InC,InCSS),print_side_by_side(len(ID1,IL)=InCSS),print_grid(combined(ID1)=InC))). + +show_io_groups(Color,ROptions,ID1,InC0,ID2,OutC0):- + must_det_ll(( + banner_lines(Color,3), + visible_order(InC0,InC), + visible_order(OutC0,OutC), + print_side_by_side(Color,InC,lhs(ROptions,ID1),_,OutC,rhs(ROptions,ID2)), + banner_lines(Color,2), + show_group(lhs(ID1),InC), + banner_lines(Color), + show_group(rhs(ID2),OutC), + banner_lines(Color,3))), + nop((if_t(should_not_be_io_groups(InC,OutC), ( print(InC),print(OutC),ibreak)))). + +should_not_be_io_groups(I,O):- I\==[],O\==[],I=@=O. + +visible_order_fg(InC0,InC):- is_grid(InC0),!,InC=InC0. +visible_order_fg(InC00,InC):- is_list(InC00),!,include(is_used_fg_object,InC00,InC0),visible_order(InC0,InC). +visible_order_fg(InC,InC). +visible_order(InC0,InC):- is_grid(InC0),!,InC=InC0. +visible_order(InC0,InC):- is_list(InC0),!, predsort(sort_on(most_visible),InC0,InC). +visible_order(InC,InC). + +most_visible(Obj,LV):- has_prop(pixel2C(_,_,_),Obj),!, LV= (-1)^1000^1000. +most_visible(Obj,LV):- area(Obj,1), grid_size(Obj,H,V), Area is (H-1)*(V-1), !, LV=Area^1000^1000. +most_visible(Obj,LV):- area(Obj,Area),cmass(bg,Obj,BGMass), % cmass(fg,Obj,FGMass), + findall(_,doing_map_list(_,_,[Obj|_]),L),length(L,Cnt),NCnt is -Cnt, !, %, NCMass is -CMass, + LV = Area^BGMass^NCnt. +most_visible(_Obj,LV):- LV= (-1)^1000^1000. + + recalc_sizes(VM,[After|TODO]):- recalc_sizes(VM), nop((set(VM.lo_program) = [After,recalc_sizes|TODO])). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_imageproc.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_imageproc.pl index 3882e2b3e6..926b1436e4 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_imageproc.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_imageproc.pl @@ -334,7 +334,7 @@ pred_global_cpoints(Pred7,Color,[H|T],Grid,GridO):- !, pred_global_cpoints(Pred7,Color,H,Grid,GridM),pred_global_cpoints(Pred7,Color,T,GridM,GridO). pred_global_cpoints(Pred7,FG,Point,Grid,GridO):- FG == fg, point_to_hvc(Point,H,V,C), !, hv_c_value_or(Grid,Old,H,V,_), call(Pred7,H,V,C,Old,Grid,GridO). pred_global_cpoints(Pred7,Color,Point,Grid,GridO):- point_to_hvc(Point, H,V,_), hv_c_value_or(Grid,Old,H,V,_), call(Pred7,H,V,Color,Old,Grid,GridO). -%pred_global_cpo ints(Pred7,Color,Point,Grid,GridO):- set_local _points(Pred7,,Point,Grid,GridO). +%pred_global_cpo ints(Pred7,Color,Point,Grid,GridO):- set_local _points(Pred7, ,Point,Grid,GridO). pred_global_cpoints(Pred7,Color,Point,Grid,Grid):- nop(warn_skip(((pred_global_points(Pred7,Color,Point))))). @@ -489,6 +489,61 @@ subst_cvars([],[],A,A):-!. subst_cvars([F|FF],[R|RR],S,D):- !, freeze(R,(\=(R,_-_))),subst001(S,F,R,M), subst_cvars(FF,RR,M,D). + +pair_color_order(Grid,Colors):- + testid_name_num_io_0(Grid,TestID,E,N,_),!, + findall(G,kaggle_arc_io(TestID,E+N,_,G),GL), + grid_color_order(GL,Colors). + +input_color_vary(TestID):- + findall(G,kaggle_arc_io(TestID,trn+_,in,G),GL), + color_vary(GL). +output_color_vary(TestID):- + findall(G,kaggle_arc_io(TestID,trn+_,out,G),GL), + color_vary(GL). +output_to_input_color_vary(TestID):- + forall(kaggle_arc(TestID,trn+_,I,O),color_overlap(I,O)). + +color_vary(I,O):- \+ color_overlap(I,O). +color_vary([I,O]):- !, color_vary(I,O). +color_vary(List):- forall(pairs_from(List,I,O),color_vary(I,O)). + +pairs_from(List,I,O):- append(_,[I|Rest],List),member(O,Rest). + +color_overlap(I,O):- fg_color_cc(I,FG1),fg_color_cc(O,FG2), + color_overlap_cc(FG1,FG2). + +color_overlap_cc(FG1,FG2):- + maplist(arg_same(1),FG1,FG2). +size_overlap_cc(FG1,FG2):- + maplist(arg_same(2),FG1,FG2). + + + + +fg_color_cc(Grid,FGs):- + colors_cc(Grid,CCs), + my_include(arg1(is_real_fg_color),CCs,FGs). + +test_color_order(Grid,Colors):- + testid_name_num_io_0(Grid,TestID,_,_,_),!, + findall(G,kaggle_arc_io(TestID,_,_,G),GL), + grid_color_order(GL,Colors). + +grid_color_order(Grid,Colors):- + fg_color_cc(Grid,FGs), + maplist(arg(1),FGs,Colors). + +apply_grid_color_order(Colors,Grid,GridO):- + (var(Colors)->test_color_order(Grid,Colors);true), + available_fg_colors(Avails), + mapgrid(subst_color_order(Colors,Avails),Grid,GridO),!. +subst_color_order(Colors,Avails,Grid,GridO):- + is_color(Grid),nth1(Nth,Colors,E),E=@=Grid, + nth1(Nth,Avails,GridO),!. +subst_color_order(_,_,Grid,Grid). + + /* colors_to_vars(B,A,Grid,GridO):- is_list(Grid),!,my_maplist(colors_to_vars(B,A),Grid,GridO). colors_to_vars(F,R,S,D):- nth1(N,F,E),E==S,nth1(N,R,D),!. @@ -688,20 +743,21 @@ grid_size(NIL,1,1):- NIL==[],!. grid_size(ID,H,V):- is_grid_size(ID,H,V),!. grid_size(GID,H,V):- atom(GID),gid_to_grid(GID,Grid),!,grid_size_nd(Grid,H,V),!. -grid_size(OID,H,V):- atom(OID),oid_to_parent_gid(OID,GID),grid_size(GID,H,V),!. +grid_size(Point,H,V):- is_point(Point),hv_point(H,V,Point),!. +grid_size(OID,H,V):- \+compound(OID),!,atom(OID),!,oid_to_parent_gid(OID,GID),grid_size(GID,H,V),!. grid_size(I,H,V):- notrace(is_object(I)),indv_props_list(I,L),gsize_member(E,H,V),member(E,L),!. %grid_size(G,H,V):- quietly(is_object(G)), !, vis2D(G,H,V). -grid_size(Points,H,V):- is_points_list(Points),!,points_range(Points,_LoH,_LoV,_HiH,_HiV,H,V),!. +grid_size(Points,H,V):- is_points_list(Points),!,must_det_ll(points_range(Points,_LoH,_LoV,_HiH,_HiV,H,V)),!. %grid_size(G,H,V):- is_graid(G,GG),!, grid_size(GG,H,V). grid_size(G,H,V):- notrace(is_vm_map(G)),H = G.h,V = G.v, !. grid_size(G,H,V):- notrace(is_group(G)),mapgroup(grid_size_term,G,Offsets),grid_size_2d(Offsets,H,V),!. -grid_size(G,H,V):- findall(size2D(H,V),((sub_term(E,G),compound(E),gsize_member(E,H,V))),Offsets),grid_size_2d(Offsets,H,V),!. +grid_size(G,H,V):- findall(size2D(H,V),((sub_compound(E,G),gsize_member(E,H,V))),Offsets),grid_size_2d(Offsets,H,V),!. %grid_size([G|G],H,V):- is_list(G), length(G,H),length([G|G],V),!. grid_size(G,H,V):- notrace(is_grid(G)),!,grid_size_nd(G,H,V),!. %grid_size([G|G],H,V):- is_list(G),is_list(G), grid_size_nd([G|G],H,V),!. %grid_size(O,_,_):- trace_or_throw(no_grid_size(O)). -grid_size(G,H,V):- sub_term(E,G),compound(E),E=giz(gid(GID)),nonvar(GID),grid_size(GID,H,V),!. -grid_size(G,H,V):- sub_term(E,G),compound(E),E=oid(OID),nonvar(OID),oid_to_parent_gid(OID,GID),grid_size(GID,H,V),!. +grid_size(G,H,V):- sub_compound(E,G),E=giz(gid(GID)),nonvar(GID),grid_size(GID,H,V),!. +grid_size(G,H,V):- sub_compound(E,G),E=oid(OID),nonvar(OID),oid_to_parent_gid(OID,GID),grid_size(GID,H,V),!. grid_size(O,30,30):- arcST,itrace,dmsg(warn(grid_size(O,30,30))),!. diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_individuation.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_individuation.pl index 414c19939f..19ad5c5863 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_individuation.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_individuation.pl @@ -54,37 +54,70 @@ extend_obj_proplists, really_group_vm_priors, %whole, - %combine_objects, + %combine_objects, end_of_macro]). no_fg_mass(Zero):- mass(Zero,Mass),!,Mass=0. i_minus_o_equals_none:- i_minus_o(Zero), no_fg_mass(Zero). o_minus_i_equals_some:- o_minus_i(Zero), \+ no_fg_mass(Zero). +mono_i_minus_o_equals_none:- mono_i_minus_o(Zero), no_fg_mass(Zero). +mono_o_minus_i_equals_some:- mono_o_minus_i(Zero), \+ no_fg_mass(Zero). + +i_minus_o(Zero):- current_pair_io(I,O),mapgrid(cell_minus_cell,I,O,Zero). +o_minus_i(Zero):- current_pair_io(I,O),mapgrid(cell_minus_cell,O,I,Zero). + +i_intersect_o(Zero):- current_pair_io(I,O),mapgrid(fg_intersectiond,O,I,Zero). +mono_i_intersect_o(Zero):- current_pair_io(I,O),mapgrid(fg_intersectiond_mono,O,I,Zero). + +mono_i_minus_o(Zero):- current_pair_io(I,O),mapgrid(mono_cell_minus_cell,I,O,Zero). +mono_o_minus_i(Zero):- current_pair_io(I,O),mapgrid(mono_cell_minus_cell,O,I,Zero). + +show_minuses:- + maplist(show_minuses,[i_minus_o,mono_i_minus_o,mono_o_minus_i,o_minus_i],SS), + print_ss(SS). + +show_minuses(P1,P1=G):- call(P1,G). -i_minus_o(Zero):- current_pair(I,O),mapgrid(cell_minus_cell,I,O,Zero). -o_minus_i(Zero):- current_pair(I,O),mapgrid(cell_minus_cell,O,I,Zero). -mono_i_minus_o(Zero):- current_pair(I,O),mapgrid(mono_cell_minus_cell,I,O,Zero). -mono_o_minus_i(Zero):- current_pair(I,O),mapgrid(mono_cell_minus_cell,O,I,Zero). -mono_i_to_o_is_none_some_none:- - mono_i_minus_o(Zero1),no_fg_mass(Zero1), - mono_o_minus_i(Zero2),no_fg_mass(Zero2), - o_minus_i_equals_some. -individuation_macros(complete, ListO):- +individuation_macros(complete, [i_complete]). +individuation_macros(i_complete, ListO):- must_det_ll(( im_complete(ListC), flatten([ListC,do_ending],ListM), list_to_set(ListM,ListS))),!, ListO=ListS. -i_minus_o_equals_none_o_minus_i_equals_some:- i_minus_o_equals_none,o_minus_i_equals_some. +pair_test(mono_i_to_o_is_none_some_none). +pair_test(i_to_o_is_none_some_some). +pair_test(mono_i_to_o_is_none_some_some_not_color). + + +mono_i_to_o_is_none_some_some_not_color:- + \+ i_to_o_is_none_some_some, + mono_i_minus_o_equals_none,mono_o_minus_i_equals_some. + + +i_to_o_is_none_some_some:- i_minus_o_equals_none,o_minus_i_equals_some. + +mono_i_to_o_is_none_some_none:- + mono_i_minus_o(Zero1),no_fg_mass(Zero1), + mono_o_minus_i(Zero2),no_fg_mass(Zero2), + o_minus_i_equals_some. + + + +im_complete(do_im_complete). + +is_fti_step(do_im_complete). -im_complete(i_to_o_is_none_some_some):- i_minus_o_equals_none_o_minus_i_equals_some,!. -im_complete(mono_i_to_o_is_none_some_none):- mono_i_to_o_is_none_some_none,!. -im_complete(ListO):- test_config(indiv(ListO)), [i_repair_patterns]\=@= ListO,[i_repair_patterns_f]\=@= ListO,[any]\= ListO,['']\= ListO,''\= ListO,!. -im_complete(i_complete_generic). +do_im_complete(VM):- is_im_complete(Info), run_fti(VM,Info). + +is_im_complete(i_to_o_is_none_some_some):- i_to_o_is_none_some_some,!. +is_im_complete(mono_i_to_o_is_none_some_none):- mono_i_to_o_is_none_some_none,!. +is_im_complete(ListO):- test_config(indiv(ListO)), [i_repair_patterns]\=@= ListO,[i_repair_patterns_f]\=@= ListO,[any]\= ListO,['']\= ListO,''\= ListO,!. +is_im_complete(i_complete_generic). %im_complete(ListO):- ListO=[nsew,all_lines,diamonds,do_ending]. %im_complete([i_repair_patterns]):- get_current_test(TestID),is_symgrid(TestID),!. %im_complete(i_repair_patterns):-!. @@ -93,45 +126,59 @@ is_input_vm(VM):- VM.id=(_>(trn+N)*in),!,integer(N). -mass_gtt(Two,O):- globalpoints(O,GP),length(GP,Len),Len>Two. +fg_mass_geq(Two,O):- globalpoints(O,GP),include(is_fg_point,GP,FG), length(FG,Len),Len>=Two. % ===================================================================== is_fti_step(i_to_o_is_none_some_some). % ===================================================================== i_to_o_is_none_some_some(VM):- \+ is_output_vm(VM),!,i_to_o_is_none_some_some_in(VM),!. -i_to_o_is_none_some_some(VM):- - is_output_vm(VM),!, +i_to_o_is_none_some_some(VM):- is_output_vm(VM),!, + set_example_num_vm(VM), o_minus_i(NewGrid), + gset(VM.objs)=[], + show_minuses, set_vm_grid_now(VM,NewGrid), + i_intersect_o(Intersect), + individuate([keypads],Intersect,AddObjs), + my_maplist(mergeObject(VM),AddObjs), run_fti(VM,generic_nsew_colormass), - current_pair(I,_O), + current_pair_io(I,_O), set_vm_grid_now(VM,I), i_to_o_is_none_some_some_in(VM). i_to_o_is_none_some_some_in(VM):- + set_current_pair(VM.start_grid,VM.target_grid), ignore(keypads(VM)), + + + length(VM.lo_points,LenMass), if_t(LenMass>0, must_det_ll(( OObjs = VM.objs, + set_example_num_vm(VM), + gset(VM.objs)=[], + i_intersect_o(Intersect), + individuate([keypads],Intersect,AddObjs), + my_maplist(mergeObject(VM),AddObjs), o_minus_i(Zero), \+ no_fg_mass(Zero), grid_to_points(Zero,Points), - gset(VM.grid)=Zero,% individuate(i_colormass,Zero,Library), + gset(VM.grid)=Zero, + % individuate(i_colormass,Zero,Library), gset(VM.lo_points)=Points, - gset(VM.objs)=[], one_fti(VM,colormass), Library1 = VM.objs, gset(VM.objs)=[], filter_library(Library1,Library), - print_grid(library,Library), - (Library=[_|_]->my_maplist(add_shape_lib(pairs),Library);true), + print_grid(library2(i_to_o_is_none_some_some_in),Library), + nop(Library=[_|_]->my_maplist(add_shape_lib(pairs),Library);true), OGrid = VM.start_grid, OPoints = VM.start_points, gset(VM.grid)=OGrid, gset(VM.lo_points)=OPoints, - print_ss(find_hybrid_shapes,Library,OGrid), - find_hybrid_shapes_on(Library,OGrid,RGroup), - pp(rgroup=RGroup), + print_ss(find_hybrid_shapes2,Library,OGrid), + maybe_find_hybrid_shapes_on(Library,OGrid,RGroup), + pp(rgroup2=RGroup), gset(VM.objs)=OObjs, my_maplist(mergeObject(VM),RGroup), %addOGSObjects(VM,RGroup), @@ -143,38 +190,54 @@ %LeftOver = VM.lo_points, points_to_grid(VM.h,VM.v,LeftOver,Grid), gset(VM.grid)=Grid, - print_ss(afterHybrid,Grid,VM.objs), + print_ss(afterHybrid2,Grid,VM.objs), run_fti(VM,generic_nsew_colormass)))),!. +set_example_num_vm(VM):- + must_det_ll(( + ID = VM.id, + get_example_num(ExampleNum), + set_example_num(ID), + get_example_num(ExampleNum2), + ignore((o_minus_i(NewGrid))), + %dmsg(ExampleNum->ID->ExampleNum2), + print_ss(wqs(o_minus_i(ExampleNum->ID->ExampleNum2)),NewGrid,VM.objs))),!. % ===================================================================== is_fti_step(mono_i_to_o_is_none_some_none). % ===================================================================== -mono_i_to_o_is_none_some_none(VM):- - is_output_vm(VM),!, - run_fti(VM,generic_nsew_colormass). -mono_i_to_o_is_none_some_none(VM):- \+ is_output_vm(VM),!,mono_i_to_o_is_none_some_none_in(VM),!. +mono_i_to_o_is_none_some_none(VM):- set_example_num_vm(VM), + \+ is_output_vm(VM),!,mono_i_to_o_is_none_some_none_in(VM),!. mono_i_to_o_is_none_some_none(VM):- + set_example_num_vm(VM), is_output_vm(VM),!, + must_det_ll(( + show_minuses, + gset(VM.objs)=[], + gset(VM.grid)=I, + current_pair_io(I,_O), o_minus_i(NewGrid), set_vm_grid_now(VM,NewGrid), run_fti(VM,generic_nsew_colormass), - current_pair(I,_O), set_vm_grid_now(VM,I), - mono_i_to_o_is_none_some_none_in(VM). + gset(VM.grid)=I, + gset(VM.start_grid)=I, + mono_i_to_o_is_none_some_none_in(VM))). filter_library(Library1,Library):- - remove_background_only_object(Library1,Library2), - include(mass_gtt(2),Library2,Library3),!, - include(is_fg_object,Library3,Library). + must_det_ll((remove_background_only_object(Library1,Library2), + include(fg_mass_geq(3),Library2,Library))), +% include(is_fg_object,Library3,Library). + !. mono_i_to_o_is_none_some_none_in(VM):- + set_example_num_vm(VM), ignore(keypads(VM)), length(VM.lo_points,LenMass), + OObjs = VM.objs, if_t(LenMass>0, must_det_ll(( - OObjs = VM.objs, o_minus_i(Zero), \+ no_fg_mass(Zero), grid_to_points(Zero,Points), gset(VM.grid)=Zero,% individuate(i_colormass,Zero,Library), @@ -185,14 +248,14 @@ gset(VM.objs)=[], filter_library(Library1,Library), %pp(library=Library), - print_grid(library,Library), - (Library=[_|_]->my_maplist(add_shape_lib(pairs),Library);true), + print_grid(library(mono_i_to_o_is_none_some_none_in),Library), + nop((Library=[_|_]->my_maplist(add_shape_lib(pairs),Library);true)), OGrid = VM.start_grid, OPoints = VM.start_points, gset(VM.grid)=OGrid, gset(VM.lo_points)=OPoints, print_ss(find_hybrid_shapes,Library,OGrid), - find_hybrid_shapes_on(Library,OGrid,RGroup), + maybe_find_hybrid_shapes_on(Library,OGrid,RGroup), %i_colormass, %trace, pp(rgroup=RGroup), @@ -210,6 +273,8 @@ print_ss(afterHybrid,Grid,VM.objs), run_fti(VM,generic_nsew_colormass)))),!. +mono_i_to_o_is_none_some_none_in(VM):- + run_fti(VM,generic_nsew_colormass). @@ -249,10 +314,12 @@ zero_to_black, colormass, black_to_zero,alone_dots(lte(25)),zero_to_black, - print_vm_info(post_generic_nsew_colormass),lo_dots,print_vm_info(post_lo_dots)]). + print_vm_info(post_generic_nsew_colormass), + lo_dots, + print_vm_info(post_lo_dots)]). -mass_same_io:- once(arc_common_property(mass(_));((current_pair(I,O),is_grid(O), mass(I,IM),mass(O,OM), IM=OM))). +mass_same_io:- once(arc_common_property(mass(_));((current_pair_io(I,O),is_grid(O), mass(I,IM),mass(O,OM), IM=OM))). use_subtractions:- \+ cant_use_intersections. %once(arc_common_property(containsAll(o-i));arc_common_property(containsAll(o-i))). @@ -266,7 +333,7 @@ forall(nth_above(800,N,L,E+_), (find_indivizers(E,R),format('~N'),sformat(S,'~t~d~t ~w: ~t~w',[N,E,R]),print_menu_cmd1(write(S),E),nl)). do_indivizer_number(N):- - list_of_indivizers(L),nth_above(800,N,L,E), set_indivs_mode(E), + list_of_indivizers(L),nth_above(800,N,L,E+_), set_indivs_mode(E), with_indivs_mode(E,ndividuator). % vm_grid_call(subst_color(black,brown)), @@ -274,6 +341,90 @@ individuation_macros(nsew_bg,[ with_mapgrid([fgc_as_color(plain_var),bgc_as_color(zero),plain_var_as(black)],'_nsew_bg',[nsew,alone_dots,lo_dots])]). +fill_in_bg(_Black,G2,GG2):- is_fg_color(G2),!,ignore(G2=GG2). +fill_in_bg(Black,G2,GG2):- \+ G2\=Black,!,ignore(GG2=Black). +fill_in_bg(Alt,In,Out):- only_color_data_or(Alt,In,Out),!. +fill_in_bg(_Alt,In,In):-!. +into_solid_grid(I,GG1):- into_grid(I,G1),mapgrid(fill_in_bg(black),G1,GG1),!. + + + + + +completely_represents(I,O):- + into_solid_grid(I,I1),into_solid_grid(O,O1), + (I1=@=O1-> true ; (print_ss(not_completely_represents,I1,O1),fail)). + +current_how(HOW,Stuff1,Stuff2):- + current_pair_io(I,O), guess_how(HOW,I,O,Stuff1,Stuff2). + +current_how_else(HOW,Stuff1,Stuff2):- + current_how(HOW,I,O), guess_how_else(HOW,I,O,Stuff1,Stuff2). + + +guess_how_else([HOW|HOW_ELSE],I,O,Stuff1,Stuff2):- + guess_how(HOW,I,O,MID1,MID2), + maplist(guess_how_else,how,HOW_ELSE,MID1,MID2,Stuff1,Stuff2),!. +guess_how_else([],I,O,I,O). + +guess_how(HOW,I1,O1,Stuff1,Stuff2):- + must_det_ll((into_solid_grid(I1,I2),into_solid_grid(O1,O2))),!, + indiv_how1(HOW), + duplicate_term(I2+O2,I+O), + must_det_ll(( + + once((individuate(HOW,I,Stuff1))), + once((individuate(HOW,O,Stuff2))))), + + length(Stuff1,L),L>0,length(Stuff2,L), + must_det_ll(( + print_ss(orig,I,O), + ignore(completely_represents(I,Stuff1)), + ignore(completely_represents(O,Stuff2)), + print_ss(objs(HOW,L),Stuff1,Stuff2), + save_how_io(HOW,HOW))). + + + + +individuation_macros(completely_do(This),[This,do_ending]). + +is_grid_io(Grid,RealIO):- get_current_test(TestID),kaggle_arc_io(TestID,_,RealIO,G),Grid=@=G,!. +indiv_how(IO,How):- is_grid(IO),is_grid_io(IO,RealIO),!,indiv_how(RealIO,How). +indiv_how(IO,How):- arc_test_property(common,indiv_how(IO),How),!. +indiv_how(_,How):- indiv_how1(How). + +indiv_how1(completely_do(i_complete)). +indiv_how1(completely_do(i_colormass)). +indiv_how1(completely_do(i_mono_colormass)). +%indiv_how(completely_do(maybe_lo_dots)). +indiv_how1( indv_opt(Flags)):- fail, + toggle_values([bground,diags,mono,shape,boxes,parts],Flags). +toggle_values([N|Names],[V|Vars]):- toggle_values(Names,Vars), toggle_val(N,V). +toggle_values([],[]). +toggle_val(Lst,V):- is_list(Lst),!,member(V,Lst). +toggle_val(N,V):- member(TF,[false,true]), V =..[N,TF]. + + +is_fti_step(set_indv_flags). +set_indv_flags(X,_VM):- set_indv_flags(X),!. +set_indv_flags(X):- is_list(X),!,maplist(set_indv_flags,X). +set_indv_flags(NV):- NV=..[N,V],assert(indv_flag(N,V)). + +is_fti_step(which_tf). +which_tf(Name,True,False,VM):- (indv_flag(Name,true)->run_fti(VM,True);run_fti(VM,False)). + +is_fti_step(nop). + +individuation_macros(indv_opt(Flags), + [set_indv_flags(Flags),which_tf(mono,fg_shapes(TODO),TODO)]):- + TODO = [ %bg_shapes(nsew), + which_tf(shape,do_im_complete,nop), + which_tf(diags,colormass,nsew), + call(print(Flags)), + which_tf(boxes,pbox_vm_special_sizes,nop), + which_tf(bground,remove_if_prop(cc(fg,0)),nop)]. + individuation_macros(i_complete_generic333, [save_as_obj_group([indv_omem_points]), @@ -432,151 +583,6 @@ - - -maybe_optimize_objects(InC00,OutC00,InCR,OutCR):- - wots(S, - w_section(optimize_objects, (( - once((must_det_ll(( - remove_background_only_object(InC00,InC000), - remove_background_only_object(OutC00,OutC000), - extend_grp_proplist(InC000,InC0), - extend_grp_proplist(OutC000,OutC0), - maybe_fix_group(InC0,InCRFGBG), - maybe_fix_group(OutC0,OutCRFGBG), - mostly_fg_objs(InCRFGBG,InCR), - mostly_fg_objs(OutCRFGBG,OutCR), - nop((show_changes(InC0,InCR), - show_changes(OutC0,OutCR))))))))),ran_collapsed)), - ((InC00\=@=InCR;OutC00\=@=OutCR),(InCR\==[],OutCR\==[])),!, - write(S). - -optimize_objects(InC00,OutC00,InC,OutC):- - (maybe_optimize_objects(InC00,OutC00,InC,OutC)->true;(InC00=InC,OutC00=OutC)). - - - -show_individuated_pair(PairName,ROptions,GridIn,GridOfIn,InC,OutC):- - GridIn=@=GridOfIn,!, - must_det_ll(( - into_iog(InC,OutC,IndvS), - show_individuated_nonpair(PairName,ROptions,GridIn,GridOfIn,IndvS))). - -show_individuated_pair(PairName,ROptions,GridIn,GridOut,InC00,OutC00):- - maybe_optimize_objects(InC00,OutC00,InCR,OutCR),!, - show_individuated_pair(PairName,ROptions,GridIn,GridOut,InCR,OutCR),!. - - -show_individuated_pair(PairName,ROptions,GridIn,GridOut,InCB,OutCB):- - must_det_ll(( - grid_to_tid(GridIn,ID1), grid_to_tid(GridOut,ID2), - w_section(show_individuated_sections,(( - print_side_by_side(red,GridIn,gridIn(ROptions,ID1,PairName),_,GridOut,gridOut(ID2)), - as_ngrid(GridIn,GridIn1),as_ngrid(GridOut,GridOut1), xfer_zeros(GridIn1,GridOut1), - print_side_by_side(yellow,GridIn1,ngridIn(ROptions,ID1,PairName),_,GridOut1,ngridOut(ID2)), - %trace, - remove_background_only_object(InCB,InC),remove_background_only_object(OutCB,OutC), - %pp(InC), - print_side_by_side(green,InC,objs(ROptions,ID1),_,OutC,objs(ID2)), - - if_t( \+ nb_current(menu_key,'i'), -(((((( - if_wants_output_for(show_interesting_props, - show_interesting_props(PairName,InC,OutC)), - show_indivs_side_by_side(inputs,InC),show_indivs_side_by_side(outputs,OutC), - %w_section(show_io_groups,show_io_groups(green,ROptions,ID1,InC,ID2,OutC)), - %show_io_groups(green,ROptions,ID1,InC,ID2,OutC), - =(InCR,InC), =(OutCR,OutC), - true))), - ((( - banner_lines(orange), %visible_order(InC,InCR), - if_t( once(true; \+ nb_current(menu_key,'i')), - - w_section(show_individuated_learning,must_det_ll(( - %when_in_html(if_wants_output_for(guess_some_relations,guess_some_relations(InC,OutC))), - %when_in_html(if_wants_output_for(sort_some_relations,sort_some_relations(InC,OutC))), - if_wants_output_for(learn_group_mapping, if_t(sub_var(trn,ID1), learn_group_mapping(InCR,OutCR))), - if_wants_output_for(learn_group_mapping_of_tst, if_t(sub_var(tst,ID1), learn_group_mapping(InCR,OutCR))), - - - if_wants_output_for(show_safe_assumed_mapped, show_safe_assumed_mapped), - if_wants_output_for(show_test_associatable_groups, - forall(member(In1,InC),show_test_associatable_groups(ROptions,ID1,In1,GridOut))), - - if_wants_output_for(try_each_using_training, - forall(try_each_using_training(InC,GridOut,RulesUsed,OurOut), - ignore(( - print_grid(try_each_using_training,OurOut), - nop(pp(RulesUsed)), - banner_lines(orange,2))))))))), - - banner_lines(orange,4))))))))))))),!. - - -show_indivs_side_by_side(W,InC):- \+ wants_html,!, - print_list_of(show_indiv(W),W,InC). -show_indivs_side_by_side(W,InC):- show_indivs_side_by_side_html(W,InC). - -show_indivs_side_by_side_html(W,InC):- - my_maplist(show_indiv_vert(W),InC,Vert), - print_table([Vert]). - -show_indiv_vert(W,Obj,TD):- wots(TD,show_indiv(W,Obj)). - - - -arc_spyable_keyboard_key(detect_pair_hints,'g'). -arc_spyable_keyboard_key(show_interesting_props,'y'). -arc_spyable_keyboard_key(show_safe_assumed_mapped,'j'). -arc_spyable_keyboard_key(learn_group_mapping,'o'). -arc_spyable_keyboard_key(learn_group_mapping_of_tst,'o'). -arc_spyable_keyboard_key(show_test_associatable_groups,'a'). -arc_spyable_keyboard_key(try_each_using_training,'u'). - - -show_test_associatable_groups(ROptions,ID1,InC,GridOut):- - print_grid(wqs(show_test_assocs(ROptions,ID1)),InC), - forall( - must_det_ll1((use_test_associatable_group(InC,Sols) - *-> show_result("Our Learned Sols", Sols,GridOut,_) - ; arcdbg_info(red,warn("No Learned Sols")))), - true). - - -show_group(ID1,InC):- - must_det_ll(( - length(InC,IL),g_display(InC,InCSS),print_side_by_side(len(ID1,IL)=InCSS),print_grid(combined(ID1)=InC))). - -show_io_groups(Color,ROptions,ID1,InC0,ID2,OutC0):- - must_det_ll(( - banner_lines(Color,3), - visible_order(InC0,InC), - visible_order(OutC0,OutC), - print_side_by_side(Color,InC,lhs(ROptions,ID1),_,OutC,rhs(ROptions,ID2)), - banner_lines(Color,2), - show_group(lhs(ID1),InC), - banner_lines(Color), - show_group(rhs(ID2),OutC), - banner_lines(Color,3))), - nop((if_t(should_not_be_io_groups(InC,OutC), ( print(InC),print(OutC),ibreak)))). - -should_not_be_io_groups(I,O):- I\==[],O\==[],I=@=O. - -visible_order_fg(InC0,InC):- is_grid(InC0),!,InC=InC0. -visible_order_fg(InC00,InC):- is_list(InC00),!,include(is_used_fg_object,InC00,InC0),visible_order(InC0,InC). -visible_order_fg(InC,InC). -visible_order(InC0,InC):- is_grid(InC0),!,InC=InC0. -visible_order(InC0,InC):- is_list(InC0),!, predsort(sort_on(most_visible),InC0,InC). -visible_order(InC,InC). - -most_visible(Obj,LV):- has_prop(pixel2C(_,_,_),Obj),!, LV= (-1)^1000^1000. -most_visible(Obj,LV):- area(Obj,1), grid_size(Obj,H,V), Area is (H-1)*(V-1), !, LV=Area^1000^1000. -most_visible(Obj,LV):- area(Obj,Area),cmass(bg,Obj,BGMass), % cmass(fg,Obj,FGMass), - findall(_,doing_map_list(_,_,[Obj|_]),L),length(L,Cnt),NCnt is -Cnt, !, %, NCMass is -CMass, - LV = Area^BGMass^NCnt. -most_visible(_Obj,LV):- LV= (-1)^1000^1000. - - % ========================================================= % TESTING FOR INDIVIDUATIONS % ========================================================= @@ -608,11 +614,8 @@ into_grids(GridSpec,GridIn), once((into_grid(GridIn,Grid),igo(ROptions,Grid))). -i_pair(ROptions,GridIn,GridOut):- - check_for_refreshness, - maybe_name_the_pair(GridIn,GridOut,PairName), - individuate_pair(ROptions,GridIn,GridOut,InC,OutC), - show_individuated_pair(PairName,ROptions,GridIn,GridOut,InC,OutC). +/* +*/ %worker_output(G):- \+ menu_or_upper('B'),!, time(wots(_,arc_weto(G))). worker_output(G):- call(G). @@ -832,11 +835,12 @@ % ===================================================================== is_fti_step(print_vm_info). % ===================================================================== +print_vm_info(_Why,_VM):-!. print_vm_info(Why,VM):- - print_grid(VM.h,VM.v,i(print_vm_info(Why,points)),VM.lo_points), - writeg(i(print_vm_info(Why,grid))=VM.grid), + \+ \+ print_grid(VM.h,VM.v,ii(print_vm_info(Why,points)),VM.lo_points), + \+ \+ writeg(i(print_vm_info(Why,grid))=VM.grid), visible_order(VM.objs,Objs), - print_grid(VM.h,VM.v,i(print_vm_info(Why,objs)),Objs), + \+ \+ print_grid(VM.h,VM.v,ii(print_vm_info(Why,objs)),Objs), banner_lines(red). % ===================================================================== @@ -881,7 +885,7 @@ O1\==O2, globalpoints(O1,Ps1),globalpoints(O2,Ps2), Ps1\==Ps2, - area(O1,A1),area(O2,A2), (A1/4>A2), + area(O1,A1),area(O2,A2), ((A1/4)>A2), findall(C-P1,(member(C-P1,Ps1),member(C-P1,Ps2)),Overlaps), length(Overlaps,Len),Len>=2, area_contained(O1,O2), @@ -1207,28 +1211,8 @@ ensure_objects(VM):- must_det_ll(( if_t(\+ is_group(VM.objs), - (individuate(complete,VM), - extend_obj_proplists(VM), - objects_into_grid(VM))))). -/* -% ===================================================================== -is_fti_step(grid_to_objs). -% ===================================================================== -grid_to_objs(VM):- - run_fti(VM,[complete]), - extend_obj_proplists(VM), - Objs = VM.objs,!, - show_indivs_side_by_side(grid_to_objs,Objs), - my_maplist(pp,Objs), - Objs = Grp, - gset(VM.objs)=Grp, - grid_size(Grp,H,V), gset(VM.h)=H, gset(VM.v)=V, - globalpoints(Grp, Points), - gset(VM.lo_points)=Points, - points_to_grid(VM.h,VM.v,Points,Grid), - gset(VM.grid)=Grid,!. - % set_vm_grid_now(VM,Objs),!. -*/ + (individuate(complete,VM))))). + % ===================================================================== is_fti_step(objects_into_grid). % ===================================================================== @@ -1384,7 +1368,7 @@ ignore(( enum_hybrid_shapes(Set,VM), %find_hybrid_shapes_on(VM.gid,Set,VM.o_grid,GroupO), - find_hybrid_shapes_on(Set,VM.grid,Group), + maybe_find_hybrid_shapes_on(Set,VM.grid,Group), ((var(Group);Group==[])->true;addOGSObjects(VM,Group)))). enum_hybrid_shapes(Set,_VM):- @@ -1414,6 +1398,8 @@ ogs_size_ok(SX,SY,_Mass):- SY=2,SX=2,!. ogs_size_ok(_SX,_SY,Mass):- Mass>3,!. +maybe_find_hybrid_shapes_on(_,_,[]):-!. +maybe_find_hybrid_shapes_on( Set,Grid,AllInUse):- find_hybrid_shapes_on( Set,Grid,AllInUse),!. find_hybrid_shapes_on([],_,[]):-!. find_hybrid_shapes_on(_Set,Grid,[]):- mass(Grid,GMass), GMass<1, !. find_hybrid_shapes_on( Set,Grid,AllInUse):- @@ -1811,8 +1797,8 @@ :- multifile(muarc:clear_all_caches/0). :- dynamic(muarc:clear_all_caches/0). muarc:clear_all_caches:- forall(muarc:clear_arc_caches,true), fail. -:- luser_default(use_individuated_cache,false). -:- luser_setval(use_individuated_cache,false). +:- luser_default(use_individuated_cache,true). +:- luser_setval(use_individuated_cache,true). get_individuated_cache(TID,ROptions,GOID,IndvS):- nonvar(ROptions), ground(GOID), \+ luser_getval(use_individuated_cache,false), call_in_testid(arc_cache:individuated_cache(TID,GOID,ROptions,IndvS)),!. @@ -1837,10 +1823,12 @@ must_grid_to_gid(GridIn,GOID), !, individuate2(VM,ROptions,GOID,GridIn,IndvS), once((delistify_single_element(ROptions,NamedOpts), - save_grouped(individuate(NamedOpts,GOID),IndvS))). + maybe_save_grouped(individuate(NamedOpts,GOID),IndvS))). must_grid_to_gid(GridIn,GOID):- must_det_ll(grid_to_gid(GridIn,GOID)). +maybe_save_grouped(A,B):- save_grouped(A,B). + allow_out_in :- true. first_grid_same_areas(In,Out,IO):- @@ -1883,22 +1871,22 @@ compile_and_save_current_test_pt_2(_TestID,_):- cant_use_intersections,!. compile_and_save_current_test_pt_2(_TestID,_):- - current_pair(I,O), + current_pair_io(I,O), arc_common_property(containsAll(i-o)), mapgrid(cell_minus_cell,I,O,IMinusO), print_grid(early_i_minus_o,IMinusO). compile_and_save_current_test_pt_2(_TestID,_):- - current_pair(I,O), + current_pair_io(I,O), arc_common_property(containsAll(o-i)), mapgrid(cell_minus_cell,O,I,OMinusI), print_grid(early_o_minus_i,OMinusI),!. -cell_minus_cell(I,O,M):- maybe_mapgrid(cell_minus_cell,I,O,M),!. +cell_minus_cell(I,O,M):- is_grid(I),!,mapgrid(cell_minus_cell,I,O,M),!. cell_minus_cell(I,O,M):- I=@=O, M=bg. cell_minus_cell(I,_,I). -mono_cell_minus_cell(I,O,M):- maybe_mapgrid(mono_cell_minus_cell,I,O,M),!. +mono_cell_minus_cell(I,O,M):- is_grid(I),!,mapgrid(mono_cell_minus_cell,I,O,M),!. mono_cell_minus_cell(I,O,M):- is_fg_color(I),is_fg_color(O), M=bg. mono_cell_minus_cell(I,_,I). @@ -1934,7 +1922,7 @@ must_be_free(IndvSI),must_be_free(IndvSO), check_for_refreshness, into_grid(In,InG), into_grid(Out,OutG), - individuate_two_grids(ROptions,InG,OutG,IndvSII,IndvSOO), + with_current_pair(InG,OutG,individuate_two_grids(ROptions,InG,OutG,IndvSII,IndvSOO)), IndvSOO=IndvSO,IndvSII=IndvSI,!. @@ -1945,13 +1933,14 @@ delistify_single_element(ROptions,NamedOpts), must_grid_to_gid(GridIn,OIDIn), must_grid_to_gid(GridOut,OIDOut), locally(nb_setval(doing_pair,t), - individuate_two_grids_once(two(OIDIn,OIDOut),NamedOpts,GridIn,GridOut,IndvSI,IndvSO)). + with_current_pair(GridIn,GridOut, + individuate_two_grids_once(two(OIDIn,OIDOut),NamedOpts,GridIn,GridOut,IndvSI,IndvSO))). /* individuate_two_grids_once(OID_In_Out,ROptions,GridIn,GridOut,IndvSI,IndvSO):- saved_group(individuate(ROptions,OID_In_Out),IndvS),!,into_gio(IndvS,IndvSI,IndvSO),!. individuate_two_grids_once(OID_In_Out,ROptions,GridIn,GridOut,IndvSI,IndvSO):- individuate_two_grids_now(OID_In_Out,ROptions,GridIn,GridOut,IndvSI,IndvSO), - ignore((into_iog(IndvSI,IndvSO,IndvS),save_grouped(individuate(ROptions,OID_In_Out),IndvS))). + ignore((into_iog(IndvSI,IndvSO,IndvS),maybe_save_grouped(individuate(ROptions,OID_In_Out),IndvS))). */ individuate_two_grids_once(OID_In_Out,ROptions,GridIn,GridOut,IndvSI,IndvSO):- @@ -1959,7 +1948,7 @@ ((saved_group(individuate(ROptions,OID_In_Out),IndvS),IndvS\==[]) -> into_gio(IndvS,IndvSI,IndvSO) ; ((individuate_two_grids_now(OID_In_Out,ROptions,GridIn,GridOut,IndvSI,IndvSO), - into_iog(IndvSI,IndvSO,IndvS),save_grouped(individuate(ROptions,OID_In_Out),IndvS)))). + into_iog(IndvSI,IndvSO,IndvS),maybe_save_grouped(individuate(ROptions,OID_In_Out),IndvS)))). :- retractall(is_why_grouped_g(_,_,_,_)). @@ -2033,7 +2022,7 @@ individuate2(VM_In,ROptions,ID_In,Grid_In,Objs_In), individuate2(VM_Out,ROptions,ID_Out,Grid_Out,Objs_Out), into_iog(Objs_In,Objs_Out,IndvS), - save_grouped(individuate(ROptions,OID_In_Out),IndvS))),!. + maybe_save_grouped(individuate(ROptions,OID_In_Out),IndvS))),!. /* individuate_two_grids_now_X(OID_In_Out,ROptions,Grid_In,Grid_Out,VM_In,VM_Out,Grid_InX,Grid_OutX,Objs_InX,Objs_OutX):- @@ -2058,7 +2047,7 @@ with_other_grid(Grid_In,individuate2(VM_OutX,ROptions,OID_Out,Grid_OutX,Objs_OutX)))),!, into_iog(Objs_InX,Objs_OutX,IndvS), - save_grouped(individuate(ROptions,OID_In_Out),IndvS))). + maybe_save_grouped(individuate(ROptions,OID_In_Out),IndvS))). */ individuate2(VM,[ROptions],GOID,Grid,IndvS):- nonvar(ROptions), !, individuate2(VM,ROptions,GOID,Grid,IndvS). @@ -2124,22 +2113,30 @@ %ensure_fti(GH,GV,ID,Grid,[],Reserved,NewOptions,Points,VM), set_vm(VM), %individuals_raw(VM,GH,GV,ID,NewOptions,Reserved,Points,Grid,IndvSRaw), - run_fti(VM,ROptions), + run_fti(VM,ROptions), + ObjsB = VM.objs, remove_background_only_object(VM), + find_relations(VM), + remove_dead_links(VM), + extend_obj_proplists(VM), + really_group_vm_priors(VM), + %remove_if_prop(cc(fg,0),VM), IndvSRaw = VM.objs, %as_debug(9,ppt((individuate=IndvSRaw))), make_indiv_object_list(VM,IndvSRaw,IndvS1), %combine_objects(IndvS1,IndvS2), combine_same_globalpoints(IndvS1,IndvS), + print_ss(indvS,ObjsB,IndvS), %list_to_set(IndvS1,IndvS), nop(print_info(IndvS)))). maybe_into_fti(ID_In,[ROptions],Grid_In,VM_In):- nonvar(ROptions),!,maybe_into_fti(ID_In,ROptions,Grid_In,VM_In). -maybe_into_fti(ID_In,ROptions,Grid_In,VM_In):- ROptions==complete,grid_vm(Grid_In,VM_In),!,gset(VM_In.id) = ID_In. +%maybe_into_fti(ID_In,ROptions,Grid_In,VM_In):- ROptions==complete,grid_vm(Grid_In,VM_In),!,gset(VM_In.id) = ID_In. maybe_into_fti(ID_In,ROptions,Grid_In,VM_In):- into_fti(ID_In,ROptions,Grid_In,VM_In). -into_fti(ID,ROptions,GridIn0,VM):- + +into_fti(TID,ROptions,GridIn0,VM):- fix_indivs_options(ROptions,Options), must_det_ll(( ignore((ROptions \= Options, @@ -2151,7 +2148,8 @@ (is_dict(GridIn0)-> (VM = GridIn0, GridIn = GridIn0.grid) ; GridIn0 = GridIn), into_grid(GridIn,Grid), globalpoints_include_bg(GridIn,Points), - (var(ID)->grid_to_tid(Grid,ID);true), + (var(TID)->grid_to_tid(Grid,TID);true), + tid_to_id(TID,ID), grid_size(Grid,H,V), % rb_new(HM),duplicate_term(HM,Hashmap), max_min(H,V,MaxM,_), @@ -2163,6 +2161,8 @@ TID_GID=tid_gid(ID,GOID), check_tid_gid(TID_GID,Grid), + set_example_num(ID), + ignore(other_grid_size(Grid,OGX,OGY)), @@ -2184,6 +2184,7 @@ area:Area, added_points:[], lo_points:Points, + start_points:Points, % repaired:[], props:_{}, option_repair_grid: _, % Automatic, option_pboxes: _, % Automatic, @@ -2206,7 +2207,8 @@ option_NoLinks:_, -%=% changed:_,% solution:_,neededChanged +%=% + changed:_,% solution:_,neededChanged neededChanged:_, repaired:_, full_grid:_, parent_vm:_, @@ -2215,7 +2217,7 @@ start_grid:Grid, ngrid:_, rule_dir: ROptions, - start_points:Points, % repaired:[], + % objects found in grid and object that are reserved to not be found objs:[], robjs:Reserved, % objs_prev:[], % Notes and debug info @@ -2353,12 +2355,13 @@ fti(VM,NotAList):- \+ is_list( NotAList),!, fti(VM,[NotAList]). fti(VM,[Step|Program]):- is_list(Step),append(Step,Program,StepProgram),!,fti(VM,StepProgram). fti(VM,[end_of_macro|TODO]):- !, fti(VM,TODO). + fti(_,[Done|TODO]):- ( \+ done \= Done ), !, u_dmsg(done_fti([Done|TODO])),!. %fti(VM,_):- VM.lo_points==[], !. fti(VM,_):- Objs = VM.objs, length(Objs,Count), - ((member(progress,VM.options); Count > VM.objs_max_len; (statistics(cputime,X), X > (VM.timeleft)))) -> + ((member(progress,VM.options); catch_log(Count > VM.objs_max_len); (statistics(cputime,X), catch_log(X > (VM.timeleft))))) -> print_vm_debug_objs(VM),fail. fti(VM,[+(AddOptions)|TODO]):- !, @@ -2649,7 +2652,7 @@ into_monogrid(Orig,NewGrid):-mapgrid(mono_shaped,Orig,NewGrid). -mono_shaped(G,O):- maybe_mapgrid(mono_shaped,G,O),!. +mono_shaped(G,O):- is_grid(G),!,mapgrid(mono_shaped,G,O),!. mono_shaped(Cell,NewCell):- mono_shaped(fg,wbg,Cell,NewCell). mono_shaped(_FG,_BG,Cell,bg):- plain_var(Cell),!. mono_shaped(_FG,_BG,Cell,bg):- Cell==bg,!. @@ -3036,9 +3039,10 @@ remove_background_only_object(VM):- Objs = VM.objs, ignore(( - is_group(Objs),length(Objs,Len),Len>1, + is_group(Objs),length(Objs,Len),Len>1, + must_det_ll(( remove_background_only_object(Objs,NewObjs,VM), - setObjects(NewObjs,VM))),!. + setObjects(NewObjs,VM))))),!. setObjects(NewObjs,VM):- VM.objs == NewObjs -> true ; gset(VM.objs)=NewObjs. @@ -3048,14 +3052,21 @@ remove_background_only_object(Objs,NewObjs,VM):- remove_background_only_object(VM.h,VM.v,Objs,NewObjs). +remove_background_only_object(H,V,Objs,NewObjs):- fail, + select(O,Objs,Mid), + contains_numberedvars(O), + pp(O), + fail, + !,remove_background_only_object(H,V,Mid,NewObjs). + remove_background_only_object(H,V,Objs,NewObjs):- - select(O,Objs,NewObjs), + select(O,Objs,Mid), area(O,Area),Area>3, vis2D(O,OH,OV), abs(H - OH)<3, abs(V - OV)<3, has_prop(cc(fg,0),O), %has_prop(cc(plain_var,0),O),!, - %print_ss(remove_background_only_object,[O],NewObjs), - !. + print_ss(remove_background_only_object,[O],NewObjs), + !,remove_background_only_object(H,V,Mid,NewObjs). remove_background_only_object(_,_,Objs,Objs):-!. % ===================================================================== @@ -3081,7 +3092,7 @@ % ===================================================================== is_fti_step(fg_subtractions). % ===================================================================== -fg_subtractiond(G,M,O):- maybe_mapgrid(fg_subtractiond,G,M,O),!. +fg_subtractiond(G,M,O):- is_grid(G),!,mapgrid(fg_subtractiond,G,M,O),!. fg_subtractiond(This,Minus,_):- This =@= Minus,!. %fg_subtractiond(This,Minus,_):- \+ This \= Minus,!. fg_subtractiond(This,_,This). @@ -3125,7 +3136,7 @@ vm_subst(Black,Zero,VM):- subst001(VM,Black,Zero,NewVM), set(VM.grid)=NewVM.grid, - itrace,set(VM.start_grid)=NewVM.start_grid, + set(VM.start_grid)=NewVM.start_grid, set(VM.objs)=NewVM.objs, set(VM.start_points)=NewVM.start_points, set(VM.lo_points)=NewVM.lo_points, @@ -3136,14 +3147,14 @@ % ===================================================================== is_fti_step(fg_intersections). % ===================================================================== -fg_intersectiond(This,That,Inter):- maybe_mapgrid(fg_intersectiond,This,That,Inter),!. +fg_intersectiond(This,That,Inter):- is_grid(This),!,mapgrid(fg_intersectiond,This,That,Inter),!. fg_intersectiond(This,That,This):- This =@= That,!. -fg_intersectiond(_,_,bg). +fg_intersectiond(Cell,_,bg):- \+ is_grid(Cell). %fg_intersectiond(_,_,Black):- get_black(Black). -fg_intersectiond_mono(This,That,Inter):- maybe_mapgrid(fg_intersectiond_mono,This,That,Inter),!. +fg_intersectiond_mono(This,That,Inter):- is_grid(This),!,mapgrid(fg_intersectiond_mono,This,That,Inter),!. fg_intersectiond_mono(This,That,This):- is_fg_color(This),is_fg_color(That). -fg_intersectiond_mono(_,_,bg). +fg_intersectiond_mono(Cell,_,bg):- \+ is_grid(Cell). cant_use_intersections:- @@ -3191,7 +3202,7 @@ bigger_grid_contains_other_i_o_1(out,VM):- copy_term(VM.start_grid,Grid), other_grid(Grid,Other), is_grid(Other), - current_pair(I,O), O=@=Grid, + current_pair_io(I,O), O=@=Grid, arc_common_property(containsAll(o-i)), individuate(generic_nsew_colormass,I,IObjs), mapgrid(cell_minus_cell,O,I,R), @@ -3205,7 +3216,7 @@ bigger_grid_contains_other_i_o_2(in,VM):- copy_term(VM.start_grid,Grid), other_grid(Grid,Other), is_grid(Other), - current_pair(I,O), I=@=Grid, + current_pair_io(I,O), I=@=Grid, %arc_common_property(containsAll(i-o)), mapgrid(cell_minus_cell,I,O,R), individuate(generic_nsew_colormass,O,OObjs), @@ -3218,7 +3229,7 @@ bigger_grid_contains_other_i_o_2(IO,VM):- copy_term(VM.start_grid,Grid), other_grid(Grid,Other), is_grid(Other), - current_pair(I,O), + current_pair_io(I,O), I=@=Grid, arc_common_property(containsAll(i-o)), must_det_ll(( @@ -3239,7 +3250,7 @@ /* glean_shape_lib(VM):- - current_pair(I,O), + current_pair_io(I,O), ignore(glean_shape_lib_i(I,O,VM)), ignore(glean_shape_lib_o(I,O,VM)). @@ -3446,9 +3457,10 @@ must_grid_to_gid(GridIn,GOID), individuate2(_,ROptions,GOID,GridIn,IndvS0), my_maplist(add_birth_if_missing(indiv(ROptions)),IndvS0,IndvSL), - once((delistify_single_element(ROptions,NamedOpts), save_grouped(individuate(NamedOpts,GOID),IndvSL))),!, + once((delistify_single_element(ROptions,NamedOpts), + (maybe_save_grouped(individuate(NamedOpts,GOID),IndvSL)))),!, TID = VM.id, - asserta_in_testid(arc_cache:individuated_cache(TID,GOID,ROptions,IndvSL)), + (asserta_in_testid(arc_cache:individuated_cache(TID,GOID,ROptions,IndvSL))), nop((addObjectOverlap(VM,IndvSL))))),!. @@ -3767,14 +3779,14 @@ is_fti_step(keypads). % ====================================== keypads(VM):- - ignore(( Grid = VM.grid, trim_to_rect4(OX,OY,EX,EY,Grid,Keypad), grid_size(Keypad,H,V), print_ss(keypad(OX,OY,H,V,EX,EY),Grid,Keypad), H==3,V==3, - mass(Keypad,Mass),!, + mass(Keypad,Mass), Mass>=9,Mass=<9, + must_det_ll(( grid_to_points(Keypad,LPoints), writeg(keypad=Keypad), length(LPoints,Len), @@ -3783,10 +3795,34 @@ %itrace, my_maplist(make_point_object(VM,[birth(keypads),iz(media(shaped))]),AllGpoints,IndvList), print_grid(allGpoints,IndvList), + % remLOPoints(VM,IndvList), + remLOPoints(VM,IndvList))),!. + %addObjects(VM,IndvList) + +keypads(VM):- + ignore(( + Grid = VM.grid, + trim_to_rect4(OX,OY,EX,EY,Grid,Keypad), + grid_size(Keypad,H,V), + print_ss(keypad(OX,OY,H,V,EX,EY),Grid,Keypad), + Area is H*V, + once( H>1 ; V>1 ), + mass(Keypad,Mass), + Mass==Area,Mass=<25, + grid_to_points(Keypad,LPoints), + unique_colors(LPoints,CCs),CCs=[_,_|_], + writeg(keypad=Keypad), + length(LPoints,Len), + writeg(points(Len)=LPoints), + must_det_ll(( + offset_points0(OX,OY,LPoints,AllGpoints), + %itrace, + my_maplist(make_point_object(VM,[birth(keypads),iz(media(shaped))]),AllGpoints,IndvList), + print_grid(allGpoints,IndvList), % remLOPoints(VM,IndvList), remLOPoints(VM,IndvList), %addObjects(VM,IndvList) - !)),!. + !)))),!. % ====================================== % tiny grid becomes a series of points @@ -3827,7 +3863,7 @@ %run_fti(VM,[i_by_color]), set(VM.lo_program)=Code, using_alone_dots(VM,(my_maplist(make_point_object(VM,[birth(glyphic),iz(media(shaped))]),UPoints,IndvList), assumeAdded(VM,IndvList), - save_grouped(individuate(glyphic,VM.gid),IndvList))))))). + maybe_save_grouped(individuate(glyphic,VM.gid),IndvList))))))). %make_point_object(VM,_Opts,Point,Indv):- % member(Point=Indv, VM.added_points),!. @@ -3872,12 +3908,12 @@ make_indiv_object(VM,[iz(stype(whole)),iz(media(image)),% iz(flag(hidden)), mass(Area),loc2D(1,1),globalpoints(Points),localpoints(Points)|Props], Points,Whole),assumeAdded(VM,Whole), - save_grouped(individuate(whole,VM.gid),[Whole]),learn_hybrid_shape(pair,Whole))). + maybe_save_grouped(individuate(whole,VM.gid),[Whole]),learn_hybrid_shape(pair,Whole))). /* if_t(Len>=0, (make_indiv_object(VM,[mass(Len),vis2D(H,V),iz(stype(whole)),iz(flag(always_keep)),loc2D(1,1),iz(media(image))|Props],Points,Whole), assumeAdded(VM,Whole), - save_grouped(individuate(whole,VM.gid),[Whole]),learn_hybrid_shape(pair,Whole))), + maybe_save_grouped(individuate(whole,VM.gid),[Whole]),learn_hybrid_shape(pair,Whole))), localpoints(Grid,LPoints), length(LPoints,CLen),if_t((CLen=<144,CLen>=0), (make_indiv_object(VM,[iz(stype(whole)),iz(media(shaped)),mass(Area),loc2D(1,1)],LPoints,Whole2),assumeAdded(VM,Whole2))). @@ -4380,6 +4416,11 @@ find_one_individual(Option,Obj,VM):- find_one_ifti3(Option,Obj,VM),!. %find_one_individual(Option,Obj,VM):- find_one_ifti2(Option,Obj,VM),!. +include_only_between(HS,HE,VS,VE,IndvPoints0,IndvPoints):- + include(w_in_box(HS,HE,VS,VE),IndvPoints0,IndvPoints). + +w_in_box(HS,HE,VS,VE,CPoint):- hv_c_value(CPoint,_,H,V),between(HS,HE,H),between(VS,VE,V),!. + find_one_ifti3(Option,Obj,VM):- Points = VM.lo_points, @@ -4394,7 +4435,10 @@ FirstTwo=PointsFrom, Rest1 = ScanPoints, points_allowed(VM,Option,PointsFrom), - all_individuals_near(_SkipVM,Dir,Option,C1,PointsFrom,ScanPoints,NextScanPoints,IndvPoints),!, + all_individuals_near(_SkipVM,Dir,Option,C1,PointsFrom,ScanPoints,NextScanPoints,IndvPoints0),!, + + include_only_between(1,VM.h,1,VM.v,IndvPoints0,IndvPoints), + length(IndvPoints,Len),Len>=2,!, make_indiv_object(VM,[iz(ShapeType),iz(media(shaped)),birth((ShapeType))],IndvPoints,Obj), meets_indiv_criteria(VM,Option,IndvPoints), @@ -4986,7 +5030,7 @@ % individuation_macros(i_pbox,[pbox_vm_special_sizes]). -individuation_macros(i_mono_colormass,[fg_shapes(colormass)]). +individuation_macros(i_mono_colormass,[fg_shapes(colormass),generic_nsew_colormass,do_ending]). %individuator(i_colormass,[subshape_both(v,colormass), maybe_lo_dots]). individuation_macros(i_mono_nsew,[fg_shapes(nsew)]). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_individuation_pbox.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_individuation_pbox.pl index fecec7d5a4..c9da2a6e15 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_individuation_pbox.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_individuation_pbox.pl @@ -270,7 +270,7 @@ i_pbox(GridIn,Objs):- ROptions=i_pbox, PairName=i_pbox, - locally(nb_setval(use_individuated_cache,false), + with_individuated_cache(false, ((do_ig(ROptions,GridIn,IndvS), into_grid(GridIn,Grid), locally(nb_setval(debug_indiv,t), diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_interpreter.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_interpreter.pl index b8de28e5df..a0f534cf29 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_interpreter.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_interpreter.pl @@ -85,6 +85,9 @@ unplus_split(II^OO,^,II,OO). unplus_split(II+OO,+,II,OO). +show_grid_call(P2,IO,IIIOOO):- is_plus_split(IO,How,I,O),!,unplus_split(IIIOOO,How,III,OOO), + copy_term(P2,P22), show_grid_call(P2,I,III), show_grid_call(P22,O,OOO). +/* show_grid_call(P2,IO,IIIOOO):- is_plus_split(IO,How,I,O),!,unplus_split(IIIOOO,How,III,OOO), must_det_ll((grid_to_gid(I,GIDI),grid_to_gid(O,GIDO), copy_term(P2,P22), @@ -94,7 +97,7 @@ ((O=OOO,tersify(P22,S2),Aligned=false))))), if_t(((III+OOO)\=@=(I+O)), print_side_by_side(green,III,called(S1,left,from(GIDI)),_,OOO,aligned(Aligned,S2,right,from(GIDO)))))),!. - +*/ show_grid_call(P2,I,III):- grid_call_for_info(P2,I,III,S1), if_t(((III)\=@=(I)), print_side_by_side(green,I,before(S1),_,III,after(S1))),!. @@ -205,17 +208,23 @@ set_vm_grid_now(VM,Grp):- data_type(Grp,Type), gset(VM.type) = data_type(Type), - pp(yellow,set_vm_grid_now(Type)),pp(cyan,Type),fail. + pp(yellow,set_vm_grid_now(Type)),pp(cyan,Type), + fail. + set_vm_grid_now(VM,In):- VM==In,!. -set_vm_grid_now(VM,In):- is_vm_map(In),!,map_to_grid(_Was,In,Obj,_Grid,_Closure), Obj\=@=In, !, set_vm_grid(VM,Obj). +set_vm_grid_now(VM,In):- is_vm_map(In),!, + map_to_grid(_Was,In,Obj,_Grid,_Closure), Obj\=@=In, !, set_vm_grid(VM,Obj). set_vm_grid_now(VM,Grid):- is_grid(Grid), !, + must_det_ll(( + grid_size(Grid,H,V), + gset(VM.h)=H, gset(VM.v)=V, gset(VM.grid)=Grid, - grid_size(Grid,H,V), gset(VM.h)=H, gset(VM.v)=V, -% gset(VM.start_points) = VM.lo_points, + gset(VM.start_grid)=Grid, localpoints_include_bg(Grid, Points), - gset(VM.lo_points)=Points. + gset(VM.lo_points)=Points, + gset(VM.start_points)=Points)). set_vm_grid_now(VM,Points):- is_cpoints_list(Points), !, % gset(VM.start_points) = VM.lo_points, diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_learning.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_learning.pl index 556c66c360..1d9ed8407b 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_learning.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_learning.pl @@ -759,7 +759,8 @@ learn_group_mapping(AG00,BG00):- - warn_skip(learn_group_mapping_now(AG00,BG00)). + %warn_skip + (learn_group_mapping_now(AG00,BG00)). learn_group_mapping_now(AG00,BG00):- %ignore(learn_group_mapping1(AG00,BG00)), @@ -1199,8 +1200,20 @@ assert_showed_mapping(AL,BL),!, skip_rule(IO_DIR,"All background objects "+ TITLE,AL,BL). -save_rule2(IO_DIR,TITLE,IP,OP):- - arcST, + +%save_rule2(IO_DIR,TITLE,[IP],[OP]):- !, save_rule22(IO_DIR,TITLE,IP,OP). +save_rule2(IO_DIR,TITLE,IP,OP):- + save_rule22(IO_DIR,TITLE,IP,OP). + +save_rule22(IO_DIR,TITLE,IP,OP):- + must_det_ll(( + into_lhs_obj(IP,HS1), + into_lhs_obj(OP,HS2), + save_rule3(IO_DIR,TITLE,HS1,HS2))). + + +save_rule3(IO_DIR,TITLE,IP,OP):- + %arcST, ip_op_debug_info(IP,OP,LOCK), if_t(once(true;is_fg_object(IP);is_fg_object(OP)), (must_det_ll(( @@ -1215,6 +1228,15 @@ ((print_rule_grids(IO_DIR,TITLE,IP,OP,LOCK), save_learnt_rule(arc_cache:object_to_object(TITLE,lhs(III),rhs(OOO),NewSharedS,LOCK),oneTwo,twoOne)))))))). +into_lhs_obj(Obj,Obj):-!. +into_lhs_obj(Obj,obj(PropList)):- + must_det_ll(( + PropList = [iz(cenGX(_)),iz(cenGY(_)),iz(sizeGX(_)),iz(sizeGY(_)),iz(sid(_)),pen(_),rot2D(_),oid(_),mass(_)], + maplist(must_indv_prop(Obj),PropList))). + +must_indv_prop(obj(Obj),Prop):- member(Prop,Obj),!. +must_indv_prop(Obj,Prop):- must_det_ll(indv_props(Obj,Prop)). + skip_rule(IO_DIR,TITLE,IP,OP):- ip_op_debug_info(IP,OP,LOCK), once((nb_current(rule_note,RN);RN=rule_note)), @@ -2066,9 +2088,10 @@ use_test_associatable_group(I,O):- - warn_skip(((use_test_associatable_group_now(I,O)))),!. + %warn_skipg + (((use_test_associatable_group_now(I,O)))),!. -use_test_associatable_group(I,O):- +use_test_associatable_group_now(I,O):- use_test_associatable_group_real(I,O), nop(print_side_by_side(real_associatable_group,I,O)). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_object.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_object.pl index 9b413a7326..a9bf0a3c63 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_object.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_object.pl @@ -65,6 +65,7 @@ gpoints_to_iv_info(GPoints,ShapePoints,LocX,LocY,PenColors,RotG,Iv,Overrides,LPoints,Grid,OX,OY,SizeX,SizeY,CentX,CentY):- %points_range(GPoints,LocX,LocY,HiH,HiV,_HO,_VO), once(member(vis2D(SizeX,SizeY),Overrides);(SizeX is HiH-LocX+1,SizeY is HiV-LocY+1)), + must_det_ll(( po_loc2D_vis2D(GPoints,Overrides,LocX,LocY,SizeX,SizeY), deoffset_points(LocX,LocY,GPoints,LPoints), make_grid(SizeX,SizeY,Grid), @@ -72,11 +73,12 @@ %writeg([plPoints=PLPoints,grid=Grid]), add_global_points(PLPoints,Grid,Grid), %writeg([nowgrid=Grid]), - + ShapePoints=[_|_], grid_to_shape(Grid,RotG,OX,OY,ShapePoints,PenColors), + %writeg([then=Grid]), lpoints_to_iv_info(ShapePoints,LocX,LocY,PenColors,RotG,Iv), - gpoints_to_center(GPoints,LocX,LocY,SizeX,SizeY,CentX,CentY). + gpoints_to_center(GPoints,LocX,LocY,SizeX,SizeY,CentX,CentY))). lpoints_to_iv_info(ShapePoints,LocX,LocY,PenColors,RotG,Iv):- L=[ shape_rep(grav,ShapePoints), loc2D(LocX,LocY), pen(PenColors), rot2D(RotG)], @@ -99,13 +101,19 @@ add_prop_with_count(O,N,V):- my_assertion(is_list(V)),add_prop(O,N,V), length(V,Len),atom_concat(N,'_count',NN),add_prop(O,NN,Len). +real_colors(GPoints,Cs):- + findall(C,(sub_term(C,GPoints),is_real_color(C),is_fg_color(C)),L),list_to_set(L,S),!,Cs=S. + :- style_check(+singleton). -make_indiv_object_s(GID0,GridH,GridV,Overrides0,GPoints0,ObjO):- +make_indiv_object_s(GID0,GridH,GridV,Overrides0,GPoints00,ObjO):- + fix_point_colors(GPoints00,GPoints0), testid_name_num_io(GID0,TestID,Example,Num,IO), testid_name_num_io_gid(TestID,Example,Num,IO,GIDR), GID0=GID, - physical_points(GPoints0,GPoints), + physical_points(GPoints0,GPointsM), + nop((Wfg = fg)), + ((nonvar(Wfg),real_colors(GPointsM,[FG1]))->subst(GPointsM,FG1,Wfg,GPoints);GPointsM=GPoints), my_assertion(is_list([overrides|Overrides0])), my_assertion(is_cpoints_list(GPoints)), %luser_getval(test_pairname,ID), @@ -115,7 +123,9 @@ physical_points(LPoints0,LPoints), %writeg([gpoints0=GPoints0,lpoints=LPoints,shapePoints(RotG,OX,OY)=ShapePoints]), - if_t(ShapePoints==[],ibreak), + if_t(ShapePoints==[], + (pp([make_indiv_object_s(GID0,GridH,GridV,Overrides0,GPoints0,ObjO),lPoints=LPoints]), + ibreak)), make_localpoints(ShapePoints,RotG,OX,OY,PenColors,_CheckLPoints), %sort_safe(LPoints0,LPoints0S), %CheckLPoints=LPoints0S, @@ -179,6 +189,9 @@ flatten([ShapeNamesUF],ShapeNamesU),list_to_set(ShapeNamesU,ShapeNames), my_maplist(append_term(iz),ShapeNames,OShapeNames), + my_assertion(LocX= FinalLocalPoints=LPoints; must_det_ll((tips_to_rot(LPoints,GridH,GridV,RotOut,Final),localpoints(Final,FinalLocalPoints)))), @@ -212,11 +225,11 @@ %grav_rot(Grid,NormOps,NormGrid), my_maplist(ignore,[GIDOMem==GID,IvOMem=Iv,GlyphOMem=Glyph,OIDOMem=OID]), - + (PenColors == [cc(Wfg,1)] -> PenColorsR = [cc(FG1,1)] ; PenColorsR = PenColors), flatten( [ PropL, shape_rep(grav,ShapePoints), - pen(PenColors), + pen(PenColorsR), rot2D(RotG), rotSize2D(grav,OX,OY), @@ -231,8 +244,7 @@ iz(sizeGY(SizeYG)),iz(sizeGX(SizeXG)), global2G(GlobalXG,GlobalYG), - % RE=ADD=PHASE2 iz(algo_sid(norm,NormShapeID)), - %iz(mono_algo_sid(norm,MonoNormShapeID)), + % RE=ADD=PHASE2 iz(mono_algo_sid(norm,MonoNormShapeID)), iz(sid(ShapeID)), %ngrid(NGrid), @@ -252,19 +264,17 @@ % RE=ADD=PHASE2 [grid_rep(norm,NormGrid),grid_ops(norm,NormOps),iz(algo_sid(norm,NormSID))], [grid_rep(comp,CompGrid),grid_ops(comp,CompOps),iz(algo_sid(comp,CompSID))], - % [iz(locY(LocY)),iz(locX(LocX))], % iz(tall(SizeY)),iz(wide(SizeX)), + %[iz(locY(LocY)),iz(locX(LocX))], % iz(tall(SizeY)),iz(wide(SizeX)), %obj_to_oid(ID,Iv), kept(giz(g(IO))), kept(giz(testid(TestID))), kept(giz(example_num(Example+Num))), - kept(giz(testid_example_io(TestID>(Example+Num)*IO))), - - + kept(giz(testid_example_io(TestID>(Example+Num)*IO))), %unkept(giz(gid_omem(GIDOMem))), unkept(giz(oid_omem(OIDOMem))), unkept(iv_omem(IvOMem)),giz(glyph_omem(GlyphOMem)), kept(oid(OID)),kept(giz(iv(Iv))),kept(giz(glyph(Glyph))),kept(giz(gid(GIDR))),kept(giz(gido(GID))), - globalpoints(GPoints), + globalpoints(GPointsM), giz(grid_sz(GridH,GridV)), []],Ps00), redress_override(Ps00,Ps0), @@ -274,9 +284,22 @@ with_objprops(override,NewOverrides,Ps,OUT1), sort_obj_props(OUT1,OUT),!,as_obj(OUT,Obj),verify_object(Obj),!, - must_det_ll((ObjO = Obj)))). - - + remove_gridoid_props(Obj,ObjM), + must_det_ll((ObjM = ObjO)))). + +remove_gridoid_props(O,O):- !. +remove_gridoid_props(O,O):- \+ compound(O),!. +remove_gridoid_props(obj(List),obj(ListO)):- !, remove_gridoid_props(List,ListO). +remove_gridoid_props(O,O):- is_grid(O),!. +remove_gridoid_props(globalpoints(O),globalpoints(O)):-!. +remove_gridoid_props(localpoints(O),localpoints(O)):-!. +remove_gridoid_props([O|Obj],ObjM):- is_list(O),!,maplist(remove_gridoid_props,[O|Obj],ObjM). +remove_gridoid_props([O|Obj],ObjM):- is_object(O),!,maplist(remove_gridoid_props,[O|Obj],ObjM). +remove_gridoid_props([O|Obj],ObjM):- is_prop1(O),arg(_,O,E),is_grid_or_points(E),!,remove_gridoid_props(Obj,ObjM). +remove_gridoid_props([O|Obj],[O|ObjM]):- is_prop1(O),!,remove_gridoid_props(Obj,ObjM). + +is_grid_or_points(E):- is_grid(E),!. +is_grid_or_points(E):- is_points_list(E),!. :- use_module(library(clpfd)). @@ -344,7 +367,7 @@ enum_object(O):- var(O),!,no_repeats_cmp(=@=,O,enum_object0(O)). enum_object(O):- nop(ppt(enum_object(O))),!. -enum_object0(Obj):- oid_glyph_object(_,_,Obj). +%enum_object0(Obj):- oid_glyph_object(_,_,Obj). enum_object0(Obj):- % listing(obj_cache/2), get_current_test(TestID), obj_cache(TestID,O,_S),as_obj(O,Obj). @@ -456,8 +479,10 @@ %show_indiv_textinfo(NewObj),!. make_indiv_object_real(VM,Overrides,GOPoints,NewObj):- + fix_global_offset(GOPoints,OPoints), must_det_ll(( + GOPoints\==[], globalpoints_maybe_bg(OPoints,GPoints), sort_points(GPoints,Points), Objs = VM.objs, @@ -483,8 +508,8 @@ print_grid(remove_prev(OOID),Orig))), set(VM.objs)= [NewObj|ROBJS])))). -grav_roll([[Y]],sameR,[[Y]]):-!. grav_roll(Shape,SameR,Shape):- SameR == sameR,!. +%grav_roll([[Y]],sameR,[[Y]]):- nonvar(Y),!. grav_roll(LPoints,RotG,Shape):- must_det_ll((grav_rot(LPoints,RotG,Shape), undo_effect(RotG,Shape,LPoints0),LPoints0=LPoints)). @@ -492,6 +517,13 @@ protect_black(Grid,PGrid,UndoProtect):- Grid=PGrid, UndoProtect = (=). +fix_point_colors(RShapeA,RShapeAR):- + maplist(arg(1),RShapeA,Cs),list_to_set(Cs,CCS), + (CCS==[bg]->subst(RShapeA,bg,black,RShapeAR);RShapeA=RShapeAR),!. +fix_point_colors(RShapeA,RShapeA):-!. + +grid_to_shape([[Dot]],sameR,1,1,[point_01_01],[cc(Dot,1)]):-!. + grid_to_shape(Grid,RotG,OX,OY,ShapePoints,PenColors):- % writeg([grid=Grid]), must_det_ll(( @@ -499,13 +531,15 @@ grav_roll(PGrid,RotG,PRotShape), % writeg([pGrid2=PGrid,pRotShape=PRotShape]), call(UndoProtect,PRotShape,RotShape), - globalpoints_include_bg(RotShape,RShapeA), - physical_points(RShapeA,RShape), - include(ground,RShape,LShape), - % writeg([rotShape=RotShape,rShapeA=RShapeA,lShape=LShape]), + globalpoints_include_bg(RotShape,RShapeA), + fix_point_colors(RShapeA,RShapeAR), + physical_points(RShapeAR,RShape), + include(ground,RShape,LShape), grid_size(RotShape,OX,OY), % colors_cc - my_maplist(arg(2),LShape,ShapePoints), my_maplist(arg(1),LShape,Colorz), + writeg([rotShape=RotShape,lShape=LShape]), + my_maplist(arg(2),LShape,ShapePoints), + my_maplist(arg(1),LShape,Colorz), cclumped(Colorz,PenColors0),!, simplify_pen(PenColors0,PenColors))). @@ -810,12 +844,21 @@ physical_points(GPoints,Points):- my_partition(sub_var('$VAR'('_')),GPoints,BGPoints,OPoints), BGPoints\==[],OPoints\==[],!,physical_points(OPoints,Points). -physical_points(GPoints,Points):- - my_partition(sub_var(bg),GPoints,BGPoints,OPoints), + +physical_points(GPoints,Points):- numbervars(GPoints,0,_,[singletons(true),attvars(skip)]), + \+ (sub_compound('$VAR'(S),GPoints),S\=='_'), + my_partition(sub_var('$VAR'('_')),GPoints,BGPoints,OPoints), BGPoints\==[],OPoints\==[],!,physical_points(OPoints,Points). + +physical_points(GPoints,OPoints):- + my_partition(sub_var(bg),GPoints,BGPoints,OPoints), + BGPoints\==[],OPoints\==[],!. + +/* physical_points(GPoints,Points):- my_partition(sub_var(fg),GPoints,FGPoints,_), FGPoints\==[],!, Points = FGPoints. +*/ physical_points(GPoints,Points):- my_partition(sub_var(black),GPoints,BGPoints,OPoints), BGPoints\==[],OPoints\==[],!,physical_points(OPoints,Points). @@ -876,8 +919,8 @@ is_oid(OID):- oid_glyph_object(OID,_,_). is_oid(OID):- gid_type_oid(_,_,OID), \+ oid_glyph_object(OID,_,_). -obj_to_decl_oid(Obj,OID):- compound(Obj),Obj = obj(L), -((member(obj_to_oid(OID),L);member(was_oid(OID),L);member(oid(OID),L);member(omem_oid(OID),L);member(omem_oid(OID),L)),atom(OID)),!. +obj_to_decl_oid(L,OID):- +((sub_compound(obj_to_oid(OID),L);sub_compound(was_oid(OID),L);sub_compound(oid(OID),L);sub_compound(omem_oid(OID),L)),atom(OID)),!. /* obj_to_oid(I,X):- var_check(I,obj_to_oid(I,X))*->!; (indv_props(I,L),((member(obj_to_oid(X),L);member(oid(X),L)),!, @@ -975,7 +1018,7 @@ %obj_to_oid(Obj,_,MyID):- obj_to_oid(Obj,MyID). -tid_to_gid(TID,GID):- is_grid(TID),!,grid_to_gid(TID,GID). +id_to_gid(TID,GID):- is_grid(TID),!,grid_to_gid(TID,GID). tid_to_gid(TID,GID):- var(TID),!,current_gid(GID). tid_to_gid(TID,GID):- tid_to_gids(TID,GID),!. @@ -1248,6 +1291,14 @@ %never_newd(C):- compound(C),C =(_-_), dumpST,throw(never_newd(C)). never_newd(_). +all_points_between_include_bg(_Grid,_LowH,_LowV,_GridH,GridV,_Hi,Vi,Points,Points):- Vi>GridV,!. +all_points_between_include_bg(Grid,LowH,LowV,GridH,GridV,Hi,Vi,PointsIn,PointsO):- + (Hi>GridH -> (H = LowH, V is Vi+1) ; (H is Hi +1, V = Vi )), + all_points_between(Grid,LowH,LowV,GridH,GridV,H,V,PointsIn,Points), + (((once(hv_c_value(Grid,C,Hi,Vi)), hv_point(Hi,Vi,Point))) -> + (PointsO = [C-Point|Points],never_newd(C)) ; PointsO = Points). + +/* % Is there an advantage to counting down? all_points_between_include_bg(_Grid,_LowH,_LowV,_GridH,GridV,_Hi,Vi,Points,Points):- Vi>GridV,!. all_points_between_include_bg(Grid,LowH,LowV,GridH,GridV,Hi,Vi,Points,PointsO):- @@ -1257,6 +1308,7 @@ (Hi>GridH -> (H = LowH, V is Vi+1) ; (H is Hi +1, V = Vi )),!, all_points_between_include_bg(Grid,LowH,LowV,GridH,GridV,H,V,PointsT,PointsO). +*/ color_spec_or_fail_include_bg(Grid,C,Hi,Vi):- hv_c_value(Grid,C2,Hi,Vi), @@ -1273,9 +1325,11 @@ grid_to_points(Grid,Points):- grid_size(Grid,HH,HV),!, grid_to_points(Grid,HH,HV,Points). % Is there an advantage to counting down? -grid_to_points(Grid,HH,HV,Points):- all_points_between(Grid,1,1,HH,HV,1,1,[],Points),!. +grid_to_points(Grid,HH,HV,Points):- + all_points_between(Grid,1,1,HH,HV,1,1,[],Points),!. % Is there an advantage to counting down? -grid_to_points_include_bg(Grid,Points):- grid_size(Grid,HH,HV),!,all_points_between_include_bg(Grid,1,1,HH,HV,1,1,[],Points),!. +grid_to_points_include_bg(Grid,Points):- grid_size(Grid,HH,HV),!, + all_points_between_include_bg(Grid,1,1,HH,HV,1,1,[],Points),!. /* grid_to_points(Grid,HH,HV,Points):- trace_or_throw(all_points_between), findall(C-Point,(between(1,HV,V),between(1,HH,H), @@ -1344,7 +1398,8 @@ must_det_11(G):- must_det_ll(call(call,(G))). localpoints_include_bg(I,X):- must_be_free(X), \+ is_grid(I), !, must_det_11((localpoints(I,X),is_cpoints_list(X))),!. -localpoints_include_bg(Grid,Points):- is_grid(Grid),!, must_det_11((grid_to_points_include_bg(Grid,Points),is_cpoints_list(Points))),!. +localpoints_include_bg(Grid,Points):- is_grid(Grid),!, + must_det_11((grid_to_points_include_bg(Grid,Points),is_cpoints_list(Points))),!. object_grid(I,G):- is_grid(I),!,G=I. @@ -1361,27 +1416,45 @@ is_cpoints_list(XX))),!. */ -object_localpoints(I,X):- indv_props_list(I,L), object_l(localpoints(X),L),!. +object_localpoints(I,X):- indv_props_list(I,L), must_det_ll(object_l(localpoints(X),L)),!. + + +object_l(P,L):- compound(P),functor(P,F,A),functor(PP,F,A), member(PP,L),!,P=PP. +object_l(globalpoints(O),L):- object_l(loc2D(OH,OV),L),object_l(localpoints(LPoints),L),!, offset_points(OH,OV,LPoints,O). +object_l(loc2D(OH,OV),L):- + member(iz(cenGX(CX)),L),member(iz(cenGY(CY)),L),member(iz(sizeGX(SX)),L),member(iz(sizeGY(SY)),L), + OH is floor(CX-(SX/2)), OV is floor(CY-(SY/2)). -object_l(P,L):- functor(P,F,A),functor(PP,F,A), member(PP,L),!,P=PP. -object_l(globalpoints(O),L):- !,object_l(loc2D(OH,OV),L),object_l(localpoints(LPoints),L),!, offset_points(OH,OV,LPoints,O). object_l(localpoints(O),L):- member(globalpoints(XX),L),is_list(XX),object_l(loc2D(OH,OV),L),!,deoffset_points(OH,OV,XX,O). -object_l(localpoints(O),L):- object_l(grid(In),L),!,release_some_c(In,Out),localpoints(Out,O). -object_l(grid(G),L):- member(grid(grav,SCGrid),L), object_l(rot2D(RotG),L), grid_call(RotG,SCGrid,G). -object_l(grid(O),L):- member(f_grid(In),L),!,include(p1_arg(1,is_real_color),In,O). -object_l(grid(O),L):- member(grid_rep(Norm,NormGrid),L),member(grid_ops(Norm,Ops),L), - unreduce_grid(NormGrid,Ops,LocalGrid),grid_to_points(LocalGrid,O). +object_l(localpoints(O),L):- member(iz(sid(ShapeID)),L),!, + must_det_ll((id_shape(ShapeID,ShapePoints), + object_l(rot2D(RotG),L), object_l(pen(PenColors),L),%object_l(rotSize2D(OX,OY),L), + OX=1,OY=1, make_localpoints(ShapePoints,RotG,OX,OY,PenColors,O))),!. +object_l(localpoints(O),L):- must_det_ll((object_l(grid(In),L),!,release_some_c(In,Out),localpoints(Out,O))). + +%object_l(localpoints(O),L):- object_l(points_rep(grav,O),L),!. +%grid_to_points(LocalGrid,O)) +object_l(grid(O),L):- + once(( + (member(f_grid(In),L),include(p1_arg(1,is_real_color),In,O)) + ;(member(grid_rep(Norm,NormGrid),L),member(grid_ops(Norm,Ops),L), unreduce_grid(NormGrid,Ops,O)) + ;(object_l(localpoints(LPoints),L), points_to_grid(LPoints,O)) + ;(object_l(grid(grav,SCGrid),L), object_l(rot2D(RotG),L), grid_call(RotG,SCGrid,O)))),!. + object_l(f_grid(O),L):- object_l(grid(In),L),fpad_grid(f,var,In,O). -object_l(shape_rep(grav,Shape),L):- member(iz(sid(ShapeID)),L),id_shape(ShapeID,Shape). +object_l(shape_rep(grav,Shape),L):- shape_rep(obj(L),grav,Shape). +%member(iz(sid(ShapeID)),L),id_shape(ShapeID,Shape). object_l(grid_rep(Grav,Grid),L):- (grav_algo(Grav);algo_list(Grav)), member(points_rep(Grav,Points),L), member(rotSize2D(Grav,OX,OY),L), points_to_grid(OX,OY,Points,Grid). -object_l(points_rep(Grav,ColoredShape),L):- grav_algo(Grav), member(shape_rep(Grav,ShapePoints),L),object_l(pen(PenColors),L), +object_l(points_rep(Grav,ColoredShape),L):- grav_algo(Grav), + member(shape_rep(Grav,ShapePoints),L),object_l(pen(PenColors),L), colorize_points(ShapePoints,PenColors,ColoredShape). + object_l(Prop,L):- Prop = iz(algo_sid(Algo,NormShapeID)),algo_list(Algo), \+ member(Prop,L), object_l(grid_rep(Algo,NormGrid),L), local_shape_id(NormGrid,NormShapeID),!. %shape_id(NormGrid,NormShapeID). @@ -1393,18 +1466,6 @@ localpoints(NormGrid,NormLPoints),my_maplist(arg(2),NormLPoints,ShapeNormLPoints), shape_id(ShapeNormLPoints,NormShapeID), PropsOut = [grid_ops(Algo,NormOps),iz(algo_sid(Algo,NormShapeID)),grid_rep(Algo,NormGrid)].*/ -missing_obj_props(Obj,List,Prop):- - Prop = grid_ops(Algo,NormOps), - algo_list(Algo), \+ member(Prop,List), grid_ops(Obj,Algo,NormOps). -missing_obj_props(Obj,List,Prop):- - Prop = grid_rep(Algo,NormOps), - algo_list(Algo), \+ member(Prop,List), grid_rep(Obj,Algo,NormOps). -missing_obj_props(Obj,List,Prop):- - Prop = iz(algo_sid(Algo,NormShapeID)), - algo_list(Algo), - \+ member(Prop,List), - grid_rep(Obj,Algo,NormGrid),local_shape_id(NormGrid,NormShapeID). - algo_ops_grid(obj(List),Algo,NormOps,NormGrid):- @@ -2231,19 +2292,20 @@ */ grid_call_unbound_p1(_P1,Call,GridIn,GridOut):- grid_call(Call,GridIn,GridOut). - -rot_p_plus_trim(symmetry_after(trim_to_rect,P,_)):- rot_p_plus_full(P). -rot_p_plus_trim(symmetry_after(trim_outside,P,_)):- rot_p_plus_full(P). -rot_p_plus_trim(symmetry_type(P,_)):- rot_p_plus_full(P). +into_true_false(P0,TF):- (call(P0)->TF=true;TF=false). +rot_p_plus_trim(symmetry_after(trim_to_rect,Type,_)):- rot_p_plus_full(Type). +rot_p_plus_trim(symmetry_after(trim_outside,Type,_)):- rot_p_plus_full(Type). +rot_p_plus_trim(symmetry_type(Type,_)):- rot_p_plus_full(Type). %symmetry_after(A,B,I,O):- grid_call_alters(A,I,M), grid_call(B,M,O). -symmetry_after(A,B,TF,I,O):- grid_call(A,I,M),!,I\=@=M, symmetry_type(B,TF,M,O). - -symmetry_type(Var,TF,I,O):- var(Var),!,rot_p_plus_full(Var),symmetry_type(Var,TF,I,O). -symmetry_type(full,TF,I,O):- !, flipSym_checks(rot90,I),!,symmetry_type(sym_hv,TF,I,O). -symmetry_type(sym_hv,TF,I,O):- !, flipSym_checks(flipH,I),!,symmetry_type(flipV,TF,I,O). -symmetry_type(sym_h_xor_v,TF,I,O):- !, (symmetry_type(flipH,TF,I,O) -> ( \+ symmetry_type(flipV,TF,I,O) ) ; symmetry_type(flipV,TF,I,O)). -symmetry_type(R,TF,I,O):- grid_call(R,I,O),(I=@=O->TF=true;TF=false). +symmetry_after(P2,Type,TF,I,M):- grid_call(P2,I,M),!,I\=@=M, symmetry_type(Type,TF,M). +symmetry_type(R,TF,I,O):- symmetry_type(R,TF,I),!,O=I. + +symmetry_type(Var,TF,I):- var(Var),!,rot_p_plus_full(Var),symmetry_type(Var,TF,I). +symmetry_type(full,TF,I):- !,flipSym_checks(rot90,I),!,symmetry_type(sym_hv,TF,I). +symmetry_type(sym_hv,TF,I):- !, flipSym_checks(flipH,I),!,symmetry_type(flipV,TF,I). +symmetry_type(sym_h_xor_v,TF,I):- !, symmetry_type(flipH,TF1,I), symmetry_type(flipV,TF2,I), !, into_true_false(TF1\=@=TF2,TF). +symmetry_type(R,TF,I):- grid_call(R,I,O)->into_true_false(I=@=O,TF). rot_p_plus_full(sym_hv). rot_p_plus_full(full). rot_p_plus_full(sym_h_xor_v). rot_p_plus_full(P):- rot_p2(P). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_physics.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_physics.pl index b35a6feafb..5a8e1cbba2 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_physics.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_physics.pl @@ -62,16 +62,37 @@ flip_Many(Rot,X,Y):- flip_Once(Rot,X,Y),X\=@=Y. flip_Many(sameR,X,X). +neighbor_counts(_,_,[],_,[]):-!. +neighbor_counts(H,V,[C-P1|Ps],Points,[(N-C)-P1|Ps2]):- + must_det_ll(( + neighbor_count1(C,P1,Points,N), + neighbor_counts(H,V,Ps,Points,Ps2))). + +neighbor_count1(C,_P1,_Points,N):- is_bg_color(C),!,N=0. +neighbor_count1(C,_P1,_Points,N):- var(C),!,N=200. +neighbor_count1(C,P1,Points,N):- + findall(Dir,(n_s_e_w(Dir),once((is_adjacent_point_m2(P1,Dir,P2),member(NC-P2,Points),only_color_data(NC,CD),==(C,CD)))),DirsC), + findall(Dir,(is_diag(Dir),once((is_adjacent_point(P1,Dir,P2),member(NC-P2,Points),only_color_data(NC,CD),==(C,CD)))),DirsD), + findall(Dir,(is_adjacent_point(P1,Dir,P2),member(NC-P2,Points),only_color_data(NC,CD),dif_color(C,CD)),DirsE), + length(DirsE,E1), + length(DirsC,C1), + length(DirsD,D1), N is E1+C1*2+D1*2. + +neighbor_counts(Grid,GridO):- + must_det_ll(( + globalpoints_maybe_bg(Grid,Points), + grid_size(Grid,H,V), + neighbor_counts(H,V,Points,Points,CountedPointsO), + points_to_grid(H,V,CountedPointsO,GridO))). %grid_mass_ints(Grid,[[1]]):- Grid=@=[[_]],!. -grid_mass_ints(Grid,GridIII):- +grid_mass_ints(Grid,GridIII):- unique_fg_colors(Grid,Sorted), %arc_test_property(Prop), mapgrid(normal_w(Sorted),Grid,GridIII),!. /* %Prop = unique_colors(lst(vals([[cyan,yellow,orange,green,red,blue,black],[orange,cyan,yellow,green,black,red,blue]]),len(7),diff([orange,cyan,yellow,green,black,red,blue]=@=[cyan,yellow,orange,green,red,blue,black]))) - - include(is_fg_color,CC,FG), + dmiles include(is_fg_color,CC,FG), (FG==[]->SORT=[fg,black,bg];SORT=FG),!, %((unique_fg_colors(Grid,FG)->FG\==[])->true;FG=[black]), mapgrid(normal_w(SORT),Grid,GridIII),!. @@ -92,27 +113,70 @@ %normal_w(ColorSort,Cell,N):- color_int(Cell,N),!. normal_w(_ColorSort,_,0). + +rav_rot_test([[_,_,green,_],[red,_,green,yellow],[red,blue,blue,_],[red,_,_,yellow]]). +rav_rot_test([[black,black,green,black],[red,black,green,yellow],[red,blue,blue,black],[red,black,black,yellow]]). +rav_rot_test([[red,red,red,red,red,red,_,_],[red,red,red,red,red,red,_,_],[_,_,blue,blue,_,_,_,_],[_,_,blue,blue,_,_,_,_],[_,_,blue,blue,green,green,green,green],[_,_,blue,blue,green,green,green,green],[yellow,yellow,_,_,yellow,yellow,_,_],[yellow,yellow,_,_,yellow,yellow,_,_]]). +rav_rot_test([[red,red,red,red,red,red,black,black],[red,red,red,red,red,red,black,black],[black,black,blue,blue,black,black,black,black],[black,black,blue,blue,black,black,black,black],[black,black,blue,blue,green,green,green,green],[black,black,blue,blue,green,green,green,green],[yellow,yellow,black,black,yellow,yellow,black,black],[yellow,yellow,black,black,yellow,yellow,black,black]]). +rav_rot_test([[cyan,cyan,cyan,cyan,cyan,cyan,_,_],[cyan,cyan,cyan,cyan,cyan,cyan,_,_],[_,_,cyan,cyan,_,_,_,_],[_,_,cyan,cyan,_,_,_,_],[_,_,cyan,cyan,cyan,cyan,cyan,cyan],[_,_,cyan,cyan,cyan,cyan,cyan,cyan],[cyan,cyan,_,_,cyan,cyan,_,_],[cyan,cyan,_,_,cyan,cyan,_,_]]). +rav_rot_test([[cyan,cyan,cyan,cyan,cyan,cyan,black,black],[cyan,cyan,cyan,cyan,cyan,cyan,black,black],[black,black,cyan,cyan,black,black,black,black],[black,black,cyan,cyan,black,black,black,black],[black,black,cyan,cyan,cyan,cyan,cyan,cyan],[black,black,cyan,cyan,cyan,cyan,cyan,cyan],[cyan,cyan,black,black,cyan,cyan,black,black],[cyan,cyan,black,black,cyan,cyan,black,black]]). +rav_rot_test([[black,black,black,black,black,black,_,_],[black,black,black,black,black,black,_,_],[_,_,black,black,_,_,_,_],[_,_,black,black,_,_,_,_],[_,_,black,black,black,black,black,black],[_,_,black,black,black,black,black,black],[black,black,_,_,black,black,_,_],[black,black,_,_,black,black,_,_]]). +%rav_rot_test(X):- never_this(X,Y),rav_rot_test(Y),into_mono(Y,Z),X=Y. +rav_rot_test(X):- clause(rav_rot_test(Y),true),into_monochrome2(Y,Z),X=Z. + +/* +show_grav_rot(X):- + must_det_ll(( + into_grid(X,Y),!, + into_solid_grid(Y,YY),!, + into_monorot(YY,YYY),!, + ignore(( + grav_rot(YYY,R1,Y1), reduce_grid(Y1,Z,A), grav_rot(A,R2,AA), + wots(S,writeq(show_grav_rot(R1,Z,R2))), print_ss(S,YY,AA), + ignore((grid_call([R1,R2],Y,YR), wots(S2,writeq(show_grav_rot(R1,R2))), print_ss(S2,Y,YR))), + \+ \+ ignore((call(R1,YY,ZZ),call(R2,YY,TT), print_ss(R1-R2,ZZ,TT))), + + !)))). +*/ + +into_monorot(X,Y):- mapgrid(fg_is_fg_is_bg,X,Y), \+ avoid_mono(Y),!. +into_monorot(X,X). + + +avoid_mono(Y):- flipSym(rot90,Y),!. +avoid_mono(Y):- flipSym(flipH,Y),flipSym(flipV,Y),!. + + +fg_is_fg_is_bg(X,bg):- \+ is_fg_color(X),!. +fg_is_fg_is_bg(_,fg). + + /* arc_test_property(Prop):- get_current_test(TestID),first_current_example_num(trn+N) arc_test_property(TestID, gh(N), comp(cbg(black), i-o, _), Prop). */ -grav_rot(Grid,sameR,Grid):- \+ \+ Grid=[[_]],!. grav_rot(Grid,RotG,Rotated):- %must_be_free(RotG), - must_det_ll((into_grid(Grid,GridII), + must_det_ll(( + into_grid(Grid,GridI), + into_monorot(GridI,GridII), dif(RotG,rollD), - best_grav_rot_grid(GridII,RotG,Rotated))). + best_grav_rot_grid(GridII,RotG,_), + grid_call(RotG,GridI,Rotated))). -best_grav_rot(Shape,RotG,Rotated):- must_be_free(Rotated), +/*best_grav_rot(Shape,RotG,Rotated):- must_be_free(Rotated), must_det_ll(( cast_to_grid(Shape,Grid,Uncast), best_grav_rot_grid(Grid,RotG,Final), uncast(Shape,Uncast,Final,Rotated))). +*/ best_grav_rot_grid(Grid,sameR,Grid):- \+ \+ Grid=[[_]],!. -best_grav_rot_grid(Grid,RotG,RotatedG):- must_be_free(Rotated), - must_det_ll(( is_grid(Grid), +best_grav_rot_grid(GridI,RotG,RotatedG):- must_be_free(Rotated), + must_det_ll(( is_grid(GridI), + %trim_outside(GridI,Grid), + =(GridI,Grid), grid_mass_ints(Grid,GridInts), w(W,RotG)=Template, findall(Template,(flip_Many(RotG,GridInts,Rotated),rot_mass(Rotated,W)),Pos), @@ -152,6 +216,11 @@ N2 is N * Len, map_row_size(N2,Len,Rest,Mass),!. +is_top_heavy(Grid):- split_50_v(Grid,Top,Bottem),!,rot_mass(Top,TopM),rot_mass(Bottem,BottemM),!,BottemM>TopM. +is_left_heavy(Grid0):- rot270(Grid0,Grid),!,is_top_heavy(Grid). +split_50_v(Grid,Top,Bottem):- length_safe(Grid,N),H is floor(N/2), length_safe(Top,H),length_safe(Bottem,H), + my_append(Top,Rest,Grid),my_append(_Mid,Bottem,Rest). + grav_mass(Grid,sameR):- iz(Grid,hv_symmetric),!. grav_mass(Grid,RotOut):- vis2D(Grid,H,V), !, tips_to_rot(Grid,H,V,RotOut,_). @@ -161,11 +230,6 @@ %tips_to_rot(Grid,H,V,[rot180|RotOut]):- is_top_heavy(Grid), !, rot180(Grid,Grid90), !, tips_to_rot(Grid90,H,V,RotOut). tips_to_rot(Grid,_H,_V,RotOut,Final):- is_left_heavy(Grid)-> (RotOut=[rot180],rot180(Grid,Final)); (RotOut=[sameR],Final=Grid). -is_top_heavy(Grid):- split_50_v(Grid,Top,Bottem),!,rot_mass(Top,TopM),rot_mass(Bottem,BottemM),!,BottemM>TopM. -is_left_heavy(Grid0):- rot270(Grid0,Grid),!,is_top_heavy(Grid). -split_50_v(Grid,Top,Bottem):- length_safe(Grid,N),H is floor(N/2), length_safe(Top,H),length_safe(Bottem,H), - my_append(Top,Rest,Grid),my_append(_Mid,Bottem,Rest). - ensure_dir(s). ensure_dir(e). ensure_dir(w). ensure_dir(n). ensure_int(1). ensure_int(2). @@ -553,16 +617,17 @@ related_how( subsumed(Offset,OverlapP),O1,O2,Ps1,Ps2,Overlap,_P1L,P2L):- Overlap\==[],P2L==[], length(Ps1,Len1),length(Ps2,Len2), OverlapP = rational(Len2/Len1), object_offset(O2,O1,Offset). -sees_dir(s,D,O1,O2,Ps1,Ps2,Overlap,P1L,SX1,SY1,EX1,EY1,P2L,SX2,SY2,EX2,EY2):- SY1 >= EY2, D is SY1-EY2. -sees_dir(n,D,O1,O2,Ps1,Ps2,Overlap,P1L,SX1,SY1,EX1,EY1,P2L,SX2,SY2,EX2,EY2):- SY2 >= EY1, D is SY2-EY1. -sees_dir(e,D,O1,O2,Ps1,Ps2,Overlap,P1L,SX1,SY1,EX1,EY1,P2L,SX2,SY2,EX2,EY2):- SX1 >= EX2, D is SX1-EX2. -sees_dir(w,D,O1,O2,Ps1,Ps2,Overlap,P1L,SX1,SY1,EX1,EY1,P2L,SX2,SY2,EX2,EY2):- SX2 >= EX1, D is SX2-EX1. +sees_dir(n,D,O1,O2,Ps1,Ps2,Overlap,P1L,SX1,SY1,EX1,EY1,P2L,SX2,SY2,EX2,EY2):- SY1 >= EY2, D is SY1-EY2. +sees_dir(s,D,O1,O2,Ps1,Ps2,Overlap,P1L,SX1,SY1,EX1,EY1,P2L,SX2,SY2,EX2,EY2):- SY2 >= EY1, D is SY2-EY1. +sees_dir(w,D,O1,O2,Ps1,Ps2,Overlap,P1L,SX1,SY1,EX1,EY1,P2L,SX2,SY2,EX2,EY2):- SX1 >= EX2, D is SX1-EX2. +sees_dir(e,D,O1,O2,Ps1,Ps2,Overlap,P1L,SX1,SY1,EX1,EY1,P2L,SX2,SY2,EX2,EY2):- SX2 >= EX1, D is SX2-EX1. related_how2(sees(DirsDists),O1,O2,Ps1,Ps2,Overlap,P1L, SX1,SY1,EX1,EY1,P2L,SX2,SY2,EX2,EY2):- findall(cc(Dir,Dist),(sees_dir(Dir,Dist,O1,O2,Ps1,Ps2,Overlap,P1L,SX1,SY1,EX1,EY1,P2L,SX2,SY2,EX2,EY2),Dist<3),DirsDists), DirsDists\==[]. + %related_how(How,O1,O2,Ps1,Ps2,Overlap,P1L,SX1,SY1,EX1,EY1,P2L,SX2,SY2,EX2,EY2):- SX1 < SX2, SY1 < SY2, EX2 < EX1, EY2 < EY1, How = contained_by(engulfed). related_how2(contained_by,O1,O2,Ps1,Ps2,Overlap,P1L, SX1,SY1,EX1,EY1,P2L,SX2,SY2,EX2,EY2):- diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_precompiler.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_precompiler.pl index 0c1b0fa92b..6dd44879cf 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_precompiler.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_precompiler.pl @@ -27,9 +27,10 @@ must_det_ll_maplist(_,[],[],[]):-!. must_det_ll_maplist(P3,[HA|TA],[HB|TB],[HC|TC]):- must_det_ll(call(P3,HA,HB,HC)), must_det_ll_maplist(P3,TA,TB,TC). -must_det_ll(G):- !, once((notrace(G)*->true;must_det_ll_failed(G))). +%must_det_ll(G):- !, once((notrace(G)*->true;must_det_ll_failed(G))). +must_det_ll(G):- nb_current(cant_rrtrace,t),!,call(G). must_det_ll(G):- notrace(arc_html),!, ignore(notrace(G)),!. -must_det_ll(G):- tracing,!, once((call(G)*->true;must_det_ll_failed(G))). +must_det_ll(G):- tracing,!, call(G). % once((call(G)*->true;must_det_ll_failed(G))). %must_det_ll(X):- !,must_not_error(X). must_det_ll((X,Goal)):- is_trace_call(X),!,call((itrace,Goal)). must_det_ll(X):- is_trace_call(X),!,itrace. @@ -67,8 +68,9 @@ %must_not_error(G):- must(once(G)). +must_not_error(_):- nb_current(cant_rrtrace,t),!,fail. must_not_error(G):- tracing,!,call(G). -must_not_error(G):- is_cgi,!, catch(notrace(G),E,((u_dmsg(E=G)))). +must_not_error(G):- is_cgi,!, catch((G),E,((u_dmsg(E=G)))). must_not_error(X):- \+ nb_current(cant_rrtrace,t),is_guitracer,!, call(X). must_not_error(X):- catch(X,E,(always_rethrow(E)-> throw(E);(/*arcST,*/writeq(E=X),pp(etrace=X), rrtrace(visible_rtrace([-all,+exception]),X)))). @@ -81,6 +83,7 @@ main_debug:- main_thread,current_prolog_flag(debug,true). %must_det_ll_failed(X):- predicate_property(X,number_of_clauses(1)),clause(X,(A,B,C,Body)), (B\==!),!,must_det_ll(A),must_det_ll((B,C,Body)). +must_det_ll_failed(_):- nb_current(cant_rrtrace,t),!,fail. must_det_ll_failed(G):- tracing,notrace(u_dmsg(must_det_ll_failed(G))),!,throw(must_det_ll_failed(G)). must_det_ll_failed(G):- main_debug,notrace(u_dmsg(must_det_ll_failed(G))),!,trace,call(G). must_det_ll_failed(G):- is_cgi,!, u_dmsg(arc_html(must_det_ll_failed(G))). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_prior_groups.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_prior_groups.pl index 4d351f6b37..24dc5535dc 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_prior_groups.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_prior_groups.pl @@ -70,12 +70,13 @@ interesting_compares(trn+N*out,F1, trn+N2*out,F2):- current_example_nums(trn,N,N2),filter_pairs(F1,F2). interesting_compares(tst+N*in, F1, trn+N *in,F2) :- current_example_nums(tst,N, _),filter_pairs(F1,F2). -filter_pairs(shared,shared). filter_pairs(unshared,shared). filter_pairs(shared,unshared). filter_pairs(unshared,unshared). +filter_pairs(whole,whole). +%filter_pairs(shared,shared). filter_pairs(unshared,shared). filter_pairs(shared,unshared). filter_pairs(unshared,unshared). -make_up_selector_name(Trn_num_io,Name):- trn_num_io(Trn_num_io,Trn,Num,IO), +make_up_selector_name(Trn_num_io,Named):- trn_num_io(Trn_num_io,Trn,Num,IO), interesting_selectors(NameI,Trn1,Num1,IO1), match_selector(Trn1,Trn),match_selector(IO1,IO),match_selector(Num1,Num), - once(maybe_aformat(NameI,Name)). -maybe_aformat(Fmt-Args,Name):- format(atom(Name),Fmt,Args),!. maybe_aformat(Name,Name). + once(maybe_aformat(NameI,Named)). +maybe_aformat(Fmt-Args,Named):- format(atom(Named),Fmt,Args),!. maybe_aformat(Named,Named). match_selector(Trn1,Trn):- var(Trn1),var(Trn),!. match_selector(Trn1,Trn):- Trn1=@=Trn. @@ -85,11 +86,11 @@ trn_num_io((Trn+Num)*IO,Trn,Num,IO):-!. trn_num_io(Trn+Num*IO,Trn,Num,IO):-!. -select_filtered_group(TestID,Name,Trn_num_io,Filter,Objects):- trn_num_io(Trn_num_io,Trn,Num,IO), - with_luser(use_individuated_cache,true, +select_filtered_group(TestID,Named,Trn_num_io,Filter,Objects):- trn_num_io(Trn_num_io,Trn,Num,IO), + with_individuated_cache(true, forall(kaggle_arc_io(TestID,Trn+Num,IO,G),individuate(complete,G,_Objs))), select_some_objects(TestID,Trn,Num,IO,Filter,Objects), - make_up_selector_name(Trn+Num*IO,Name). + make_up_selector_name(Trn+Num*IO,Named). %select_some_objects(TestID,Trn,Num,IO,whole,Objs):- !, test_grouped_io(TestID,[(TestID>(Trn+Num)*IO)],[],Objs). @@ -117,7 +118,7 @@ never_share_prop(oid(_)). never_share_prop(was_oid(_)). -next_change(Next,Objects):- sort(Objects,SObjects),sort(Next,SNext), SObjects\=@=SNext. +next_change(Next,Objects):- list_to_set(Objects,SObjects),list_to_set(Next,SNext), SObjects\=@=SNext. reorganize_objs([O|Objects],Shared,PropsUnique,PropsDistibuted):- \+ is_list(O), must_det_ll(( @@ -177,24 +178,25 @@ reorganize_objs([],[],[],[]):-!. +show_groups(_TestID):-!. show_groups(TestID):- ensure_test(TestID), show_filtered_groups(TestID), show_pair_groups(TestID). - +show_filtered_groups(_TestID):-!. show_filtered_groups(TestID):- ensure_test(TestID), forall( interesting_selectors(_,Trn,Num,IO), forall( member(Filter,[shared,unshared]), must_det_ll(( - select_filtered_group(TestID,Name,(Trn+Num*IO),Filter,Objs), + select_filtered_group(TestID,Named,(Trn+Num*IO),Filter,Objs), length(Objs,Len), - w_section(interesting_selectors(Name,Filter,Len), + w_section(interesting_selectors(Named,Filter,Len), must_det_ll(( nop(ignore(((ground((Trn+Num*IO))->print(Objs); (Len<10 ->print(Objs); true))))), - print_grouped_props(Name+Filter,Objs)))))))). + print_grouped_props(Named+Filter,Objs)))))))). show_pair_groups(TestID):- ensure_test(TestID), - forall(pair_two_groups(TestID,Name1+Filter1,Name2+Filter2,Objs1,Objs2), + forall(no_repeats(vars(Name1+Filter1,Name2+Filter2),pair_two_groups(TestID,Name1+Filter1,Name2+Filter2,Objs1,Objs2)), ignore(( Objs1\==[],Objs2\==[], Objs1\==Objs2, @@ -206,16 +208,16 @@ %functor(Filter1,F1,_),functor(Filter2,F2,_), F1\==alone,F2\==alone, %F1==F2, append(Objs1,Objs2,OBJS),list_to_set(OBJS,OBJSET), - length(OBJS,L1),length(OBJSET,L2), L1 == L2, + length(OBJS,WP1),length(OBJSET,WP2), WP1 == WP2, % pp(Name1+Filter1-Name2+Filter2 = Objs1->Objs2), - print_grouped_props(vs(Name1+Filter1,Name2+Filter2),OBJS) + show_interesting_vs(vs(Name1+Filter1,Name2+Filter2),Objs1,Objs2) ))). rules_from(Objs1,Objs2,Objects):- Objects=(Objs1->Objs2). -show_info_about_objects(TestID,Name,Ors,Ands):- +show_info_about_objects(TestID,Named,Ors,Ands):- test_grouped_io(TestID,Ors,Ands,IO), - w_section(Name,print_grouped_props(Name,IO)). + w_section(Named,print_grouped_props(Named,IO)). test_grouped_io(TestID,Ors,Ands,Objs):- @@ -243,34 +245,202 @@ :- thread_local(t_l:objs_others/4). -show_interesting_props(Named,OutC,InC):- - extend_grp_proplist(InC,ObjsI), - extend_grp_proplist(OutC,ObjsO), +show_interesting_props(Named,InC,OutC):- + must_det_ll(( + extend_grp_proplist(InC,ObjsI), + extend_grp_proplist(OutC,ObjsO), banner_lines(cyan,4), w_section('INPUT PROPS', locally(t_l:objs_others(inputs,ObjsI,ObjsO,outputs), - print_grouped_props(input(Named),ObjsI))), + (print_grid(output(Named),ObjsI), + print_grouped_props(input(Named),ObjsI), + !))), banner_lines(white,2), w_section('OUTPUT PROPS', locally(t_l:objs_others(outputs,ObjsO,ObjsI,inputs), - print_grouped_props(output(Named),ObjsO))), + (print_grid(output(Named),ObjsO), + print_grouped_props(output(Named),ObjsO), + !))), + banner_lines(white,2), - show_interesting_props_next(Named,ObjsI,ObjsO), - banner_lines(cyan,4). + %show_interesting_merge(Named,ObjsI,ObjsO), + %show_template_matches(t_m(Named),ObjsI,ObjsO), + %nop(show_interesting_comp_diffs(Named,objs_to_which_props,templify_cc,ObjsI,ObjsO)), + %nop(show_interesting_comp_diffs(Named,variance_counts,first_number,ObjsI,ObjsO)), + %append(ObjsO,ObjsI,Objs),show_interesting_props_gojs(Objs), + show_changes_and_match_template(m_t(Named),ObjsI,ObjsO), + banner_lines(cyan,4))). -show_interesting_props_next(Named,ObjsI,ObjsO):- + +show_interesting_merge(Named,ObjsI,ObjsO):- append(ObjsO,ObjsI,ObjsAll), - w_section('BOTH PROPS', + w_section(show_interesting_merge(Named), locally(t_l:objs_others(both,ObjsAll,ObjsAll,both), print_grouped_props(both(Named),ObjsAll))),!. -show_interesting_props_next(_Named,ObjsI,ObjsO):- - append(ObjsO,ObjsI,Objs), - show_interesting_props_gojs(Objs). - show_interesting_props_gojs(Objs):- u_dmsg(show_interesting_props_gojs(Objs)). %8731374e +count_each_value(Objs,CountOfEachL):- + flat_props(Objs,AllProps), + maplist(make_unifiable_cc,AllProps,ASProps), + variant_list_to_set(ASProps,SUProps), + count_each(SUProps,AllProps,CountOfEachL),!. + +variance_counts(Objs,CountOfEachL):- + flat_props(Objs,AllProps), + maplist(make_unifiable_cc,AllProps,ASProps), + variant_list_to_set(ASProps,SUProps), + maplist(variance_had_count(Objs),SUProps,Variance), + maplist(into_kv,Variance,SUProps,CountOfEachL). + +into_kv(K,V,K-V). +from_kv(K-V,K,V). +variance_had_count(Objs,UHAD,Variance):- + variance_had_counts(_Common,UHAD,Objs,_Versions,_Missing,_VersionsByCount,Variance),!. +variance_had_count(_Objs,_UHAD,0). + + + +show_changes_and_match_template(Named,ObjsI,ObjsO):- + must_det_ll(( + maplist(variance_counts,[ObjsI,ObjsO],[VC1,VC2]), + intersection(VC1,VC2,_Shared,VD1,VD2),append(VD1,VD2,VCB), + maplist(prop_name,VD1,VN1), + maplist(prop_name,VD2,VN2), + %print_each_ss(variance_counts(Named),VD1,VD2), + show_changed_diffs([c([b,_,_])],Named,first_number,VD1,VD2), + nop(maplist(prop_name,VCB,VCN)), + VCN=VNN, + intersection(VN1,VN2,VNN,_,_), + pp_saved(vnn=VNN), pp_saved(vcn=VCN), + maplist(objs_to_which_props,[ObjsI,ObjsO],[WP1,WP2]), + %show_changed_diffs(Named,templify_cc,WP1,WP2), + append(WP1,WP2,WPB), + include(equals_same_p2(prop_name,VCN),WPB,WPBT), + pp_saved(wPBT=WPBT), + maplist(templify_cc,WPBT,Templ), + variant_list_to_set(Templ,Templates), + pp_saved(templates=Templates), + maplist(show_matching_templates(Named,VNN,WP1,WP2),Templates,Info), + sum_list(Info,Shown), + (Shown==0 -> + (writeln(shown=Shown),maplist(show_matching_templates(Named,_,WP1,WP2),Templates,Info)); + true), + !)). + +equals_same_p2(P2,VCN,I2):- call(P2,I2,O2),!, \+ \+ member(O2,VCN). + +show_matching_templates(Named,VCN,WP1,WP2,T,Info):- + must_det_ll(( + include(p1_call(chk(=(T))),WP1,LL1), + include(p1_call(chk(=(T))),WP2,LL2), + %numbervars(T,1100,_,[]), + if_t(((LL1\==[],LL2\==[])), + must_det_ll((color_print(green,Named),write(': '),color_print(white,T),nl, + maplist(prop_value,LL1,N1), maplist(prop_value,LL2,N2), + ignore(( + (nonvar(VCN)->once(overlapping_element(prop_name,VCN,N1);overlapping_element(prop_name,VCN,N2));true), + Info = 1, + print_each_ss2(N1,N2)))))))), + ignore(Info=0). + +overlapping_element(P2,L1,L2):- member(E1,L1),member(E2,L2),once((call(P2,E1,F1),call(P2,E2,F2))), F1 =@= F2,!. + +show_interesting_comp_diffs(Named,P2,P2A,ObjsI,ObjsO):- + must_det_ll(( + call(P2,ObjsI,HAD1), call(P2,ObjsO,HAD2), + w_section(show_interesting_compare(P2,Named), + must_det_ll(( + show_changed_diffs(t(P2,Named),P2A,HAD1,HAD2)))))). + +pp_non_nil_e(_,PP):- PP == [],!. +pp_non_nil_e(Named,PP):- nl,listify(PP,LL),wqs(Named),nl,maplist(pp,LL),nl. + +changed_diffs(PropC1,PropC2,LS1,LS2,Same,LLS1,LLS2):- + must_det_ll(( + intersection(PropC1,PropC2,Same,WP1,WP2), + predsort(sort_on(prop_name),WP1,LS1), predsort(sort_on(prop_name),WP2,LS2), + list_to_set(WP1,LLS1), list_to_set(WP2,LLS2))). + +show_changed_diffs(Show,Named,Pred2,PropC1,PropC2):- + must_det_ll(( + changed_diffs(PropC1,PropC2,LS1,LS2,Same,LLS1,LLS2), + \+ \+ if_t(member(c(Which),Show),show_changed_by_sides(Which,["Changed",Named],prop_name,LS1,LS2)), + \+ \+ if_t(member(s(Which),Show),pp_non_nil_e(["Same",Named],Same)), + \+ \+ if_t(member(d(Which),Show),show_changed_by_sides(Which,["Different",Named],Pred2,LLS1,LLS2)))). + +show_changed_by_sides(Show,Named,Pred2,PropS1,PropS2):- + must_det_ll(( + changed_by_sides(Pred2,PropS1,PropS2,LeftOnly,RightOnly,A1O,A2O), + \+ \+ if_t(member(l,Show),pp_non_nil_e(["Left Only",Named],LeftOnly)), + \+ \+ if_t(member(r,Show),pp_non_nil_e(["Right Only",Named],RightOnly)), + \+ \+ if_t(member(b,Show),ignore(((((A1O\==[] ; A2O\==[])),!,nl,wqs(["Both",Named]),nl,maplist(print_each_ss2,A1O,A2O))))))). + + +changed_by_sides(Pred2,PropS1,PropS2,LeftOnly,RightOnly,A1O,A2O):- + must_det_ll(( + maplist(Pred2,PropS1,ArgPropS1), maplist(Pred2,PropS2,ArgPropS2), + append(ArgPropS1,ArgPropS2,ArgPropS),variant_list_to_set(ArgPropS,ArgPropSort), + maplist(grp_by(Pred2,PropS1),ArgPropSort,A1L), + maplist(grp_by(Pred2,PropS2),ArgPropSort,A2L), + maplist(into_kv,A1L,A2L,OLairs), + findall(K,member(K-[],OLairs),LeftOnly), + findall(K,member([]-K,OLairs),RightOnly), + findall(K-V,(member(K-V,OLairs),K\==[],V\==[]),Both), + maplist(from_kv,Both,A1O,A2O))). + + +grp_by(P2,PPS1,AE,L):- + findall(A,(member(A,PPS1),call(P2,A,AE)),L). + +first_number(A,AE):- nonvar(AE),first_number(A,AE1),!,AE1=AE. +first_number(A,AE):- sub_term(AE,A),number(AE),!. +first_number(_,inf). + +print_each_ss(Title,L1E,L2E):- + listify(L1E,WP1), listify(L2E,WP2), + print_each_ss2([Title,'~n'|WP1],[Title,'~n'|WP2]). + +%print_each_ss2([],L2E):- nl,print("Only Right "),!,variant_list_to_set(L2E,LL),maplist(pp,LL),!. +%print_each_ss2(L1E,[]):- nl,print("Only Left "),!,variant_list_to_set(L1E,LL),maplist(pp,LL),!. +print_each_ss2(L1E,[]):-!,print_each_ss2(["Only Left"],L1E). +print_each_ss2([],L1E):-!,print_each_ss2(["Only Right"],L1E). +print_each_ss2(L1E,L2E):- listify(L1E,WP1), listify(L2E,WP2),print_each_ss2_2(WP1,WP2),!. + +pp_saved(A=B):- is_list(B),!,maplist(pp_saved_nv(A),B),pp(A=B). +pp_saved(A=B):- pp_saved_nv(A,B),!,pp(A=B). +pp_saved(A,B):- pp_saved_nv(A,B),pp(B). + +pp_saved_nv(A,B):- must_det_ll((remember_propcounts(_Named,pp_saved,A,B))). + +print_each_ss2_2(WP1,WP2):- + must_det_ll(( + wots(S1,maplist(pp_saved(left),WP1)), + wots(S2,maplist(pp_saved(right),WP2)), + atomic_list_concat(SS10,'\n',S1), + atomic_list_concat(SS20,'\n',S2), + max_width(SS10,SS1,100), + max_width(SS20,SS2,100), + make_longest_len(SS1,SS2,SSS1,SSS2), + print_to_string11(write,0,SSS1,SSS1A,Lad1),Lad is Lad1, + maplist(print_to_string_using_up(Lad,''),SSS1A,SSS1B), + print_side_by_side0(SSS1B,_,SSS2))). + +max_width([E|SS20],[E|SS2],Hundred):- atom_length(E,Len),Len=0, write(S),wp_n_sp(Used),!. +wp_s_up(S,_):- write(S),!. wp_n_sp(N):- N>0,!,write(' '),Nm1 is N -1,wp_n_sp(Nm1). wp_n_sp(_). + + + + print_treeified_props(Objs):- print_treeified_props(treeified_props,Objs),!. print_treeified_props(Named,Objs):- @@ -278,11 +448,17 @@ my_maplist(treed_plist,Objs,PropLists), color_print(cyan,call(print_ptree(Named,PropLists))))). -treed_plist(Obj,PropList):- - must_det_ll((indv_props_list(Obj,RawPropList), - treed_props_list(RawPropList,PropList0),!, - ((fail,make_ss(PropList0,SS))-> - append(PropList0,[(SS)],PropList); append(PropList0,[],PropList)))). +make_longest_len(WP1,WP2,L11,L22):- + length(WP1,LL1),length(WP2,LL2), + (LL1>LL2 -> (L11=WP1,ensure_length(WP2,LL1,'',L22)); + (L22=WP2,ensure_length(WP1,LL2,'',L11))). + +ensure_length(WP1,Len,With,New):- length(WP1,Len0), + Extend is Len-Len0,Extend>0,!, + make_list(With,Extend,More), + append(WP1,More,New). +ensure_length(WP1,_Len,_With,WP1). + make_ss(RawPropList,SS):- member(oid(OID),RawPropList),member(grid(Grid),RawPropList),wots(SS,print_grid(OID,Grid)),!. @@ -290,6 +466,13 @@ member(oid(OID),RawPropList),oid_to_obj(OID,PObj),wots(SS,print_grid(OID,[PObj])),!. %make_ss(RawPropList,SS):- wots(SS,print(SS)). + +treed_plist(Obj,PropList):- + must_det_ll((indv_props_list(Obj,RawPropList), + treed_props_list(RawPropList,PropList0),!, + ((fail,make_ss(PropList0,SS))-> + append(PropList0,[(SS)],PropList); append(PropList0,[],PropList)))). + treed_props_list(RawPropLists,PropLists):- is_list_of_lists(RawPropLists),!,maplist(treed_props_list,RawPropLists,PropLists). treed_props_list(RawPropLists,PropLists):- must_det_ll(( @@ -307,6 +490,7 @@ treeify_props(Named,RRR,Tree), remember_tree(Named,Tree), tersify_gridoids(Tree,TTree), + with_pre(print_tree_no_nl(Named=TTree)))). tersify_gridoids(Tree,TTree):- map_pred1(replace_gridoids,Tree,TTree). @@ -342,44 +526,54 @@ is_prop(Prop):- is_prop1(Prop),!. is_prop(Prop):- writeln(user_error,not(is_prop(Prop))),itrace,!,fail. +% ===================================================================== +is_fti_step(extend_obj_proplists). +% ===================================================================== +extend_obj_proplists(VM):- extend_grp_proplist(VM.objs,set(VM.objs)). + extend_grp_proplist(Grp,GrpO):- Grp==[],!,GrpO=[]. extend_grp_proplist(Grp,GrpO):- user:extend_grp_proplist0(Grp,GrpO),!. -extend_grp_proplist0(Grp,GrpO):- \+ ((sub_term(E,Grp),compound(E),E=oid(_))),!,Grp=GrpO. +%extend_grp_member_proplist(Var,NewObj):- var(Var),!, enum_object(Var),extend_grp_proplist(Var,NewObj). +dont_extend_proplist(Grp):- \+ compound(Grp),!. +dont_extend_proplist(Grp):- \+ ((sub_term(E,Grp),compound(E),E=oid(_))),!. +dont_extend_proplist(Grp):- \+ \+ ((sub_term(E,Grp),compound(E),E=links_count(_,_))),!. +extend_grp_proplist0(Grp,GrpO):- dont_extend_proplist(Grp),!,GrpO=Grp. extend_grp_proplist0(Grp,GrpO):- must_det_ll(( - maplist(extend_obj_proplist(Grp),Grp,GrpM), + maplist(extend_grp_member_proplist(Grp),Grp,GrpM), externalize_links(GrpM,GrpO))). -extend_obj_proplist(Obj,Props):- extend_obj_proplist(_,Obj,Props). +extend_grp_member_proplist(Grp,Props,OUTL):- is_list_of_prop_lists(Props),!,maplist(extend_grp_member_proplist(Grp),Props,OUTL). +extend_grp_member_proplist(Grp,[obj(Obj)],[obj(OUT)]):- extend_grp_member_proplist(Grp,Obj,OUT),!. +extend_grp_member_proplist(Grp,obj(Obj),obj(OUT)):-!, extend_grp_member_proplist(Grp,Obj,OUT). -%extend_obj_proplist(Var,NewObj):- var(Var),!, enum_object(Var),extend_grp_proplist(Var,NewObj). -extend_obj_proplist(Grp,Props,OUTL):- is_list_of_prop_lists(Props),!,maplist(extend_obj_proplist(Grp),Props,OUTL). -extend_obj_proplist(Grp,[obj(Obj)],[obj(OUT)]):- extend_obj_proplist(Grp,Obj,OUT),!. -extend_obj_proplist(Grp,obj(Obj),obj(OUT)):-!, extend_obj_proplist(Grp,Obj,OUT). -extend_obj_proplist(_Grp,Props,OUTL):- must_det_ll(is_obj_props(Props)), length(Props,Len), Len==1,!,Props=OUTL. -extend_obj_proplist(Grp,Props,OUTL):- +extend_grp_member_proplist(_Grp,Props,OUTL):- must_det_ll(is_obj_props(Props)), length(Props,Len), Len==1,!,Props=OUTL. +extend_grp_member_proplist(Grp,Props,OUTL):- Obj = obj(Props), findall(P,extend_obj_prop(Grp,Obj,P),NewProps), flatten(NewProps,NewPropsF), override_object(NewPropsF,Props,Obj1), + fix_dumb_props(1,Obj1,Obj2), %override_object(Props,Obj1,OUT), - indv_props_list(Obj1,OUTL). + indv_props_list(Obj2,OUTL). + +fix_dumb_props(N,Obj1,[pen([cc(Color,1)])|Obj2]):- N==1, fail, + select(pen([cc(Color,1)]),Obj1,ObjM1), \+ sub_var(wfg,ObjM1), + is_real_color(Color),is_fg_color(Color), + subst001(ObjM1,Color,wfg,ObjM), + N1 is N +1,!, + fix_dumb_props(N1,ObjM,Obj2). +fix_dumb_props(_,Obj1,Obj1). - %lazy_prop(Prop):- algo_list(Algo), arg(_,v(grid_ops(Algo,_NormOps),iz(algo_sid(Algo,_NormShapeID)),grid_rep(Algo,_NormGrid)),Prop). +%extend_obj_prop(_Grp,Obj,Props):- fail, once((localpoints(Obj,P),vis2D(Obj,H,V),points_to_grid(H,V,P,Grid), grid_props(Grid,Props))). +extend_obj_prop(_Grp,Obj,Prop):- compound(Obj), Obj = obj(List), missing_obj_props(Obj,List,Prop). extend_obj_prop(Grp,Obj,Prop):- is_in_subgroup(Grp,Obj,Prop). -extend_obj_prop(_Grp,Obj,Props):- fail, - once((localpoints(Obj,P),vis2D(Obj,H,V),points_to_grid(H,V,P,Grid), - grid_props(Grid,Props))). -extend_obj_prop(_Grp,Obj,Prop):- compound(Obj), Obj = obj(List), - missing_obj_props(Obj,List,Prop). - -extend_obj_or_proplist(In,PLists):- is_list(In), last(In,Obj),is_object(Obj),!,must_det_ll((extend_grp_proplist(In,Objs), - my_maplist(indv_props_list,Objs,PLists))). -extend_obj_or_proplist(In,PLists):- is_list(In), last(In,Obj),is_list(Obj),!, must_det_ll((my_maplist(indv_props_list,In,PLists))). -extend_obj_or_proplist(In,In). +%extend_obj_or_proplist(In,PLists):- is_list(In), last(In,Obj),is_object(Obj),!,must_det_ll((extend_grp_proplist(In,Objs), my_maplist(indv_props_list,Objs,PLists))). +%extend_obj_or_proplist(In,PLists):- is_list(In), last(In,Obj),is_list(Obj),!, must_det_ll((my_maplist(indv_props_list,In,PLists))). +%extend_obj_or_proplist(In,In). %%%indv_props_list(PA,PAP):- must_det_ll((extend_grp_proplist(PA,Obj), indv_props_list(Obj,PAP))),!. @@ -441,13 +635,15 @@ !. -print_grouped_props(Named,OProps):- non_interesting_props(OProps),!, print(print_non_interesting_props(Named)->OProps). +print_grouped_props(Named,OProps):- + non_interesting_props(OProps),!, print(print_non_interesting_props(Named)->OProps). %print_grouped_props(Named,Obj):- \+ is_list(Obj), !, pp(print_grouped_props(Named)=Obj). print_grouped_props(Named,In):- extend_grp_proplist(In,Objs), - print_grouped_props1(Named,Objs),!, - print_grouped_props2(Named,Objs),!. + set_test_id_io(Named), + print_grouped_props2(Named,Objs),!, + print_grouped_props1(Named,Objs),!. print_grouped_props1(Named,In):- must_det_ll(( @@ -465,7 +661,7 @@ must_det_ll(( extend_grp_proplist(In,ObjsG), consider_for_rank(ObjsG,Objs,_), - hack_prop_groups(Named,Objs), + %hack_prop_groups(Named,Objs), show_three_interesting_groups(Named,Objs,Groups), %banner_lines(cyan,3), groups_to_groupsets(Groups,GroupSets), @@ -483,11 +679,13 @@ w_section(title(SGroup), (pp(Title),nl,print_ss(Objs))). +ssort(A,B):- list_to_set(A,B). + show_three_interesting_groups(Named,Objs,Groups):- findall(Prop,(member(obj(O),Objs),member(Prop,O), not_skip_ku(Prop) ),Props), - sort_safe(Props,SProps), + ssort(Props,SProps), print_interesting_named_groups(props(Named),SProps), - my_maplist(make_unifiable_cc,SProps,UProps), predsort(using_compare(numbered_vars),UProps,SUProps), + my_maplist(make_unifiable_cc,SProps,UProps), variant_list_to_set(UProps,SUProps), print_interesting_named_groups(suprops(Named),SUProps), %count_each(SProps,Props,GroupsWithCounts), length_s(Objs,L), @@ -585,7 +783,7 @@ objs_with_props([],_,_,[]). group_quals([U|SUProps],SProps,L,[U-ListUS|KUProps]):- findall(U,member(U,SProps),ListU), - length_s(ListU,LUL),LUL\==L, sort_safe(ListU,ListUS), + length_s(ListU,LUL),LUL\==L, ssort(ListU,ListUS), ListUS=[_,_|_],!,group_quals(SUProps,SProps,L,KUProps). group_quals([_|SUProps],SProps,L,KUProps):- group_quals(SUProps,SProps,L,KUProps). group_quals([],_SProps,_,[]). @@ -610,9 +808,27 @@ objects_names_props(SubObjs,Props):- findall(F-Prop,(member(O,SubObjs),object_prop(O,Prop),prop_name(Prop,F)),Props). -prop_name(Prop,F):- \+ compound(Prop),!,F=Prop. -prop_name(Prop,Named):- compound_name_arguments(Prop,F,[A|_]), - (number(A)-> Named =F ; compound_name_arguments(Named,F,[A])). +prop_value(Prop,Value):- nonvar(Value),prop_value(Prop,Var),!,Value=Var. +prop_value(List,Value):- is_list(List),!,maplist(prop_value,List,Value),!. +prop_value(Prop,Value):- prop_first_value(Prop,Value). + +prop_first_value(Prop,Value):- nonvar(Value),prop_first_value(Prop,Var),!,Value=Var. +prop_first_value(Prop,Value):- \+ compound(Prop),!,Value=Prop. +prop_first_value(\+ Prop,Value):- nonvar(Prop),!,prop_first_value(Prop,Value). +prop_first_value(_ - Prop,Value):- nonvar(Prop),!,prop_first_value(Prop,Value). +prop_first_value(List,Value):- is_list(List),!,member(Prop,List),prop_first_value(Prop,Value),!. +prop_first_value(Value,Value). + +prop_name(Prop,Named):- nonvar(Named),prop_name(Prop,Var),!,Named=Var. +prop_name(Prop,Named):- prop_first_value(Prop,Value), value_to_name(Value,Named),!. + +value_to_name(Value,Named):- nonvar(Named),value_to_name(Value,Named2),!,Named2=Named. +value_to_name(Value,Named):- \+ compound(Value),!,Value=Named. +value_to_name(Value,Named):- make_unifiable_cc(Value,Named),!. +value_to_name(Value,Named):- make_unifiable_cc(Value,UProp), + compound_name_arguments(UProp,F,Args), + include(nonvar,Args,OArgs), + (OArgs ==[] -> Named=F ; compound_name_arguments(Named,F,OArgs)). mostly_fg_objs(OutCR,OutCR):-!. @@ -665,16 +881,33 @@ link_functor(contained_by,contained_by). + +missing_obj_props(Obj,List,Prop):- + Prop = grid_ops(Algo,NormOps), + algo_list(Algo), \+ member(Prop,List), grid_ops(Obj,Algo,NormOps). +missing_obj_props(Obj,List,Prop):- + Prop = grid_rep(Algo,NormOps), + algo_list(Algo), \+ member(Prop,List), grid_rep(Obj,Algo,NormOps). +missing_obj_props(Obj,List,Prop):- + Prop = iz(algo_sid(Algo,NormShapeID)), + algo_list(Algo), + \+ member(Prop,List), + grid_rep(Obj,Algo,NormGrid),local_shape_id(NormGrid,NormShapeID). + +missing_obj_props(Obj,List,Prop):- + Prop = links_count(Functor,Count), + \+ member(Prop,List), + obj_link_count(Obj,Functor,Count). + + + %is_in_subgroup(Grp,Obj,Prop):- var(Obj),!, enum_object(Obj),is_in_subgroup(Grp,Obj,Prop). is_in_subgroup(Grp,Obj,Prop):- nonvar(Grp),var(Obj),!,member(Obj,Grp),is_in_subgroup(Grp,Obj,Prop). is_in_subgroup(Grp,Obj,Prop):- var(Grp),var(Obj),!,findall(Obj,enum_object(Obj),Grp),is_in_subgroup(Grp,Obj,Prop). -is_in_subgroup(_Grp,Obj,links_count(Functor,Count)):- - link_functor(Contained_by,Functor), - findall(_, (indv_props(Obj,link(Contained_by,_))), FYL1), - (FYL1==[] -> findall(_, (indv_props(Obj,elink(Contained_by,_))), FYL); FYL=FYL1), - length_s(FYL,Count). -is_in_subgroup(Grp,YObj,occurs_in_links(Functor,Count)):- +%is_in_subgroup(_Grp,Obj,links_count(Functor,Count)):- obj_link_count(Obj,Functor,Count). + +is_in_subgroup(Grp,YObj,occurs_in_links(Functor,Count)):- is_list(Grp), obj_to_oid(YObj,Y), findall(Functor-Obj, (member(Obj,Grp),indv_props_list(Obj,PL),member(link(Contained_by,YY),PL),YY=Y,functor(Contained_by,Functor,_)), FYL), @@ -684,6 +917,13 @@ is_in_subgroup(_Grp,Obj,nth_fg_color(Nth,Color)):- unique_fg_colors(Obj,List), sort_color_by_mass(Obj,List,Sorted),nth1(Nth,Sorted,Color). +obj_link_count(Obj,Functor,Count):- + link_functor(Contained_by,Functor), + findall(_, (indv_props(Obj,link(Contained_by,_))), FYL1), + (FYL1==[] -> findall(_, (indv_props(Obj,elink(Contained_by,_))), FYL); FYL=FYL1), + length_s(FYL,Count). + + %is_in_subgroup(Grp,Obj,ansestors(N,Set)):-transitive_sets(ansestor,Obj,Set,N). %is_in_subgroup(Grp,Obj,descendants(N,Set)):-transitive_sets(descendant,Obj,Set,N). @@ -700,13 +940,12 @@ indv_props_list(Indv,List0), ku_rewrite_props(List0,List9). +var_e(E,S):- E==S,!. +var_e(E,S):- (nonvar(E);attvar(E)),!,E=@=S. -variant_list_to_set(I,O):- list_to_set(I,M),list_to_set_variants_equal2(M,O). - -list_to_set_variants_equal2([E|List],[E|Set]):- !, - ((select(S,List,Rest),shall_count_as_same(E,S)) - ->list_to_set_variants_equal2(Rest,Set);list_to_set_variants_equal2(List,Set)). -list_to_set_variants_equal2(H,H). +variant_list_to_set([E|List],Out):- select(S,List,Rest),var_e(E,S),!, variant_list_to_set([E|Rest],Out). +variant_list_to_set([E|List],[E|Out]):- !, variant_list_to_set(List,Out). +variant_list_to_set(H,H). flat_props(PropLists,OUTL):- is_list_of_prop_lists(PropLists),!,flatten(PropLists,OUTL). flat_props(Objs,EList):- @@ -717,25 +956,26 @@ hack_prop_groups(Named,Objs):- must_det_ll(( flat_props(Objs,EList), - w_section(print_elists(Named), print_elists_hack_objs(Named,EList,Objs,HackedObjs)), + w_section(print_elists(Named), + print_elists_hack_objs(Named,EList,Objs,HackedObjs)), banner_lines(orange,2), nop((my_maplist(arg(1),HackedObjs,RRR), w_section(hack_prop_groups(Named), (print_ptree(hacked(Named),RRR), banner_lines(yellow,2))))), ignore(skip_if_ansi(print_propset_groups(Named,Objs,EList))))). -obj_had_vbo(Objs,HAD,VersionsByOccurances):- +obj_had_vbo(Objs,HAD,VbO):- variance_had_counts(_Common,HAD,Objs,_Versions,_Missing,VersionsByCount,_Variance), vesion_uniqueness(VersionsByCount,VersionsByOccurancesN), - vesion_uniqueness(VersionsByOccurancesN,VersionsByOccurances),!. + vesion_uniqueness(VersionsByOccurancesN,VbO),!. which_props(UPropsSetGSet,Objs,WhichCounts):- - sort(UPropsSetGSet,UPropsSetGSetOO), + list_to_set(UPropsSetGSet,UPropsSetGSetOO), variant_list_to_set(UPropsSetGSetOO,UPropsSetGSetOOL), maplist(obj_had_vbo(Objs),UPropsSetGSetOOL,VCWs), - sort(VCWs,VCWsS1),reverse(VCWsS1,VCWsS2), + list_to_set(VCWs,VCWsS1),reverse(VCWsS1,VCWsS2), %maplist(indicate_priority,VCWsS2,SS), VCWsS2 = SS,!, - sort(SS,WhichCounts), !. + list_to_set(SS,WhichCounts), !. %predsort(sort_on(prop_priority),VCWsS2,WhichCounts). indicate_priority(I,S -> I):- indicate_priority0(I,S). @@ -747,7 +987,7 @@ prop_priority([1-(N-_),Not1-(_-_)|_],1-N):- Not1\==1,!. prop_priority([1-(_-_), 1-(N-_)|_],2-N):-!. prop_priority(_, 3-inf). - + var_to_underscore(Var,_):- plain_var(Var),!. @@ -760,11 +1000,12 @@ % HackedObjs = Splits, length_s(Objs,BaseSize), variant_list_to_set(Props,PropsSet), - count_each(PropsSet,Props,CountOfEachL), - predsort(sort_on(arg(2)),CountOfEachL,CountOfEach0), - sort(CountOfEach0,CountOfEach), + count_each(PropsSet,Props,CountOfEach0), + %predsort(sort_on(arg(2)),CountOfEachL,CountOfEach0), + list_to_set(CountOfEach0,CountOfEach), %mpp(countOfEach=CountOfEach), ignore(my_maplist(remember_propcounts(Named,count),CountOfEach)), + remember_propcounts(Named,countE,CountOfEach,Props,PropsSet), my_maplist(make_unifiable_cc,PropsSet,UPropsSet), map_pred(var_to_underscore,UPropsSet,UPropsSetG), variant_list_to_set(UPropsSetG,UPropsSetGSet), @@ -774,13 +1015,14 @@ variant_list_to_set(GroupsWithCountsL,GroupsWithCountsLVS), predsort(sort_on(arg(2)),GroupsWithCountsLVS,GroupsWithCounts),!, variant_list_to_set(GroupsWithCounts,GroupsWithCountsW), - sort(GroupsWithCountsW,GroupsWithCountsWP), + list_to_set(GroupsWithCountsW,GroupsWithCountsWP), variant_list_to_set(GroupsWithCountsWP,GroupsWithCountsWPO), - make_splitter(GroupsWithCountsWPO,CountOfEach,SSplits),sort(SSplits,CSplits), + make_splitter(GroupsWithCountsWPO,CountOfEach,SSplits),list_to_set(SSplits,CSplits), store_splits(Named,BaseSize,CSplits,Splits), %nop - nop(print_ptree(countOfEachU(Named),Splits)), + (print_ptree(countOfEachU(Named),Splits)), ignore(my_maplist(remember_propcounts(Named,diversity),GroupsWithCountsWPO)), + remember_propcounts(Named,diversityE,GroupsWithCountsWPO), replace_props_with_stats(GroupsWithCountsWPO,CountOfEach,Objs,HackedObjsM), my_maplist(ku_rewrite_props,HackedObjsM,Hacked), nop(pp(hackedObjs(Named)=HackedObjs)))). @@ -827,36 +1069,52 @@ made_split(_N,_UProp,[],[]). made_split(N,UProp,List,Out):-variant_list_to_set(List,Set),List\=@=Set,!,made_split(N,UProp,Set,Out). -made_split(N,UProp,List,Out):-sort(List,Set),List\=@=Set,!,made_split(N,UProp,Set,Out). +made_split(N,UProp,List,Out):-list_to_set(List,Set),List\=@=Set,!,made_split(N,UProp,Set,Out). made_split(_,UProp,List,((Len-UProp)->List)):- length_s(List,Len). sameps(UProp,_-Prop):- \+ Prop \= UProp. -into_test_id_io(Named+Filter,TestID,ExampleNum,IO+Filter):- - into_test_id_io(Named,TestID,ExampleNum,IO),!. -into_test_id_io(Named,TestID,(Example+Num),IO):- - name_to_selector(Named,((Example+Num)*IO)),get_current_test(TestID),!. -into_test_id_io(vs(Name1+Filter1,Name2+Filter2),TestID, +set_test_id_io(Named):- + into_test_id_io1(Named,TestID,ExampleNum,IO), + nb_setval(prior_asserts,to(TestID,ExampleNum,IO)). +into_test_id_io(Named,TestID,ExampleNum,IO):- var(Named),!, must_det_ll((nb_current(prior_asserts,to(TestID,ExampleNum,IO)))),!. +into_test_id_io(Named,TestID,ExampleNum,IO):- + into_test_id_io1(Named,TestID,ExampleNum,IO), + nb_setval(prior_asserts,to(TestID,ExampleNum,IO)). + +into_test_id_io1(Named+Filter,TestID,ExampleNum,IO+Filter):- into_test_id_io1(Named,TestID,ExampleNum,IO),!. +into_test_id_io1(Named,TestID,(Example+Num),IO):- name_to_selector(Named,((Example+Num)*IO)),get_current_test(TestID),!. +into_test_id_io1(vs(Name1+Filter1,Name2+Filter2),TestID, vs(Example+Num,(Example2+Num2)), vs(IO,IO2,vs(Filter1,Filter2))):- name_to_selector(Name1,((Example+Num)*IO)),get_current_test(TestID), name_to_selector(Name2,((Example2+Num2)*IO2)),!. -into_test_id_io(input(TestID>ExampleNum),TestID,ExampleNum,in). -into_test_id_io(both(TestID>ExampleNum),TestID,ExampleNum,in_out). -into_test_id_io(output(TestID>ExampleNum),TestID,ExampleNum,out). -into_test_id_io(Named,TestID,ExampleNum,IO):- Named=..[IO,TestID>ExampleNum],!. -into_test_id_io(Named,TestID,ExampleNum,IO):- Named=..[IO,TestID,ExampleNum],!. -into_test_id_io(Named+Filter,TestID,Named,Filter):-get_current_test(TestID),!. -into_test_id_io(Named,TestID,Named,Named):-get_current_test(TestID),!. - -name_to_selector(Name,((Trn+Num)*IO)):- make_up_selector_name(Trn+Num*IO,NameO),Name=NameO. +into_test_id_io1(input(TestID>ExampleNum),TestID,ExampleNum,in). +into_test_id_io1(both(TestID>ExampleNum),TestID,ExampleNum,in_out). +into_test_id_io1(output(TestID>ExampleNum),TestID,ExampleNum,out). +into_test_id_io1(Named,TestID,ExampleNum,IO):- Named=..[IO,TestID>ExampleNum],!. +into_test_id_io1(Named,TestID,ExampleNum,IO):- Named=..[IO,TestID,ExampleNum],!. +into_test_id_io1(Named+Filter,TestID,Named,Filter):-get_current_test(TestID),!. +into_test_id_io1(Named,TestID,Named,Named):-get_current_test(TestID),!. + +name_to_selector(Named,((Trn+Num)*IO)):- make_up_selector_name(Trn+Num*IO,NameO),Named=NameO. + + + +remember_propcounts(Named,Diversity,N-Prop):- !, into_test_id_io(Named,TestID,ExampleNum,IO), + assert_if_new(propcounts(TestID,ExampleNum,IO,Diversity,N,Prop)). +remember_propcounts(Named,Diversity,Prop):- into_test_id_io(Named,TestID,ExampleNum,IO), + assert_if_new(propcounts(TestID,ExampleNum,IO,Diversity,Prop)). +remember_propcounts(Named,Diversity,B,N-Prop):- !, into_test_id_io(Named,TestID,ExampleNum,IO), + assert_if_new(propcounts(TestID,ExampleNum,IO,Diversity,B,N,Prop)). +remember_propcounts(Named,Diversity,B,Prop):- into_test_id_io(Named,TestID,ExampleNum,IO), + assert_if_new(propcounts(TestID,ExampleNum,IO,Diversity,B,Prop)). +remember_propcounts(Named,Diversity,B,Prop,A):- into_test_id_io(Named,TestID,ExampleNum,IO), + assert_if_new(propcounts(TestID,ExampleNum,IO,Diversity,B,Prop,A)). -remember_propcounts(Named,Diversity,N-Prop):- into_test_id_io(Named,TestID,ExampleNum,IO), - arc_assert(propcounts(TestID,ExampleNum,IO,Diversity,N,Prop)). -remember_propcounts(Named,Diversity,B,N-Prop):- into_test_id_io(Named,TestID,ExampleNum,IO), - arc_assert(propcounts(TestID,ExampleNum,IO,Diversity,B,N,Prop)). +:- dynamic(propcounts/5). :- dynamic(propcounts/6). :- dynamic(propcounts/7). @@ -865,7 +1123,7 @@ replace_props_with_stats(SortedWithCounts,CountOfEach,obj(Objs),obj(HackedObjs)):- !,my_maplist(replace_props_with_stats(SortedWithCounts,CountOfEach),Objs,Hacked), - sort(Hacked,HackedObjsR),reverse(HackedObjsR,List0),!, + list_to_set(Hacked,HackedObjsR),reverse(HackedObjsR,List0),!, include(not_skip_ku,List0,List1), my_maplist(ku_rewrite_props,List1,HackedObjs). @@ -949,8 +1207,8 @@ any_have_prop(Except,Prop):- member(O,Except),has_prop(Prop,O),!. -transitive_sets(P2,Obj,Set,N):- findall(n(P,List),(trans(P2,Obj,List),List\==[],length_s(List,P)),Lists),sort_safe(Lists,Set),length_s(Set,N). -nontransitive_set(P2,Obj,Set,N):- findall(Other,p2_call(P2,Obj,Other),List),sort_safe(List,Set),length_s(Set,N). +transitive_sets(P2,Obj,Set,N):- findall(n(P,List),(trans(P2,Obj,List),List\==[],length_s(List,P)),Lists),ssort(Lists,Set),length_s(Set,N). +nontransitive_set(P2,Obj,Set,N):- findall(Other,p2_call(P2,Obj,Other),List),list_to_set(List,Set),length_s(Set,N). trans(P2,Obj,Out):- obj_to_oid(Obj,OID),trans_no_loop(P2,[OID],Obj,Out). @@ -973,11 +1231,6 @@ contained_by(Obj,Other):- has_prop(link(contained_by,Other,_),Obj). -% ===================================================================== -is_fti_step(extend_obj_proplists). -% ===================================================================== -%really_group_vm_priors(_VM):-!. -extend_obj_proplists(VM):- extend_grp_proplist(VM.objs,set(VM.objs)). % ===================================================================== @@ -1020,6 +1273,8 @@ add_rankings(Objs,WithPriors):- add_rankings(cuz,Objs,WithPriors). + + add_rankings(Why,ObjsIn,WithPriors):- fail, relivant_divide(RelivantDivide), my_partition(RelivantDivide,ObjsIn,FG,BG), @@ -1033,74 +1288,142 @@ add_rankings(Why,ObjsIn,WithPriors):- fail, once(combine_same_globalpoints(ObjsIn,Objs)), - ObjsIn\=@=Objs,!, - add_rankings(Why,ObjsIn,WithPriors). + ObjsIn\=@=Objs,!, + add_rankings(Why,Objs,WithPriors). +%add_rankings(_,Objs,Objs):-!. add_rankings(Why,Objs,WithPriors):- - group_prior_objs0(Why,Objs,WithPriors),!. + add_how_simular(Objs,Simulars), + group_prior_objs0(Why,Simulars,WithPriors),!. group_prior_objs0(Why,Objs,WithPriors):- + must_det_ll(group_prior_objs1(Why,Objs,WithPriors)),!, + (Objs=@=WithPriors -> wdmsg(group_prior_objs0_same) ; wdmsg(group_prior_objs0_DIFFF)), + !. + +add_how_simular(ObjsIn,ObjsIn):-!. +add_how_simular(ObjsIn,Simulars):- + add_how_simular(ObjsIn,ObjsIn,Simulars). + +add_how_simular([],_,[]):-!. +add_how_simular([obj(O)|Objs],ObjsIn,[obj(OO)|Simulars]):- + select(obj(O),ObjsIn,Rest), + add_how_common(O,Rest,OO), + add_how_simular(Objs,ObjsIn,Simulars). + +add_how_common([],_,[]):-!. +add_how_common([Prop|O],Rest,[Prop,simular(Prop,N)|OO]):- + Prop\=giz(_), Prop\=simular(_,_), Prop\=link(_,_), + Prop\=oid(_), + \+ (compound_name_arity(Prop,_,A),A>2), + % \+ ( arg(2,Prop,E),number(E) ), + % Prop\=pg(_,_,_,_), + findall(_,(sub_term(E,Rest),E==Prop),L),length(L,N), + %prop_name(Prop,Name),!, + add_how_common(O,Rest,OO). +add_how_common([Prop|O],Rest,[Prop|OO]):- + add_how_common(O,Rest,OO). + + +group_prior_objs1(Why,Objs,WithPriors):- must_det_ll(( %print_list_of(show_indiv,add_rankings,Objs),!, flat_props(Objs,Flat), maplist(make_unifiable_cc,Flat,UFlat), - predsort(using_compare(numbered_vars),UFlat,Lbls), + variant_list_to_set(UFlat,Lbls), length_s(Lbls,Len), Title = Why+Len, + length(Objs,ObjsLen), + w_section(title(add_priors(Title)), %print_tree(groupPriors=Lbls,[max_depth(200)]), - with_tag_class(div,nonpre,add_uset_priors(Lbls,Objs,WithPriors))))). + with_tag_class(div,nonpre, + add_uset_priors(ObjsLen,Lbls,Objs,WithPriors))))). skip_prior(HAD):- \+ compound(HAD),!. skip_prior(HAD):- \+ \+ not_care_to_count(HAD),!. +%skip_prior(HAD):- HAD=simular(_,_),!,fail. skip_prior(HAD):- compound_name_arity(HAD,_,N),!,N>1. -add_uset_priors([],Objs,Objs):-!. -add_uset_priors([HAD|Lbls],Objs,WithPriors):- - skip_prior(HAD), !, add_uset_priors(Lbls,Objs,WithPriors). -add_uset_priors([HAD|Lbls],Objs,WithPriors):- - skip_prior(HAD), !, add_uset_priors(Lbls,Objs,WithPriors). -add_uset_priors([HAD|Lbls],Objs,WithPriors):- +add_uset_priors(_,[],Objs,Objs):-!. +add_uset_priors(ObjsLen,[HAD|Lbls],Objs,WithPriors):- + skip_prior(HAD), !, add_uset_priors(ObjsLen,Lbls,Objs,WithPriors). +add_uset_priors(ObjsLen,[HAD|Lbls],Objs,WithPriors):- + skip_prior(HAD), !, add_uset_priors(ObjsLen,Lbls,Objs,WithPriors). + +add_uset_priors(ObjsLen,[HAD|Lbls],Objs,WithPriors):- must_det_ll(( variance_had_counts(Common,HAD,Objs,Versions,Missing,VersionsByCount,Variance))), \+ \+ (member(V,Versions),has_subterm(number,V)), - must_det_ll((( Variance==1; (fail, length(Objs,Len),Len==Variance,Missing==[])) - -> add_uset_priors(Lbls,Objs,WithPriors) - ; (add_1uset_prior(Common,VersionsByCount,Objs,NObjs), add_uset_priors(Lbls,NObjs,WithPriors)))),!. + must_det_ll(((( Variance==1; (fail, length(Objs,Len),Len==Variance,Missing==[])),fail) + -> add_uset_priors(ObjsLen,Lbls,Objs,WithPriors) + ; (add_1uset_prior(ObjsLen,Common,VersionsByCount,Objs,NObjs), add_uset_priors(ObjsLen,Lbls,NObjs,WithPriors)))),!. -add_uset_priors([_|Lbls],Objs,WithPriors):- - add_uset_priors(Lbls,Objs,WithPriors),!. +add_uset_priors(ObjsLen,[_|Lbls],Objs,WithPriors):- + add_uset_priors(ObjsLen,Lbls,Objs,WithPriors),!. -add_1uset_prior(Common,VersionsByCount,Objs,NObjs):- +add_1uset_prior(ObjsLen,Common,VersionsByCount,Objs,NObjs):- vesion_uniqueness(VersionsByCount,VersionsByOccurancesN), - vesion_uniqueness(VersionsByOccurancesN,VersionsByOccurances), - maplist(add_prior_info(Common,VersionsByOccurances),Objs,NObjs). - -add_prior_info(Common,VersionsByOccurances,obj(List),obj(NewList)):- - add_prior_info_1(Common,VersionsByOccurances,List,NewList),!. -add_prior_info(Common,VersionsByOccurances,(List),(NewList)):- - add_prior_info_1(Common,VersionsByOccurances,List,NewList),!. - -add_prior_info_1(_Common,VersionsByOccurances,PropList,OUT):- is_list(PropList), - length(VersionsByOccurances,Max), Max>1, - append(Left,[PropL|Right],PropList), - find_version(VersionsByOccurances,Prop,N1,N2,PropL), - \+ sub_compound(pg(Max,Prop,_,_),PropList), - append(Left,[pg(Max,Prop,N1,N2),Prop,Right],OUT),!. - -add_prior_info_1(_Common,_VersionsByCount,PropList,PropList). - + vesion_uniqueness(VersionsByOccurancesN,VbO), + maplist(add_prior_info(Objs,ObjsLen,Common,VbO),Objs,NObjs). + +add_prior_info(Objs,ObjsLen,Common,VbO,obj(List),obj(NewList)):- + add_prior_info_1(Objs,ObjsLen,Common,VbO,List,NewList),!. +add_prior_info(Objs,ObjsLen,Common,VbO,(List),(NewList)):- + add_prior_info_1(Objs,ObjsLen,Common,VbO,List,NewList),!. + +add_prior_info_1(_Objs,ObjsLen,_Common,VbO,PropList,OUT):- is_list(PropList), + length(VbO,Rankers), %Rankers>1, + find_version(VbO,Prop,N1,N2,PropList), + member(Prop,PropList), + %prop_name(Prop,Name), + value_to_name(Prop,Name), + R = pg(Rankers,Name,rank1,N2), + \+ member(R,PropList), + rank_size(Rankers,N2,Size), + %subst(PropList,Prop,R,PropListR), + PropList = PropListR, + nop(_=pg(Size,Name,rank3,Size)), + append(PropListR,[R,pg(ObjsLen,Name,simulars,N1)],OUTE),!, + include(some_pgs_and_props(PropList),OUTE,OUT). + +add_prior_info_1(_Objs,_ObjsLen,_Common,_VersionsByCount,PropList,PropList). + +use_simulars(_):- fail. +use_rank(mass(_)). +redundant_prop(_,nth_fg_color(N1,_)):- N1==1. +redundant_prop(Props,unique_colors([FG])):- sub_var(pen([cc(FG,1)]),Props),!. +redundant_prop(Props,cc(FG,_)):- is_real_fg_color(FG),sub_var(pen([cc(FG,1)]),Props),!. +redundant_prop(Props,center2D(_,_)):- sub_compound(loc2D(_,_),Props). +%redundant_prop(Props,center2D(X,Y)):- sub_var(center2G(X,Y),Props). +redundant_prop(Props,center2G(X,Y)):- sub_var(center2D(X,Y),Props). + +some_pgs_and_props(_,pg(_,Name,simulars,_)):- !, use_simulars(Name),!. +some_pgs_and_props(_,pg(_,Name,rank1,_)):- !, use_rank(Name),!. +some_pgs_and_props(PropList,Name):- \+ redundant_prop(PropList,Name). + +rank_size(_,1,3):-!. +rank_size(M,N,2):- N\==M,!. +rank_size(N,N,1):-!. + +find_version(VbO,Prop,N1,N2,PropList):- + member(Version,VbO),deepest_kv(Version,N2,Prop),has_nprop(Prop,PropList),arg(1,Version,N1),!. +find_version(VbO,OProp,N1,N2,_PropList):- + member(Version,VbO),deepest_kv(Version,N2, \+ Prop),ignore(arg(1,Version,N1)),!, + ignore(\+ Prop = OProp). + + +deepest_kv(_-(K-V),O,VV):- nonvar(K), !, deepest_kv(K-V,O,VV). +deepest_kv(O-V,O,V). +deepest_kv(V,_,V). -find_version(VersionsByOccurances,Prop,N1,N2,PropList):- - member(Version,VersionsByOccurances),deepest_kv(Version,N2,Prop),has_nprop(Prop,PropList),arg(1,Version,N1),!. +%:- reconsult(kaggle_arc_individuation). /* clumped_r([1,2,3,3],O). O = [1-1,1-2,2-3]. */ -deepest_kv(_-(K-V),O,VV):-!, deepest_kv(K-V,O,VV). -deepest_kv(O-V,O,V). select_which(CntC,Order):- keysort(CntC,Order2),maplist(arg(2),Order2,Order). clumped_r(Cnts,CntR):- clumped(Cnts,CntC),maplist(swap_vk,CntC,CntR). @@ -1113,7 +1436,7 @@ vesion_uniqueness(I,O):- vesion_uniqueness1(I,O),!. vesion_uniqueness1(I,O):- - vesion_uniqueness(I,I,M),sort(M,M1),=(M1,O),!. + vesion_uniqueness(I,I,M),list_to_set(M,M1),=(M1,O),!. %number_cards(M1,O):- @@ -1180,7 +1503,7 @@ list_to_set(Fallback2,BestOrder), ((InHidden==[];equal_sets(InHidden,InC))-> Rest=[] ; create_vis_layers(Fallback2,IH,IV,LayerNum2,InHidden,Rest)). -equal_sets(A,B):- sort_safe(A,AA),sort_safe(B,BB),AA=@=BB. +equal_sets(A,B):- sort(A,AA),sort(B,BB),AA=@=BB. % sprop_piority(Class,Priority). @@ -1248,7 +1571,7 @@ largest_priority(Indv,Priority):- sprop_piority(Prop,Priority), has_prop(Prop,Indv),!. largest_priority(_,1). largest_first(P2,IndvS0,IndvR):- - sort_safe(IndvS0,IndvS), + ssort(IndvS0,IndvS), %must_det_ll (( findall((Priority+Size)-Indv,(member(Indv,IndvS),largest_priority(Indv,NPriority),call(P2,Indv,Size),Priority is - NPriority),All), @@ -1283,32 +1606,40 @@ has_subterm(P1,HasNumber):- sub_term(N,HasNumber),call(P1,N),!. variance_had_counts(Common,HAD,RRR,Versions,Missing,VersionsByCount,Variance):- - must_det_ll(( + %HAD\=simular(_,_), + must_det_ll(( make_unifiable_cc(HAD,UHAD), findall(RR,(member(RR,RRR), once((indv_props_list(RR,R), \+ member(UHAD,R)))),Missing), length(Missing,ML), findall(UHAD,(member(RR,RRR), indv_props_list(RR,R), member(UHAD,R)),VersionL), - predsort(using_compare(numbered_vars),VersionL,VersionSet), - some_min_unifier_cc(VersionSet,Common),nonvar(Common), - predsort(using_compare(version_magnitude),VersionSet,VersionSetOrdered), - lists:number_list(VersionSetOrdered,1,VersionSetNumberedVK), - maplist(swap_vk,VersionSetNumberedVK,VersionSetNumbered), - count_each(VersionSetOrdered,VersionL,CountOfEachL), - subst_2L(VersionSetOrdered,VersionSetNumbered,CountOfEachL,CountOfEachNumbered), + variant_list_to_set(VersionL,VersionSet), + some_min_unifier(VersionSet,Common),nonvar(Common), + number_from_magnitude(VersionSet,VersionSetNumbered), + count_each(VersionSet,VersionL,CountOfEachL), + subst_2L(VersionSet,VersionSetNumbered,CountOfEachL,CountOfEachNumbered), - (ML == 0 -> - ->(Versions = VersionSetOrdered, vesion_uniqueness2(CountOfEachNumbered,VersionsByCount)) - ; (Versions=[(\+(UHAD))|VersionSetOrdered],vesion_uniqueness2([ML-(0- \+(UHAD))|CountOfEachNumbered],VersionsByCount))), - length(Versions,Variance))). + (ML == 0 + ->(Versions = VersionSet, CountOfEachNumbered=CountOfEachNumberedNN) + ; (Versions=[(\+(UHAD))|VersionSet],CountOfEachNumberedNN=[ML-(0- \+(UHAD))|CountOfEachNumbered])), + length(Versions,Variance), + vesion_uniqueness2(CountOfEachNumberedNN,VersionsByCount), + ignore(((nb_current(prior_asserts,to(TestID,ExampleNum,IO)), + \+ propcounts(TestID,ExampleNum,IO, variance_had_count_set(_,_), UHAD,_,_), + assert_if_new( + propcounts(TestID,ExampleNum,IO, variance_had_count_set(Variance,ML),Common,Versions,CountOfEachNumberedNN))))))). + +number_from_magnitude(VersionSet,VersionSetNumbered):- + predsort(using_compare(version_magnitude),VersionSet,VersionSetOrdered), + lists:number_list(VersionSetOrdered,1,VersionSetOrderedNumberedVK), + maplist(swap_vk,VersionSetOrderedNumberedVK,VersionSetOrderedNumberedKV), + subst_2L(VersionSetOrdered,VersionSetOrderedNumberedKV,VersionSet,VersionSetNumbered). -some_min_unifier_cc([],[]):-!. -some_min_unifier_cc(A,B):- some_min_unifier(A,B). /* variance_had(HAD,RRR,Versions,Variance):- make_unifiable_cc(HAD,UHAD), findall(UHAD,(member(R,RRR),member(UHAD,R)),VersionL), - sort(VersionL,Versions), + list_to_set(VersionL,Versions), length(Versions,Variance). */ is_length(N,L):- length_s(L,N). @@ -1353,7 +1684,7 @@ variant_list_to_set(GroupsWithCountsL,GroupsWithCountsLVS), predsort(sort_on(arg(2)),GroupsWithCountsLVS,GroupsWithCounts),!, variant_list_to_set(GroupsWithCounts,GroupsWithCountsW), - sort(GroupsWithCountsW,KS), [_N-HAD|_] = KS, + list_to_set(GroupsWithCountsW,KS), [_N-HAD|_] = KS, findall(HAD,member(HAD,PropsSet),HHH),!, treeify_props_these_next(Named,HAD,HHH,RRR,OUTPUT). @@ -1364,16 +1695,18 @@ my_maplist(select_safe_always(Versions,UProp),_,RRR,RR), treeify_props(Named,RR,OUT). */ - -objs_to_had(Objs,HAD):- +objs_to_which_props(Objs,List):- flat_props(Objs,Props), maplist(make_unifiable_cc,Props,UProps), variant_list_to_set(UProps,PropsSet), my_maplist(make_unifiable_cc,PropsSet,UPropsSet), map_pred(var_to_underscore,UPropsSet,UPropsSetG), variant_list_to_set(UPropsSetG,UPropsSetGSet), - which_props(UPropsSetGSet,Objs,List),!, - member(one(_,_-HAD),List). + which_props(UPropsSetGSet,Objs,List). + +objs_to_had(Objs,HAD):- + objs_to_which_props(Objs,List),!, + member(1-One,List),deepest_kv(One,_,HAD). treeify_props(Named,_DontDivOnThisNumber,Objs, (one(EACH) -> EACHOUT)):- fail, objs_to_had(Objs,HAD), @@ -1403,18 +1736,21 @@ -treeify_props(P1,Named,DontDivOnThisNumber,RRR, (EACH -> EACHOUT)):- member(SEG,[5,3,2,1]), +treeify_props(P1,Named,DontDivOnThisNumber,RRR, (EACH -> EACHOUT)):- EACH = each((SubEach>=SEG)*Variance*UProp), + TopDiv is round(DontDivOnThisNumber /2)-1, + member(SEG,[TopDiv,5,3,2,1]), member(R,RRR), member(HAD,R), \+ call(P1,HAD,RRR), %HAD\=pen(_), variance_had_counts(UProp,HAD,RRR,Versions,Missing,CountOfEach,Variance), DontDivOnThisNumber\==Variance, maplist(arg(1),CountOfEach,CountL), - sort(CountL,CountOfEachSorted), + list_to_set(CountL,CountOfEachSorted), CountOfEachSorted=[SubEach], SubEach>=SEG, term_variables(UProp,EVars), subst_between(EVars,UProp,RRR,NEWRRR), + print(coe = CountOfEach), (((RRR=@=NEWRRR)) -> ( treeify_versions(Named,EACH,UProp,Versions,RRR,Missing,OUT), always_attempt_min_unifier_select(EACH,OUT,EACHOUT)) ; ( flag(nvs,X,X), @@ -1454,7 +1790,7 @@ variance_had_counts(UProp,HAD,RRR,Versions,Missing,Counts,Variance), (Missing==[] -> DontDivOnThisNumber\==Variance ; true)), BestUProps), - sort(BestUProps,SortedBestUProps), + list_to_set(BestUProps,SortedBestUProps), uniquest(DontDivOnThisNumber,SortedBestUProps,Best), UProp\=pen(_), term_variables(UProp,EVars), @@ -1536,7 +1872,7 @@ lots_of_prop(RRR,N,HAD):- flatten(RRR,GF), - sort_safe(GF,GSS), + ssort(GF,GSS), care_to_count(GSS,GS), count_each(GS,GF,UC), keysort(UC,KS), @@ -1545,12 +1881,30 @@ variant_member(E,List):- member(V,List),E=@=V,!. +templify_cc(WP1,WP2):- \+ compound(WP1),!,WP2=WP1. +templify_cc(N-WP1,N-_):- \+ compound(WP1),!. + +templify_cc([H|T],[HH|TT]):- !, templify_cc(H,HH),templify_cc(T,TT). + +templify_cc(A-(B-(C-(_-_))),A-(B-(C-(_-_)))):- nonvar(C),!. +%templify_cc(A-B-C-_-WP1,A-B-C-_-_):- compound(WP1),!. + + +templify_cc(N-M-WP1,N-WP2):- !, templify_cc(M-WP1,WP2). +templify_cc(N-WP1,N-_):- is_prop1(WP1),!. +templify_cc(N-WP1,N-WP2):- !, templify_cc(WP1,WP2). + + +make_unifiable_cc(WP1,WP2):- \+ compound(WP1),!,WP2=WP1. +make_unifiable_cc(N-WP1,N-_):- \+ is_list(WP1),!. +make_unifiable_cc(N-WP1,N-WP2):- !, make_unifiable_cc(WP1,WP2). +make_unifiable_cc([H|T],[HH|TT]):- !, make_unifiable_cc(H,HH),make_unifiable_cc(T,TT). make_unifiable_cc(cc(C,N),cc(_,N)):- is_real_color(C),!. make_unifiable_cc(cc(N,_),cc(N,_)):-!. make_unifiable_cc(oid(_),oid(_)):-!. -make_unifiable_cc(recolor(_,N),recolor(_,N)):-!. -make_unifiable_cc(iz(symmetry_type(N)),iz(symmetry_type(N))):- nonvar(N),!. -make_unifiable_cc(pg(N,G,_,_),pg(N,UG,_,_)):-!,make_unifiable_cc(G,UG). +make_unifiable_cc(recolor(N,_),recolor(N,_)):-!. +make_unifiable_cc(iz(symmetry_type(N,_)),iz(symmetry_type(N,_))):-!. +make_unifiable_cc(pg(_,G,M,_),pg(_,UG,M,_)):-!,make_unifiable_cc(G,UG). make_unifiable_cc(O,U):- make_unifiable(O,U). count_objs(B,O):- \+ is_list(B),!, O = 0. @@ -1562,15 +1916,15 @@ treeify_n_versions(StoredName,Title,UProp,[Prop|Versions],RRR,Missing,[(Prop->HAVESSTREE)|OUTS]):- my_partition(variant_member(Prop),RRR,HAVES,HAVENOTS), - my_maplist(variant_select(Prop),HAVES,HAVESS), + my_maplist(variant_select(Prop),HAVES,HAVESS),!, treeify_props(StoredName,HAVESS,HAVESSTREE), treeify_n_versions(StoredName,Title,UProp,Versions,HAVENOTS,Missing,OUTS), - maybe_unite_oids(StoredName,HAVES). + maybe_unite_oids(StoredName,HAVES),!. treeify_n_versions(_StoredName,_Title,_, [],_,[],[]):-!. treeify_n_versions(StoredName,_Title,UProp,[],_,Missing,[((\+ (UProp)) ->MissingTREE)]):- treeify_props(StoredName,Missing,MissingTREE), - maybe_unite_oids(StoredName,Missing). + maybe_unite_oids(StoredName,Missing),!. any_to_oid(Obj,_):- \+ compound(Obj),!,fail. any_to_oid(_->Obj,OID):-any_to_oid(Obj,OID). @@ -1579,10 +1933,10 @@ maybe_unite_oids(StoredName,Missing):- compound(Missing), Missing = (_ -> List),!, maybe_unite_oids(StoredName,List). maybe_unite_oids(StoredName,Missing):- - arc_assert(is_objgrp(StoredName,Missing)), + assert_in_testid(is_objgrp(StoredName,Missing)), oids_from(Missing,OIDS), length(OIDS,N), - arc_assert(is_oidlist(StoredName,N,OIDS)), + assert_in_testid(is_oidlist(StoredName,N,OIDS)), pp(red,is_oidlist(StoredName,N,OIDS)). @@ -1722,7 +2076,7 @@ get_prior_labels(Objs,PriorsSetClean,AllPriors,PriorsWithCounts):- must_det_ll((is_list(Objs), findall(Named,(member(Obj,Objs),object_get_priors(Obj,Named)),AllPriorsL), append(AllPriorsL,AllPriors), - sort_safe(AllPriors,PriorsSet), + ssort(AllPriors,PriorsSet), my_partition(never_prior,PriorsSet,_Unused,PriorsSetClean), count_each(PriorsSetClean,AllPriors,PriorsWithCounts))). @@ -1903,4 +2257,470 @@ II = pg(OG,GType,ZType,N), override_object([II],L,Obj),!. +:- retractall(arc_cache:individuated_cache(_,_,_,_,_)). +:- ignore(muarc:clear_all_caches). +:- luser_setval(use_individuated_cache,false). + + + +read_terms_from_atom(D,Atom):- + open_string(Atom,Stream), + repeat, + read_term(Stream,D,[]), + ((D == end_of_file) -> !, fail ; true). + +%learn_ilp:- ensure_test(TestID),learn_ilp(TestID). +learn_ilp(TestID):- + ensure_test(TestID), + must_det_ll(( + ensure_test(TestID), + %abolish(arc_test_properties/3), dynamic(arc_test_properties/3), + abolish(is_for_ilp/4), dynamic(is_for_ilp/4), + %compile_and_save_test(TestID), + individuate_all_pairs_from_hints(TestID), + with_individuated_cache(true, + forall(kaggle_arc(TestID,ExampleNum,I,O), + must_det_ll(learn_ilp(TestID,ExampleNum,I,O)))),!, + listing(is_for_ilp/4), + dump_ilp_files(S))), + compute_scene_change(TestID), + must_det_ll(write_ilp_file(TestID,S,logicmoo_ex)), + solve_via_scene_change(TestID). + +:- dynamic(is_for_ilp/4). +learn_ilp(TestID,ExampleNum,GridIn,GridOut):- + ExampleNum = (trn+_),!, + must_det_ll(( + set_example_num(ExampleNum), + individuate_pair(complete,GridIn,GridOut,InC,OutC), + into_ilp_int(ExampleNum,ExampleID), + assert_ilp(TestID,ExampleNum,liftcover_models,begin(model(ExampleID))), + maplist(make_ilp(TestID,ExampleNum,lhs),InC), + maplist(make_ilp(TestID,ExampleNum,rhs),OutC),!, + assert_ilp(TestID,ExampleNum,liftcover_models,end(model(ExampleID))), + assert_ilp(TestID,ExampleNum,liftcover_models,[]), + assert_ilp(TestID,ExampleNum,liftcover_models,[]), + !)). +learn_ilp(TestID,ExampleNum,GridIn,GridOut):- + ExampleNum = (tst+_),!, + must_det_ll(( + set_example_num(ExampleNum), + individuate_pair(complete,GridIn,GridOut,InC,OutC), + into_ilp_int(ExampleNum,ExampleID), + assert_ilp(TestID,ExampleNum,_,"/*"), + assert_ilp(TestID,ExampleNum,liftcover_models,begin(model(ExampleID))), + maplist(make_ilp(TestID,ExampleNum,lhs),InC), + maplist(make_ilp(TestID,ExampleNum,rhs),OutC),!, + assert_ilp(TestID,ExampleNum,liftcover_models,end(model(ExampleID))), + assert_ilp(TestID,ExampleNum,_,"*/"))). + +into_ilp_int(Int,Int):- integer(Int),!. +into_ilp_int(Example+Num,ExampleID):- % integer(Int). + atomic_list_concat([Example,Num],'_',ExampleID),!. + +assert_ilp(TestID,ExampleNum,File,Term):- ground(ExampleNum+File), clause_asserted(is_for_ilp(TestID,ExampleNum,File,Term)),!. +assert_ilp(TestID,ExampleNum,File,Term):- pp(File=Term),!, + assert_if_new(is_for_ilp(TestID,ExampleNum,File,Term)),!. + +safe_oid(OID,OOID):- atomic_list_concat(['o',_Glyph,Iv,_TV,_UUID,_Trn,Num,IO],'_',OID), + atomic_list_concat(['obj',Num,Iv,IO],'_',OOID). + + +%make_ilp(_TestID,Example+_Num,_LRSide,_Obj):- Example==tst,!. +make_ilp(TestID,Example+Num,LRSide,Obj):- + must_det_ll(( + ExampleNum = Example+Num, + obj_to_oid(Obj,OIDUS), + safe_oid(OIDUS,OID), + %id_shape(SID,LPs),next_to_32(LPs,Shape), + assert_ilp_object(TestID,ExampleNum,LRSide,Obj,OID, + [loc2D,rot2D,pen_color,rotSize2D(grav),vis2D,mass,iz(sid)]))). + +into_2arg( V1,V2,A2):- V2==true,!, A2 = V1. +into_2arg(_V1,V2,A2):- V2==false,!, A2 = V2. +into_2arg( V1,V2,hv(V1,V2)). + +ilp_object_props(_Obj,Props,OID,LRhs,iz(E),V,Pred):- append_term(E,V,P), member(iz(P),Props),!, + functor(P,EF,_), atomic_list_concat([LRhs,'iz',EF],'_',EFIZ), Pred=..[EFIZ,OID,V]. +ilp_object_props(_Obj,Props,OID,LRhs,iz(E),A2,Pred):- append_term(E,V1,P0), append_term(P0,V2,P), member(iz(P),Props),!, + functor(P,EF,_), atomic_list_concat([LRhs,'iz',EF],'_',EFIZ), Pred=..[EFIZ,OID,V1,V2],into_2arg(V1,V2,A2). +ilp_object_props(_Obj,Props,OID,LRhs,(E),V,Pred):- E\=iz(_), append_term(E,V,P), member((P),Props),!, + functor(P,EF,_), atomic_list_concat([LRhs,EF],'_',EFIZ), Pred=..[EFIZ,OID,V]. +ilp_object_props(_Obj,Props,OID,LRhs,(E),A2,Pred):- E\=iz(_), append_term(E,V1,P0), append_term(P0,V2,P), member((P),Props),!, + functor(P,EF,_),atomic_list_concat([LRhs,EF],'_',EFIZ), Pred=..[EFIZ,OID,V1,V2],into_2arg(V1,V2,A2). +ilp_object_props(Obj,_Props,OID,LRhs,(E),V,Pred):- E\=iz(_), append_term(E,Obj,P0),append_term(P0,V,P), call(P),!, + functor(P,EF,_), atomic_list_concat([LRhs,EF],'_',EFIZ), + append_term(E,OID,P1),append_term(P1,V,PredR), + PredR=..[_|PredL], Pred=..[EFIZ|PredL]. + + +pen_color(Obj,Color):- (pen(Obj,[cc(Color,_)])->true;(pen(Obj,PenInfo),Color=pen(PenInfo))),!. + + +assert_ilp_object(TestID,ExampleNum,LRSide,Obj,OID,List):- + must_det_ll(( + into_ilp_int(ExampleNum,ExampleID), + indv_props_list(Obj,Props), + if_t(LRSide==lhs, assert_ilp_typed(LRSide,TestID,ExampleNum,liftcover_models,lhs_peice(ExampleID,OID))), + if_t(LRSide==rhs, assert_ilp_typed(LRSide,TestID,ExampleNum,liftcover_models,rhs_peice(ExampleID,OID))), + maplist(ilp_object_props(Obj,Props,OID,LRSide),List,Args,PredS), + maplist(assert_ilp_typed(LRSide,TestID,ExampleNum,liftcover_models),PredS), + Side =..[LRSide,ExampleID|Args], + if_t(LRSide==rhs, assert_ilp_typed(LRSide,TestID,ExampleNum,exs,pos(Side))), + if_t(LRSide==lhs, assert_ilp_typed(LRSide,TestID,ExampleNum,bk,Side)))). + +next_to_32(I,O):- next_to_32s(I,M),atom_chars(O,M),!. +next_to_32s([N32|Ints],[36|Rest]):- N32==10, !,next_to_32s(Ints,Rest),!. +%next_to_32s([N32,N|Ints],[N|Rest]):- (N32==32;N32==109), number(N), N>31,N\==95,N<128,!,next_to_32s(Ints,Rest),!. +%next_to_32s([N|Ints],Rest):- number(N),next_to_32s(Ints,Rest),!. +next_to_32s([N|Ints],[N|Rest]):- number(N),next_to_32s(Ints,Rest),!. +next_to_32s([],[]). +next_to_32s(S,N32):- string(S),with_output_to(codes(Chars),write(S)),!,next_to_32s(Chars,N32). +next_to_32s(S,N32):- into_grid(S,G),into_ngrid(G,SS),ngrid_to_sgrid(SS,SSS), + numbervars(SSS,999,_,[singletons(true)]),with_output_to(codes(Chars), write(SSS)),!, + next_to_32s(Chars,N32). + +assert_ilp_typed(LRSide,TestID,ExampleNum,File,Term):- + ignore(remember_types(LRSide,TestID,Term)), + assert_ilp(TestID,ExampleNum,File,Term). + +remember_types(LRSide,TestID,pos(Term)):-!, remember_types(LRSide,TestID,Term). +remember_types(LRSide,TestID,Term):- + must_det_ll(( + compound_name_arguments(Term,F,Args), + compound_name_arity(Term,F,A), + atomic_list_concat(NameL,'_',F), reverse(NameL,NameR), + maplist(must_guess_types(LRSide,NameR,Term),Args,Types), + compound_name_arguments(TypeTerm,F,Types), + if_t(LRSide=rhs,assert_ilp(TestID,_,determination(0),output(F/A))), + if_t(LRSide=lhs,assert_ilp(TestID,_,determination(1),input_cw(F/A))), + if_t(LRSide=rhs,assert_ilp(TestID,_,determination(2),modeh(*,TypeTerm))), + if_t(LRSide=lhs,assert_ilp(TestID,_,determination(3),modeb(*,TypeTerm))), + !)). + +must_guess_types(LRSide,NameR,Term,Args,Types):- must_det_ll(guess_types(LRSide,NameR,Term,Args,Types)). + +guess_types(_,[peice|_],T,A,+peice):- arg(2,T,O),A==O,!. +guess_types(_,[peice|_],_,_,+scope):-!. +guess_types(_,_,T,A,+peice):- arg(1,T,O),A==O,!. +guess_types(_,[mass|_],_,_,nat900). +guess_types(_,_,_,Arg,+nat30):- integer(Arg),between(1,30,Arg),!. +guess_types(_,_,_,Arg,+(#(color))):- is_color(Arg),!. +%guess_types(_,_,_,Arg,+pred2):- atom(Arg),!. +%guess_types(_,_,_,Arg,+unknown(Arg)): -compound(Arg). +guess_types(lhs,[Type|_],_,_Arg,-Type). +guess_types(rhs,[Type|_],_,_Arg,+Type). + +ngrid_to_sgrid(SS,SSS):- mapgrid(into_sarg,SS,SSS). +into_sarg(A,A):- \+ compound(A),!. +into_sarg(A-fg,A):-!. +into_sarg(_-bg,bg):-!. +into_sarg(A,A). + +dump_ilp_files:- dump_ilp_files(_). +dump_ilp_files(S):- + must_det_ll(( + get_current_test_atom(TestAtom), + if_t(var(S),sformat(S,'out/ilp/~w',[TestAtom])), + make_directory_path(S), + write_ilp_file(TestID,S,bias), + write_ilp_file(TestID,S,bk), + write_ilp_file(TestID,S,exs),!, + write_ilp_file(TestID,S,metagol_ex),!, + write_ilp_file(TestID,S,input),!, + write_ilp_file(TestID,S,foil_ex),!, + write_ilp_file(TestID,S,liftcover_ex),!, + wdmsg(ls(S)), + ls(S))). + +write_ilp_file(TestID,Dir,Bias):- + sformat(S,'~w/~w.pl',[Dir,Bias]), + setup_call_cleanup(open(S,write,Out,[]), + forall(get_is_for_ilp(TestID,_,Bias,Term), + output_term(Out,Term)), + close(Out)). + +:- op(500,yf,in_cmt). + +output_term(_,Nil):- var(Nil),!. +output_term(_,Nil):- Nil==[],!,nl. +output_term(_, (:- Nil)):- Nil==[],!,nl. +output_term(_, (:- Nil)):- var(Nil),!. +output_term(Out,Term):- \+ ground(Term),!, + \+ \+ (numbervars(Term,15,_,[singletons(true)]),!,output_term(Out,Term)). + +output_term(Out,(:- Term)):- string(Term),!,format(Out,'~N~w~n',[Term]). +output_term(Out,Term):- string(Term),!,format(Out,'~N~w~n',[Term]). +output_term(Out, :- (Term in_cmt)):- format(Out,'~N% :- ~q. ~n',[Term]). +output_term(Out,Term in_cmt):- format(Out,'~N% ~q. ~n',[Term]). +output_term(Out,Term):- format(Out,'~N~q. ~n',[Term]). + +get_is_for_ilp(_,_,input, :-(D) ):- + member(D, + [ + (style_check(-discontiguous)), + (use_module(library(aleph))), + (if(current_predicate(use_rendering/1))), + (use_rendering(prolog)), + (endif), + [], + (aleph_set(verbosity, 1)), + (aleph_set(interactive, false)), + (aleph_set(i,4)), + (aleph_set(nodes,10000)), + [], + (aleph), + []]), + D\==[]. + + +get_is_for_ilp(_,_,input, :-(D) ):- get_is_for_ilp(_,_,determination, D ). + +get_is_for_ilp(TestID,common,logicmoo_ex,accompany_changed(TestID,P,Same)):- + is_accompany_changed_db(TestID,P,Same). + + +get_is_for_ilp(_,_,liftcover_ex,D):- read_terms_from_atom(D, ' + +:-use_module(library(slipcover)). +:-if(current_predicate(use_rendering/1)). +:-use_rendering(prolog). +:-endif. +:-sc. + +:- set_sc(verbosity,3). +:- set_sc(depth_bound,false). +:- set_sc(neg_ex,given). + +bg([]). + +in([]). + +input_cw(incr_nat30/2). +input_cw(color_change/2). + + +determination(OF/OA,IF/IA):- + input_cw(IF/IA),output(OF/OA). + + + +fold(trn_0,[trn_0]). +fold(trn_1,[trn_1]). +fold(trn_2,[trn_2]). + +'). + +get_is_for_ilp(_,_,liftcover_ex,D):-get_is_for_ilp(_,_,determination, D ). + +get_is_for_ilp(_,_,determination, D ):- + member(D, + [ + modeh(*,rhs(+state,+nat30,+nat30,+color,+nat30,+nat30,+rotation,+nat900,+shape,+list)) in_cmt, + modeb(*,lhs(+state,+nat30,+nat30,#(color),+nat30,+nat30,+rotation,+nat900,+shape,+list)) in_cmt, + modeb(*,my_geq(+nat30,-#(nat30))) in_cmt, + modeb(*,my_leq(+nat30,-#(nat30))) in_cmt, + modeb(*,my_add(+nat30,+nat30,-nat30)) in_cmt, + modeb(*,my_mult(+nat30,#(nat30),-nat30)) in_cmt, + + [], + (lazy_evaluate(my_add/3)) in_cmt, + (lazy_evaluate(my_geq/2)) in_cmt, + (lazy_evaluate(my_leq/2)) in_cmt, + (lazy_evaluate(my_mult/3)) in_cmt, + [], + determination(rhs/7,lhs/7) in_cmt, + determination(rhs/7,color_change/2) in_cmt, + determination(rhs/7,incr_nat30/2) in_cmt, + determination(rhs/7,my_geq/2) in_cmt, + determination(rhs/7,my_leq/2) in_cmt, + determination(rhs/7,my_add/3) in_cmt, + determination(rhs/7,my_mult/3) in_cmt, + + []]), + D\==[]. + +get_is_for_ilp(A,B,input, D ):- get_is_for_ilp(A,B,bias,D). +get_is_for_ilp(A,B,input, D ):- ((D = (:-begin_bg));get_is_for_ilp(A,B,bk,D);(D = (:-end_bg))). +get_is_for_ilp(A,B,input, D ):- ((D = (:-begin_in_pos));get_is_for_ilp(A,B,exs,D);(D = (:-end_in_pos))). + +get_is_for_ilp(A,B,metagol_ex, D ):- get_is_for_ilp(A,B,bias,D). +get_is_for_ilp(A,B,metagol_ex, D ):- get_is_for_ilp(A,B,bk,D). +get_is_for_ilp(A,B,metagol_ex, D ):- get_is_for_ilp(A,B,exs,D). + +%get_is_for_ilp(A,B,liftcover_ex, D ):- get_is_for_ilp(A,B,input, D ). +get_is_for_ilp(A,B,foil_ex, D ):- get_is_for_ilp(A,B,input, D ). + +get_is_for_ilp(_,_,bias,D):- + member(D, + [ (:-style_check(-discontiguous)), + max_body(6), + max_vars(8), + non_magic(4), + %enable_pi, + head_pred(rhs,7) in_cmt, + body_pred(lhs,7) in_cmt, + body_pred(child,2) in_cmt, + /* + body_pred(cenGX,2), + body_pred(cenGY,2), + body_pred(mass,2), + body_pred(color,2), + body_pred(medium,1), + body_pred(large,1), + body_pred(position,3), + body_pred(rotation,2), + body_pred(traits,2), + body_pred(contact,2),*/ + %:- clause(C), #count{V : clause_var(C,V),var_type(C,V,ex)} != 1, + body_pred(incr_nat30_by,3) in_cmt, + body_pred(incr_nat30,2), + body_pred(color_change,2), + body_pred(my_add,3), + body_pred(my_geq,2), + body_pred(my_leq,2), + body_pred(my_mult,3), + bounds(my_add,1,(0,29)), + bounds(my_geq,1,(1,30)), + bounds(my_leq,1,(1,30)), + bounds(my_mult,1,(1,10)), + direction(color_change,(out,out)) in_cmt, + direction(incr_nat30,(out,out)) in_cmt, + direction(my_add,(in,in,out)) in_cmt, + direction(my_geq,(in,out)) in_cmt, + direction(my_leq,(in,out)) in_cmt, + direction(my_mult,(in,out,in)) in_cmt, +/* + direction(large,(out)), + direction(medium,(out)), + direction(small,(out)), + + direction(cenGX,(in,out)), + direction(cenGY,(in,out)), + direction(child,(in,out)), + direction(color,(in,out)), + direction(contact,(in,out)), + direction(orientation,(in,out)), + direction(piece,(in,out)), + direction(position,(in,out,out)), + direction(rotation,(in,out)), + direction(size,(in,out)), +*/ + type(my_add,(nat30, nat30, nat30)), + type(my_mult,(nat30, nat30, nat30)), + type(my_geq,(nat30,nat30)), + type(my_leq,(nat30,nat30)), + type(incr_nat30,(nat30,nat30)), + type(color_change,(color,color)), + + /* + type(large,(nat30)), + type(medium,(nat30)), + type(small,(nat30)),*/ + % ExampleID, OID, X, Y,Color,SH,SV,RotG,Size,Shape + + direction(rhs,(in,in,in,in,in,in,in,in,in,in)) in_cmt, + type(rhs,(state,loc2D,rot2D,color,vis2D,rotSize2D,nat900,shape)), + direction(lhs,(out,out,out,out,out,out,out,out,out,out)) in_cmt, + type(lhs,(state,loc2D,rot2D,color,vis2D,rotSize2D,nat900,shape)), + + /* + type(cenGX,(piece,nat30)), type(cenGY,(piece,nat30)), + type(color,(piece,color)), + type(orientation,(piece,orientation)), + type(rotation,(piece,rotation)), + type(piece,(state,piece)), + type(position,(piece,nat30,nat30)), + type(mass,(piece,nat900)), + type(contact,(piece,piece)), + type(child,(piece,piece)), + + */ + %type(incr_nat30_by,(nat30,nat30,nat30)), + %magic_value(rhs,1), + %magic_value(rhs,2), + %magic_value(rhs,3), + %magic_value(rhs,4), + %magic_value(rhs,5), + %magic_value(rhs,6), + %magic_value_all, + %magic_value_type(color), + %magic_value_type(nat30), + %magic_value_type(nat900), + %magic_value_type(piece), + %magic_value_type(shape), + magic_type(color), + magic_type(nat30), + magic_value_type(color), + magic_value_type(nat30), + numerical_pred(my_add,3), + numerical_pred(my_geq,2), + numerical_pred(my_leq,2), + numerical_pred(my_mult,3), + + + []]). + +get_is_for_ilp(_,_,bk,D):- + member(D, + [ %(:- dynamic contact/2), large(10), medium(5),small(1), + (:- use_module(library(clpfd))), + (incr_nat30(A,B) :- B #= A + 1), + (color_change(_,_)), + (my_geq(A,B) :- nonvar(A), nonvar(B), !, A>=B), + (my_leq(A,B) :- nonvar(A), nonvar(B), !, A= 1, + X2 #= X1 - 1. + +down(hv(X,Y1),hv(X,Y2)):- + size(Size), + Y1 #< Size, + Y2 #= Y1 + 1. + +up(hv(X,Y1),hv(X,Y2)):- + Y1 #> 1, + Y2 #= Y1 - 1. + +'). + + +get_is_for_ilp(A,B,determination, D ):- get_is_for_ilp(A,B,determination(0), D ). +get_is_for_ilp(A,B,determination, D ):- get_is_for_ilp(A,B,determination(1), D ). +get_is_for_ilp(A,B,determination, D ):- get_is_for_ilp(A,B,determination(2), D ). +get_is_for_ilp(A,B,determination, D ):- get_is_for_ilp(A,B,determination(3), D ). +get_is_for_ilp(A,B,determination, D ):- get_is_for_ilp(A,B,determination(4), D ). +get_is_for_ilp(A,B,liftcover_ex, D ):- get_is_for_ilp(A,B,bk, D ). +get_is_for_ilp(A,B,liftcover_ex,D):- is_for_ilp(A,B,liftcover_models,D). +get_is_for_ilp(A,B,C,D):- is_for_ilp(A,B,C,D). + + + + diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_recognise.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_recognise.pl index 2bb21b8c79..5f310e6b17 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_recognise.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_recognise.pl @@ -515,8 +515,8 @@ maybe_ogs_test_i(In):- maybe_ogs_test_j(I),(maybe_if_changed(trim_to_rect,I,In);In=I),mass(In,Mass),Mass>0. maybe_ogs_test_j(In):- enum_object(O),global_grid(O,In). maybe_ogs_test_j(In):- maybe_ogs_test_p(In). -maybe_ogs_test_p(In):- current_pair(I,O),grid_minus_grid(I,O,In). -maybe_ogs_test_p(In):- current_pair(I,O),mapgrid(cell_minus_cell,O,I,In). +maybe_ogs_test_p(In):- current_pair_io(I,O),grid_minus_grid(I,O,In). +maybe_ogs_test_p(In):- current_pair_io(I,O),mapgrid(cell_minus_cell,O,I,In). maybe_ogs_test_p(Out):- current_test_example(X,Y),into_grid(X>Y*_,Out). maybe_ogs_test_o(Out):- get_current_test(TestID), kaggle_arc(TestID,_,_,Out), \+ maybe_ogs_test_p(Out). maybe_ogs_test_o(Out):- maybe_ogs_test_p(Out). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_reduce.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_reduce.pl index 43af827658..102f888e82 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_reduce.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_reduce.pl @@ -183,7 +183,7 @@ reduce_1op(_Type,Len1,Half1,PassNo,GridIn, make_solid_object(Rect,H,V),OUT):- GridIn = [Row1|GridR], my_maplist(=@=(Row1),GridR), Row1= [C1|Row], my_maplist(=@=(C1),Row), grid_size(GridIn,H,V), once(H > 1 ; V > 1),!, - (H==V->(Rect=square,OUT=[[C1]]);(H>V->(Rect=rect,OUT=[[C1]]);(Rect=rect,OUT=[[C1]]))). + (H==V->(Rect=square,OUT=[[C1]]);(H>V->(Rect=rect,OUT=[[C1,C1]]);(Rect=rect,OUT=[[C1],[C1]]))). reduce_1op(_Type,Half,Len,_,[Row1|Grid],copy_row_ntimes(1,Times),[Row1]):- @@ -547,7 +547,8 @@ %b_grid_to_norm(I,OUT):- b_grid_to_norm(Op,I,OO),OUT=(OO-w(Op)). %b_grid_to_norm(Op,I,O):- Op==[],!,I=O. %b_grid_to_norm(Op,IO,IIOO):- compound(IO),IO=(I^O),b_grid_to_norm(Op,I,II),!,Op\==[],b_grid_to_norm(Op2,O,OO),!,Op=Op2,IIOO=II^OO. -normalize_grid(Op,I,GOO):- +normalize_grid(OpRot,I,GOO):- grav_rot(I,R1,M),I\=@=M,!,normalize_grid(Op,M,GOO),append(Op,[R1],OpRot). +normalize_grid(R2Op,I,GOOP):- must_det_ll(( debug_c(reduce,writeg(normalize_grid=I)), protect_vars(I,III,How), @@ -559,7 +560,10 @@ call(How,COp,Op), call(How,COO,OO), mapgrid(fix_bg(Which),OO,GOO), - debug_c(reduce,writeg([un_reduce_grid=OO,un_cop=Op])))). + debug_c(reduce,writeg([un_reduce_grid=OO,un_cop=Op])), + grav_rot(GOO,R2,GOOP), + ((R2==sameR->R2Op=Op;R2Op=[R2|Op])))). + fix_bg(Which,OO,X):- fail, Which=@=OO,!,freeze(X,X\=(_,_)). %fix_bg(Which,OO,_):-OO=fg,!. @@ -588,15 +592,24 @@ reverse_op(I,R):- reverse(I,R),!. reverse_op(I,[I]). -reduce_grid_pair1(AB,OPS,ARBR):- \+ ground(AB), +contains_numberedvars(AB):- \+ \+ (sub_term(E,AB),compound(E), E='$VAR'(_)). + + +reduce_grid_pair1(AB,OPS,ARBR):- fail, \+ ground(AB), + \+ contains_numberedvars(AB+OPS), must_det_ll(( - protect_vars(AB,ABC,How), - my_assertion(ground(ABC)), - reduce_grid_pair111(ABC,OPSP,ARBRP), - call(How,OPSP+ARBRP,OPS+ARBR), - nop((my_assertion((\+ (sub_term(E,OPS+ARBR),compound(E), E='$VAR'(_)))))))). + protect_vars(AB,ABC,Unprotect), + my_assertion(ground(ABC)))), + reduce_grid_pair2(ABC,OPSP+ARBRP), + must_det_ll(( + call(Unprotect,OPSP+ARBRP,OPS+ARBR), + my_assertion((\+ contains_numberedvars(AB+ARBR))))),!. + +reduce_grid_pair1(AB,OPS,ARBR):- reduce_grid_pair2(AB,OPS,ARBR). -reduce_grid_pair1(AB,OPS,ARBR):- reduce_grid_pair111(AB,OPS,ARBR),!. +reduce_grid_pair2(AB,OPS,ARBR):- + %my_assertion(ground(AB)), + rrd_call(reduce_grid_pair111(AB,OPS,ARBR)),!. reduce_grid_pair111(A^B,ROPA,AR^BR):- once((reduce_grid_pass(1,A^A,[A^A],ROPA,AR^AR), @@ -645,7 +658,7 @@ reductions_from_two(OPS,G1,G2,G1R,G2R). -reductions(GL,OPS,REDUCE):- into_grid_list(GL,List), reductions1(List,OPS,REDUCE),!. +reductions(GL,OPS,REDUCE):- into_grid_list(GL,List),!, fail_over_time(6, reductions1(List,OPS,REDUCE)),!. %reductions([A,B],OPS,[AA,BB]):- !, reductions_from_two(OPS,A,B,AA,BB). reductions1(List,[Reduce|OPS],REDUCE):- select(G1,List,Rest0),select(G2,Rest0,Rest), @@ -656,23 +669,28 @@ reduce_two(G1,G2,Reduce,G1R,G2R):- reductions_from_two(Reduce,G1,G2,G1R,G2R). -reductions_from_two(Reduce,G1,G2,G1R,G2R):- one_reduction1(Reduce,G1,G2,G1R,G2R). +reductions_from_two(Reduce,G1,G2,G1R,G2R):- one_reduction1(Reduce,G1,G2,G1R,G2R),!. reductions_from_two(r_c(Reduce),G1,G2,G1RR,G2RR):- rot90(G1,G1R),rot90(G2,G2R),one_reduction1(Reduce,G1R,G2R,G1RR,G2RR),!,Reduce\==[]. reductions_from_two(c_r(Reduce),G1,G2,G1RR,G2RR):- rot270(G1,G1R),rot270(G2,G2R),one_reduction1(Reduce,G1R,G2R,G1RR,G2RR),!,Reduce\==[]. +rrd_up:- flag('$reduction_recursion_depth',X,X+1). +rrd_down:- flag('$reduction_recursion_depth',X,X-1). +rrd_ok:- flag('$reduction_recursion_depth',X,X),X<100. +%rrd_call(Goal):- !, call(Goal). +rrd_call(Goal):- scce_orig(rrd_up,(rrd_ok,Goal),rrd_down). +one_reduction1(OP,G1,G2,G1R,G2R):- rrd_call(one_reduction11(OP,G1,G2,G1R,G2R)). +one_reduction11(Reduce,G1,G2,G1R,G2R):- var(Reduce),!,reduce_grid_pair1(G1^G2,Reduce,G1R^G2R),!. +one_reduction11(OP,G1,G2,G1R,G2R):- nonvar(OP),OP\==[],!,one_reduction3(OP,G1,G1R),!,(G2=@=G1->G2R=G1R ; one_reduction2(OP,G2,G2R)). -one_reduction1(OP,G1,G2,G1R,G2R):- nonvar(OP),OP\==[],!,one_reduction1(OP,G1,G1R),!,(G2=@=G1->G2R=G1R ; one_reduction2(OP,G2,G2R)). -one_reduction1(Reduce,G1,G2,G1R,G2R):- var(Reduce),reduce_grid_pair1(G1^G2,Reduce,G1R^G2R). - -one_reduction2(OP,G1,G1R):- one_reduction1(OP,G1,G1R). +one_reduction2(OP,G1,G1R):- one_reduction3(OP,G1,G1R). -%one_reduction1(OP,G=Var,GG):- var(Var),!, one_reduction1(OP,G,GG). -one_reduction1([],G1,G1R):- !, G1=G1R. -one_reduction1(OPS,G1,G1RR):- nonvar(OPS), OPS=[OP|OPL], !, one_reduction1(OP,G1,G1R), - one_reduction1(OPL,G1R,G1RR). -one_reduction1(reversed(OP),G1,G1R):-!, one_reduction1(OP,G1,G1R). -one_reduction1(OP^OP,G1,G1R):-!,one_reduction1(OP,G1,G1R). -one_reduction1((OP),G1,G1R):-!, grid_call(OP,G1,G1R). % dmsg(one_reduction1(OP,G1,G1R)). +%one_reduction1(OP,G=Var,GG):- var(Var),!, onae_reduction1(OP,G,GG). +one_reduction3(OP,G,GG):- var(OP),!,throw(var_one_reduction3(OP,G,GG)). +one_reduction3(Nil,G1,G1R):- Nil==[],!, G1=G1R. +one_reduction3(OPS,G1,G1RR):- nonvar(OPS), OPS=[OP|OPL], !, one_reduction3(OP,G1,G1R),one_reduction3(OPL,G1R,G1RR). +one_reduction3(reversed(OP),G1,G1R):-!, one_reduction3(OP,G1,G1R). +one_reduction3(OP^OP2,G1,G1R):- OP==OP2,!,one_reduction3(OP,G1,G1R). +one_reduction3((OP),G1,G1R):-!, grid_call(OP,G1,G1R). % dmsg(one_reduction1(OP,G1,G1R)). %reduce_grid(A^B,OPA^OPB,AA^BB):- A\=@=B,nth1(N,A,EA,A0),my_maplist(=(_),EA),nth1(N,B,EB,B0),EA=@=EB,reduce_grid(A0^B0,OPA^OPB,AA^BB). @@ -687,7 +705,9 @@ reduce_grid_pass(PassNo,GridR,[GridR|NBC],More,Reduced),!. reduce_pair_op(_,NR,_,[],NR):-!. -test_reduce_grid(Grid,GridO):- reduce_grid(Grid,Ops,GridO),unreduce_grid(GridO,Ops,Unred),show_sf_if_lame(Ops,Unred,Grid). +test_reduce_grid(Grid,GridO):- + reduce_grid(Grid,Ops,GridO), + unreduce_grid(GridO,Ops,Unred),show_sf_if_lame(Ops,Unred,Grid). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_symmetry.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_symmetry.pl index e6b6f9c3e8..1dc666274f 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_symmetry.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_symmetry.pl @@ -826,7 +826,7 @@ blur_mix(fg). blur_mix(bg). blur_mix(not_color(Black)):- get_black(Black). cv(FG,OC):- once(FG==fg;OC==fg;FG==bg;OC==bg),!. -cv(FG,OC):- FG=OC,!. +cv(FG,OC):- \+ FG \= OC,!. cv(_,_). mix_cellr(Mix,I,M,O):- mix_cell(Mix,M,I,O). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_test_favs.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_test_favs.pl index 1c2ab87f3d..46d78120da 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_test_favs.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_test_favs.pl @@ -14,22 +14,75 @@ fav(v('p'),[dmiles]). -fav(v('37d3e8b2'), - human_coded( +fav(v('37d3e8b2'), + human( rule(links_count(contains,1),subst_color(fg,blue)), rule(links_count(contains,2),subst_color(fg,red)), rule(links_count(contains,3),subst_color(fg,green)), rule(links_count(contains,4),subst_color(fg,yellow)))). +fav(v('37d3e8b2'), + indiv_h(colormass)). + + +fav(v('0a2355a6'), + human( + rule(links_count(contains,1),subst_color(fg,blue)), + rule(links_count(contains,2),subst_color(fg,green)), + rule(links_count(contains,3),subst_color(fg,red)), + rule(links_count(contains,4),subst_color(fg,yellow)))). +fav(v('0a2355a6'), + indiv_h(colormass)). + fav(t('ea32f347'), - human_coded( - rule(pg(_,RANK1,_,1),subst_color(fg,blue)), + human( + rule(pg(_,RANK1,_,1),subst_color(fg,red)), rule(pg(_,RANK1,_,2),subst_color(fg,yellow)), - rule(pg(_,RANK1,_,3),subst_color(fg,red)) )):- - RANK1 = mass(_) - . + rule(pg(_,RANK1,_,3),subst_color(fg,blue)) )):- + RANK1 = mass(_). +fav(v('ea32f347'), + indiv_h(colormass)). + + +fav(t('a61f2674'), + human( + rule(pg(_,RANK1,_,_),subst_color(fg,black)), + rule(pg(_,RANK1,_,1),subst_color(fg,red)), + rule(pg(N,RANK1,_,N),subst_color(fg,blue)) )):- + RANK1 = mass(_). +fav(v('0a2355a6'), + indiv_h(colormass)). +fav(v('b230c067'), + human( + rule(pg(_,RANK1,_,_),subst_color(fg,black)), + rule(pg(_,RANK1,_,1),subst_color(fg,red)), + rule(pg(N,RANK1,_,N),subst_color(fg,blue)) )):- + RANK1 = mass(_). +fav(v('b230c067'), + indiv_h(colormass)). + + + +fav(t('25d487eb'), + human( + rule(from(mass(1),color(C)), + rule(from(iz(symmetry_type(sym_h_xor_v,true)),top(Point)), + shoot(Point,C))))). +fav(t('25d487eb'), + indiv_h(colormass)). + + +fav(t('f8b3ba0a'), + human( + use_output_predictor, + rule(from(pg(_,RANK1,_,2),color(Color2)),subst_color(fg,Color2)), + rule(from(pg(_,RANK1,_,3),color(Color3)),subst_color(fg,Color3)), + rule(from(pg(_,RANK1,_,4),color(Color4)),subst_color(fg,Color4)))):- + RANK1 = mass(_). +fav(t('f8b3ba0a'), + indiv_h(colormass)). %~ (save_supertest(v('00576224'),'muarc_cache/00576224.ansi.pl')) diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_test_iface.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_test_iface.pl index d187225725..1224846af4 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_test_iface.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_test_iface.pl @@ -515,7 +515,7 @@ check_for_refreshness, nop(show_test_grids), set_flag(indiv,0), compile_and_save_test, - with_luser(use_individuated_cache,true, + with_individuated_cache(true, with_pair_mode(whole_test, findall(PairGroups, (kaggle_arc(TestID,ExampleNum,In,Out),%nonvar(Out), @@ -531,7 +531,7 @@ nop(show_test_grids), set_flag(indiv,0), compile_and_save_test, findall(PairGroups, - with_luser(use_individuated_cache,true, + with_individuated_cache(true, (with_test_pairs(TestID,ExampleNum,In,Out, once(each_ndividuator(TestID,ExampleNum,In,Out,PairGroups))))), AllPairGroups), @@ -549,7 +549,7 @@ each_ndividuator(TestID,ExampleNum,In,Out, OUTPUT):- name_the_pair(TestID,ExampleNum,In,Out,PairName), - findall(pair_result(PairName,Complete,InC,OutC), + findall(show_pair_result(PairName,Complete,InC,OutC), (get_each_ndividuator(Complete), with_indivs_mode(Complete,(( with_test_pairs(TestID,ExampleNum,In,Out, @@ -561,10 +561,10 @@ print_side_by_side(each_ndividuator(PairName),In,Out),dash_chars,dash_chars|PairGroups]. -pair_result(PairName,Complete,InC,OutC):- - print_side_by_side(pair_result(PairName,Complete),InC,OutC), - w_section(pair_result_objects(PairName,Complete), - (my_maplist(show_i(in),InC), dash_chars, my_maplist(show_i(out),OutC),dash_chars)), +show_pair_result(PairName,Complete,InC,OutC):- + print_side_by_side(show_pair_result(PairName,Complete),InC,OutC), + nop((w_section(pair_result_objects(PairName,Complete), + (my_maplist(show_i(in),InC), dash_chars, my_maplist(show_i(out),OutC),dash_chars)))), !. show_i(Y,O):- @@ -576,17 +576,18 @@ ndividuator(TestID):- ensure_test(TestID), never_entire_suite,nop(show_test_grids), set_flag(indiv,0), - each_ndividuator(TestID), - with_test_pairs(TestID,ExampleNum,In,Out,ndividuator(TestID,ExampleNum,In,Out)). + %each_ndividuator(TestID), + forall(with_test_pairs(TestID,ExampleNum,In,Out,ndividuator(TestID,ExampleNum,In,Out)),true). -ndividuator(TestID,ExampleNum,In,Out):- get_indivs_mode(Complete), ndividuator(TestID,ExampleNum,Complete,In,Out). +ndividuator(TestID,ExampleNum,In,Out):- + get_indivs_mode(Complete), ndividuator(TestID,ExampleNum,Complete,In,Out). ndividuator(TestID,ExampleNum,Complete,In,Out):- with_indivs_mode(Complete,((name_the_pair(TestID,ExampleNum,In,Out,_PairName), - with_test_pairs(TestID,ExampleNum,In,Out, i_pair(Complete,In,Out))))). + with_test_pairs(TestID,ExampleNum,In,Out, i_pair(Complete,In,Out))))). show_test_pairs(TestID):- ensure_test(TestID), set_flag(indiv,0), - with_test_pairs(TestID,ExampleNum,In,Out, - print_side_by_side(green,In,in(show_test_pairs(TestID>ExampleNum)),_,Out,out(show_test_pairs(TestID>ExampleNum)))). + forall( with_test_pairs(TestID,ExampleNum,In,Out, + print_side_by_side(green,In,in(show_test_pairs(TestID>ExampleNum)),_,Out,out(show_test_pairs(TestID>ExampleNum)))), true). %show_test_grids:- get_current_test(TestID),set_flag(indiv,0),with_test_grids(TestID,Grid,print_grid(show_test_grids(TestID),Grid)). @@ -701,7 +702,7 @@ for_each(Gen,Goal):- Gen,(Goal*->true;true). -with_test_pairs(TestID,ExampleNum,I,O,P):- +with_test_pairs(TestID,ExampleNum,I,O,P):- for_each((test_pairs(TestID,ExampleNum,I,O)), my_menu_call(( ensure_test(TestID), @@ -1183,22 +1184,29 @@ some_current_example_num(_):- get_pair_mode(whole_test), !. some_current_example_num(_):- get_pair_mode(entire_suite), !. -some_current_example_num(TrnN):- foc_current_example_num(TrnN). +some_current_example_num(ExampleNum):- foc_current_example_num(ExampleNum). -foc_current_example_num(TrnN):- get_example_num(TrnN),!. -foc_current_example_num(TrnN):- TrnN = trn+0, set_example_num(TrnN),!. -foc_current_example_num(TrnN):- ignore(get_example_num(TrnN)),set_example_num(TrnN),!. +foc_current_example_num(ExampleNum):- get_example_num(ExampleNum),!. +foc_current_example_num(ExampleNum):- ExampleNum = trn+0, set_example_num(ExampleNum),!. +foc_current_example_num(ExampleNum):- ignore(get_example_num(ExampleNum)),set_example_num(ExampleNum),!. current_test_example(TestID,ExampleNum):- get_current_test(TestID), - must_det_ll(first_current_example_num(ExampleNum)). + (get_example_num(ExampleNum) -> true ; must_det_ll(first_current_example_num(ExampleNum))). -get_example_num(TrnN):- \+ arc_html, nb_current(example,TrnN),ground(TrnN),TrnN\==[],!. -get_example_num(TrnN):- luser_getval(example,TrnN),ground(TrnN),TrnN\==[],!. +get_example_num(ExampleNum):- \+ arc_html, nb_current(example,ExampleNum),ground(ExampleNum),ExampleNum\==[],!. +get_example_num(ExampleNum):- luser_getval(example,ExampleNum),ground(ExampleNum),ExampleNum\==[],!. -set_example_num(TrnN):- luser_setval(example,TrnN). +set_example_num(_ > ExampleNum):- nonvar(ExampleNum), !, set_example_num(ExampleNum). +set_example_num(ExampleNum * _):- nonvar(ExampleNum), !, set_example_num(ExampleNum). +set_example_num(Trn+N):- nonvar(Trn),!,luser_setval(example,Trn+N). +set_example_num(Atom):- must_det_ll((testid_name_num_io(Atom,_TID,Trn,N,_IO),luser_setval(example,Trn+N))),!. -first_current_example_num(TrnN):- some_current_example_num(TrnN),ground(TrnN),TrnN\==[],get_current_test(TestID),kaggle_arc(TestID,TrnN,_,_),!. +tid_to_id((TID>(Trn+Num)*IO),(TID>(Trn+Num)*IO)). +tid_to_id(Atom,(TID>(Trn+Num)*IO)):- testid_name_num_io(Atom,TID,Trn,Num,IO),!. + +first_current_example_num(TrnN):- some_current_example_num(TrnN),ground(TrnN),TrnN\==[], + get_current_test(TestID),kaggle_arc(TestID,TrnN,_,_),!. first_current_example_num(TrnN):- TrnN = trn+0. next_pair:- with_pair_mode(single_pair,next_pair0). @@ -1566,8 +1574,12 @@ with_next_grid_mode(Goal):- (luser_getval('$grid_mode',Dots);Dots=dots),next_grid_mode(Dots,Dashes), with_luser('$grid_mode',Dashes,Goal). -as_d_grid(In,In):- \+ luser_getval('$grid_mode',dashes),!. -as_d_grid(In,In1):- as_ngrid(In,In1),!. +as_d_grid(In,Out):- as_d_grid0(In,Out),!. +%as_d_grid(In,Out):- apply_grid_color_order(_,In,Mid),as_d_grid0(Mid,Out),!. + + +as_d_grid0(In,In):- \+ luser_getval('$grid_mode',dashes),!. +as_d_grid0(In,In1):- as_ngrid(In,In1),!. as_ngrid(In,In1):- must_det_ll((change_bg_fg(In, _BG, _FG,In0), most_d_colors(In0,_CI,In1))),!. as_ngrid(In,In):-!. @@ -1645,8 +1657,15 @@ %var_ensure_test(TestID):- var(TestID), !, ensure_test(TestID). %var_ensure_test(TestID):- \+ ground(TestID), !, all_arc_test_name(TestID). +var_ensure_test(TestID,_):- compound(TestID), TestID=(_^_),!,fail. var_ensure_test(TestID,OUT):- var_ensure_test(TestID),OUT=TestID,is_valid_testname(OUT). +var_ensure_test(TestSpec,I,O,Goal):- + var_ensure_test(TestSpec,TestID), + wots(Title,\+ \+ (I=(+(in)),O=(-(out)),writeln(Goal))), + forall(with_test_pairs(TestID,ExampleNum,I,O, + (print_side_by_side(green,I,orig_in(TestID,Title,ExampleNum),_,O,orig_out(TestID,Title,ExampleNum)), + forall(Goal,true))),true). ensure_test(TestID):- nonvar(TestID),!, ignore(( is_valid_testname(TestID), really_set_current_test(TestID))). ensure_test(TestID):- var(TestID), !, var_ensure_test(TestID). @@ -2117,8 +2136,13 @@ plus_minus_modes(Var,-):- var(Var),!. plus_minus_modes(_,+). +kaggle_arc_io_current_first(TestID,E,IO,G):- + get_current_test(TestID),kaggle_arc_io(TestID,E,IO,G). +kaggle_arc_io_current_first(TestID,E,IO,G):- + get_current_test(TestID2),kaggle_arc_io(TestID,E,IO,G), TestID\==TestID2. + testid_name_num_io_0(ID,_Name,_Example,_Num,_IO):- var(ID),!, fail. -testid_name_num_io_0(X,TestID,E,N,IO):- is_grid(X),!,kaggle_arc_io(TestID,E+N,IO,G),G=@=X. +testid_name_num_io_0(X,TestID,E,N,IO):- is_grid(X),!,kaggle_arc_io_current_first(TestID,E+N,IO,G),G=@=X. testid_name_num_io_0(ID,_Name,_Example,_Num,_IO):- is_grid(ID),!, fail. testid_name_num_io_0(ID,_Name,_Example,_Num,_IO):- is_list(ID), \+ my_maplist(nonvar,ID),!,fail. @@ -2282,7 +2306,7 @@ once((\+ indicates_arg1_testid(F), \+ \+ (clause(M:P,GG),first_cmpd_goal(GG,G),compound(G),functor(G,GF,_), \+ \+ indicates_arg1_testid(GF), - arg(1,P,Var1),arg(1,G,Var2),Var1==Var2), + compound(P),arg(1,P,Var1),arg(1,G,Var2),Var1==Var2), N1 is N-1, functor(P1,F,N1), \+ predicate_property(M:P1,static))). scan_uses_test_id:- forall((uses_test_id(P1),atom(P1)),assertz_if_new(user:(P1:- with_current_test(P1)))). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_test_loader.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_test_loader.pl index cbaba4da2d..af19095a28 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_test_loader.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_test_loader.pl @@ -242,6 +242,8 @@ %:- load_json_files(t,'./data/test_nar_10x10/*.json'). load_json_files1:- load_json_files('1D_testset',t,'./data/1D_testset/*.json'). load_json_files1:- load_json_files('MyTrainingData',t,'./dbigham/Data/MyTrainingData/*.json'). + +load_json_files1:- load_json_files(michod,t,'./arc-task-generator/conditional_transforms_schema/tasks/0*.json'). %:- load_json_files(v,'../../secret_data/solu**66/*.json'). %:- load_json_files(v,'../../secret_data/evaluation/*.json'). %load_json_files1:- load_deval, load_json_files('secret_data_evaluation',v,'/data/evaluation/*.json'). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_two.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_two.pl index 3e16f8e1a7..259a7bf092 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_two.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_two.pl @@ -295,10 +295,12 @@ ;arcdbg(warn(unrunable(TestID,ExampleNum,SolutionProgram))))))), - print_side_by_side("our grid", InVM.grid, InVM.objs),!, - print_list_of("our objs",InVM.objs), ppt("END!!!"+Why+TestID+ExampleNum))),!. +/* + print_side_by_side("our old grid", InVM.grid, InVM.objs),!, + print_list_of("our old objs",InVM.objs), +*/ :- luser_linkval(test_rules,[rules]). :- luser_linkval(pair_rules,[rules]). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_ui_ansi.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_ui_ansi.pl index a09ce2f6f4..c9834be7c5 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_ui_ansi.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_ui_ansi.pl @@ -78,6 +78,8 @@ b_setval(arc_can_portray,t). +:- current_prolog_flag(never_pp_hook, true). + portray_terse:- true,!. @@ -100,18 +102,26 @@ % Portray In Debugger arc_portray_nt(G, false):- is_grid(G), print_grid(G),!. -arc_portray_nt(G0, true):- is_group(G0), ppt(G0),!. +%arc_portray_nt([G|L],_False):- is_object(G), !, pp([G|L]). +%arc_portray_nt(G0, true):- is_group(G0), ppt(G0),!. %arc_portray_nt(G0, false):- is_group(G0), ppt(G0),!. -arc_portray_nt(G0, false):- is_group(G0), into_list(G0,G), length(G,L),% L>1, !, - dash_chars, - once(((why_grouped(_TestID,Why,WG),WG=@=G,fail);(Why = (size2D=L)))),!, - print_grid(Why,G),nl_now, - %underline_print(writeln(Why)), - print_info_l(G), - dash_chars. - - -arc_portray_nt(G,_False):- is_object(G), wots(S,ppt(G)), show_indiv(S,G). +arc_portray_nt(G0, Tracing):- is_group(G0), into_list(G0,G), length(G,L),% L>1, !, + maplist(tersify,G0,GG), write(GG), + if_t(Tracing==false, + in_cmt(( + dash_chars, + once(((why_grouped(_TestID,Why,WG),WG=@=G,fail);(Why = (size2D=L)))),!, + print_grid(Why,G),nl_now, + + %underline_print(writeln(Why)), + %print_info_l(G), + dash_chars))). + + +arc_portray_nt(G,_False):- is_object(G), wots(S,writeg(G)), + global_grid(G,GG),!, + print_grid(GG), + write(S),!. % show_indiv(S,G). %object_grid(G,OG), %neighbor_map(OG,NG), !, %print_grid(object_grid,NG),nl_now, @@ -533,7 +543,7 @@ flag(arc_portray_current_depth,X,X),X<3, current_predicate(bfly_startup/0). -user:portray(Grid):- +user:portray(Grid):- arcp:will_arc_portray, \+ \+ catch(quietly(arc_portray(Grid)),_,fail),!, flush_output. @@ -690,19 +700,20 @@ -writeg(Term):- ignore( \+ notrace(catch(once(writeg0(Term);ppa(Term)),E,(pp(E),ppa(Term))))). +writeg(Term):- ignore( \+ notrace(catch(once(writeg0(Term);ppa(Term)),E,(pp(E),ppa(Term))))),!. writeg0(Term):- term_attvars(Term,Attvars),Attvars\==[],!, - (((number_vars_calc_goals(Term,TermC,Goals), + must_det_ll(((number_vars_calc_goals(Term,TermC,Goals), writeg5(TermC)),!, if_t(Goals\==[],(nl_if_needed, write(' goals='), call_w_pad_prev(3,az_ansi(print_tree_no_nl(Goals))))))),!. -writeg0(Term):- \+ ground(Term), must_det_ll(( +writeg0(Term):- \+ ground(Term), + \+ \+ must_det_ll(( numbervars(Term,0,_Ten1,[singletons(true),attvar(skip)]), writeg5(Term))). writeg0(Term):- writeg5(Term),!. -writeg5(X):- is_ftVar(X),!,write_nbsp,write_nbsp,print(X). +writeg5(X):- is_ftVar(X),!,write_nbsp,write_nbsp,print(X),write_nbsp. writeg5(N=V):- is_simple_2x2(V),!,print_grid(N,V),writeln(' = '),call_w_pad_prev(2,writeg9(V)). writeg5(N=V):- is_gridoid(V),!,print_grid(N,V),writeln(' = '),call_w_pad_prev(2,writeg9(V)). writeg5(N=V):- nl_if_needed,nonvar(N), pp_no_nl(N),writeln(' = '), !, call_w_pad_prev(2,writeg5(V)). @@ -1136,11 +1147,12 @@ print_side_by_side(call(P)):- !, call(P,Ret),!,print_side_by_side_l(1,Ret). print_side_by_side(List):- is_obj_props(List),!,wqs(List). print_side_by_side(G):- is_grid(G),!,print_grid(G). +print_side_by_side([G|L]):- is_grid(G),maplist(is_grid,L),!,print_side_by_side_l(1,[G|L]). print_side_by_side(G):- is_object(G),!,print_grid([G]). +print_side_by_side(Title=Value):- !, format('~N'),print_title(Title),write('==>'),print_side_by_side(Value). print_side_by_side(GF):- grid_footer(GF,G,W),is_gridoid(G),!,print_grid(W,G). %print_side_by_side(Title=(A^B)):- print_side_by_side((Title=A)^B). -print_side_by_side(Title=Value):- !, format('~N'),print_title(Title),write('==>'),print_side_by_side(Value). print_side_by_side(P):- is_list(P), print_side_by_side_l(1,P), !,nop((length(P,PL),PL>5,writeln(pss=PL))). print_side_by_side(P):- \+ is_list(P), !, ignore((print_side_by_side_l(1,[P]))),!. @@ -1884,6 +1896,7 @@ %ansi_format_real(Ansi,Format,Args):- wants_html,!,sformat(S,Format,Args),!,color_print_webui(Ansi,S). %ansi_format_real(Ansi,Format,Args):- ansicall(Ansi,format(Format,Args)),!. +ansi_format_real(fg(fg(Ansi)),Format,Args):- !, ansi_format(fg(Ansi),Format,Args). ansi_format_real(Ansi,Format,Args):- ansi_format(Ansi,Format,Args). diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_uniqueness.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_uniqueness.pl index 414e948c1e..1946ce9595 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_uniqueness.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_uniqueness.pl @@ -4,8 +4,460 @@ This work may not be copied and used by anyone other than the author Douglas Miles unless permission or license is granted (contact at business@logicmoo.org) */ + + +% ARC challenged me to write code that i knew i could but would take me some learning to do. +% thought i could put off until after funding.. +% Really I thought it was more something Fabrizio could write. +% but evidently it is considered impressive feat +/* +he big joke i am working on to really sting everyone is i have told several people exactly how my code works.. and they just don't believe anyone could make it work the way i did .. my explanations are so incredulous sounding .. but yet the system does work and does everything i say it does.. +So as the community sees my ARC stuff violate their beliefs, and the logicmoo stuff sounding so equally incredulous might be worth trusting me on (edited) + +*/ + + +% MOO mean multi user OO universe +% OO (Object Orientated) is sort of passee now but i ideally the logicmoo meaning is based on +% an abstration ("OO") of a refernce to a multi-propertied thing +% rether than defining these properties by soem instances of objects, I define them as calls to logical relations defined by situation calculus +% these things have simularities that make them groupable for arbitrary reasons + + :- include(kaggle_arc_header). +:- dynamic(is_for_ilp/4). +:- dynamic(is_accompany_changed_db/3). +clear_scene_rules(TestID):- + forall(is_accompany_changed_db(TestID,B,C), + ignore(retract(is_accompany_changed_db(TestID,B,C)))). + +count_of(G,N):- findall(G,G,L),variant_list_to_set(L,S),length(S,N). + +dont_notice(oid(_)). +dont_notice(giz(_)). +dont_notice(global2G(_,_)). +dont_notice(link(sees,_)). +dont_notice(links_count(sees,_)). +dont_notice(occurs_in_links(contained_by,_)). +dont_notice(occurs_in_links(sees,_)). +dont_notice(iz(i_o(_))). +dont_notice(P):- compound(P),arg(_,P,E),is_gridoid(E),!. +dont_notice(P):- compound(P),!,compound_name_arity(P,F,_),!,dont_notice(F). +dont_notice(F):- \+ atom(F),!,fail. +dont_notice(link). +dont_notice(oid). +dont_notice(giz). +dont_notice(shape_rep). +do_notice(pg(_,_,rank1,_)). + +ok_notice(X):- \+ \+ do_notice(X),!. +ok_notice(X):- \+ dont_notice(X). + +%ensure_propcounts(_TestID):-!. +ensure_propcounts(TestID):- ensure_test(TestID),ensure_propcounts1(TestID). +ensure_propcounts1(TestID):- + forall(current_example_nums(TestID,ExampleNum), + ( \+ \+ propcounts(TestID, ExampleNum, out, count, _, _), + \+ \+ propcounts(TestID, ExampleNum, in, count, _, _))),!. +ensure_propcounts1(TestID):- with_pair_mode(whole_test,ndividuator(TestID)), + my_assertion(propcounts(TestID, _, out, count, _, _)). + +counts_change(TestID,E):- + ensure_propcounts(TestID), + findall(P,counts_change(TestID,_,P,_,_),L),list_to_set(L,S),!,member(E,S). + +counts_change(TestID,ExampleNum,X,N2,N1):- + ensure_propcounts(TestID), + propcounts(TestID, ExampleNum, out, count, N1, X), \+ dont_notice(X), + ExampleNum = trn+_, + (propcounts(TestID, ExampleNum, in, count, N2, X) -> true ; N2=0), N1\==N2. + +counts_change(TestID,ExampleNum,X,N1,N2):- + ensure_propcounts(TestID), + propcounts(TestID, ExampleNum, in, count, N1, X), \+ dont_notice(X), + ExampleNum = trn+_, + (propcounts(TestID, ExampleNum, out, count, N2, X) -> true ; N2=0), N1\==N2. + +accompany_change30(TestID,P,Same):- + maplist(no_repeats_var,[P]), + accompany_changed_compute_pass1(TestID,P,Same). + +compute_scene_change(TestID):- + with_pair_mode(whole_test, + (banner_lines(red,4), + ensure_test(TestID), + clear_scene_rules(TestID), + compute_scene_change_pass1(TestID), + banner_lines(yellow,4), + compute_scene_change_pass2(TestID), + banner_lines(blue,4), + compute_scene_change_pass3(TestID))). + +compute_scene_change_pass1(TestID):- + no_repeats_var(NR), + NR = accompany_changed_compute_pass1(TestID,P,Same), + NRO = is_accompany_changed_db(TestID,P,Same), + with_pair_mode(whole_test, forall(call(NR),assert_ilp_new(NRO))). + +assert_ilp_new(Term):- clause_asserted(Term),!. +assert_ilp_new(Term):- pp(assert_ilp_new=Term),!, assert_if_new(Term). + + +solve_via_scene_change(TestID):- + ensure_test(TestID), + clear_scene_rules(TestID), + (\+ is_accompany_changed_db(TestID,_,_) -> compute_scene_change(TestID) ; true), + + nop(nop((show_scene_change_rules(TestID),ExampleNum=tst+_,forall((obj_group_io(TestID,ExampleNum,in,ROptions,Objs),Objs\==[]), + solve_obj_group(TestID,ExampleNum,in,ROptions,Objs))))), + show_scene_change_rules(TestID),!. + + +show_scene_change_rules(TestID):- + banner_lines(cyan,4), + forall(is_accompany_changed_computed(TestID,P,Same), + pp(show_scene_change_rules(Same)=>P)), +banner_lines(cyan,4). + + +compute_scene_change_pass2(TestID):- + findall(P,is_accompany_changed_db(TestID,P,_),Ps), + variant_list_to_set(Ps,Set), + maplist(compute_scene_change_pass2(TestID),Set). +compute_scene_change_pass3(TestID):- + compute_scene_change_pass2(TestID). + +compute_scene_change_pass2(TestID,P):- + findall(Same,is_accompany_changed_db(TestID,P,Same),List), + %List=[_,_|_], + flatten(List,SameF), variant_list_to_set(SameF,SameS), + correct_antes1(TestID,P,SameS,Kept), Kept\==[],!, % pp(P=compute_scene_change_pass2([SameS,Kept])), + forall(retract(is_accompany_changed_db(TestID,P,_)),true), + assert_ilp_new(is_accompany_changed_db(TestID,P,Kept)). +%compute_scene_change_pass2(_,_). + +at_least_one_overlap(DSame,Same):- + member(DS,DSame),member(S,Same), + (DS=@=S;other_val(S,DS)),!. + +correct_antes1(TestID,P,Same,SL):- + findall(S, + (member(S,Same), + \+ \+ (( + forall((is_accompany_changed_db(TestID,DP,DSame),at_least_one_overlap(DSame,Same)), + ((P==DP)-> true; (member(DS,DSame),other_val(S,DS))))))), + SL), SL\==[],!. +correct_antes1(_TestID,_P,Same,Same). + +/* +correct_antes2(TestID,P,Same,Kept):- + is_accompany_changed_db(TestID,DP,DSame), + other_val(P,DP), + include(other_vals_from(DSame),Same,Kept), Kept\==[],!. +correct_antes2(_TestID,_P,Same,Same). +other_vals_from(DSame,E):- member(DS,DSame),other_val(E,DS),!. + +*/ + +correct_antes3(TestID,P,Same,SameS):- + share_level(Level), + my_partition(not(shared_prop_U(TestID,P,Level)),Same,_Lost,SameS). + +/* +correct_antes3(TestID,P,Same,SameS):- + share_level(Level), + include(shared_prop_U(TestID,P,Level),Same,SameS),!. +correct_antes3(TestID,P,Same,SameS):- + include(shared_prop_U(TestID,P,_),Same,SameS),!. + +*/ +correct_antes3(_,_,Same,Same):-!. + +share_level(all). %share_level(5). share_level(4). +share_level(3). share_level(2). + +shared_prop_U(TestID,P,ShareLevel,Same):- var(TestID),!,get_current_test(TestID),!,shared_prop_U(TestID,P,ShareLevel,Same). +shared_prop_U(TestID,P,ShareLevel,Same):- var(P),!,ensure_prop_change(P),shared_prop_U(TestID,P,ShareLevel,Same). +shared_prop_U(TestID,P,ShareLevel,Same):- var(ShareLevel),!,share_level(ShareLevel),shared_prop_U(TestID,P,ShareLevel,Same). + +shared_prop_U(TestID,P,ShareLevel,Same):- var(Same),!, + is_accompany_changed_computed(TestID,P,SameL), + member(Same,SameL), + shared_prop_U(TestID,P,ShareLevel,Same). +/* +shared_prop_U(TestID,P,_,Same):- !, + forall(current_example_nums(TestID,ExampleNum), + (set_example_num(ExampleNum), + findall(O,(kaggle_arc_io(TestID,ExampleNum,out,Grid),individuate(complete,Grid,Objs), + %print_ss(wqs(individuate(ExampleNum)),Grid,Objs), + member(O,Objs)),OL1), + %copy_term(P,PP), copy_term(PP,PPP), + findall(O,(member(O,OL1),has_prop(P,O)),OL), + %print_ss(Same,OL1,OL), + % writeq(P), + forall(member(O,OL),has_prop(Same,O)))). +*/ + +shared_prop_U(TestID,_P,all,Same):- + forall(current_example_nums(TestID,ExampleNum), is_prop_in(TestID,ExampleNum,Same)). + +shared_prop_U(TestID,_P,ShareLevel,Same):- number(ShareLevel), + findall(+,((current_example_nums(TestID,ExampleNum), + \+ \+ is_prop_in(TestID,ExampleNum,Same))),L), + length(L,N),%trace, + N>=ShareLevel. + +is_prop_in(TestID,ExampleNum,Same):- + obj_group_io(TestID,ExampleNum,in,Objs), + \+ \+ (member(O,Objs),has_prop(Same,O)),!. + + +solve_obj_group(TestID,ExampleNum,IO,ROptions,Objs):- + my_maplist(solve_obj(TestID,ExampleNum,IO,ROptions),Objs,OObjs), + print_ss(wqs(solved_obj_group(ExampleNum)),Objs,OObjs). + +solve_obj(TestID,_ExampleNum,_IO,_ROptions,Obj,OObj):- + must_det_ll((findall(P,(is_accompany_changed_verified(TestID,P,Same),member(S,Same),has_prop(S,Obj)),Ps), + wots(SS,writeln(Ps)), + override_object_1(Ps,Obj,OObj),!, + print_ss(override_object(SS),[Obj],[OObj]))). + +override_object_1([H|T],I,OO):- override_object_1(H,I,M),!, override_object_1(T,M,OO). +override_object_1(pen([cc(Red,N)]),Obj,OObj):- pen(Obj,[cc(Was,N)]), subst(Obj,Was,Red,OObj),!. +override_object_1(O,I,OO):- override_object(O,I,OO),!. + +is_accompany_changed_verified(TestID,P,Same):- + is_accompany_changed_computed(TestID,P,Same), Same\==[]. + +is_accompany_changed_computed(TestID,P,Same):- + is_accompany_changed_db(TestID,P,Same) *->true ; accompany_changed_compute_pass1(TestID,P,Same). + +ensure_prop_change(Prop):- + (var(Prop)->counts_change(_TestID,Prop);true). + +prop_can(Prop,Can):- + ensure_prop_change(Prop), + prop_cant(Prop,Cant), + prop_can1(Prop,Can1), + intersection(Can1,Cant,_,Can,_). + + +% Turns out due to shortage Fred Meyer doesn't have the XR now anyways .. But i confirmed they do have have a 28 day supply of the non-XR .. .. Go ahead and not send the XR if you haven't sent it + +prop_cant(Prop,Set):- + ensure_prop_change(Prop), + findall(Cant, + ((enum_object(O),has_prop(giz(g(out)),O),has_prop(cc(bg,0),O), + not_has_prop(Prop,O),indv_props_list(O,List),member(Cant,List),ok_notice(Cant))),Flat), + list_to_set(Flat,Set). + +enum_object_ext(O):- + ensure_test(TestID), + current_example_nums(TestID,ExampleNum), + once((obj_group_io(TestID,ExampleNum,out,Objs),Objs\==[])),member(O,Objs). + +prop_can1(Prop,Can):- + ensure_prop_change(Prop), + findall(O, + ((enum_object_ext(O),has_prop(giz(g(out)),O),has_prop(cc(bg,0),O), + has_prop(Prop,O))),[I|L]), + indv_props_list(I,List), + findall(P,(member(P,List),ok_notice(P),forall(member(E,L),has_prop(P,E))),Can). + + +accompany_changed_compute_pass1(TestID,P,SameS):- + findall(ac(TestID,X,ExampleNum,PO), + (accompany_change2(TestID,ExampleNum,[X1=P1O,X2=P2O,common=_Intersect]), + member(X=PO,[X1=P1O,X2=P2O])), AC0), + sort(AC0,AC1), + list_to_set_variant(AC1,AC2), + counts_change(TestID,P), + ac1_or_ac2(TestID,P,AC2,NewSame), + correct_antes3(TestID,P,NewSame,SameS). + +ac1_or_ac2(TestID,P,AC2,NewSame):- + ac1_or_ac2_1(TestID,P,AC2,NewSame)*->true;ac1_or_ac2_2(TestID,P,AC2,NewSame). + +ac1_or_ac2_1(TestID,P,AC2,NewSame):- + findall(ac1(PO),member(ac(TestID,P,_ExampleNum,PO),AC2),AC3), + merge_xtra_props_ac1(AC3,Same), + find_peers_with_same(TestID,P,Same,NewSame), + NewSame\==[]. + +ac1_or_ac2_2(TestID,P,AC2,NewSame):- + findall(ac2(ExampleNum,PO),(member(ac(TestID,P,ExampleNum,PO),AC2)),AC3), + sort(AC3,AC4), + merge_xtra_props_ac2(AC4,Same), + find_peers_with_same(TestID,P,Same,NewSame), + NewSame\==[]. + +%xlisting(propcounts+variance_had_count_set+(pen([cc(yellow,1)]);links_count(contains,4))-'$spft$'). +/* + propcounts( TestID, + ExampleNum, IO, + variance_had_count_set(2,0), + P, + PL, + [ 1-(2-links_count(contains,4)), + 1-(1-links_count(contains,3))]), +*/ +contains_same([],_):- !. +contains_same([E|L],P):- sub_var(E,P),!,contains_same(L,P). + +find_peers_with_same(TestID,P,Same,NewSame):- select(S,Same,Next),S=@=P,!,find_peers_with_same(TestID,P,Next,NewSame). +find_peers_with_same(TestID,P,Same,NewSame):- + sub_term(Color,P),is_real_color(Color), sub_term(N,P),number(N), + my_partition(contains_same([Color]),Same,SameW,SameWO),SameW\==[], SameWO\==[],!, + find_peers_with_same(TestID,P,SameWO,NewSame). +find_peers_with_same(_,_,Same,Same):-!. + + + + + +merge_xtra_props_ac1([ac1(PO)|AC3],Same):- !, merge_xtra_props_ac1_3(PO,AC3,Same), Same\==[]. +merge_xtra_props_ac1_3(PO,[ac1(PO2)|MORE],OUT):- + intersection(PO,PO2,IPO), + merge_xtra_props_ac1_3(IPO,MORE,OUT). +merge_xtra_props_ac1_3(PO,[],PO). + +merge_xtra_props_ac2([ac2(_,Same)],Same):-!. +merge_xtra_props_ac2(AC2,Same):- + select(ac2(ExampleNum,PO1),AC2,AC3), + select(ac2(ExampleNum,PO2),AC3,AC4), + intersection(PO1,PO2,Some),Some\==[],!, + merge_xtra_props_ac2([ac2(ExampleNum,Some)|AC4],Same). +merge_xtra_props_ac2(AC2,Same):- + select(ac2(ExampleNum,PO1),AC2,AC3), + select(ac2(ExampleNum2,PO2),AC3,AC4), + ExampleNum \== ExampleNum2, + intersection(PO1,PO2,Some),Some\==[],!, + merge_xtra_props_ac2([ac2(ExampleNum,Some)|AC4],Same). +merge_xtra_props_ac2([ac2(ExampleNum,PO1)|AC3],[ac2(ExampleNum,PO1)|Same]):- + merge_xtra_props_ac2(AC3,Same),!. +merge_xtra_props_ac2(Same,Same):-!. + + +changing_props(X1,X2):- + counts_change(TestID,X1), + counts_change(TestID,X2), +% X1@>X2, + other_val(X1,X2). + +other_val(X1,X2):- X1\=@=X2, same_prop_names(X1,X2),!. +same_prop_names(X1,X2):- + compound(X1),compound(X2), same_functor(X1,X2),!, + make_unifiable_u(X1,U1), make_unifiable_u(X2,U2), U1 =@= U2. +make_unifiable_u(X1,U1):- make_unifiable_cc(X1,U1),!. + +accompany_change2(TestID,ExampleNum,[X1=P1O,X2=P2O,common=Intersect]):- + changing_props(X1,X2), + accompany_change(TestID,ExampleNum,X1,Props1,_NotProps1), + accompany_change(TestID,ExampleNum,X2,Props2,_NotProps2), + once(( + intersection(Props1,Props2,Intersect,P1,P2), + include(has_other_val(Props2),P1,P1O), + include(has_other_val(Props1),P2,P2O))). + +has_other_val(Props1,X2):- member(X1,Props1),other_val(X1,X2),!. + + +accompany_change(TestID,ExampleNum,X,Props,NotProps):- + var(TestID),!,ensure_test(TestID), + accompany_change(TestID,ExampleNum,X,Props,NotProps). +accompany_change(TestID,ExampleNum,X,Props,NotProps):- + var(ExampleNum),!,current_example_nums(TestID,ExampleNum), + accompany_change(TestID,ExampleNum,X,Props,NotProps). +accompany_change(TestID,ExampleNum,X,Props,NotProps):- + var(X),!,counts_change(TestID,X), + accompany_change(TestID,ExampleNum,X,Props,NotProps). + +accompany_change(TestID,ExampleNum,X,Props,NotProps):- + once((counts_change(TestID,ExampleNum,X,N1,N2), N1N2, + once(( + %obj_group_io(TestID,ExampleNum,in,In), my_partition(has_prop(X),In,HasPropsI,NotHasPropsI), + %obj_group_io(TestID,ExampleNum,out,Out), + other_objs_than_group(TestID,ExampleNum,out,Out), + my_partition(not_has_prop(X),Out,HasPropsO,NotHasPropsO), + %my_partition(not_has_prop(X),Others,HasPropsOthers,NotHasPropsOthers), + common_props(HasPropsO,Common), + common_props(NotHasPropsO,NotCommon), + intersection(Common,NotCommon,_,Props,NotProps),Props\==[])). + + +common_props([O|Objs],Props):- + indv_props_list(O,List), + findall(P,(member(P,List),\+ dont_notice(P),forall(member(E,Objs),has_prop(P,E))),Props). + +current_example_nums(_TestID,ExampleNum):- ground(ExampleNum),!. +current_example_nums(TestID,ExampleNum):- + get_current_test(TestID),ExampleNum=trn+_, kaggle_arc(TestID,ExampleNum,_,_). + + + +save_how_io(HowIn,HowOut):- + get_current_test(TestID),save_how_io(TestID,HowIn,HowOut). +save_how_io(TestID,HowIn,HowOut):- + assert_test_property(TestID,common,indiv_how(in),HowIn), + assert_test_property(TestID,common,indiv_how(out),HowOut),!. + + + +obj_group_gg(TestID,ExampleNum,In,Out):- + no_repeats_var(Out),set_example_num(ExampleNum), + obj_group5(TestID,ExampleNum,in,HowIn,In), In\==[], length(In,L), + + (((obj_group5(TestID,ExampleNum,out,HowOut,OOut),length(OOut,L),save_how_io(TestID,HowIn,HowOut))) + ;obj_group5(TestID,ExampleNum,out,_,OOut)), + Out = OOut. + +other_objs_than_group(TestID,ExampleNum,IO,Others):- + findall(O,(current_example_nums(TestID,OExampleNum), + ExampleNum\==OExampleNum, + obj_group_io(TestID,OExampleNum,IO,Objs), + member(O,Objs)),Others). + +all_io_objs(TestID,IO,Others):- + findall(O,(current_example_nums(TestID,ExampleNum), + obj_group_io(TestID,ExampleNum,IO,Objs), member(O,Objs)),Others). + +with_individuated_cache(TF,Goal):- locally(nb_setval(use_individuated_cache,TF),Goal). + +obj_group_io(TestID,ExampleNum,IO,Objs):- + arc_test_property(TestID,common,indiv_how(IO),How),!, + current_example_nums(TestID,ExampleNum), + with_individuated_cache(true, + once(obj_group5(TestID,ExampleNum,IO,How,Objs))). + +obj_group_io(TestID,ExampleNum,IO,Objs):- + current_example_nums(TestID,ExampleNum), + with_individuated_cache(true, + once(obj_group5(TestID,ExampleNum,IO,_,Objs))). + +obj_group5(TestID,ExampleNum,IO,ROptions,Objs):- var(TestID), + ensure_test(TestID),!,obj_group5(TestID,ExampleNum,IO,ROptions,Objs). +obj_group5(TestID,ExampleNum,IO,ROptions,Objs):- var(ROptions), + arc_test_property(TestID,common,indiv_how(IO),ROptions),!, + obj_group5(TestID,ExampleNum,IO,ROptions,Objs). +obj_group5(TestID,ExampleNum,IO,ROptions,Objs):- + kaggle_arc_io(TestID,ExampleNum,IO,Grid), + set_example_num(ExampleNum), + ((fail, arc_cache:individuated_cache(TestID,TID,GOID,ROptions,Objs), Objs\==[], + once((testid_name_num_io_0(TID,_,Example,Num,IO), + testid_name_num_io_0(GOID,_,Example,Num,IO))))*-> true ; grid_to_objs(Grid,ROptions,Objs)). + + saved_group(Why,IndvS):- diff --git a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_utils.pl b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_utils.pl index 4589d3fae4..029879f4a4 100644 --- a/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_utils.pl +++ b/packs_sys/logicmoo_agi/prolog/kaggle_arc/kaggle_arc_utils.pl @@ -218,7 +218,7 @@ mapg_list(P3,Grid,GridN,GridO):- is_list(Grid),!,maplist(mapg_list(P3),Grid,GridN,GridO). mapg_list(P3,Grid,GridN,GridO):- call(P3,Grid,GridN,GridO),!. -mapgrid(P2, Grid,GridN):- into_grid_or_var(Grid,G1),into_grid_or_var(GridN,G2),mapg_list(P2, G1,G2). +mapgrid(P2, Grid,GridN):- into_grid_or_var(Grid,G1),into_grid_or_var(GridN,G2),!,mapg_list(P2, G1,G2). mapg_list(P2, Grid,GridN):- is_list(Grid),!,maplist(mapg_list(P2),Grid,GridN). mapg_list(P2, Grid,GridN):- p2_call(P2, Grid,GridN),!. @@ -244,6 +244,7 @@ p1_call(not(not(P1)),E):- !, \+ \+ p1_call(P1,E). p1_call(not(P1),E):- !, not(p1_call(P1,E)). p1_call(once(P1),E):- !, once(p1_call(P1,E)). +p1_call(ignore(P1),E):- !, ignore(p1_call(P1,E)). p1_call(chk(P1),E):- !, \+ \+ (p1_call(P1,E)). p1_call( \+ (P1),E):- !, \+ p1_call(P1,E). p1_call(P1,E):- !, call(P1,E). @@ -265,6 +266,7 @@ p1_or(P1A,P1B,X):- p1_call(P1A,X)->true;p1_call(P1B,X). p1_and(P1A,P1B,X):- p1_call(P1A,X),p1_call(P1B,X). p1_not(P1,E):- \+ p1_call(P1,E). +p1_ignore(P1,E):- ignore(p1_call(P1,E)). p1_arg(N,P1,E):- arg(N,E,Arg),p1_call(P1,Arg). p1_subterm(P1,E):- sub_term(Arg,E),p1_call(P1,Arg). my_partition(_,[],[],[]):-!. diff --git a/packs_sys/logicmoo_utils/prolog/debuggery/first.pl b/packs_sys/logicmoo_utils/prolog/debuggery/first.pl index 852c876a2b..1f92b8e2c5 100755 --- a/packs_sys/logicmoo_utils/prolog/debuggery/first.pl +++ b/packs_sys/logicmoo_utils/prolog/debuggery/first.pl @@ -334,7 +334,7 @@ % % If May Hide. % -if_may_hide(G):-G. +if_may_hide(G):-call(G). :- meta_predicate with_unlocked_pred(:,0). @@ -388,10 +388,10 @@ % Managed Predicate Trace nochilds. % mpred_trace_nochilds(W):- if_may_hide(forall(match_predicates(W,M,Pred,_,_),( -with_unlocked_pred(M:Pred,( -'old_set_predicate_attribute'(M:Pred, trace, 1), -%'old_set_predicate_attribute'(M:Pred, noprofile, 0), -'old_set_predicate_attribute'(M:Pred, hide_childs, 1)))))). + with_unlocked_pred(M:Pred,( + 'old_set_predicate_attribute'(M:Pred, trace, 1), + %'old_set_predicate_attribute'(M:Pred, noprofile, 0), + 'old_set_predicate_attribute'(M:Pred, hide_childs, 1)))))). :- export(mpred_trace_childs/1). diff --git a/packs_sys/logicmoo_utils/prolog/debuggery/rtrace.pl b/packs_sys/logicmoo_utils/prolog/debuggery/rtrace.pl index cd451d8a50..4cfc68ea87 100755 --- a/packs_sys/logicmoo_utils/prolog/debuggery/rtrace.pl +++ b/packs_sys/logicmoo_utils/prolog/debuggery/rtrace.pl @@ -60,6 +60,10 @@ rtrace_break(:), quietly(:), + quietly1(:), + quietly2(:), + quietly3(:), + quietly4(:), ftrace(:), visible_rtrace(+,:). @@ -85,7 +89,7 @@ ((( tracing; t_l:rtracing),!,maybe_leash(+exception))) -> Goal ; - (catchv(Goal,E,(ignore(debugCallWhy(on_x_debug(E,Goal),rtrace(Goal))),throw(E)))). + (catchv(quietly(Goal),E,(ignore(debugCallWhy(on_x_debug(E,Goal),rtrace(Goal))),throw(E)))). @@ -100,7 +104,13 @@ maybe_leash(Some):- notrace((should_maybe_leash->leash(Some);true)). old_swi(_). -my_totally_hide(G):- '$hide'(G), old_swi(totally_hide(G)). +with_unlocked_pred_local(MP,Goal):- strip_module(MP,M,P),Pred=M:P, + (predicate_property(Pred,foreign)-> true ; + setup_call_cleanup(unlock_predicate(Pred), + catch(Goal,E,throw(E)),lock_predicate(Pred))),!. + +my_totally_hide(G):- + with_unlocked_pred_local(G, '$hide'(G)), old_swi(totally_hide(G)). :- my_totally_hide(maybe_leash/1). @@ -222,8 +232,10 @@ (YN == true -> trace ; (trace;(notrace,fail))); (trace,!,notrace(fail)))). +quietly(Goal):- quietly3(Goal). + % version 4 -quietly(M:Goal):- \+ tracing +quietly4(M:Goal):- \+ tracing -> M:Goal ; (get_trace_reset(W), scce_orig(notrace(visible(-all)),M:Goal,W)). diff --git a/packs_sys/logicmoo_utils/prolog/logicmoo/no_repeats.pl b/packs_sys/logicmoo_utils/prolog/logicmoo/no_repeats.pl index 5cf439702b..a6d1f14df4 100755 --- a/packs_sys/logicmoo_utils/prolog/logicmoo/no_repeats.pl +++ b/packs_sys/logicmoo_utils/prolog/logicmoo/no_repeats.pl @@ -436,14 +436,24 @@ % X = 3; % No. % == -no_repeats_var(Var):- nonvar(Var) ->true; (get_attr(Var,nr,_)->true;put_attr(Var,nr,old_vals(Var,same_forms,[]))). +no_repeats_var(Var):- nonvar(Var) ->true; + (get_attr(Var,nr,_)->true;put_attr(Var,nr,old_vals(Var,same_forms,[]))). no_repeats_var(Cmp,Var):- nonvar(Var) ->true; (get_attr(Var,nr,_)->true;put_attr(Var,nr,old_vals(Var,Cmp,[]))). -nr:attr_unify_hook(AttValue,VarValue):- AttValue=old_vals(_Var,Cmp,Waz), \+ memberchk_pred(Cmp,VarValue,Waz),nb_setarg(1,AttValue,[VarValue|Waz]). + +nr:attr_unify_hook(AttValue,VarValue):- + AttValue=old_vals(_Var,Cmp,Waz), + \+ memberchk_pred(Cmp,VarValue,Waz),nb_setarg(3,AttValue,[VarValue|Waz]). +/* +nr:attr_unify_hook(AttValue,VarValue):- + AttValue=old_vals(_Var,Cmp,Waz), + \+ (member(E,Waz), call(Cmp,VarValue,E)), + nb_setarg(3,AttValue,[VarValue|Waz]). +*/ same_forms(F1,F2):- get_attrs(F1,A1),!,get_attrs(F2,A2),A1=@=A2. -same_forms(F1,F2):- get_attrs(F2,A1),!,get_attrs(F1,A2),A1=@=A2. +same_forms(F1,F2):- get_attrs(F2,A1),!,fail,get_attrs(F1,A2),A1=@=A2. same_forms(F1,F2):- var(F1),!,F2==F1. -same_forms(F1,F2):- var(F2),!,F2==F1. +same_forms(F1,F2):- var(F2),!,fail,F2==F1. same_forms(F1,F2):- F1=@=F2. % WAS OFF :- system:use_module(library(logicmoo_startup)).

    ^LCzlP$TIAMLs_=qrP;Auw3jTo6HcL66AC5ooxD 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