From d59399073fee1dc6f13cfd396318959d22e2c9ac Mon Sep 17 00:00:00 2001 From: pdollar Date: Mon, 12 Jun 2006 23:36:10 +0000 Subject: [PATCH] git-svn-id: svn+ssh://lumo.ucsd.edu/projects/p1/svnroot/pdollar/toolbox@1268 52fe0c90-79fe-0310-8a18-a0b98ad248f8 --- classify/Contents.m | 45 + classify/clf_data.mat | Bin 0 -> 479768 bytes classify/clf_dectree.m | 25 + classify/clf_dectree_fwd.m | 25 + classify/clf_dectree_train.m | 34 + classify/clf_ecoc.m | 43 + classify/clf_ecoc_code.m | 32 + classify/clf_knn.m | 28 + classify/clf_knn_dist.m | 59 + classify/clf_knn_fwd.m | 31 + classify/clf_knn_train.m | 31 + classify/clf_lda.m | 45 + classify/clf_lda_fwd.m | 70 + classify/clf_lda_train.m | 106 ++ classify/clf_svm.m | 17 + classify/confmatrix.m | 54 + classify/confmatrix_show.m | 69 + classify/democlassify.m | 85 + classify/democluster.m | 80 + classify/demogendata.m | 126 ++ classify/dist_L1.m | 39 + classify/dist_chisquared.m | 41 + classify/dist_emd.m | 44 + classify/dist_euclidean.m | 90 ++ classify/distmatrix_show.m | 62 + classify/kmeans2.m | 172 ++ classify/meanshift.m | 74 + classify/meanshiftim.m | 112 ++ classify/meanshiftim_explore.m | 67 + classify/nfoldxval.m | 182 +++ classify/pca.m | 108 ++ classify/pca_apply.m | 85 + classify/pca_apply_large.m | 62 + classify/pca_data.mat | Bin 0 -> 165368 bytes classify/pca_randomvector.m | 91 ++ classify/pca_visualize.m | 113 ++ classify/private/IDX2order.m | 32 + classify/private/meanshift1.c | 264 ++++ classify/private/meanshift1.dll | Bin 0 -> 7680 bytes classify/private/meanshift_post.m | 44 + classify/softmin.m | 58 + classify/visualize_data.m | 75 + doc/alpha.png | Bin 0 -> 273 bytes doc/c++.png | Bin 0 -> 327 bytes doc/c.png | Bin 0 -> 252 bytes doc/classify/Contents.html | 86 + doc/classify/clf_dectree.html | 54 + doc/classify/clf_dectree_fwd.html | 54 + doc/classify/clf_dectree_train.html | 55 + doc/classify/clf_ecoc.html | 59 + doc/classify/clf_ecoc_code.html | 50 + doc/classify/clf_knn.html | 55 + doc/classify/clf_knn_dist.html | 63 + doc/classify/clf_knn_fwd.html | 54 + doc/classify/clf_knn_train.html | 55 + doc/classify/clf_lda.html | 60 + doc/classify/clf_lda_fwd.html | 54 + doc/classify/clf_lda_train.html | 55 + doc/classify/clf_svm.html | 49 + doc/classify/confmatrix.html | 63 + doc/classify/confmatrix_show.html | 64 + doc/classify/democlassify.html | 47 + doc/classify/democluster.html | 50 + doc/classify/demogendata.html | 65 + doc/classify/dist_L1.html | 66 + doc/classify/dist_chisquared.html | 67 + doc/classify/dist_emd.html | 68 + doc/classify/dist_euclidean.html | 66 + doc/classify/distmatrix_show.html | 64 + doc/classify/kmeans2.html | 113 ++ doc/classify/meanshift.html | 84 + doc/classify/meanshiftim.html | 94 ++ doc/classify/meanshiftim_explore.html | 66 + doc/classify/menu.html | 34 + doc/classify/nfoldxval.html | 97 ++ doc/classify/pca.html | 91 ++ doc/classify/pca_apply.html | 78 + doc/classify/pca_apply_large.html | 57 + doc/classify/pca_randomvector.html | 69 + doc/classify/pca_visualize.html | 67 + doc/classify/private/IDX2order.html | 59 + doc/classify/private/meanshift_post.html | 45 + doc/classify/private/menu.html | 30 + doc/classify/softmin.html | 82 + doc/classify/visualize_data.html | 63 + doc/demoicon.gif | Bin 0 -> 214 bytes doc/down.png | Bin 0 -> 133 bytes doc/filters/Contents.html | 68 + doc/filters/FB_apply_2D.html | 62 + doc/filters/FB_crop.html | 55 + doc/filters/FB_make_1D.html | 47 + doc/filters/FB_make_2D.html | 47 + doc/filters/FB_make_3D.html | 50 + doc/filters/FB_reconstruct_2D.html | 63 + doc/filters/FB_visualize_1D.html | 48 + doc/filters/FB_visualize_2D.html | 51 + doc/filters/filter_DOG_2D.html | 62 + doc/filters/filter_DOOG_1D.html | 62 + doc/filters/filter_DOOG_2D.html | 63 + doc/filters/filter_DOOG_3D.html | 62 + doc/filters/filter_binomial_1D.html | 67 + doc/filters/filter_gabor_1D.html | 64 + doc/filters/filter_gabor_2D.html | 64 + doc/filters/filter_gauss_1D.html | 62 + doc/filters/filter_gauss_nD.html | 73 + doc/filters/filter_steerable.html | 57 + doc/filters/filter_visualize_1D.html | 51 + doc/filters/filter_visualize_2D.html | 54 + doc/filters/filter_visualize_3D.html | 54 + doc/filters/menu.html | 32 + doc/fortran.png | Bin 0 -> 265 bytes doc/history.txt | 21 + doc/hp.png | Bin 0 -> 255 bytes doc/images/Contents.html | 111 ++ doc/images/apply_homography.html | 70 + doc/images/assign2bins.html | 65 + doc/images/clustermontage.html | 69 + doc/images/convn_fast.html | 77 + doc/images/filmstrip.html | 58 + doc/images/filmstrips.html | 58 + doc/images/gauss_smooth.html | 59 + doc/images/histc_1D.html | 77 + doc/images/histc_image.html | 76 + doc/images/histc_nD.html | 77 + doc/images/histc_sift.html | 68 + doc/images/histc_sift_nD.html | 73 + doc/images/histmontage.html | 56 + doc/images/im.html | 58 + doc/images/imageMLG.html | 88 ++ doc/images/imnormalize.html | 70 + doc/images/imrotate2.html | 65 + doc/images/imshrink.html | 62 + doc/images/imsubs2array.html | 58 + doc/images/imsubs_resize.html | 62 + doc/images/imtranslate.html | 64 + doc/images/imwrite2.html | 83 + doc/images/imwrite2split.html | 66 + doc/images/jitter_image.html | 94 ++ doc/images/jitter_video.html | 67 + doc/images/localsum.html | 64 + doc/images/localsum_block.html | 57 + doc/images/makemovie.html | 60 + doc/images/makemovies.html | 63 + doc/images/makemoviesets.html | 64 + doc/images/makemoviesets2.html | 66 + doc/images/mask_circle.html | 72 + doc/images/mask_ellipse.html | 82 + doc/images/mask_gaussians.html | 87 + doc/images/menu.html | 34 + doc/images/modefilt1.html | 65 + doc/images/montage2.html | 70 + doc/images/montages.html | 65 + doc/images/montages2.html | 66 + doc/images/movie2images.html | 61 + doc/images/nonmaxsupr.html | 86 + doc/images/nonmaxsupr_list.html | 71 + doc/images/nonmaxsupr_window.html | 65 + doc/images/normxcorrn.html | 73 + doc/images/normxcorrn_fg.html | 72 + doc/images/optflow_corr.html | 72 + doc/images/optflow_horn.html | 55 + doc/images/optflow_lucaskanade.html | 76 + doc/images/playmovie.html | 62 + doc/images/playmovies.html | 58 + doc/images/private/menu.html | 30 + doc/images/private/nlfilt_sep.html | 75 + doc/images/private/nlfiltblock_sep.html | 70 + doc/images/texture_map.html | 73 + doc/images/xcorrn.html | 65 + doc/images/xeucn.html | 65 + doc/index.html | 22 + doc/left.png | Bin 0 -> 136 bytes doc/linux.png | Bin 0 -> 272 bytes doc/m2html.css | 75 + doc/matlab/Contents.html | 95 ++ doc/matlab/arraycrop2dims.html | 65 + doc/matlab/arraycrop_full.html | 59 + doc/matlab/c.html | 45 + doc/matlab/cc.html | 45 + doc/matlab/ccc.html | 45 + doc/matlab/cell2array.html | 64 + doc/matlab/checknumericargs.html | 77 + doc/matlab/feval_arrays.html | 83 + doc/matlab/feval_images.html | 94 ++ doc/matlab/feval_mats.html | 71 + doc/matlab/figureresized.html | 60 + doc/matlab/gauss2ellipse.html | 63 + doc/matlab/getargs.html | 69 + doc/matlab/imlabel.html | 59 + doc/matlab/ind2sub2.html | 63 + doc/matlab/int2str2.html | 61 + doc/matlab/isfield2.html | 59 + doc/matlab/mat2cell2.html | 67 + doc/matlab/menu.html | 30 + doc/matlab/mode.html | 55 + doc/matlab/normpdf2.html | 57 + doc/matlab/num2strs.html | 54 + doc/matlab/plot_ellipse.html | 60 + doc/matlab/plot_gaussellipses.html | 55 + doc/matlab/randint2.html | 61 + doc/matlab/randomsample.html | 74 + doc/matlab/randperm2.html | 66 + doc/matlab/recover_rotation3D.html | 58 + doc/matlab/rotation_matrix2D.html | 59 + doc/matlab/rotation_matrix3D.html | 60 + doc/matlab/simplecache.html | 81 + doc/matlab/sub2ind2.html | 64 + doc/matlab/text2.html | 59 + doc/matlab/ticstatus.html | 89 ++ doc/matlab/tocstatus.html | 56 + doc/matlab/tps_getwarp.html | 76 + doc/matlab/tps_interpolate.html | 57 + doc/matlab/tps_interpolateimage.html | 58 + doc/matlab/tps_random.html | 54 + doc/matlabicon.gif | Bin 0 -> 574 bytes doc/menu.html | 33 + doc/mex.png | Bin 0 -> 242 bytes doc/overview.html | 66 + doc/right.png | Bin 0 -> 136 bytes doc/sgi.png | Bin 0 -> 263 bytes doc/simulinkicon.gif | Bin 0 -> 977 bytes doc/solaris.png | Bin 0 -> 286 bytes doc/up.png | Bin 0 -> 162 bytes doc/windows.png | Bin 0 -> 286 bytes external/exportfig/applytofig.m | 20 + external/exportfig/exportfig.m | 991 ++++++++++++ external/exportfig/previewfig.m | 49 + external/exportfig/restorefig.m | 20 + external/history.txt | 27 + external/m2html/@template/char.m | 15 + external/m2html/@template/display.m | 18 + external/m2html/@template/get.m | 50 + external/m2html/@template/parse.m | 33 + external/m2html/@template/private/finish.m | 31 + external/m2html/@template/private/loadtpl.m | 24 + external/m2html/@template/private/subst.m | 14 + external/m2html/@template/set.m | 110 ++ external/m2html/@template/template.m | 47 + external/m2html/Changelog | 54 + external/m2html/Contents.m | 21 + external/m2html/GPL | 280 ++++ external/m2html/INSTALL | 32 + external/m2html/LICENSE | 16 + external/m2html/README | 122 ++ external/m2html/TODO | 95 ++ external/m2html/m2html.m | 1405 +++++++++++++++++ external/m2html/mdot.m | 93 ++ external/m2html/mwizard.m | 968 ++++++++++++ external/m2html/mwizard2.m | 1041 ++++++++++++ external/m2html/private/doxyread.m | 101 ++ external/m2html/private/doxysearch.m | 256 +++ external/m2html/private/doxywrite.m | 128 ++ .../m2html/private/m2htmltoolbarimages.mat | Bin 0 -> 53792 bytes external/m2html/private/mexexts.m | 15 + external/m2html/private/mfileparse.m | 150 ++ external/m2html/private/openfile.m | 20 + external/m2html/private/searchindex.m | 57 + external/m2html/private/splitcode.m | 87 + external/m2html/private/strtok.m | 52 + external/m2html/templates/blue/Thumbs.db | Bin 0 -> 27648 bytes external/m2html/templates/blue/alpha.png | Bin 0 -> 273 bytes external/m2html/templates/blue/c++.png | Bin 0 -> 327 bytes external/m2html/templates/blue/c.png | Bin 0 -> 252 bytes external/m2html/templates/blue/demoicon.gif | Bin 0 -> 214 bytes external/m2html/templates/blue/down.png | Bin 0 -> 133 bytes external/m2html/templates/blue/doxysearch.php | 329 ++++ external/m2html/templates/blue/fortran.png | Bin 0 -> 265 bytes external/m2html/templates/blue/graph.tpl | 28 + external/m2html/templates/blue/hp.png | Bin 0 -> 255 bytes external/m2html/templates/blue/left.png | Bin 0 -> 136 bytes external/m2html/templates/blue/linux.png | Bin 0 -> 272 bytes external/m2html/templates/blue/m2html.css | 90 ++ external/m2html/templates/blue/master.tpl | 49 + external/m2html/templates/blue/matlabicon.gif | Bin 0 -> 574 bytes external/m2html/templates/blue/mdir.tpl | 60 + external/m2html/templates/blue/mex.png | Bin 0 -> 242 bytes external/m2html/templates/blue/mfile.tpl | 70 + external/m2html/templates/blue/pcode.png | Bin 0 -> 212 bytes external/m2html/templates/blue/right.png | Bin 0 -> 136 bytes external/m2html/templates/blue/search.tpl | 29 + external/m2html/templates/blue/sgi.png | Bin 0 -> 263 bytes .../m2html/templates/blue/simulinkicon.gif | Bin 0 -> 977 bytes external/m2html/templates/blue/solaris.png | Bin 0 -> 286 bytes external/m2html/templates/blue/todo.tpl | 28 + external/m2html/templates/blue/up.png | Bin 0 -> 162 bytes external/m2html/templates/blue/windows.png | Bin 0 -> 286 bytes external/m2html/templates/brain/alpha.png | Bin 0 -> 273 bytes external/m2html/templates/brain/brain.png | Bin 0 -> 24107 bytes external/m2html/templates/brain/c++.png | Bin 0 -> 327 bytes external/m2html/templates/brain/c.png | Bin 0 -> 252 bytes external/m2html/templates/brain/demoicon.gif | Bin 0 -> 214 bytes external/m2html/templates/brain/down.png | Bin 0 -> 133 bytes .../m2html/templates/brain/doxysearch.php | 329 ++++ external/m2html/templates/brain/fortran.png | Bin 0 -> 265 bytes external/m2html/templates/brain/graph.tpl | 26 + external/m2html/templates/brain/hp.png | Bin 0 -> 255 bytes external/m2html/templates/brain/index.html | 22 + external/m2html/templates/brain/left.png | Bin 0 -> 136 bytes external/m2html/templates/brain/linux.png | Bin 0 -> 272 bytes external/m2html/templates/brain/m2html.css | 92 ++ external/m2html/templates/brain/master.tpl | 44 + .../m2html/templates/brain/matlabicon.gif | Bin 0 -> 574 bytes external/m2html/templates/brain/mdir.tpl | 60 + external/m2html/templates/brain/menu.css | 93 ++ external/m2html/templates/brain/mex.png | Bin 0 -> 242 bytes external/m2html/templates/brain/mfile.tpl | 75 + external/m2html/templates/brain/pcode.png | Bin 0 -> 212 bytes external/m2html/templates/brain/right.png | Bin 0 -> 136 bytes external/m2html/templates/brain/search.tpl | 29 + external/m2html/templates/brain/sgi.png | Bin 0 -> 263 bytes .../m2html/templates/brain/simulinkicon.gif | Bin 0 -> 977 bytes external/m2html/templates/brain/solaris.png | Bin 0 -> 286 bytes external/m2html/templates/brain/todo.tpl | 27 + external/m2html/templates/brain/up.png | Bin 0 -> 162 bytes external/m2html/templates/brain/windows.png | Bin 0 -> 286 bytes .../m2html/templates/frame-piotr/alpha.png | Bin 0 -> 273 bytes external/m2html/templates/frame-piotr/c++.png | Bin 0 -> 327 bytes external/m2html/templates/frame-piotr/c.png | Bin 0 -> 252 bytes .../m2html/templates/frame-piotr/demoicon.gif | Bin 0 -> 214 bytes .../m2html/templates/frame-piotr/down.png | Bin 0 -> 133 bytes .../m2html/templates/frame-piotr/fortran.png | Bin 0 -> 265 bytes .../m2html/templates/frame-piotr/graph.tpl | 26 + external/m2html/templates/frame-piotr/hp.png | Bin 0 -> 255 bytes .../m2html/templates/frame-piotr/index.html | 22 + .../m2html/templates/frame-piotr/left.png | Bin 0 -> 136 bytes .../m2html/templates/frame-piotr/linux.png | Bin 0 -> 272 bytes .../m2html/templates/frame-piotr/m2html.css | 75 + .../m2html/templates/frame-piotr/master.tpl | 30 + .../templates/frame-piotr/matlabicon.gif | Bin 0 -> 574 bytes .../m2html/templates/frame-piotr/mdir.tpl | 61 + external/m2html/templates/frame-piotr/mex.png | Bin 0 -> 242 bytes .../m2html/templates/frame-piotr/mfile.tpl | 63 + .../templates/frame-piotr/overview.html | 66 + .../m2html/templates/frame-piotr/right.png | Bin 0 -> 136 bytes external/m2html/templates/frame-piotr/sgi.png | Bin 0 -> 263 bytes .../templates/frame-piotr/simulinkicon.gif | Bin 0 -> 977 bytes .../m2html/templates/frame-piotr/solaris.png | Bin 0 -> 286 bytes .../m2html/templates/frame-piotr/todo.tpl | 27 + external/m2html/templates/frame-piotr/up.png | Bin 0 -> 162 bytes .../m2html/templates/frame-piotr/windows.png | Bin 0 -> 286 bytes external/m2html/templates/frame/alpha.png | Bin 0 -> 273 bytes external/m2html/templates/frame/c++.png | Bin 0 -> 327 bytes external/m2html/templates/frame/c.png | Bin 0 -> 252 bytes external/m2html/templates/frame/demoicon.gif | Bin 0 -> 214 bytes external/m2html/templates/frame/down.png | Bin 0 -> 133 bytes .../m2html/templates/frame/doxysearch.php | 329 ++++ external/m2html/templates/frame/fortran.png | Bin 0 -> 265 bytes external/m2html/templates/frame/graph.tpl | 26 + external/m2html/templates/frame/hp.png | Bin 0 -> 255 bytes external/m2html/templates/frame/index.html | 22 + external/m2html/templates/frame/left.png | Bin 0 -> 136 bytes external/m2html/templates/frame/linux.png | Bin 0 -> 272 bytes external/m2html/templates/frame/m2html.css | 90 ++ external/m2html/templates/frame/master.tpl | 44 + .../m2html/templates/frame/matlabicon.gif | Bin 0 -> 574 bytes external/m2html/templates/frame/mdir.tpl | 60 + external/m2html/templates/frame/mex.png | Bin 0 -> 242 bytes external/m2html/templates/frame/mfile.tpl | 71 + external/m2html/templates/frame/pcode.png | Bin 0 -> 212 bytes external/m2html/templates/frame/right.png | Bin 0 -> 136 bytes external/m2html/templates/frame/search.tpl | 29 + external/m2html/templates/frame/sgi.png | Bin 0 -> 263 bytes .../m2html/templates/frame/simulinkicon.gif | Bin 0 -> 977 bytes external/m2html/templates/frame/solaris.png | Bin 0 -> 286 bytes external/m2html/templates/frame/todo.tpl | 27 + external/m2html/templates/frame/up.png | Bin 0 -> 162 bytes external/m2html/templates/frame/windows.png | Bin 0 -> 286 bytes .../templates/menu-for-frame-piotr.html | 33 + external/matrix2latex.m | 156 ++ external/svm/Contents.m | 55 + external/svm/License.txt | 340 ++++ external/svm/Readme.txt | 80 + external/svm/code14-11 | 11 + external/svm/consist.m | 87 + external/svm/demecoc1.m | 46 + external/svm/demecoc1.mat | Bin 0 -> 89198 bytes external/svm/demsvm1.m | 247 +++ external/svm/demsvm2.m | 308 ++++ external/svm/demsvm3.m | 36 + external/svm/ecoc-codes.tar.gz | Bin 0 -> 315933 bytes external/svm/ecoc.m | 46 + external/svm/ecocfwd.m | 57 + external/svm/ecocload.m | 108 ++ external/svm/ecoctrain.m | 79 + external/svm/loqo.c | 262 +++ external/svm/loqo.dll | Bin 0 -> 18432 bytes external/svm/pr_loqo.c | 614 +++++++ external/svm/pr_loqo.h | 93 ++ external/svm/svm toolbox.URL | Bin 0 -> 74 bytes external/svm/svm.m | 123 ++ external/svm/svmcv.m | 261 +++ external/svm/svmfwd.m | 71 + external/svm/svmkernel.m | 85 + external/svm/svmstat.m | 139 ++ external/svm/svmtrain.m | 596 +++++++ external/toolbox_compile.m | 13 + external/toolbox_generatedoc.m | 21 + external/toolbox_updateallinfo.m | 100 ++ external/xmltree/@xmltree/Contents.m | 46 + external/xmltree/@xmltree/add.m | 92 ++ external/xmltree/@xmltree/attributes.m | 103 ++ external/xmltree/@xmltree/branch.m | 56 + external/xmltree/@xmltree/char.m | 14 + external/xmltree/@xmltree/children.m | 28 + external/xmltree/@xmltree/convert.m | 130 ++ external/xmltree/@xmltree/copy.m | 45 + external/xmltree/@xmltree/delete.m | 33 + external/xmltree/@xmltree/display.m | 19 + external/xmltree/@xmltree/find.m | 171 ++ external/xmltree/@xmltree/flush.m | 39 + external/xmltree/@xmltree/get.m | 39 + external/xmltree/@xmltree/getfilename.m | 14 + external/xmltree/@xmltree/isfield.m | 22 + external/xmltree/@xmltree/length.m | 33 + external/xmltree/@xmltree/move.m | 18 + external/xmltree/@xmltree/parent.m | 14 + .../xmltree/@xmltree/private/xml_findstr.c | 109 ++ .../xmltree/@xmltree/private/xml_findstr.dll | Bin 0 -> 7680 bytes .../xmltree/@xmltree/private/xml_findstr.m | 28 + .../xmltree/@xmltree/private/xml_parser.m | 428 +++++ external/xmltree/@xmltree/root.m | 33 + external/xmltree/@xmltree/save.m | 114 ++ external/xmltree/@xmltree/set.m | 23 + external/xmltree/@xmltree/setfilename.m | 13 + external/xmltree/@xmltree/view.m | 209 +++ external/xmltree/@xmltree/xmltree.m | 42 + external/xmltree/GPL | 280 ++++ external/xmltree/INSTALL | 45 + external/xmltree/LICENSE | 16 + external/xmltree/README | 90 ++ external/xmltree/TODO | 12 + external/xmltree/struct2xml.m | 90 ++ external/xmltree/view_ui.m | 259 +++ external/xmltree/xmldemo1.m | 129 ++ external/xmltree/xmldemo2.m | 82 + external/xmltree/xmldemo3.m | 57 + filters/Contents.m | 27 + filters/FB_DoG.mat | Bin 0 -> 276960 bytes filters/FB_apply_2D.m | 49 + filters/FB_crop.m | 32 + filters/FB_gabor.mat | Bin 0 -> 307712 bytes filters/FB_make_1D.m | 36 + filters/FB_make_2D.m | 148 ++ filters/FB_make_3D.m | 37 + filters/FB_reconstruct_2D.m | 105 ++ filters/FB_visualize_1D.m | 34 + filters/FB_visualize_2D.m | 25 + filters/filter_DOG_2D.m | 74 + filters/filter_DOOG_1D.m | 45 + filters/filter_DOOG_2D.m | 50 + filters/filter_DOOG_3D.m | 55 + filters/filter_binomial_1D.m | 41 + filters/filter_gabor_1D.m | 57 + filters/filter_gabor_2D.m | 56 + filters/filter_gauss_1D.m | 41 + filters/filter_gauss_nD.m | 73 + filters/filter_steerable.m | 35 + filters/filter_visualize_1D.m | 35 + filters/filter_visualize_2D.m | 61 + filters/filter_visualize_3D.m | 40 + images/Contents.m | 70 + images/apply_homography.m | 93 ++ images/assign2bins.m | 39 + images/clustermontage.m | 64 + images/convn_fast.m | 242 +++ images/filmstrip.m | 53 + images/filmstrips.m | 45 + images/gauss_smooth.m | 46 + images/histc_1D.m | 62 + images/histc_image.m | 63 + images/histc_nD.m | 73 + images/histc_sift.m | 36 + images/histc_sift_nD.m | 127 ++ images/histmontage.m | 45 + images/im.m | 37 + images/imageMLG.m | 161 ++ images/images.mat | Bin 0 -> 967040 bytes images/imnormalize.m | 72 + images/imrotate2.m | 40 + images/imshrink.m | 85 + images/imsubs2array.m | 27 + images/imsubs_resize.m | 34 + images/imtranslate.m | 37 + images/imwrite2.m | 107 ++ images/imwrite2split.m | 47 + images/jitter_image.m | 183 +++ images/jitter_video.m | 95 ++ images/localsum.m | 75 + images/localsum_block.m | 23 + images/makemovie.m | 42 + images/makemovies.m | 61 + images/makemoviesets.m | 90 ++ images/makemoviesets2.m | 62 + images/mask_circle.m | 61 + images/mask_ellipse.m | 68 + images/mask_gaussians.m | 104 ++ images/modefilt1.m | 46 + images/montage2.m | 135 ++ images/montages.m | 103 ++ images/montages2.m | 72 + images/movie2images.m | 39 + images/nonmaxsupr.m | 147 ++ images/nonmaxsupr_list.m | 76 + images/nonmaxsupr_window.m | 64 + images/normxcorrn.m | 67 + images/normxcorrn_fg.m | 71 + images/optflow_corr.m | 147 ++ images/optflow_data.mat | Bin 0 -> 140432 bytes images/optflow_horn.m | 94 ++ images/optflow_lucaskanade.m | 165 ++ images/playmovie.m | 53 + images/playmovies.m | 50 + images/private/assign2binsc.c | 85 + images/private/assign2binsc.dll | Bin 0 -> 6144 bytes images/private/findBin.c | 43 + images/private/histc_nD_c.c | 154 ++ images/private/histc_nD_c.dll | Bin 0 -> 7168 bytes images/private/mask_ellipse1.c | 119 ++ images/private/mask_ellipse1.dll | Bin 0 -> 7680 bytes images/private/nlfilt_sep.m | 76 + images/private/nlfiltblock_sep.m | 54 + images/private/rnlfilt_max.c | 113 ++ images/private/rnlfilt_max.dll | Bin 0 -> 6656 bytes images/private/rnlfilt_sum.c | 115 ++ images/private/rnlfilt_sum.dll | Bin 0 -> 6656 bytes images/private/rnlfiltblock_sum.c | 93 ++ images/private/rnlfiltblock_sum.dll | Bin 0 -> 6656 bytes images/texture_map.m | 61 + images/xcorrn.m | 39 + images/xeucn.asv | 48 + images/xeucn.m | 49 + matlab/Contents.m | 55 + matlab/arraycrop2dims.m | 58 + matlab/arraycrop_full.m | 70 + matlab/c.m | 10 + matlab/cc.m | 10 + matlab/ccc.m | 11 + matlab/cell2array.m | 51 + matlab/checknumericargs.m | 103 ++ matlab/feval_arrays.m | 78 + matlab/feval_images.m | 128 ++ matlab/feval_mats.m | 83 + matlab/figureresized.m | 42 + matlab/gauss2ellipse.m | 51 + matlab/getargs.m | 78 + matlab/imlabel.m | 100 ++ matlab/ind2sub2.m | 40 + matlab/int2str2.m | 46 + matlab/isfield2.m | 57 + matlab/mat2cell2.m | 42 + matlab/mode.m | 23 + matlab/normpdf2.m | 41 + matlab/num2strs.m | 25 + matlab/plot_ellipse.m | 42 + matlab/plot_gaussellipses.m | 30 + matlab/randint2.m | 28 + matlab/randomsample.m | 55 + matlab/randperm2.m | 40 + matlab/recover_rotation3D.m | 40 + matlab/rotation_matrix2D.m | 25 + matlab/rotation_matrix3D.m | 28 + matlab/simplecache.m | 168 ++ matlab/sub2ind2.m | 44 + matlab/text2.m | 93 ++ matlab/ticstatus.m | 81 + matlab/tocstatus.asv | 81 + matlab/tocstatus.m | 81 + matlab/tps_getwarp.m | 78 + matlab/tps_interpolate.m | 48 + matlab/tps_interpolateimage.m | 33 + matlab/tps_random.m | 41 + 571 files changed, 37682 insertions(+) create mode 100644 classify/Contents.m create mode 100644 classify/clf_data.mat create mode 100644 classify/clf_dectree.m create mode 100644 classify/clf_dectree_fwd.m create mode 100644 classify/clf_dectree_train.m create mode 100644 classify/clf_ecoc.m create mode 100644 classify/clf_ecoc_code.m create mode 100644 classify/clf_knn.m create mode 100644 classify/clf_knn_dist.m create mode 100644 classify/clf_knn_fwd.m create mode 100644 classify/clf_knn_train.m create mode 100644 classify/clf_lda.m create mode 100644 classify/clf_lda_fwd.m create mode 100644 classify/clf_lda_train.m create mode 100644 classify/clf_svm.m create mode 100644 classify/confmatrix.m create mode 100644 classify/confmatrix_show.m create mode 100644 classify/democlassify.m create mode 100644 classify/democluster.m create mode 100644 classify/demogendata.m create mode 100644 classify/dist_L1.m create mode 100644 classify/dist_chisquared.m create mode 100644 classify/dist_emd.m create mode 100644 classify/dist_euclidean.m create mode 100644 classify/distmatrix_show.m create mode 100644 classify/kmeans2.m create mode 100644 classify/meanshift.m create mode 100644 classify/meanshiftim.m create mode 100644 classify/meanshiftim_explore.m create mode 100644 classify/nfoldxval.m create mode 100644 classify/pca.m create mode 100644 classify/pca_apply.m create mode 100644 classify/pca_apply_large.m create mode 100644 classify/pca_data.mat create mode 100644 classify/pca_randomvector.m create mode 100644 classify/pca_visualize.m create mode 100644 classify/private/IDX2order.m create mode 100644 classify/private/meanshift1.c create mode 100644 classify/private/meanshift1.dll create mode 100644 classify/private/meanshift_post.m create mode 100644 classify/softmin.m create mode 100644 classify/visualize_data.m create mode 100644 doc/alpha.png create mode 100644 doc/c++.png create mode 100644 doc/c.png create mode 100644 doc/classify/Contents.html create mode 100644 doc/classify/clf_dectree.html create mode 100644 doc/classify/clf_dectree_fwd.html create mode 100644 doc/classify/clf_dectree_train.html create mode 100644 doc/classify/clf_ecoc.html create mode 100644 doc/classify/clf_ecoc_code.html create mode 100644 doc/classify/clf_knn.html create mode 100644 doc/classify/clf_knn_dist.html create mode 100644 doc/classify/clf_knn_fwd.html create mode 100644 doc/classify/clf_knn_train.html create mode 100644 doc/classify/clf_lda.html create mode 100644 doc/classify/clf_lda_fwd.html create mode 100644 doc/classify/clf_lda_train.html create mode 100644 doc/classify/clf_svm.html create mode 100644 doc/classify/confmatrix.html create mode 100644 doc/classify/confmatrix_show.html create mode 100644 doc/classify/democlassify.html create mode 100644 doc/classify/democluster.html create mode 100644 doc/classify/demogendata.html create mode 100644 doc/classify/dist_L1.html create mode 100644 doc/classify/dist_chisquared.html create mode 100644 doc/classify/dist_emd.html create mode 100644 doc/classify/dist_euclidean.html create mode 100644 doc/classify/distmatrix_show.html create mode 100644 doc/classify/kmeans2.html create mode 100644 doc/classify/meanshift.html create mode 100644 doc/classify/meanshiftim.html create mode 100644 doc/classify/meanshiftim_explore.html create mode 100644 doc/classify/menu.html create mode 100644 doc/classify/nfoldxval.html create mode 100644 doc/classify/pca.html create mode 100644 doc/classify/pca_apply.html create mode 100644 doc/classify/pca_apply_large.html create mode 100644 doc/classify/pca_randomvector.html create mode 100644 doc/classify/pca_visualize.html create mode 100644 doc/classify/private/IDX2order.html create mode 100644 doc/classify/private/meanshift_post.html create mode 100644 doc/classify/private/menu.html create mode 100644 doc/classify/softmin.html create mode 100644 doc/classify/visualize_data.html create mode 100644 doc/demoicon.gif create mode 100644 doc/down.png create mode 100644 doc/filters/Contents.html create mode 100644 doc/filters/FB_apply_2D.html create mode 100644 doc/filters/FB_crop.html create mode 100644 doc/filters/FB_make_1D.html create mode 100644 doc/filters/FB_make_2D.html create mode 100644 doc/filters/FB_make_3D.html create mode 100644 doc/filters/FB_reconstruct_2D.html create mode 100644 doc/filters/FB_visualize_1D.html create mode 100644 doc/filters/FB_visualize_2D.html create mode 100644 doc/filters/filter_DOG_2D.html create mode 100644 doc/filters/filter_DOOG_1D.html create mode 100644 doc/filters/filter_DOOG_2D.html create mode 100644 doc/filters/filter_DOOG_3D.html create mode 100644 doc/filters/filter_binomial_1D.html create mode 100644 doc/filters/filter_gabor_1D.html create mode 100644 doc/filters/filter_gabor_2D.html create mode 100644 doc/filters/filter_gauss_1D.html create mode 100644 doc/filters/filter_gauss_nD.html create mode 100644 doc/filters/filter_steerable.html create mode 100644 doc/filters/filter_visualize_1D.html create mode 100644 doc/filters/filter_visualize_2D.html create mode 100644 doc/filters/filter_visualize_3D.html create mode 100644 doc/filters/menu.html create mode 100644 doc/fortran.png create mode 100644 doc/history.txt create mode 100644 doc/hp.png create mode 100644 doc/images/Contents.html create mode 100644 doc/images/apply_homography.html create mode 100644 doc/images/assign2bins.html create mode 100644 doc/images/clustermontage.html create mode 100644 doc/images/convn_fast.html create mode 100644 doc/images/filmstrip.html create mode 100644 doc/images/filmstrips.html create mode 100644 doc/images/gauss_smooth.html create mode 100644 doc/images/histc_1D.html create mode 100644 doc/images/histc_image.html create mode 100644 doc/images/histc_nD.html create mode 100644 doc/images/histc_sift.html create mode 100644 doc/images/histc_sift_nD.html create mode 100644 doc/images/histmontage.html create mode 100644 doc/images/im.html create mode 100644 doc/images/imageMLG.html create mode 100644 doc/images/imnormalize.html create mode 100644 doc/images/imrotate2.html create mode 100644 doc/images/imshrink.html create mode 100644 doc/images/imsubs2array.html create mode 100644 doc/images/imsubs_resize.html create mode 100644 doc/images/imtranslate.html create mode 100644 doc/images/imwrite2.html create mode 100644 doc/images/imwrite2split.html create mode 100644 doc/images/jitter_image.html create mode 100644 doc/images/jitter_video.html create mode 100644 doc/images/localsum.html create mode 100644 doc/images/localsum_block.html create mode 100644 doc/images/makemovie.html create mode 100644 doc/images/makemovies.html create mode 100644 doc/images/makemoviesets.html create mode 100644 doc/images/makemoviesets2.html create mode 100644 doc/images/mask_circle.html create mode 100644 doc/images/mask_ellipse.html create mode 100644 doc/images/mask_gaussians.html create mode 100644 doc/images/menu.html create mode 100644 doc/images/modefilt1.html create mode 100644 doc/images/montage2.html create mode 100644 doc/images/montages.html create mode 100644 doc/images/montages2.html create mode 100644 doc/images/movie2images.html create mode 100644 doc/images/nonmaxsupr.html create mode 100644 doc/images/nonmaxsupr_list.html create mode 100644 doc/images/nonmaxsupr_window.html create mode 100644 doc/images/normxcorrn.html create mode 100644 doc/images/normxcorrn_fg.html create mode 100644 doc/images/optflow_corr.html create mode 100644 doc/images/optflow_horn.html create mode 100644 doc/images/optflow_lucaskanade.html create mode 100644 doc/images/playmovie.html create mode 100644 doc/images/playmovies.html create mode 100644 doc/images/private/menu.html create mode 100644 doc/images/private/nlfilt_sep.html create mode 100644 doc/images/private/nlfiltblock_sep.html create mode 100644 doc/images/texture_map.html create mode 100644 doc/images/xcorrn.html create mode 100644 doc/images/xeucn.html create mode 100644 doc/index.html create mode 100644 doc/left.png create mode 100644 doc/linux.png create mode 100644 doc/m2html.css create mode 100644 doc/matlab/Contents.html create mode 100644 doc/matlab/arraycrop2dims.html create mode 100644 doc/matlab/arraycrop_full.html create mode 100644 doc/matlab/c.html create mode 100644 doc/matlab/cc.html create mode 100644 doc/matlab/ccc.html create mode 100644 doc/matlab/cell2array.html create mode 100644 doc/matlab/checknumericargs.html create mode 100644 doc/matlab/feval_arrays.html create mode 100644 doc/matlab/feval_images.html create mode 100644 doc/matlab/feval_mats.html create mode 100644 doc/matlab/figureresized.html create mode 100644 doc/matlab/gauss2ellipse.html create mode 100644 doc/matlab/getargs.html create mode 100644 doc/matlab/imlabel.html create mode 100644 doc/matlab/ind2sub2.html create mode 100644 doc/matlab/int2str2.html create mode 100644 doc/matlab/isfield2.html create mode 100644 doc/matlab/mat2cell2.html create mode 100644 doc/matlab/menu.html create mode 100644 doc/matlab/mode.html create mode 100644 doc/matlab/normpdf2.html create mode 100644 doc/matlab/num2strs.html create mode 100644 doc/matlab/plot_ellipse.html create mode 100644 doc/matlab/plot_gaussellipses.html create mode 100644 doc/matlab/randint2.html create mode 100644 doc/matlab/randomsample.html create mode 100644 doc/matlab/randperm2.html create mode 100644 doc/matlab/recover_rotation3D.html create mode 100644 doc/matlab/rotation_matrix2D.html create mode 100644 doc/matlab/rotation_matrix3D.html create mode 100644 doc/matlab/simplecache.html create mode 100644 doc/matlab/sub2ind2.html create mode 100644 doc/matlab/text2.html create mode 100644 doc/matlab/ticstatus.html create mode 100644 doc/matlab/tocstatus.html create mode 100644 doc/matlab/tps_getwarp.html create mode 100644 doc/matlab/tps_interpolate.html create mode 100644 doc/matlab/tps_interpolateimage.html create mode 100644 doc/matlab/tps_random.html create mode 100644 doc/matlabicon.gif create mode 100644 doc/menu.html create mode 100644 doc/mex.png create mode 100644 doc/overview.html create mode 100644 doc/right.png create mode 100644 doc/sgi.png create mode 100644 doc/simulinkicon.gif create mode 100644 doc/solaris.png create mode 100644 doc/up.png create mode 100644 doc/windows.png create mode 100644 external/exportfig/applytofig.m create mode 100644 external/exportfig/exportfig.m create mode 100644 external/exportfig/previewfig.m create mode 100644 external/exportfig/restorefig.m create mode 100644 external/history.txt create mode 100644 external/m2html/@template/char.m create mode 100644 external/m2html/@template/display.m create mode 100644 external/m2html/@template/get.m create mode 100644 external/m2html/@template/parse.m create mode 100644 external/m2html/@template/private/finish.m create mode 100644 external/m2html/@template/private/loadtpl.m create mode 100644 external/m2html/@template/private/subst.m create mode 100644 external/m2html/@template/set.m create mode 100644 external/m2html/@template/template.m create mode 100644 external/m2html/Changelog create mode 100644 external/m2html/Contents.m create mode 100644 external/m2html/GPL create mode 100644 external/m2html/INSTALL create mode 100644 external/m2html/LICENSE create mode 100644 external/m2html/README create mode 100644 external/m2html/TODO create mode 100644 external/m2html/m2html.m create mode 100644 external/m2html/mdot.m create mode 100644 external/m2html/mwizard.m create mode 100644 external/m2html/mwizard2.m create mode 100644 external/m2html/private/doxyread.m create mode 100644 external/m2html/private/doxysearch.m create mode 100644 external/m2html/private/doxywrite.m create mode 100644 external/m2html/private/m2htmltoolbarimages.mat create mode 100644 external/m2html/private/mexexts.m create mode 100644 external/m2html/private/mfileparse.m create mode 100644 external/m2html/private/openfile.m create mode 100644 external/m2html/private/searchindex.m create mode 100644 external/m2html/private/splitcode.m create mode 100644 external/m2html/private/strtok.m create mode 100644 external/m2html/templates/blue/Thumbs.db create mode 100644 external/m2html/templates/blue/alpha.png create mode 100644 external/m2html/templates/blue/c++.png create mode 100644 external/m2html/templates/blue/c.png create mode 100644 external/m2html/templates/blue/demoicon.gif create mode 100644 external/m2html/templates/blue/down.png create mode 100644 external/m2html/templates/blue/doxysearch.php create mode 100644 external/m2html/templates/blue/fortran.png create mode 100644 external/m2html/templates/blue/graph.tpl create mode 100644 external/m2html/templates/blue/hp.png create mode 100644 external/m2html/templates/blue/left.png create mode 100644 external/m2html/templates/blue/linux.png create mode 100644 external/m2html/templates/blue/m2html.css create mode 100644 external/m2html/templates/blue/master.tpl create mode 100644 external/m2html/templates/blue/matlabicon.gif create mode 100644 external/m2html/templates/blue/mdir.tpl create mode 100644 external/m2html/templates/blue/mex.png create mode 100644 external/m2html/templates/blue/mfile.tpl create mode 100644 external/m2html/templates/blue/pcode.png create mode 100644 external/m2html/templates/blue/right.png create mode 100644 external/m2html/templates/blue/search.tpl create mode 100644 external/m2html/templates/blue/sgi.png create mode 100644 external/m2html/templates/blue/simulinkicon.gif create mode 100644 external/m2html/templates/blue/solaris.png create mode 100644 external/m2html/templates/blue/todo.tpl create mode 100644 external/m2html/templates/blue/up.png create mode 100644 external/m2html/templates/blue/windows.png create mode 100644 external/m2html/templates/brain/alpha.png create mode 100644 external/m2html/templates/brain/brain.png create mode 100644 external/m2html/templates/brain/c++.png create mode 100644 external/m2html/templates/brain/c.png create mode 100644 external/m2html/templates/brain/demoicon.gif create mode 100644 external/m2html/templates/brain/down.png create mode 100644 external/m2html/templates/brain/doxysearch.php create mode 100644 external/m2html/templates/brain/fortran.png create mode 100644 external/m2html/templates/brain/graph.tpl create mode 100644 external/m2html/templates/brain/hp.png create mode 100644 external/m2html/templates/brain/index.html create mode 100644 external/m2html/templates/brain/left.png create mode 100644 external/m2html/templates/brain/linux.png create mode 100644 external/m2html/templates/brain/m2html.css create mode 100644 external/m2html/templates/brain/master.tpl create mode 100644 external/m2html/templates/brain/matlabicon.gif create mode 100644 external/m2html/templates/brain/mdir.tpl create mode 100644 external/m2html/templates/brain/menu.css create mode 100644 external/m2html/templates/brain/mex.png create mode 100644 external/m2html/templates/brain/mfile.tpl create mode 100644 external/m2html/templates/brain/pcode.png create mode 100644 external/m2html/templates/brain/right.png create mode 100644 external/m2html/templates/brain/search.tpl create mode 100644 external/m2html/templates/brain/sgi.png create mode 100644 external/m2html/templates/brain/simulinkicon.gif create mode 100644 external/m2html/templates/brain/solaris.png create mode 100644 external/m2html/templates/brain/todo.tpl create mode 100644 external/m2html/templates/brain/up.png create mode 100644 external/m2html/templates/brain/windows.png create mode 100644 external/m2html/templates/frame-piotr/alpha.png create mode 100644 external/m2html/templates/frame-piotr/c++.png create mode 100644 external/m2html/templates/frame-piotr/c.png create mode 100644 external/m2html/templates/frame-piotr/demoicon.gif create mode 100644 external/m2html/templates/frame-piotr/down.png create mode 100644 external/m2html/templates/frame-piotr/fortran.png create mode 100644 external/m2html/templates/frame-piotr/graph.tpl create mode 100644 external/m2html/templates/frame-piotr/hp.png create mode 100644 external/m2html/templates/frame-piotr/index.html create mode 100644 external/m2html/templates/frame-piotr/left.png create mode 100644 external/m2html/templates/frame-piotr/linux.png create mode 100644 external/m2html/templates/frame-piotr/m2html.css create mode 100644 external/m2html/templates/frame-piotr/master.tpl create mode 100644 external/m2html/templates/frame-piotr/matlabicon.gif create mode 100644 external/m2html/templates/frame-piotr/mdir.tpl create mode 100644 external/m2html/templates/frame-piotr/mex.png create mode 100644 external/m2html/templates/frame-piotr/mfile.tpl create mode 100644 external/m2html/templates/frame-piotr/overview.html create mode 100644 external/m2html/templates/frame-piotr/right.png create mode 100644 external/m2html/templates/frame-piotr/sgi.png create mode 100644 external/m2html/templates/frame-piotr/simulinkicon.gif create mode 100644 external/m2html/templates/frame-piotr/solaris.png create mode 100644 external/m2html/templates/frame-piotr/todo.tpl create mode 100644 external/m2html/templates/frame-piotr/up.png create mode 100644 external/m2html/templates/frame-piotr/windows.png create mode 100644 external/m2html/templates/frame/alpha.png create mode 100644 external/m2html/templates/frame/c++.png create mode 100644 external/m2html/templates/frame/c.png create mode 100644 external/m2html/templates/frame/demoicon.gif create mode 100644 external/m2html/templates/frame/down.png create mode 100644 external/m2html/templates/frame/doxysearch.php create mode 100644 external/m2html/templates/frame/fortran.png create mode 100644 external/m2html/templates/frame/graph.tpl create mode 100644 external/m2html/templates/frame/hp.png create mode 100644 external/m2html/templates/frame/index.html create mode 100644 external/m2html/templates/frame/left.png create mode 100644 external/m2html/templates/frame/linux.png create mode 100644 external/m2html/templates/frame/m2html.css create mode 100644 external/m2html/templates/frame/master.tpl create mode 100644 external/m2html/templates/frame/matlabicon.gif create mode 100644 external/m2html/templates/frame/mdir.tpl create mode 100644 external/m2html/templates/frame/mex.png create mode 100644 external/m2html/templates/frame/mfile.tpl create mode 100644 external/m2html/templates/frame/pcode.png create mode 100644 external/m2html/templates/frame/right.png create mode 100644 external/m2html/templates/frame/search.tpl create mode 100644 external/m2html/templates/frame/sgi.png create mode 100644 external/m2html/templates/frame/simulinkicon.gif create mode 100644 external/m2html/templates/frame/solaris.png create mode 100644 external/m2html/templates/frame/todo.tpl create mode 100644 external/m2html/templates/frame/up.png create mode 100644 external/m2html/templates/frame/windows.png create mode 100644 external/m2html/templates/menu-for-frame-piotr.html create mode 100644 external/matrix2latex.m create mode 100644 external/svm/Contents.m create mode 100644 external/svm/License.txt create mode 100644 external/svm/Readme.txt create mode 100644 external/svm/code14-11 create mode 100644 external/svm/consist.m create mode 100644 external/svm/demecoc1.m create mode 100644 external/svm/demecoc1.mat create mode 100644 external/svm/demsvm1.m create mode 100644 external/svm/demsvm2.m create mode 100644 external/svm/demsvm3.m create mode 100644 external/svm/ecoc-codes.tar.gz create mode 100644 external/svm/ecoc.m create mode 100644 external/svm/ecocfwd.m create mode 100644 external/svm/ecocload.m create mode 100644 external/svm/ecoctrain.m create mode 100644 external/svm/loqo.c create mode 100644 external/svm/loqo.dll create mode 100644 external/svm/pr_loqo.c create mode 100644 external/svm/pr_loqo.h create mode 100644 external/svm/svm toolbox.URL create mode 100644 external/svm/svm.m create mode 100644 external/svm/svmcv.m create mode 100644 external/svm/svmfwd.m create mode 100644 external/svm/svmkernel.m create mode 100644 external/svm/svmstat.m create mode 100644 external/svm/svmtrain.m create mode 100644 external/toolbox_compile.m create mode 100644 external/toolbox_generatedoc.m create mode 100644 external/toolbox_updateallinfo.m create mode 100644 external/xmltree/@xmltree/Contents.m create mode 100644 external/xmltree/@xmltree/add.m create mode 100644 external/xmltree/@xmltree/attributes.m create mode 100644 external/xmltree/@xmltree/branch.m create mode 100644 external/xmltree/@xmltree/char.m create mode 100644 external/xmltree/@xmltree/children.m create mode 100644 external/xmltree/@xmltree/convert.m create mode 100644 external/xmltree/@xmltree/copy.m create mode 100644 external/xmltree/@xmltree/delete.m create mode 100644 external/xmltree/@xmltree/display.m create mode 100644 external/xmltree/@xmltree/find.m create mode 100644 external/xmltree/@xmltree/flush.m create mode 100644 external/xmltree/@xmltree/get.m create mode 100644 external/xmltree/@xmltree/getfilename.m create mode 100644 external/xmltree/@xmltree/isfield.m create mode 100644 external/xmltree/@xmltree/length.m create mode 100644 external/xmltree/@xmltree/move.m create mode 100644 external/xmltree/@xmltree/parent.m create mode 100644 external/xmltree/@xmltree/private/xml_findstr.c create mode 100644 external/xmltree/@xmltree/private/xml_findstr.dll create mode 100644 external/xmltree/@xmltree/private/xml_findstr.m create mode 100644 external/xmltree/@xmltree/private/xml_parser.m create mode 100644 external/xmltree/@xmltree/root.m create mode 100644 external/xmltree/@xmltree/save.m create mode 100644 external/xmltree/@xmltree/set.m create mode 100644 external/xmltree/@xmltree/setfilename.m create mode 100644 external/xmltree/@xmltree/view.m create mode 100644 external/xmltree/@xmltree/xmltree.m create mode 100644 external/xmltree/GPL create mode 100644 external/xmltree/INSTALL create mode 100644 external/xmltree/LICENSE create mode 100644 external/xmltree/README create mode 100644 external/xmltree/TODO create mode 100644 external/xmltree/struct2xml.m create mode 100644 external/xmltree/view_ui.m create mode 100644 external/xmltree/xmldemo1.m create mode 100644 external/xmltree/xmldemo2.m create mode 100644 external/xmltree/xmldemo3.m create mode 100644 filters/Contents.m create mode 100644 filters/FB_DoG.mat create mode 100644 filters/FB_apply_2D.m create mode 100644 filters/FB_crop.m create mode 100644 filters/FB_gabor.mat create mode 100644 filters/FB_make_1D.m create mode 100644 filters/FB_make_2D.m create mode 100644 filters/FB_make_3D.m create mode 100644 filters/FB_reconstruct_2D.m create mode 100644 filters/FB_visualize_1D.m create mode 100644 filters/FB_visualize_2D.m create mode 100644 filters/filter_DOG_2D.m create mode 100644 filters/filter_DOOG_1D.m create mode 100644 filters/filter_DOOG_2D.m create mode 100644 filters/filter_DOOG_3D.m create mode 100644 filters/filter_binomial_1D.m create mode 100644 filters/filter_gabor_1D.m create mode 100644 filters/filter_gabor_2D.m create mode 100644 filters/filter_gauss_1D.m create mode 100644 filters/filter_gauss_nD.m create mode 100644 filters/filter_steerable.m create mode 100644 filters/filter_visualize_1D.m create mode 100644 filters/filter_visualize_2D.m create mode 100644 filters/filter_visualize_3D.m create mode 100644 images/Contents.m create mode 100644 images/apply_homography.m create mode 100644 images/assign2bins.m create mode 100644 images/clustermontage.m create mode 100644 images/convn_fast.m create mode 100644 images/filmstrip.m create mode 100644 images/filmstrips.m create mode 100644 images/gauss_smooth.m create mode 100644 images/histc_1D.m create mode 100644 images/histc_image.m create mode 100644 images/histc_nD.m create mode 100644 images/histc_sift.m create mode 100644 images/histc_sift_nD.m create mode 100644 images/histmontage.m create mode 100644 images/im.m create mode 100644 images/imageMLG.m create mode 100644 images/images.mat create mode 100644 images/imnormalize.m create mode 100644 images/imrotate2.m create mode 100644 images/imshrink.m create mode 100644 images/imsubs2array.m create mode 100644 images/imsubs_resize.m create mode 100644 images/imtranslate.m create mode 100644 images/imwrite2.m create mode 100644 images/imwrite2split.m create mode 100644 images/jitter_image.m create mode 100644 images/jitter_video.m create mode 100644 images/localsum.m create mode 100644 images/localsum_block.m create mode 100644 images/makemovie.m create mode 100644 images/makemovies.m create mode 100644 images/makemoviesets.m create mode 100644 images/makemoviesets2.m create mode 100644 images/mask_circle.m create mode 100644 images/mask_ellipse.m create mode 100644 images/mask_gaussians.m create mode 100644 images/modefilt1.m create mode 100644 images/montage2.m create mode 100644 images/montages.m create mode 100644 images/montages2.m create mode 100644 images/movie2images.m create mode 100644 images/nonmaxsupr.m create mode 100644 images/nonmaxsupr_list.m create mode 100644 images/nonmaxsupr_window.m create mode 100644 images/normxcorrn.m create mode 100644 images/normxcorrn_fg.m create mode 100644 images/optflow_corr.m create mode 100644 images/optflow_data.mat create mode 100644 images/optflow_horn.m create mode 100644 images/optflow_lucaskanade.m create mode 100644 images/playmovie.m create mode 100644 images/playmovies.m create mode 100644 images/private/assign2binsc.c create mode 100644 images/private/assign2binsc.dll create mode 100644 images/private/findBin.c create mode 100644 images/private/histc_nD_c.c create mode 100644 images/private/histc_nD_c.dll create mode 100644 images/private/mask_ellipse1.c create mode 100644 images/private/mask_ellipse1.dll create mode 100644 images/private/nlfilt_sep.m create mode 100644 images/private/nlfiltblock_sep.m create mode 100644 images/private/rnlfilt_max.c create mode 100644 images/private/rnlfilt_max.dll create mode 100644 images/private/rnlfilt_sum.c create mode 100644 images/private/rnlfilt_sum.dll create mode 100644 images/private/rnlfiltblock_sum.c create mode 100644 images/private/rnlfiltblock_sum.dll create mode 100644 images/texture_map.m create mode 100644 images/xcorrn.m create mode 100644 images/xeucn.asv create mode 100644 images/xeucn.m create mode 100644 matlab/Contents.m create mode 100644 matlab/arraycrop2dims.m create mode 100644 matlab/arraycrop_full.m create mode 100644 matlab/c.m create mode 100644 matlab/cc.m create mode 100644 matlab/ccc.m create mode 100644 matlab/cell2array.m create mode 100644 matlab/checknumericargs.m create mode 100644 matlab/feval_arrays.m create mode 100644 matlab/feval_images.m create mode 100644 matlab/feval_mats.m create mode 100644 matlab/figureresized.m create mode 100644 matlab/gauss2ellipse.m create mode 100644 matlab/getargs.m create mode 100644 matlab/imlabel.m create mode 100644 matlab/ind2sub2.m create mode 100644 matlab/int2str2.m create mode 100644 matlab/isfield2.m create mode 100644 matlab/mat2cell2.m create mode 100644 matlab/mode.m create mode 100644 matlab/normpdf2.m create mode 100644 matlab/num2strs.m create mode 100644 matlab/plot_ellipse.m create mode 100644 matlab/plot_gaussellipses.m create mode 100644 matlab/randint2.m create mode 100644 matlab/randomsample.m create mode 100644 matlab/randperm2.m create mode 100644 matlab/recover_rotation3D.m create mode 100644 matlab/rotation_matrix2D.m create mode 100644 matlab/rotation_matrix3D.m create mode 100644 matlab/simplecache.m create mode 100644 matlab/sub2ind2.m create mode 100644 matlab/text2.m create mode 100644 matlab/ticstatus.m create mode 100644 matlab/tocstatus.asv create mode 100644 matlab/tocstatus.m create mode 100644 matlab/tps_getwarp.m create mode 100644 matlab/tps_interpolate.m create mode 100644 matlab/tps_interpolateimage.m create mode 100644 matlab/tps_random.m diff --git a/classify/Contents.m b/classify/Contents.m new file mode 100644 index 00000000..3b636628 --- /dev/null +++ b/classify/Contents.m @@ -0,0 +1,45 @@ +% CLASSIFY +% See also +% +% Clustering: +% democluster - Clustering demo. +% demogendata - Generate data drawn form a mixture of Gaussians. +% kmeans2 - Very fast version of kmeans clustering. +% meanshift - meanshift clustering algorithm. +% meanshiftim - Applies the meanshift algorithm to a joint spatial/range image. +% meanshiftim_explore - Visualization to help choose sigmas for meanshiftim. +% +% Calculating distances efficiently: +% dist_L1 - Calculates the L1 Distance between vectors (ie the City-Block distance). +% dist_chisquared - Calculates the Chi Squared Distance between vectors (usually histograms). +% dist_emd - Calculates Earth Mover's Distance (EMD) between positive vectors. +% dist_euclidean - Calculates the Euclidean distance between vectors [FAST]. +% distmatrix_show - Useful visualization of a distance matrix of clustered points. +% softmin - Calculates the softmin of a vector. +% +% Principal components analysis: +% pca - principal components analysis (alternative to princomp). +% pca_apply - Companion function to pca. +% pca_apply_large - Wrapper for pca_apply that allows for application to large X. +% pca_randomvector - Generate random vectors in PCA subspace. +% pca_visualize - Visualization of quality of approximation of X given principal components. +% visualize_data - Project high dim. data unto principal components (PCA) for visualization. +% +% Classification methods with a common interface: +% democlassify - A demo used to test and demonstrate the usage of classifiers (clf_*) +% nfoldxval - Runs n-fold cross validation on data with a given classifier. +% confmatrix - Generates a confusion matrix according to true and predicted data labels. +% confmatrix_show - Used to display a confusion matrix. +% clf_dectree - Wrapper for treefit that makes decision trees compatible with nfoldxval. +% clf_dectree_fwd - Apply the decision tree to data X. +% clf_dectree_train - Train a decision tree classifier. +% clf_ecoc - Wrapper for ecoc that makes ecoc compatible with nfoldxval. +% clf_ecoc_code - Generates optimal ECOC codes when 3<=nclasses<=7. +% clf_knn - Create a k nearest neighbor classifier. +% clf_knn_dist - k-nearest neighbor classifier based on a distance matrix D. +% clf_knn_fwd - Apply a k-nearest neighbor classifier to X. +% clf_knn_train - Train a k nearest neighbor classifier (memorization). +% clf_lda - Create a Linear Discriminant Analysis (LDA) classifier. +% clf_lda_fwd - Apply the Linear Discriminant Analysis (LDA) classifier to data X. +% clf_lda_train - Train a Linear Discriminant Analysis (LDA) classifier. +% clf_svm - Wrapper for svm that makes svm compatible with nfoldxval. diff --git a/classify/clf_data.mat b/classify/clf_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..014f0a464041a49d7caa013162d44c99da372b1f GIT binary patch literal 479768 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%0D_KE%AoC$-%w=?lEZYd~S z;~Lm28w@$RJn<&8g^-Z@F8cITHYmqM);~0BK*j8ekk$X{u$tz-qiXfdka7Nt@uBx6 zaB8X3nAa^I*;^QB3fE&%%6e(Ah^G-4FZ-OP6RHPq^2Br7_)3)9{WY8^sS|crZgVD| z&j+d-eHvteOknQ+^_#);1#~C4k|n5pVgHw($8tvAz{~Rc&))EP;E=ds7E`%B#_ylg z)XeRH!1d{$%aje6vMByrn&3?h>hVGw^5gU4WhL0kvTH*sq!=kZPQT0EPl7^Q zTO%$RXWX#<$?PLI3@P*JQ%r78pnLJ=O#{z9=sv79FvjhNLA+~4KBmOpbhunqgVhzN zweI~XobZM>@*dyB*PDTlmrlB$ut?YRSo~LNp#$;zMcXD6W8pRn?VtUz^|0*LC|68X z2CR8!*gZcKBg5|4(zr}Fi2Tne?x%VL2xK)z^xg=?%n0T=E~+@_JG%SFzWxB*&FH=8 ze76nxLXWE)WGcskwAnppyqfXvzUw9#S> z&&Wb93G1G4?VEZL55GE7<}=kE;(Pgn8S{T4V19I6*dT%MSFp!($4L@cfMd?oKjJ&F zmG{flqT@r@BzjFjQ@sxtMBaybxMZNp3kTPeF2wwMAo9j+c`=03Uzg8vuE76-*d#Io zYOwbSIgrE?kBj^hCOeNm!GPIjv5S@&$eKO$k9o5R#6OS!xWLf`$2+B-opiPW3x!6* zSVHetp%Z`d`;~TF7ZdZ`v`m5M^5y95A2q-#ajx2#r4dR(t-t0nl^}(u>~NiBKWfYj z^Uv{i;p~I4wU@8jFo@1~Q}kRjE@X?*H%Suvm9-Lk4)Jo-=wp+3Tc3;TtrZ=0MX|`X za`u-cYc__=bj8R|k>TY;mbkNP2T-^<>DLjwonzVoRIvdSkS2S6A~FQQ`JBbo*kC`9 z+m+L^i_kIL?$X|QpV&vTa%J25?n01KyyeW;U99~h_qcB^RUEPpFQ z@};9Y`^!?`mzeB@dd@0%en{4aeum(!FB~xvP9pg14Q1a0>3Sg}TD);mw*zF2t~u;c zE5M2vn@_ey<5=Xv!cJQ^jd9f`c4D*>D0b*REw?2gzsCrI2-I_ubBer|#gbw

Q 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

~ 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⩔lqS-d{;M| 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 literal 0 HcmV?d00001 diff --git a/classify/clf_dectree.m b/classify/clf_dectree.m new file mode 100644 index 00000000..e706a876 --- /dev/null +++ b/classify/clf_dectree.m @@ -0,0 +1,25 @@ +% Wrapper for treefit that makes decision trees compatible with nfoldxval. +% +% INPUTS +% p - data dimension +% params - parameters for treefit, ex: 'splitmin'',2,'priorprob',ones(1,n)/n +% +% OUTPUTS +% clf - model ready to be trained +% +% DATESTAMP +% 11-Oct-2005 2:45pm +% +% See also NFOLDXVAL, TREEFIT + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function clf = clf_dectree( p, varargin ) + clf.p = p; + clf.type = 'dectree'; + clf.params = varargin; + + clf.fun_train = @clf_dectree_train; + clf.fun_fwd = @clf_dectree_fwd; diff --git a/classify/clf_dectree_fwd.m b/classify/clf_dectree_fwd.m new file mode 100644 index 00000000..4a7456c1 --- /dev/null +++ b/classify/clf_dectree_fwd.m @@ -0,0 +1,25 @@ +% Apply the decision tree to data X. +% +% INPUTS +% clf - trained model +% X - nxp data array +% +% OUTPUTS +% Y - nx1 vector of labels predicted according to the clf +% +% DATESTAMP +% 11-Oct-2005 2:45pm +% +% See also CLF_DECTREE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function Y = clf_dectree_fwd( clf, X ) + if( ~strcmp( clf.type, 'dectree' ) ) error( ['incorrect type: ' clf.type] ); end; + if( size(X,2)~= clf.p ) error( 'Incorrect data dimension' ); end; + T = clf.T; + + [Y,d,cnames] = treeval( T, X ); + Y = str2double( cnames ); % convert Y back to an int format diff --git a/classify/clf_dectree_train.m b/classify/clf_dectree_train.m new file mode 100644 index 00000000..56797dc7 --- /dev/null +++ b/classify/clf_dectree_train.m @@ -0,0 +1,34 @@ +% Train a decision tree classifier. +% +% INPUTS +% clf - model to be trained +% X - nxp data array +% Y - nx1 array of labels +% +% OUTPUTS +% clf - a trained binary clf_LDA clf +% +% DATESTAMP +% 11-Oct-2005 2:45pm +% +% See also CLF_DECTREE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function clf = clf_dectree_train( clf, X, Y ) + if( ~strcmp( clf.type, 'dectree' ) ) error( ['incorrect type: ' clf.type] ); end; + if( size(X,2)~= clf.p ) error( 'Incorrect data dimension' ); end; + + % apply treefit + Y = int2str2( Y ); % convert Y to string format for treefit. + params = clf.params; + T = treefit(X,Y,'method','classification',params{:}); + + % apply cross validation (on training data), and prune + [c,s,n,best] = treetest(T,'cross',X,Y); + T = treeprune(T,'level',best); + + clf.T = T; + diff --git a/classify/clf_ecoc.m b/classify/clf_ecoc.m new file mode 100644 index 00000000..59e1a7d1 --- /dev/null +++ b/classify/clf_ecoc.m @@ -0,0 +1,43 @@ +% Wrapper for ecoc that makes ecoc compatible with nfoldxval. +% +% Requires the SVM toolbox by Anton Schwaighofer. +% +% INPUTS +% p - data dimension +% clfinit - binary classifier init (see nfoldxval) +% clfparams - binary classifier parameters (see nfoldxval) +% nclasses - number of classes (currently only 3<=nclasses<=7 suppored) +% use01targets - see ecoc +% +% OUTPUTS +% clf - see ecoc +% +% DATESTAMP +% 11-Oct-2005 2:45pm +% +% See also ECOC, NFOLDXVAL, CLF_ECOC_CODE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function clf = clf_ecoc(p,clfinit,clfparams,nclasses,use01targets) + if( nclasses<3 || nclasses>7 ) + error( 'currently only works if 3<=nclasses<=7'); end; + if( nargin<5 || isempty(use01targets)) use01targets=0; end; + + % create code (limited for now) + [C,nbits] = clf_ecoc_code( nclasses ); + clf = ecoc(nclasses, nbits, C ); + clf.verbosity = 0; % don't diplay output + + % initialize and temporarily store binary learner + clf.templearner = feval( clfinit, p, clfparams{:} ); + + % ecoctrain2 is custom version of ecoctrain + clf.fun_train = @clf_ecoctrain; + clf.fun_fwd = @ecocfwd; + + +function clf = clf_ecoctrain( clf, varargin ) + clf = ecoctrain( clf, clf.templearner, varargin{:} ); diff --git a/classify/clf_ecoc_code.m b/classify/clf_ecoc_code.m new file mode 100644 index 00000000..ce24f1fb --- /dev/null +++ b/classify/clf_ecoc_code.m @@ -0,0 +1,32 @@ +% Generates optimal ECOC codes when 3<=nclasses<=7. +% +% INPUTS +% nclasses - number of classes +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also CLF_ECOC + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [C,nbits] = clf_ecoc_code( k ) + if( k<3 || k>7 ) + error( 'method only works if k is small: 3<=k<=7'); end; + + % create C + C = ones(k,2^(k-1)); + for i=2:k + partw = 2^(k-i); nparts = 2^(i-2); + row = [zeros(1,partw) ones(1,partw)]; + row = repmat( row, 1, nparts ); + C(i,:) = row; + end + C = C(:,1:end-1); + nbits = size(C,2); + + % alter C to have entries [-1,1] + C(C==0)=-1; + diff --git a/classify/clf_knn.m b/classify/clf_knn.m new file mode 100644 index 00000000..ba158b21 --- /dev/null +++ b/classify/clf_knn.m @@ -0,0 +1,28 @@ +% Create a k nearest neighbor classifier. +% +% INPUTS +% p - data dimension +% k - number of nearest neighbors to look at +% dist_fn - [optional] distance function, squared euclidean by default +% +% OUTPUTS +% clf - model ready to be trained +% +% DATESTAMP +% 11-Oct-2005 2:45pm +% +% See also NFOLDXVAL, CLF_KNN_TRAIN, CLF_KNN_FWD + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function clf = clf_knn( p, k, dist_fn ) + if( nargin<3 ) dist_fn = @dist_euclidean; end; + + clf.p = p; + clf.type = 'knn'; + clf.k = k; + clf.dist_fn = dist_fn; + clf.fun_train = @clf_knn_train; + clf.fun_fwd = @clf_knn_fwd; diff --git a/classify/clf_knn_dist.m b/classify/clf_knn_dist.m new file mode 100644 index 00000000..47658c26 --- /dev/null +++ b/classify/clf_knn_dist.m @@ -0,0 +1,59 @@ +% k-nearest neighbor classifier based on a distance matrix D. +% +% k==1 is much faster than k>1. For k>1, ties are broken randomly. +% +% INPUTS +% D - MxN array of distances from M-TEST points to N-TRAIN points. +% IDX - ntrain length vector of class memberships +% if IDX(i)==IDX(j) than sample i and j are part of the same class +% k - [optional] number of nearest neighbors to use, 1 by default +% +% OUTPUTS +% IDXpred - length M vector of classes for training data +% +% EXAMPLE +% % [given D and IDX] +% for k=1:size(D,2) err(k)=sum(IDX==clf_knn_dist(D,IDX,k)); end; +% figure(1); plot(err) +% +% DATESTAMP +% 11-Oct-2005 8:00pm +% +% See also CLF_KNN + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function IDXpred = clf_knn_dist( D, IDX, k ) + if( nargin<3 | isempty(k) ) k=1; end; + + [n ntrain] = size(D); + if( ntrain ~= length(IDX) ); + error('Distance matrix and IDX vector dimensions do not match.'); end; + + %%% 1NN [fast and easy] + if( k==1 ) + [dis,Dind]=min(D,[],2); + IDXpred=IDX(Dind); + + %%% kNN + else + [IDXnames,dis,IDX]=unique(IDX); + + %%% get closests k prototypes [n x k matrix] + [D,knns_inds] = sort(D,2); + knns_inds = knns_inds(:,1:k); + knns = IDX(knns_inds); + if( n==1 ) knns = knns'; end; + + %%% get counts of each of the prototypes + nclasses = max(IDX); + counts = zeros(n,nclasses); + for i=1:nclasses counts(:,i)=sum(knns==i,2); end; + counts = counts + randn(size(counts))/1000; % hack to break ties randomly! + [ counts, classes ] = sort(counts,2,'descend'); + + %%% get IDXpred + IDXpred = IDXnames( classes(:,1) ); + end diff --git a/classify/clf_knn_fwd.m b/classify/clf_knn_fwd.m new file mode 100644 index 00000000..c6492aa0 --- /dev/null +++ b/classify/clf_knn_fwd.m @@ -0,0 +1,31 @@ +% Apply a k-nearest neighbor classifier to X. +% +% INPUTS +% clf - trained model +% X - nxp data array +% +% OUTPUTS +% Y - nx1 vector of labels predicted according to the clf +% +% DATESTAMP +% 11-Oct-2005 2:45pm +% +% See also CLF_KNN, CLF_KNN_TRAIN + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function Y = clf_knn_fwd( clf, X ) + if( ~strcmp( clf.type, 'knn' ) ) error( ['incorrect type: ' clf.type] ); end; + if( size(X,2)~= clf.p ) error( 'Incorrect data dimension' ); end; + + dist_fn = clf.dist_fn; + Xtrain = clf.Xtrain; + Ytrain = clf.Ytrain; + k = clf.k; + n = size(X,1); + + % get nearest neighbors for each X point + D = feval( dist_fn, X, Xtrain ); + Y = clf_knn_dist( D, Ytrain, k ); diff --git a/classify/clf_knn_train.m b/classify/clf_knn_train.m new file mode 100644 index 00000000..b80976f8 --- /dev/null +++ b/classify/clf_knn_train.m @@ -0,0 +1,31 @@ +% Train a k nearest neighbor classifier (memorization). +% +% INPUTS +% clf - model to be trained +% X - nxp data array +% Y - nx1 array of labels +% +% OUTPUTS +% clf - a trained k-nearest neighbor classifier. +% +% DATESTAMP +% 11-Oct-2005 2:45pm +% +% See also CLF_KNN, CLF_KNN_FWD + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function clf = clf_knn_train( clf, X, Y ) + if( ~strcmp( clf.type, 'knn' ) ) error( ['incorrect type: ' clf.type] ); end; + if( size(X,2)~= clf.p ) error( 'Incorrect data dimension' ); end; + + %%% error check + n=size(X,1); Y=double(Y); + [Y,er] = checknumericargs( Y, [n 1], 0, 0 ); error(er); + + %%% training is memorization + clf.Xtrain = X; + clf.Ytrain = Y; + diff --git a/classify/clf_lda.m b/classify/clf_lda.m new file mode 100644 index 00000000..0d2b83f2 --- /dev/null +++ b/classify/clf_lda.m @@ -0,0 +1,45 @@ +% Create a Linear Discriminant Analysis (LDA) classifier. +% +% Same algorithm as matlab's function 'classify' (in the statistics toolbox). Nice +% to have in form that actually stores a model that can be applied multiple times. +% +% For the meaning and usage of prior and type see classify.m +% +% INPUTS +% p - data dimension +% type - [optional] 'linear', 'quadratic', 'mahalanobis' [see classify.m] +% prior - [optional] prior to use [see classify.m] +% +% OUTPUTS +% clf - an clf_LDA model ready to be trained (see clf_lda_train) +% +% DATESTAMP +% 11-Oct-2005 2:45pm +% +% See also NFOLDXVAL, CLASSIFY, CLF_LDA_TRAIN, CLF_LDA_FWD + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function clf = clf_lda( p, type, prior ) + if( nargin<3 ) prior = []; end; + + %%% get type + if( nargin < 2 | isempty(type) ) + type = 1; % 'linear' + elseif ischar(type) + i = strmatch(lower(type), strvcat('linear','quadratic','mahalanobis')); + if( length(i) > 1 ) error('Ambiguous value for TYPE: %s.', type); + elseif isempty(i) error('Unknown value for TYPE: %s.', type); end; + type = i; + else error('TYPE must be a string.'); end; + + + %%% save clf_lda parameters + clf.prior = prior; + clf.p = p; + clf.type = 'lda'; + clf.clf_lda_type = type; + clf.fun_train = @clf_lda_train; + clf.fun_fwd = @clf_lda_fwd; diff --git a/classify/clf_lda_fwd.m b/classify/clf_lda_fwd.m new file mode 100644 index 00000000..61769a40 --- /dev/null +++ b/classify/clf_lda_fwd.m @@ -0,0 +1,70 @@ +% Apply the Linear Discriminant Analysis (LDA) classifier to data X. +% +% INPUTS +% clf - trained model +% X - nxp data array +% +% OUTPUTS +% Y - nx1 vector of labels predicted according to the model +% +% DATESTAMP +% 11-Oct-2005 2:45pm +% +% See also CLF_LDA, CLF_LDA_TRAIN + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function Y = clf_LDAfwd( clf, X ) + if( ~strcmp( clf.type, 'lda' ) ) error( ['incorrect type: ' clf.type] ); end; + if( size(X,2)~= clf.p ) error( 'Incorrect data dimension' ); end; + + %%% get clf settings + type = clf.clf_lda_type; + prior = clf.prior; + gmeans = clf.gmeans; + gtype = clf.gtype; + groups = clf.groups; + ngroups = clf.ngroups; + + %%% calculate D matrix + n = size(X,1); D = repmat(NaN, n, ngroups); + switch type + case 1 % 'linear' + % MVN relative log posterior density, by group, for each X + R = clf.R; + for k = 1:ngroups + A = (X - repmat(gmeans(k,:), n, 1)) / R; + D(:,k) = log(prior(k)) - .5*sum(A .* A, 2); + end + case {2,3} % 'quadratic' or 'mahalanobis' + for k = 1:ngroups + R=clf.RS{k}; + A = (X - repmat(gmeans(k,:), n, 1)) / R; + switch type + case 2 % 'quadratic' + % MVN relative log posterior density, by group, for each X + D(:,k) = log(prior(k)) - .5*(sum(A .* A, 2) + log(prod(diag(R))^2)); + case 3 % 'mahalanobis' + % Negative squared Mahalanobis distance, by group, for each + % X. Prior probabilities are not used + D(:,k) = -sum(A .* A, 2); + end + end + end + + %%% find nearest group to each observation in X data + [tmp Y] = max(D, [], 2); + + %%% Convert back to original grouping variable + if isnumeric(gtype) + groups = str2num(char(groups)); + Y = groups(Y); + elseif ischar(gtype) + groups = char(groups); + Y = groups(Y,:); + else %if iscellstr(group) + Y = groups(Y); + end + diff --git a/classify/clf_lda_train.m b/classify/clf_lda_train.m new file mode 100644 index 00000000..aa0a9133 --- /dev/null +++ b/classify/clf_lda_train.m @@ -0,0 +1,106 @@ +% Train a Linear Discriminant Analysis (LDA) classifier. +% +% INPUTS +% clf - model to be trained +% X - nxp data array +% Y - nx1 array of labels (or cell array, see classify.m) +% +% OUTPUTS +% clf - a trained clf_LDA model +% +% DATESTAMP +% 11-Oct-2005 2:45pm +% +% See also CLF_LDA, CLF_LDA_FWD + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function clf = clf_lda_train( clf, X, Y ) + if( ~strcmp( clf.type, 'lda' ) ) error( ['incorrect type: ' clf.type] ); end; + if( size(X,2)~= clf.p ) error( 'Incorrect data dimension' ); end; + %er = consist( clf, , X ); error(er); + prior = clf.prior; type = clf.clf_lda_type; + + % grp2idx sorts a numeric grouping var ascending, and a string grouping + % var by order of first occurrence + [gindex,groups] = grp2idx(Y); gtype = Y(1); + ngroups = length(groups); + gsize = hist(gindex,1:ngroups); + [n,d] = size(X); + + %%% GET PRIOR ACCORDINGLY + if isempty(prior) + % Default to a uniform prior + prior = ones(1, ngroups) / ngroups; + elseif ischar(prior) & ~isempty(strmatch(lower(prior), 'empirical')) + % Estimate prior from relative Y sizes + prior = gsize(:)' / sum(gsize); + elseif isnumeric(prior) + % Explicit prior + if min(size(prior)) ~= 1 | max(size(prior)) ~= ngroups + error('PRIOR must be a vector one element for each Y.'); + elseif any(prior < 0) + error('PRIOR cannot contain negative values.'); end; + prior = prior(:)' / sum(prior); % force a normalized row vector + elseif isstruct(prior) + [pgindex,pgroups] = grp2idx(prior.Y); + ord = repmat(NaN,1,ngroups); + for i = 1:ngroups + j = strmatch(groups(i), pgroups(pgindex), 'exact'); + if ~isempty(j) ord(i) = j; end; + end + if any(isnan(ord)) + error('PRIOR.Y must contain all of the unique values in GROUP.'); end; + prior = prior.prob(ord); + if any(prior < 0) + error('PRIOR.prob cannot contain negative values.'); end; + prior = prior(:)' / sum(prior); % force a normalized row vector + else + error('PRIOR must be a a vector, a structure, or the string ''empirical''.'); + end + + + %%% get means for each group + gmeans = repmat(NaN, ngroups, d); + for k = 1:ngroups + gmeans(k,:) = mean(X(find(gindex == k),:),1); end; + + + %%% get R (or RS) + switch type + case 1 % 'linear' + if n <= ngroups + error('TRAINING must have more observs than the number of groups.'); end; + + % Pooled estimate of covariance + [Q,R] = qr(X - gmeans(gindex,:), 0); + R = R / sqrt(n - ngroups); % SigmaHat = R'*R + s = svd(R); + if any(s <= max(s) * eps(class(s))^(3/4)) + warning('The pooled cov matrix of TRAINING must be positive definite.'); end; + clf.R = R; + + case {2,3} % 'quadratic' or 'mahalanobis' + if any(gsize <= 1) + error('Each Y in TRAINING must have at least two observations.'); end; + + for k = 1:ngroups + % Stratified estimate of covariance + [Q,R] = qr(X(find(gindex == k),:) - repmat(gmeans(k,:), gsize(k), 1), 0); + R = R / sqrt(gsize(k) - 1); % SigmaHat = R'*R + s = svd(R); + if any(s <= max(s) * eps(class(s))^(3/4)) + error('The cov matrix of each Y in TRAINING must be pos definite.'); end; + clf.RS{k}=R; + end + end + + + %%% store remaining clf variables + clf.prior = prior; + clf.gmeans = gmeans; + clf.gtype = gtype; + clf.groups = groups; + clf.ngroups = ngroups; diff --git a/classify/clf_svm.m b/classify/clf_svm.m new file mode 100644 index 00000000..5fc1578e --- /dev/null +++ b/classify/clf_svm.m @@ -0,0 +1,17 @@ +% Wrapper for svm that makes svm compatible with nfoldxval. +% +% Requires the SVM toolbox by Anton Schwaighofer. +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also SVM, NFOLDXVAL + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function net = clf_svm(varargin) + net = svm( varargin{:} ); + net.fun_train = @svmtrain; + net.fun_fwd = @svmfwd; diff --git a/classify/confmatrix.m b/classify/confmatrix.m new file mode 100644 index 00000000..5d977818 --- /dev/null +++ b/classify/confmatrix.m @@ -0,0 +1,54 @@ +% Generates a confusion matrix according to true and predicted data labels. +% +% CM(i,j) denotes the number of elements of class i that were given label j. In other +% words, each row i contains the predictions for elements whos actual class was i. If +% IDXpred is perfect, then CM is a diagnol matrix with CM(i,i) equal to the number of +% instances of class i. +% +% To normalize CM to fall between [0,1], divide each row by the sum of that row: +% CMnorm = CM ./ repmat( sum(CM,2), [1 size(CM,2)] ); +% +% INPUTS +% IDXtrue - nx1 array of true labels [int values between 1 and ntypes] +% IDXpred - nx1 array of predicted labels [int values between 1 and ntypes] +% ntypes - maximum number of types (should be > max(IDX)) +% +% OUTPUTS +% CM - ntypes x ntypes confusion array with integer values +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also CONFMATRIX_SHOW + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function CM = confmatrix( IDXtrue, IDXpred, ntypes ) + + %%% convert common binary labels [-1/+1] or [0/1] to [1/2] + if( ntypes==2 ) + IDX = [IDXtrue;IDXpred]; + if( min(IDX)>=-1 && max(IDX)<=1 && all(IDX~=0)) + IDXtrue=IDXtrue+2; IDXpred=IDXpred+2; + IDXtrue(IDXtrue==3) = 2; IDXpred(IDXpred==3) = 2; + elseif( min(IDX)>=0 && max(IDX)<=1 ) + IDXtrue=IDXtrue+1; IDXpred=IDXpred+1; + end; + end; + + %%% error check + [IDXtrue,er] = checknumericargs( IDXtrue, [], 0, 2 ); error(er); + [IDXpred,er] = checknumericargs( IDXpred, [], 0, 2 ); error(er); + if( length(IDXtrue)~=length(IDXpred) ) + error('Lengths of IDXs must match up.'); end; + if( max([IDXtrue;IDXpred])>ntypes ) + error(['ntypes = ' int2str(ntypes) ' not large enough']); end; + + %%% generate CM + CM = zeros(ntypes); + for i=1:ntypes + vals = IDXpred( IDXtrue==i ); + for j=1:ntypes CM(i,j) = sum(vals==j); end; + end diff --git a/classify/confmatrix_show.m b/classify/confmatrix_show.m new file mode 100644 index 00000000..683b37ce --- /dev/null +++ b/classify/confmatrix_show.m @@ -0,0 +1,69 @@ +% Used to display a confusion matrix. +% +% See confmatrix for general format and info on confusion matricies. This function +% normalizes the CM before displaying (hence all values range in [0,1] and rows sum to 1. +% +% INPUTS +% CM - ntypes x ntypes confusion array -- see confusmatrix +% types - [optional] cell array of length ntypes of text labels for each type +% pvpairs - [optional] parameter / value list for text.m +% ndigits - [optional] number of digits after decimal to display +% +% OUTPUTS +% NONE +% +% EXAMPLE +% cliptypes = { 'anger','disgust','fear','joy','sadness','surprise' }; +% confmatrix_show( rand(6)/3+eye(6), cliptypes, {'FontSize',20} ) +% title('confusion matrix','FontSize',24); +% +% DATESTAMP +% 07-Oct-2005 5:00pm +% +% See also CONFMATRIX, TEXT2 + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function confmatrix_show( CM, types, pvpairs, ndigits ) + if( nargin<2 ) types=[]; end; + if( nargin<3 || isempty(pvpairs)) pvpairs = {'FontSize',20}; end; + if( nargin<4 || isempty(ndigits)) ndigits=2; end; + if( ndigits<1 || ndigits>10 ) error('too few or too many digits'); end; + if( any(CM)<0 ) error( 'CM must have non-negative entries' ); end; + + %%% normalize and convert to integer matrix + CM = CM ./ repmat( sum(CM,2), [1 size(CM,2)] ); + CM = round(CM*10^ndigits); + + %%% display as image + clf; h=imagesc(10^ndigits-CM,[0,10^ndigits]); + colormap gray; axis square; + set(gca,'XTick',[]); set(gca,'YTick',[]); + + %%% now write text of actual confusion value + ntypes = size(CM,1); + textalign = { 'VerticalAlignment','middle', 'HorizontalAlignment','center' }; + for i=1:ntypes + for j=1:ntypes + if( CM(i,j)>10^ndigits/2 ) color = 'w'; else color = 'k'; end; + if( CM(i,j)==10^ndigits ) + label = ['1.' repmat('0',[1 ndigits-1]) ]; + else + label = ['.' int2str2( CM(i,j),ndigits) ]; + end + text(j,i,label,'color',color,textalign{:},pvpairs{:}); + end; + end + + %%% now add type labels + if( ~isempty(types) ) + imlabel( types, 'left', 0, pvpairs ); + imlabel( types, 'bottom', -35, pvpairs ); + end; + + + + + diff --git a/classify/democlassify.m b/classify/democlassify.m new file mode 100644 index 00000000..eba3ba9f --- /dev/null +++ b/classify/democlassify.m @@ -0,0 +1,85 @@ +% A demo used to test and demonstrate the usage of classifiers (clf_*) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also CLF_KNN, CLF_LDA, CLF_SVM, CLF_ECOC + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function democlassify + + %%% generate data + nclasses = 4; nin = 3; ntrain=250; ntest=150; + [train,trainIDX,test,testIDX] = demogendata(ntrain,ntest,nclasses,nin,1,6); + ntrain=size(train,1); ntest=size(test,1); + show = 1; if( show ) + % make look different due to different projections + figure(show); clf; + subplot(3,1,1); visualize_data( train, 2, trainIDX ); title( 'training set'); + subplot(3,1,2); visualize_data( test, 2, testIDX ); title( 'testing set'); + end; + + %%% initialize learners: + nnets=0; labels={}; + if(1) nnets=nnets+1; % linear LDA + nets{nnets}.func_netinit = @clf_lda; + nets{nnets}.netparams={'linear'}; + labels{nnets} = 'linear LDA'; + end + if(1) nnets=nnets+1; % quadratic LDA + nets{nnets}.func_netinit = @clf_lda; + nets{nnets}.netparams={'quadratic'}; + labels{nnets} = 'quadratic LDA'; + end + if(1) nnets=nnets+1; % kNN 5 + nets{nnets}.func_netinit = @clf_knn; + nets{nnets}.netparams={5}; + labels{nnets} = 'kNN 5'; + end + if(0) nnets=nnets+1; % svm ecoc [VERY SLOW] + nets{nnets}.func_netinit = @clf_ecoc; + nets{nnets}.netparams={@clf_svm,{'rbf',2^-1},nclasses}; + labels{nnets} = 'ecoc svm-rbf'; + end + + + %%% train each learner, and apply to test data + pred = zeros( ntest, nnets ); + for i=1:nnets + disp(['training ' labels{i} ' classifier']); + net = feval( nets{i}.func_netinit, nin, nets{i}.netparams{:} ); + net = feval( net.fun_train, net, train, trainIDX ); + pred(:,i) = feval( net.fun_fwd, net, test ); + ncorrect = length(find(testIDX==pred(:,i))); + fprintf(['Classification result for ' labels{i} ... + ':\n%i out of %i correct\n\n'], ncorrect, ntest); + end; + + %%% calculate and show confusion matricies [not using confmatrix_show] + CM = zeros( nclasses, nclasses, nnets ); + for i=1:nnets + CMi = confmatrix( testIDX, pred(:,i), nclasses ); + CM(:,:,i) = CMi ./ repmat( sum(CMi,2), [1 size(CMi,2)] ); + end; + subplot(3,1,3); montage2( CM,1,1,[0,1],1,[],labels ); + + + + + + + + + + + + + + + + + + diff --git a/classify/democluster.m b/classify/democluster.m new file mode 100644 index 00000000..56d93eda --- /dev/null +++ b/classify/democluster.m @@ -0,0 +1,80 @@ +% Clustering demo. +% +% Used to test different clustering algorithms on 2D and 3D mixture of gaussian data. +% Alter demo by edititing this file. +% +% All input arguments are optional. +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [IDX, X, k_true, noisefrac_true, IDX_true ] = ... + democluster( X, k, noisefrac, IDX_true ) + + %%% GENERATE DATA + if( nargin<3 ) + if(1) % mixture of gaussians -- see demogendata + k_true = 4; sep = 3; ecc = 3; noisefrac_true = 0.1; + npoints = 1000; dim = 2; % dim may be 2 or 3 + [X,IDX_true] = demogendata(npoints,0,k_true,dim,sep,ecc,noisefrac_true); + else + % two parallel clusters - kmeans will fail + k_true = 2; dim = 2; npoints = 200; sep = 4; + X = [([5 0; 0 .5] * randn(2,npoints) + sep/2)' ; ... + ([5 0; 0 .5] * randn(2,npoints) - sep/2)' ] / 5; + IDX_true = [ones(1,npoints) 2*ones(1,npoints)]; + noisefrac_true=0; + end; + noisefrac = noisefrac_true; k = k_true; + elseif( nargin<4 ) + IDX_true = []; + end; + + + %%% kmeans and results + switch 'meanshift' + case 'kmeans2' + params = {'replicates', 4, 'display', 1, 'outlierfrac', noisefrac}; + [IDX,C,sumd] = kmeans2( X, k, params{:} ); sum(sumd) + case 'meanshift' + %(X,radius,rate,maxiter,minCsize,blur) + [IDX,C] = meanshift( X, .3, .2, 100 , 10, 0 ); + end + + + %%% show data & clustering results + figure(1); clf; + subplot(2,2,1); plot_clusters( X, ones(1,size(X,1)) ); title('original points'); + if(~isempty(IDX_true)) + subplot(2,2,2); plot_clusters( X, IDX_true ); title('true clusters'); end; + subplot(2,2,3); plot_clusters( X, IDX, C ); title('clustering result'); + %subplot(2,2,4); distmatrix_show( dist_euclidean(X,X), IDX ); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% plot_clusters( X, IDX, C ) +% +% calls visualize_data +% also displays cluster centers +function plot_clusters( X, IDX, C ) + if(nargin<3) C=[]; end; + if( size(X,2)>3 ) error('unsupported dimension'); end; + visualize_data( X, size(X,2), IDX ); + + % plot cluster centers + if( ~isempty(C) ) + IDX(IDX>12)=12; c=1; k=max(IDX); + if( size(X,2)==2) + for i=1:k R{c}=C(i,1); R{c+1}=C(i,2); R{c+2}='x'; c=c+3; end; + hold('on'); plot( R{:}, 'MarkerSize', 30 ); hold('off'); + elseif( size(X,2)==3 ) + for i=1:k R{c}=C(i,1); R{c+1}=C(i,2); R{c+2}=C(i,3); R{c+3}='x'; c=c+4; end; + hold('on'); plot3( R{:}, 'MarkerSize',30 ); hold('off'); + end + end diff --git a/classify/demogendata.m b/classify/demogendata.m new file mode 100644 index 00000000..9e8f29cf --- /dev/null +++ b/classify/demogendata.m @@ -0,0 +1,126 @@ +% Generate data drawn form a mixture of Gaussians. +% +% Adapted from code by [Nikos Vlassis, 2000]. +% For definitions see [Dasgupta, 1999]. +% +% INPUTS +% n - size of training set +% m - size of test set +% k - number of components +% d - dimension +% c - separation degree +% e - maximum eccentricity +% f - [optional] fraction of points that are noise (uniformly distributed) +% +% OUTPUTS +% X - training set (n x d) +% IDX - cluster membership [see kmeans2.m] +% T - test set (m x d) +% IDT - cluster membership [see kmeans2.m] +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also VISUALIZE_DATA, DEMOCLUSTER, DEMOCLASSIFY + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [X,IDX,T,IDT] = demogendata(n,m,k,d,c,e,f) + + if( nargin<7 ) f=0; end; + if (f<0 || f>=1 ) + error('illegal value for f'); + end + + + % mixing weights + while 1 + W = rand(k,1); + W = W / sum(W); + if all(W > 1/(4*k)) + break; + end + end + + % adjust n and m for noise frac + if( nargin>=7 && f~=0) + nnoise = floor( f * n ); + mnoise = floor( f * m ); + n = n - nnoise; m = m - mnoise; + end + + % create c-separated Gaussian clusters of maximum eccentricity e + R=zeros(k,d^2); + trials = 1; + while 1 + IDX = []; + IDT = []; + X = []; + T = []; + M = randn(k,d)*sqrt(k)*sqrt(c)*trials/10; + Trace = zeros(k,1); + for j = 1:k + U = rand(d,d)-0.5; + U = sqrtm(inv(U*U')) * U; + L = diag(rand(d,1)*(e-1)+1).^2/100; + msg = 1; + while msg + [C,msg] = chol(U*L*U'); + end + R(j,:)=C(:)'; + + nj = ceil(n*W(j)); + Xj = randn(nj,d) * C; + IDX = [IDX j(ones(1,nj))]; + X = [X; repmat(M(j,:),nj,1) + Xj]; + Trace(j) = trace(cov(Xj)); + + + mj = ceil(m*W(j)); + Tj = randn(mj,d) * C; + IDT = [IDT j(ones(1,mj))]; + T = [T; repmat(M(j,:),mj,1) + Tj]; + + end + + + % check degree of separation + er = 0; + for i = 1:k-1 + for j = i+1:k + if norm(M(i,:)-M(j,:)) < c * sqrt(max(Trace(i),Trace(j))) + er = 1; + end + end + end + if ~er + break; + end + trials = trials + 1; + end + + % make some uniformly distributed noise + if( f~=0) + if (m>0) + maxv=max( max(abs(X(:))), max(abs(T(:))) ); + else + maxv=max(abs(X(:))); + end; + + Xnoise = (rand( nnoise, d ) - .5) * maxv * 2.5; + IDXnoise = -1; IDXnoise = IDXnoise( ones(1,nnoise ) ); + X = [X; Xnoise]; IDX = [IDX IDXnoise]; + p = randperm( length(IDX) ); X = X(p,:); IDX = IDX(p); + + if( m>0 ) + Tnoise = (rand( mnoise, d ) - .5) * maxv * 2.5; + IDTnoise = -1; IDTnoise = IDTnoise( ones(1,mnoise ) ); + T = [T; Tnoise]; IDT = [IDT IDTnoise]; + p = randperm( length(IDT) ); T = T(p,:); IDT = IDT(p); + end + end + + % put into standard form (column format) + IDX = IDX'; IDT = IDT'; diff --git a/classify/dist_L1.m b/classify/dist_L1.m new file mode 100644 index 00000000..1d7cb88c --- /dev/null +++ b/classify/dist_L1.m @@ -0,0 +1,39 @@ +% Calculates the L1 Distance between vectors (ie the City-Block distance). +% +% Assume X is an m-by-p matrix representing m points in p-dimensional space and Y is an +% n-by-p matrix representing another set of points in the same space. This function +% compute the m-by-n distance matrix D where D(i,j) is the L1 distance between X(i,:) and +% Y(j,:). +% +% The L1 distance between two vectors is defined as: +% d(x,y) = sum( abs(xi-yi) ); +% +% INPUTS +% X - m-by-p matrix of m p-bin histograms +% Y - n-by-p matrix of n p-bin histograms +% +% OUTPUTS +% D - m-by-n distance matrix +% +% EXAMPLE +% X=[randn(100,5)]; Y=randn(40,5)+2; +% D = dist_L1( [X; Y], [X; Y] ); im(D) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also DIST_EUCLIDEAN + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function D = dist_L1( X, Y ) + [m p] = size(X); [n p] = size(Y); + + m_ones = ones(1,m); D = zeros(m,n); + for i=1:n + yi = Y(i,:); yi = yi( m_ones, : ); + D(:,i) = sum( abs( X-yi),2 ); + end + diff --git a/classify/dist_chisquared.m b/classify/dist_chisquared.m new file mode 100644 index 00000000..f09fec25 --- /dev/null +++ b/classify/dist_chisquared.m @@ -0,0 +1,41 @@ +% Calculates the Chi Squared Distance between vectors (usually histograms). +% +% Assume X is an m-by-p matrix representing m points in p-dimensional space and Y is an +% n-by-p matrix representing another set of points in the same space. This function +% compute the m-by-n distance matrix D where D(i,j) is the chi-squared distance between +% X(i,:) and Y(j,:). +% +% The chi-squared distance between two vectors is defined as: +% d(x,y) = sum( (xi-yi)^2 / (xi+yi) ) / 2; +% The chi-squared distance is useful when comparing histograms. +% +% INPUTS +% X - m-by-p matrix of m p-bin histograms +% Y - n-by-p matrix of n p-bin histograms +% +% OUTPUTS +% D - m-by-n distance matrix +% +% EXAMPLE +% X=[randn(100,5)]; Y=randn(40,5)+2; +% D = dist_chisquared( abs([X; Y]), abs([X; Y]) ); im(D) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also DIST_EUCLIDEAN, DIST_EMD + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function D = dist_chisquared( X, Y ) + [m p] = size(X); [n p] = size(Y); + + m_ones = ones(1,m); D = zeros(m,n); + for i=1:n + yi = Y(i,:); yi_rep = yi( m_ones, : ); + s = yi_rep + X; d = yi_rep - X; + D(:,i) = sum( d.^2 ./ (s+eps), 2 ); + end + D = D/2; diff --git a/classify/dist_emd.m b/classify/dist_emd.m new file mode 100644 index 00000000..c3e720c6 --- /dev/null +++ b/classify/dist_emd.m @@ -0,0 +1,44 @@ +% Calculates Earth Mover's Distance (EMD) between positive vectors. +% +% Assume X is an m-by-p matrix representing m histograms with p bins each and Y is an +% n-by-p matrix representing another set of n histograms with p bins each. Each histogram +% is assumed to have the same total weight. This function compute the m-by-n distance +% matrix D where D(i,j) is the Earth Mover's Distance (EMD) between X(i,:) and Y(j,:). +% +% Note for 1D, with all histograms having equal weight, there is a simple closed form for +% the calculation of the EMD. The EMD between two histograms x and y is simply given by +% the sum(abs(cdf(x)-cdf(y))), where cdf is the cumulative distribution function (computed +% simply by cumsum). +% +% INPUTS +% X - m-by-p matrix of m p-bin histograms +% Y - n-by-p matrix of n p-bin histograms +% +% OUTPUTS +% D - m-by-n distance matrix +% +% EXAMPLE +% X=[randn(100,5)]; Y=randn(40,5)+2; +% D = dist_emd( [X; Y], [X; Y] ); im(D) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also DIST_EUCLIDEAN, DIST_CHISQUARED + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function D = dist_emd( X, Y ) + [m p] = size(X); [n p] = size(Y); + + Xcdf = cumsum(X,2); + Ycdf = cumsum(Y,2); + + m_ones = ones(1,m); D = zeros(m,n); + for i=1:n + ycdf = Ycdf(i,:); + ycdf_rep = ycdf( m_ones, : ); + D(:,i) = sum(abs(Xcdf - ycdf_rep),2); + end diff --git a/classify/dist_euclidean.m b/classify/dist_euclidean.m new file mode 100644 index 00000000..dc2a7044 --- /dev/null +++ b/classify/dist_euclidean.m @@ -0,0 +1,90 @@ +% Calculates the Euclidean distance between vectors [FAST]. +% +% Assume X is an m-by-p matrix representing m points in p-dimensional space and Y is an +% n-by-p matrix representing another set of points in the same space. This function +% compute the m-by-n distance matrix D where D(i,j) is the SQUARED Euclidean distance +% between X(i,:) and Y(j,:). Running time is O(m*n*p). +% +% If x is a single data point, here is a faster, inline version to use: +% D = sum( (Y - ones(size(Y,1),1)*x).^2, 2 )'; +% +% INPUTS +% X - m-by-p matrix of m p dimensional vectors +% Y - n-by-p matrix of n p dimensional vectors +% +% OUTPUTS +% D - m-by-n distance matrix +% +% EXAMPLE +% X=[randn(100,5)]; Y=randn(40,5)+2; +% D = dist_euclidean( [X; Y], [X; Y] ); im(D) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also DIST_CHISQUARED, DIST_EMD + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function D = dist_euclidean( X, Y ) + if( ~isa(X,'double') || ~isa(Y,'double')) + error( 'Inputs must be of type double'); end; + m = size(X,1); n = size(Y,1); + Yt = Y'; + XX = sum(X.*X,2); + YY = sum(Yt.*Yt,1); + D = XX(:,ones(1,n)) + YY(ones(1,m),:) - 2*X*Yt; + + + + +%%%% code from Charles Elkan with variables renamed +% m = size(X,1); n = size(Y,1); +% D = sum(X.^2, 2) * ones(1,n) + ones(m,1) * sum(Y.^2, 2)' - 2.*X*Y'; +%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +%%%% LOOP METHOD - SLOW +% [m p] = size(X); +% [n p] = size(Y); +% +% D = zeros(m,n); +% ones_m_1 = ones(m,1); +% for i=1:n +% y = Y(i,:); +% d = X - y(ones_m_1,:); +% D(:,i) = sum( d.*d, 2 ); +% end +%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +%%% PARALLEL METHOD THAT IS SUPER SLOW (slower then loop)! +% % Code taken from "MATLAB array manipulation tips and tricks" by Peter J. Acklam +% Xb = permute(X, [1 3 2]); +% Yb = permute(Y, [3 1 2]); +% D = sum( (Xb(:,ones(1,n),:) - Yb(ones(1,m),:,:)).^2, 3); +%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +%%%%% USELESS FOR EVEN VERY LARGE ARRAYS X=16000x1000!! and Y=100x1000 +% % call recursively to save memory +% if( (m+n)*p > 10^5 && (m>1 || n>1)) +% if( m>n ) +% X1 = X(1:floor(end/2),:); +% X2 = X((floor(end/2)+1):end,:); +% D1 = dist_euclidean( X1, Y ); +% D2 = dist_euclidean( X2, Y ); +% D = cat( 1, D1, D2 ); +% else +% Y1 = Y(1:floor(end/2),:); +% Y2 = Y((floor(end/2)+1):end,:); +% D1 = dist_euclidean( X, Y1 ); +% D2 = dist_euclidean( X, Y2 ); +% D = cat( 2, D1, D2 ); +% end +% return; +% end +% diff --git a/classify/distmatrix_show.m b/classify/distmatrix_show.m new file mode 100644 index 00000000..35977b8e --- /dev/null +++ b/classify/distmatrix_show.m @@ -0,0 +1,62 @@ +% Useful visualization of a distance matrix of clustered points. +% +% D is sorted into k blocks, where the ith block contains all the points in cluster i. +% When D is displayed the blocks are shown explicitly. Hence for a good clustering (under +% a spherical gaussian assumption) the 'diagnol' blocks ought to be mostly dark, and all +% other block ought to be relatively white. One can thus quickly visualize the quality of +% the clustering, or even how clusterable the points are. Outliers (according to IDX) are +% removed from D. +% +% INPUTS +% D - nxn distance matrix +% IDX - cluster membership [see kmeans2.m] +% +% OUTPUTS +% NONE +% +% EXAMPLE +% % not the best example since points are already ordered +% [X,IDX_true] = demogendata(100,0,2,2,10,2,0); +% distmatrix_show( dist_euclidean(X,X), IDX_true ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function distmatrix_show( D, IDX ) + k = max(IDX); + n = size(D,1); + + %%% remove outliers from D and IDX + inliers = IDX>0; + D = D( inliers, inliers ); + IDX = IDX( inliers ); + + %%% get order of points and rearrange D and IDX + order = IDX2order( IDX ); + IDX = IDX( order ); + D = D( order, order ); + + %%% show D and lines seperating super clusters. + clf; subplot(1,2,1); + im(D); + hold('on') + for i=1:k counts(i) = sum( IDX==i ); end; + cumcounts = cumsum(counts); + for i=1:k-1 + line( [.5,n+.5], [cumcounts(i)+.5,cumcounts(i)+.5] ); + line( [cumcounts(i)+.5,cumcounts(i)+.5], [.5,n+.5] ); + end; + hold('off') + + %%% show smoothed version of D + inds = 1:k; inds = inds( counts>0 ); + cumcounts = [0 cumcounts]; Dsm = D; + for i=inds for j=inds + ds = D( cumcounts(i)+1:cumcounts(i+1), cumcounts(j)+1:cumcounts(j+1) ); + Dsm( cumcounts(i)+1:cumcounts(i+1), cumcounts(j)+1:cumcounts(j+1) ) = mean( ds(:) ); + end; end; + subplot(1,2,2); im( Dsm ); diff --git a/classify/kmeans2.m b/classify/kmeans2.m new file mode 100644 index 00000000..37f0b77d --- /dev/null +++ b/classify/kmeans2.m @@ -0,0 +1,172 @@ +% Very fast version of kmeans clustering. +% +% Cluster the N x p matrix X into k clusters using the kmeans algorithm. It returns the +% cluster memberships for each data point in the N x 1 vector IDX and the K x p matrix of +% cluster means in C. +% +% Custom implementation of the kmeans algorithm. In some ways it is less general (for +% example only uses euclidian distance), but it has some options that the matlab version +% does not (for example, it has a notion of outliers and min-cluster size). It is also +% many times faster than matlab's kmeans. General kmeans help can be found in help for +% the matlab implementation of kmeans. Note that the although the names and conventions +% for this algorithm are taken from Matlab's implementation, there are slight +% alterations (for example, IDX==-1 is used to indicate outliers). +% +% +% ------------------------------------------------------------------------- +% INPUTS +% +% X +% n-by-p data matrix of n p-dimensional vectors. That is X(i,:) is the ith point in X. +% +% k +% Integer indicating the maximum nuber of clusters for kmeans to find. Actual number may +% be smaller (for example if clusters shrink and are eliminated). +% +% ------------------------------------------------------------------------- +% ADDITIONAL INPUTS +% +% [...] = kmeans2(...,'param1',val1,'param2',val2,...) enables you to +% specify optional parameter name-value pairs to control the iterative +% algorithm used by kmeans. Valid parameters are the following: +% 'replicates' - Number of times to repeat the clustering, each with a +% new set of initial cluster centroid positions. kmeans +% returns the solution with the lowest value for sumd. +% 'maxiter' - Maximum number of iterations. Default is 100. +% 'display' - Whether or not to display algorithm status (default==0) +% 'randstate' - seed with which to initialize kmeans. Useful for +% replicability of algoirhtm. +% 'outlierfrac' - maximum fraction of points that can be treated as +% outliers +% 'minCsize' - minimum size for a cluster (smaller clusters get +% eliminated) +% +% ------------------------------------------------------------------------- +% OUTPUTS +% +% IDX +% n-by-1 vector used to indicated cluster membership. Let X be a set of n points. Then +% the ID of X - or IDX is a column vector of length n, where each element is an integer +% indicating the cluster membership of the corresponding point in X. That is IDX(i)=c +% indicates that the ith point in X belongs to cluster c. Cluster labels range from 1 to +% k, and thus k=max(IDX) is typically the number of clusters IDX divides X into. The +% cluster label "-1" is reserved for outliers. That is IDX(i)==-1 indicates that the +% given point does not belong to any of the discovered clusters. Note that matlab's +% version of kmeans does not have outliers. +% +% C +% k-by-p matrix of centroid locations. That is C(j,:) is the cluster centroid of points +% belonging to cluster j. In kmeans, given X and IDX, a cluster centroid is simply the +% mean of the points belonging to the given cluster, ie: C(j,:) = mean( X(IDX==j,:) ). +% +% sumd +% 1-by-k vector of within-cluster sums of point-to-centroid distances. That is sumd(j) is +% the sum of the distances from X(IDX==j,:) to C(j,:). The total sum, sum(sumd), is a +% typical error measure of the quality of a clustering. +% +% ------------------------------------------------------------------------- +% +% DATESTAMP +% 13-May-2006 6:00pm +% +% See also DEMOCLUSTER + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [IDX,C,sumd] = kmeans2( X,k,varargin ) + + %%% get input args (NOT SUPPORTED: distance, emptyaction, start ) + pnames = { 'replicates' 'maxiter' 'display' 'randstate' 'outlierfrac' 'minCsize'}; + dflts = { 1 100 0 [] 0 1 }; + [errmsg,replicates,maxiter,display,randstate,outlierfrac,minCsize] = ... + getargs(pnames, dflts, varargin{:}); + error(errmsg); + if (k<=1) error('k must be greater than 1'); end; + if(ndims(X)~=2 || any(size(X)==0)) error('Illegal X'); end; + if (outlierfrac<0 || outlierfrac>=1) + error('fraction of outliers must be between 0 and 1'); end; + noutliers = floor( size(X,1)*outlierfrac ); + + % initialize seed if it was not specified by user, otherwise set it. + if (isempty(randstate)) randstate = rand('state'); else rand('state',randstate); end; + + % run kmeans2_main replicates times + msg = ['Running kmeans2 with k=' num2str(k)]; + if (replicates>1) msg=[msg ', ' num2str(replicates) ' times.']; end; + if (display) disp(msg); end; + + bestsumd = inf; + for i=1:replicates + tic + msg = ['kmeans iteration ' num2str(i) ' of ' num2str(replicates) ', step: ']; + if (display) disp(msg); end; + [IDX,C,sumd,niters] = kmeans2_main(X,k,noutliers,minCsize,maxiter,display); + if (sum(sumd)1) fprintf(msg); toc, end; + end + + IDX = bestIDX; C = bestC; sumd = bestsumd; k = max(IDX); + msg = ['Final number of clusters = ' num2str( k ) '; sumd=' num2str(sum(sumd))]; + if (display) if(replicates==1) fprintf('\n'); end; disp(msg); end; + + % sort IDX to have biggest clusters have lower indicies + clustercounts = zeros(1,k); for i=1:k clustercounts(i) = sum( IDX==i ); end + [ids,order] = sort( -clustercounts ); C = C(order,:); sumd = sumd(order); + IDX2 = IDX; for i=1:k IDX2(IDX==order(i))=i; end; IDX = IDX2; + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function [IDX,C,sumd,niters] = kmeans2_main(X,k,noutliers,minCsize,maxiter,display) + + % initialize the vectors containing the IDX assignments + % and set initial cluster centers to be k random X points + [N p] = size(X); + IDX = ones(N,1); oldIDX = zeros(N,1); + index = randperm2(N,k); C = X(index,:); + + % MAIN LOOP: loop until the cluster assigments do not change + niters = 0; ndisdigits = ceil( log10(maxiter-1) ); + if( display ) fprintf( ['\b' repmat( '0',[1,ndisdigits] )] ); end; + while( sum(abs(oldIDX - IDX)) ~= 0 && niters < maxiter) + + % calculate the Euclidean distance between each point and each cluster mean + % and find the closest cluster mean for each point and assign it to that cluster + oldIDX = IDX; D = dist_euclidean( X, C ); [mind IDX] = min(D,[],2); + + % do not use most distant noutliers elements in computation of cluster centers + mindsort = sort( mind ); thr = mindsort( end-noutliers ); IDX( mind > thr ) = -1; + + % discard small clusters [place in outlier set, will get included next time around] + i=1; while(i<=k) if (sum(IDX==i)0)' IDx = IDX(i); counts(IDx)=counts(IDx)+1; + C(IDx,:) = C(IDx,:)+X(i,:); end + C = C ./ counts(:,ones(1,p)); + + niters = niters+1; + if( display ) + fprintf( [repmat('\b',[1 ndisdigits]) int2str2(niters,ndisdigits)] ); end; + end + + % record within-cluster sums of point-to-centroid distances + sumd = zeros(1,k); for i=1:k sumd(i) = sum( mind(IDX==i) ); end + + + + + + diff --git a/classify/meanshift.m b/classify/meanshift.m new file mode 100644 index 00000000..f8a95266 --- /dev/null +++ b/classify/meanshift.m @@ -0,0 +1,74 @@ +% meanshift clustering algorithm. +% +% Based on code from Sameer Agarwal +% +% For a broad discussion see: +% Y. Cheng, Mean-shift, mode seeking, and clustering, IEEE Transactions on +% Pattern Analysis and Machine Intelligence, Vol.17, 1995, pp. 790-799 +% +% The radius or bandwidth is tied to the 'width' of the distribution and is +% data dependent. Note that the data should be normalized first so that +% all the dimensions have the same bandwidth. The rate determines how +% large the gradient decent steps are. The smaller the rate, the more +% iterations are needed for convergence, but the more likely minima are not +% overshot. A reasonable value for the rate is .2. Low value of the rate +% may require an increase in maxiter. Increase maxiter until convergence +% occurs regularly for a given data set (versus the algorithm being cut off +% at maxiter). +% +% Note the cluster means M do not refer to the actual mean of the points +% that belong to the same cluster, but rather the values to which the +% meanshift algorithm converged for each given point (recall that cluster +% membership is based on the mean converging to the same value from +% different points). Hence M is not the same as C, the centroid of the +% points [see kmeans2 for a definition of C]. +% +% INPUTS +% X - column vector of data - N vectors of dimension p (X is Nxp) +% radius - the bandwidth (radius of the window) +% rate - [optional] gradient descent proportionality factor in (0,1] +% maxiter - [optional] maximum number of iterations +% minCsize - [optional] min size for a cluster (smaller clusters get eliminated) +% blur - [optional] if (blur==1) then at each iteration data is blurred +% by the mean vector (the original data points move) - can +% cause 'incorrect' results +% +% OUTPUTS +% IDX - cluster membership [see kmeans2.m] +% M - cluster means [see above] +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also MEANSHIFTIM, DEMOCLUSTER + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [IDX,M] = meanshift(X, radius, rate, maxiter, minCsize, blur ) + if( nargin<3 ) rate =.2; end; + if( nargin<4 ) maxiter =100; end; + if( nargin<5 ) minCsize = 1; end; + if( nargin<6 ) blur =0; end; + if( rate<=0 || rate>1 ) error('rate must be between 0 and 1'); end; + + %%% OLD VERSION OF rate (gradient descent proportionality factor) + %%% rate = rate * (size(X,2) + 2) / radius^2; + + % c code does the work + % requires X transposed (meanshift1 uses a different convention) + [IDX,meansfinal] = meanshift1(X',radius,rate,maxiter,blur); + meansfinal = meansfinal'; + + % calculate final cluster means per cluster + [N,p] = size(X); k = max(IDX); + M = zeros(k,p); for i=1:k M(i,:) = mean( meansfinal(IDX==i,:), 1 ); end; + + % sort clusters [largest first] and remove all smaller then minCsize + ccounts = zeros(1,k); for i=1:k ccounts(i) = sum( IDX==i ); end + [ccounts,order] = sort( -ccounts ); ccounts = -ccounts; M = M(order,:); + IDX2 = IDX; for i=1:k IDX2(IDX==order(i))=i; end; IDX = IDX2; + [v,loc] = min( ccounts>=minCsize ); + if( v==0 ) M( loc:end, : ) = []; IDX( IDX>=loc ) = -1; k = max(IDX); end; + diff --git a/classify/meanshiftim.m b/classify/meanshiftim.m new file mode 100644 index 00000000..6898ed69 --- /dev/null +++ b/classify/meanshiftim.m @@ -0,0 +1,112 @@ +% Applies the meanshift algorithm to a joint spatial/range image. +% +% See "Mean Shift Analysis and Applications" by Comaniciu & Meer for info. +% +% Assumes X is an MxNxP array, where an X(i,j,:) represents the range data at locations +% (i,j). This function runs meanshift on each of the MxN data points. It takes advantage +% of the lattice structure of an image for efficiency (it only needs to calculate full +% distance between two points if they are near each other spatially). +% +% In the original formulation of the algorithm, after normalization of the data, the +% search window around each point x has radius 1 (ie corresponding to 1 std of the data). +% That is the search window only encloses 2*s+1 pixels, and of those, all which fall +% within 1 unit from x are used to calcluate the new mean. If softflag==0 the original +% formulation is used. If softflag==1, instead of using a fixed radius, each point p is +% used in the calulation of the mean with points close to x given significantly more +% weight. Specifically, each point p is given weight exp(-dist(x,p)). So instead of +% having a fixed cutoff at r, the cutoff is 'soft' (same idea as in softmax), and occurs +% at approximately r. The implementation remains efficient by actually using a hard +% cutoff at points further then 2r spatially from x. +% +% The resulting matrix M is of size MxNx(P+2). M(i,j,1) represents the convergent row +% location of X(i,j,:) - (which had initial row location i) and M(i,j,2) represents the +% final column location. M(i,j,p+2) represents the convergent value for X(i,j,p). The +% optionaly outputs Vr and Vc are 2D arrays where Vr(i,j)=M(i,j,1)-i and +% Vc(i,j)=M(i,j,2)-j. That is they represent the spatial offset between the original +% location of a point and its convergent location. Display using quiver(Vc,Vr,0). +% +% INPUTS +% X - MxNxP data array, P may be 1 +% sig_spt - integer specifying spatial standard deviation +% sig_rng - value specifying the standard deviation of the range data +% softflag - [optional] 0 or 1 [see above] +% maxiter - [optional] maximum number of iterations per data point +% mindelta - [optional] minimum amount of spatial change defining convergence +% +% OUTPUTS +% M - array of convergent locations [see above] +% Vr - spatial motion in row direction +% Vc - spatial motion in col direction +% +% EXAMPLE +% I=double(imread('cameraman.tif'))/255; +% [M,Vr,Vc] = meanshiftim( I,5,.2 ); +% figure(1); im(I); figure(2); im( M(:,:,3) ); +% % color image: +% I=double(imread('hestain.png'))/255; +% [M,Vr,Vc] = meanshiftim( I,5,.2 ); +% figure(1); im(I); figure(2); im( M(:,:,3:end) ); +% +% DATESTAMP +% 26-Oct-2005 4:00pm +% +% See also MEANSHIFT, MEANSHIFTIM_EXPLORE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [M,Vr,Vc] = meanshiftim( X, sig_spt, sig_rng, softflag, maxiter, mindelta ) + [sig_spt,er] = checknumericargs( sig_spt, 1, 0, 1 ); error(er); + if( nargin<4 || isempty(softflag)) softflag = 0; end; + if( nargin<5 || isempty(maxiter) ) maxiter = 100; end; + if( nargin<6 || isempty(mindelta)) mindelta = .001; end; + + [mrows, ncols, p] = size(X); p = p+2; + [grid_rs grid_cs] = ndgrid( 1:mrows, 1:ncols ); + data = cat( 3, cat( 3, grid_rs/sig_spt, grid_cs/sig_spt), X/sig_rng ); + + %%% MAIN LOOP + M = data; + ticstatusid = ticstatus('meanshiftim'); %t0 = clock; tlast = t0; + if( softflag ) radius = sig_spt*2; else radius = sig_spt; end + for i=1:mrows for j=1:ncols + Mij = data(i,j,:); Mij = Mij(:)'; + itercount = 0; diff = 1; + while( itercount < maxiter && diff>mindelta ) + + % get data which is possibly relevant (within spatial range) + r = round( Mij(1)*sig_spt ); c = round( Mij(2)*sig_spt ); + boundsr = max(1,r-radius):min(mrows,r+radius); + boundsc = max(1,c-radius):min(ncols,c+radius); + data_window = data( boundsr, boundsc, : ); + data_windowf = reshape( data_window, [], p ); + + % get next mean + Mij_old = Mij; + n = size( data_windowf, 1); + D = sum( (data_windowf - ones(n,1)*Mij).^2, 2 ); + if( softflag ) + S = exp( -D ); sumS = sum(S); Srep = S(:,ones(1,p)); + Mij = sum( data_windowf .* Srep, 1 ) / sumS; + else + data_windowf = data_windowf( D < 1, : ); + Mij = sum( data_windowf, 1 ) / size( data_windowf,1 ); + end; + + % check if Mij changed [only on basis of x,y location] + diff = sum( (Mij_old(1:2)-Mij(1:2)).^2 ); + itercount = itercount+1; + + end; + M(i,j,:) = Mij(:); + fracdone = ((i-1)*ncols+j) / (mrows*ncols); + tocstatus( ticstatusid, fracdone ); + end; end; + M = cat(3, M(:,:,1:2)*sig_spt, M(:,:,3:end)*sig_rng ); + + + %%% Output spatial difference + if( nargout>1 ) + Vr = M(:,:,1)-grid_rs; Vc = M(:,:,2)-grid_cs; + end; diff --git a/classify/meanshiftim_explore.m b/classify/meanshiftim_explore.m new file mode 100644 index 00000000..9bc3012d --- /dev/null +++ b/classify/meanshiftim_explore.m @@ -0,0 +1,67 @@ +% Visualization to help choose sigmas for meanshiftim. +% +% Displays the original image I, and prompts user to select a point on the image. For +% given point, calculates the distance (both spatial and range) to every other point in +% the image. It shows the results in a number of panes, which include 1) the original +% image I, 2) Srange - similarity based on range only, 3) Seuc - similarity based on +% Euclidean distance only, and 4) overall similarity. Finally, in each image the green +% dot (possibly occluded) shows the original point, and the blue dot shows the new mean of +% the window after 1 step of meanshift. +% +% INPUTS +% I - MxN image for display +% X - MxNxP data array, P may be 1 (X may be same as I) +% sig_spt - integer specifying spatial standard deviation +% sig_rng - value specifying the standard deviation of the range data +% show - [optional] will display results in figure(show) +% +% EXAMPLE +% I=double(imread('cameraman.tif'))/255; +% meanshiftim_explore( I, I, 5, .2, 1 ); +% +% DATESTAMP +% 25-Oct-2005 4:00pm +% +% See also MEANSHIFTIM + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function meanshiftim_explore( I, X, sig_spt, sig_rng, show ) + if( nargin<5 ) show = 1; end; + [mrows, ncols, p] = size(X); + + %%% get input point + figure(show); clf; im(I); + [c,r] = ginput(1); + r=round(r); c=round(c); + + %%% get D and S + [grid_rs grid_cs] = ndgrid( 1:mrows, 1:ncols ); + Deuc = ((grid_rs-r).^2 + (grid_cs-c).^2) / sig_spt^2; + x = X(r,c,:); x = x(:)'; Xflat = reshape(X,[],p); + Drange = dist_euclidean( x, Xflat ); + Drange = reshape( Drange, mrows, ncols ) / sig_rng^2; + D = Drange + Deuc; + + S = exp( -D ); + Srange = exp( -Drange ); + Seuc = exp( -Deuc ); + + %%% new c and r [stretched for display] + c2 = (grid_cs .* S); c2 = sum( c2(:) ) / sum(S(:)); + r2 = (grid_rs .* S); r2 = sum( r2(:) ) / sum(S(:)); + %c2 = c+(c2-c)*2; r2 = r+(r2-r)*2; + + %%% show + figure(show); clf; + subplot(2,2,1); im(I); + hold('on'); plot( c, r, '.g' ); plot( c2, r2, '.b' ); hold('off'); + subplot(2,2,2); im(Srange); + hold('on'); plot( c, r, '.g' ); plot( c2, r2, '.b' ); hold('off'); + subplot(2,2,3); im(Seuc); + hold('on'); plot( c, r, '.g' ); plot( c2, r2, '.b' ); hold('off'); + subplot(2,2,4); im(S); + hold('on'); plot( c, r, '.g' ); plot( c2, r2, '.b' ); hold('off'); + diff --git a/classify/nfoldxval.m b/classify/nfoldxval.m new file mode 100644 index 00000000..50492edd --- /dev/null +++ b/classify/nfoldxval.m @@ -0,0 +1,182 @@ +% Runs n-fold cross validation on data with a given classifier. +% +% Given n separate labeled data sets, trains classifier using n-1 data sets, test on +% remaining one. Average results over all n such runs. Shows overall results in average +% confusion matrix. +% +% The classifier is passed in as a parameter. For this to work the classifier (clf) must +% follow certain conventions. The conventions are as follows: +% 1) The following must initialize the clf ('p' is the dimension of the data): +% clf = clfinit( p, clfparams{:} ) +% 2) The created clf must point to 2 functions for training and applying it: +% clf.fun_train and clf.fun_fwd +% 3) For training the following will be called: +% clf = clf.fun_train( clf, X, Y ); +% 4) For testing the following will be called: +% pred = clf.fun_fwd( clf, Xtest ); +% The format for X is nxp where n is the number of data points and p is their dimension. +% The format for Y is nx1. Example of a classifier is: clfinit = @clf_lda +% +% Given data in a cell array format, it might be useful to string out into single array: +% IDX = cell2mat( permute( IDX, [2 1] ) ); data = cell2mat( permute( data, [2 1] ) ); +% For a simple, small dataset, can do the following to do leave one out classification: +% [n,p]=size(data); IDX=mat2cell(IDX,ones(1,n),1); data=mat2cell(data,ones(1,n),p); +% +% Overall error can be calculated via: +% er = 1-sum(diag(CM))/sum(CM(:)) +% Normalized confusion matrix can be calculated via: +% CMn = CM ./ repmat( sum(CM,2), [1 size(CM,2)] ); +% +% INPUTS +% data - cell array of (n x p) arrays each of n samples of dim p +% IDX - cell array of (n x 1) arrays each of n labels +% clfinit - classifier initialization function +% clfparams - classifier parameters +% types - [optional] cell array of string labels for types +% ignoretypes - [optional] array of types we aren't interested in {eg: [1 4 5]}. +% fname - [optional] specify a file to save CM to, as well as image +% show - [optional] will display results in figure(show) +% +% OUTPUTS +% CM - confusion matrix +% +% EXAMPLE +% load clf_data; % 2 class data +% nfoldxval( data, IDX, @clf_lda,{'linear'}, [],[],[],1 ); % LDA +% nfoldxval( data, IDX, @clf_knn,{4},[],[],[],2 ); % 4 k nearest neighbor +% nfoldxval( data, IDX, @clf_svm,{'poly',2},[],[],[],3 ); % polynomial SVM +% nfoldxval( data, IDX, @clf_svm,{'rbf',2^-12},[],[],[],4 ); % rbf SVM +% nfoldxval( data, IDX, @clf_dectree,{},[],[],[],5 ); % decision tree +% % for multi-class data +% nfoldxval( data, IDX, @clf_ecoc,{@clf_svm,{'rbf',2^-12},nclasses},[],[],[],6 ); % ECOC +% +% DATESTAMP +% 11-Oct-2005 2:45pm +% +% See also CLF_LDA, CLF_KNN, CLF_SVM, CLF_ECOC + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function CM=nfoldxval( data, IDX, clfinit, clfparams, types, ignoretypes, fname, show ) + if( nargin<5 || isempty(types) ) types=[]; end; + if( nargin<6 || isempty(ignoretypes) ) ignoretypes=[]; end; + if( nargin<7 || isempty(fname) ) fname=[]; end; + if( nargin<8 || isempty(show) ) show=[]; end; + dispflag = 0; + + %%% divide n data points into n different sets, perform nfoldxval on each + if( ~iscell(data) && ~iscell(IDX) ) + [n,p]=size(data); + IDX=mat2cell(IDX,ones(1,n),1); + data=mat2cell(data,ones(1,n),p); + end + + %%% correct format + data={data{:}}; IDX={IDX{:}}; + nsets = length( data ); + + %%% remove data points with type specified by ignoretypes + if( ~isempty(ignoretypes) ) + if(~isempty(types)) + keeptypes = setdiff( 1:length(types), ignoretypes ); + types = types( keeptypes ); ntypes = length(types); + end; + ignoretypes = sort(ignoretypes); + while( length(ignoretypes)>0 ) + for i=1:nsets + keeplocs = (IDX{i}~=ignoretypes(1)); + data{i} = data{i}(keeplocs,:); IDXi = IDX{i}(keeplocs); + big=IDXi>ignoretypes(1); IDXi(big)=IDXi(big)-1; IDX{i}=IDXi; + end; + ignoretypes=ignoretypes(2:end)-1; + end; + end; + + %%% for binary classes convert to most common form [-1/+1] + IDXall = cell2mat( permute( IDX, [2 1] ) ); + minIDX = min(IDXall); maxIDX = max(IDXall); + if( minIDX==0 && maxIDX==1 ) + for i=1:nsets IDX{i}(IDX{i}==0)=-1; end; + elseif( minIDX==1 && maxIDX==2 ) + for i=1:nsets IDX{i}(IDX{i}==2)=-1; end; + end; + + %%% create types string for display if not exist + if( isempty(types) ) + types = unique(IDXall); + types = int2str2( types ); + end; + ntypes = length(types); + + %%% optionally visualize data by embedding in 3D space + if( 0 ) + dataALL = cell2mat( permute( data, [2 1] ) ); + figure(show); show=show+1; + visualize_data( dataALL, 3, IDXall+2, types ); + end; + + %%% train on n-1 of the sets, test on the remaining; repeat n times + CM = zeros(ntypes); + for testind = 1:nsets + + % get training/testing data sets + allinds = logical( ones(1,nsets) ); + traininds = allinds; traininds( testind ) = logical(0); + train = cell2mat( permute( {data{traininds}}, [2 1] ) ); + test = cell2mat( permute( {data{~traininds}}, [2 1] ) ); + trainIDX = cell2mat( permute( {IDX{traininds}}, [2 1] ) ); + testIDX = cell2mat( permute( {IDX{~traininds}}, [2 1] ) ); + [ntrain p]=size(train); [ntest p]=size(test); + + % apply dim reduction [make sure data is well conditioned] + if( 0 ) + [ U, mu, variances ] = pca( train' ); + maxp = size(U,2) -6; % -20; further reduce? -6 + if( maxp < p ) + warning(['reducing dim of data from: ' ... + int2str(p) ' to ' int2str(maxp)]); + train = pca_apply( train', U, mu, variances, maxp )'; + test = pca_apply( test', U, mu, variances, maxp )'; + p = maxp; + end; + end; + + % display update + if( dispflag ) + msg = ['test set ' int2str(testind)]; + disp([msg '; ntrain=' num2str(ntrain) ', ntest=' num2str(ntest)]); + end + if( ntest==0 ) if(dispflag) disp('no test data'); end; continue; end; + + % learn a classifier on train and classify test + clf = feval( clfinit, p, clfparams{:} ); + clf = feval( clf.fun_train, clf, train, trainIDX ); + testIDXpred = feval( clf.fun_fwd, clf, test ); + CMi = confmatrix( testIDX, testIDXpred, ntypes ); + CM = CM + CMi; + end + + %%% show confusion matrix, optionally save image to file + if( show ) + figure(show); show=show+1; + confmatrix_show( CM, types ); + if( isempty(fname) ) + title( clf.type, 'FontSize', 20 ); + else + title( fname, 'FontSize', 20 ); + print( [fname '.jpg'], '-djpeg' ); + end; + end; + + %%% save data to file + if( ~isempty(fname) ) + er = 1-sum(diag(CM))/sum(CM(:)); + CMn = CM ./ repmat( sum(CM,2), [1 size(CM,2)] ); + save( fname, 'CM', 'CMn', 'er' ); + if( dispflag ) fprintf(['finished: ' fname '.\n\n\n']); end; + else + if( dispflag ) fprintf(['finished.\n\n\n']); end; + end; + diff --git a/classify/pca.m b/classify/pca.m new file mode 100644 index 00000000..eaf45dad --- /dev/null +++ b/classify/pca.m @@ -0,0 +1,108 @@ +% principal components analysis (alternative to princomp). +% +% A simple dimensionality reduction technique. Use this function to create an orthonormal +% basis for the space R^N. This basis has the property that the coordinates of a vector x +% in R^N are of decreasing importance. Hence instead of using all N coordinates to +% specify the location of x, using only the first kn) + [V,Ssq,V] = svd( X' * X ); + keeplocs = diag(Ssq) > .00000001^2; + Ssq = Ssq(keeplocs,keeplocs); + V = V(:,keeplocs); + U = X * (V * Ssq^-.5); + else + [U,Ssq,U] = svd( X * X' ); + keeplocs = diag(Ssq) > .00000001^2; + Ssq = Ssq(keeplocs,keeplocs); + U = U(:,keeplocs); + end + + % eigenvalues squared + variances = diag(Ssq); + diff --git a/classify/pca_apply.m b/classify/pca_apply.m new file mode 100644 index 00000000..5577e999 --- /dev/null +++ b/classify/pca_apply.m @@ -0,0 +1,85 @@ +% Companion function to pca. +% +% Use pca to retrieve the principal components U and the mean mu from a +% set fo vectors X1 via [U,mu,variances] = pca(X1). Then given a new +% vector x, use y = pca_apply( x, U, mu, variances, k ) to get the first k +% coefficients of x in the space spanned by the columns of U. +% +% The input x can be a matrix X, where each column represents a single +% vector in R^N. If X has higher dimension, the first n-1 dimensions are +% used as the variables and the last dimension as an observation -- for +% more information on this see pca.m +% +% This may prove useful: +% siz = size(X); k = 100; +% Uim = reshape( U(:,1:k), [ siz(1:end-1) k ] ); +% +% It is also interesting to look at the distribution of the points Y's (their projection +% onto 2D or 3D): +% plot( Y(1,:), Y(2,:), '.' ); +% plot3( Y(1,:), Y(2,:), Y(3,:), '.' ); +% +% INPUTS +% X - array for which to get PCA coefficients +% U - [returned by pca] -- see pca +% mu - [returned by pca] -- see pca +% variances - [returned by pca] -- see pca +% k - number of principal coordinates to approximate X with +% +% OUTPUTS +% Yk - first k coordinates of X in column space of U +% Xhat - approximation of X corresponding to Yk +% pixelerror - measure of squared error per pixel normalized to fall between [0,1] +% +% DATESTAMP +% 29-Nov-2005 2:00pm +% +% See also PCA, PCA_APPLY_LARGE, PCA_VISUALIZE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [ Yk, Xhat, avsq, avsq_orig ] = pca_apply( X, U, mu, variances, k ) + % Note: the 4 output version of this function is for pca_apply_large + + siz = size(X); nd = ndims(X); [N,r] = size(U); + if (N==prod(siz) && ~(nd==2 && siz(2)==1)) siz=[siz, 1]; nd=nd+1; end; + inds = {':'}; inds = inds(:,ones(1,nd-1)); + d= prod(siz(1:end-1)); + + % some error checking + if(isa(X,'uint8')) X = double(X); end; + if( k>r ) + warning(['Only ' int2str(r) '1 ) + Xhat = Uk * Yk; + Xhat = reshape( Xhat, siz ); + Xhat = Xhat + murep; + end; + + % caclulate average value of (Xhat-Xorig).^2 compared to average value of + % X.^2, where X is Xorig without the mean. This is equivalent to what + % fraction of the variance is captured by Xhat. + if( nargout>2 ) + avsq = Xhat - Xorig; + avsq = dot(avsq(:),avsq(:)); + avsq_orig = dot(X(:),X(:)); + if (nargout==3) + avsq = avsq / avsq_orig; + end + end; diff --git a/classify/pca_apply_large.m b/classify/pca_apply_large.m new file mode 100644 index 00000000..1a70f27e --- /dev/null +++ b/classify/pca_apply_large.m @@ -0,0 +1,62 @@ +% Wrapper for pca_apply that allows for application to large X. +% +% Wrapper for pca_apply that splits and processes X in parts, this may be +% useful if processing cannot be done fully in parallel because of memory +% constraints. See pca_apply for usage. +% +% INPUTS +% same as pca_apply +% +% OUTPUTS +% same as pca_apply +% +% DATESTAMP +% 29-Nov-2005 2:00pm +% +% See also PCA, PCA_APPLY, PCA_VISUALIZE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [ Yk, Xhat, pixelerror ] = pca_apply_large( X, U, mu, variances, k ) + siz = size(X); nd = ndims(X); [N,r] = size(U); + if (N==prod(siz) && ~(nd==2 && siz(2)==1)) siz=[siz, 1]; nd=nd+1; end; + inds = {':'}; inds = inds(:,ones(1,nd-1)); + d= prod(siz(1:end-1)); + + % some error checking + if(isa(X,'uint8')) X = double(X); end; + if( k>r ) warning('Only r siz(end)) + if (nargout==1) + Yk = pca_apply( X, U, mu, variances, k ); + elseif (nargout==2) + [Yk, Xhat] = pca_apply( X, U, mu, variances, k ); + else + [ Yk, Xhat, avsq, avsq_orig ] = pca_apply( X, U, mu, variances, k ); + pixelerror = avsq / avsq_orig; + end + else + Yk = zeros( k, siz(end) ); Xhat = zeros( siz ); + avsq = 0; avsq_orig = 0; lastelt = 0; + if( nargout==1 ) outargs = cell(1,1); elseif( nargout==2 ) outargs = cell(1,2); + else outargs = cell(1,4); end; + while (lastelt < siz(end)) + firstelt = lastelt + 1; lastelt = min( firstelt+maxwidth-1, siz(end) ); + truewidth = (lastelt - firstelt + 1); + [outargs{:}] = pca_apply( X(inds{:}, firstelt:lastelt), U, mu, variances, k ); + Yk( :, firstelt:lastelt ) = outargs{1}; + if(nargout>1) Xhat(inds{:}, firstelt:lastelt ) = outargs{2}; end; + if(nargout>2) avsq = avsq + outargs{3}; + avsq_orig = avsq_orig + outargs{4}; end + end + if( nargout==3) pixelerror = avsq / avsq_orig; end; + end + diff --git a/classify/pca_data.mat b/classify/pca_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..48fd92bad8e699ff0821f3308c80fb1a3bab0559 GIT binary patch literal 165368 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

|gc;*C!r)vG`))^*(Ey^o#qfBiE@emS5o0535^p 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 L6TO=!KiR(lrde43 literal 0 HcmV?d00001 diff --git a/classify/pca_randomvector.m b/classify/pca_randomvector.m new file mode 100644 index 00000000..56c25798 --- /dev/null +++ b/classify/pca_randomvector.m @@ -0,0 +1,91 @@ +% Generate random vectors in PCA subspace. +% +% Used to generate random vectors from the subspace spanned by the first k +% principal components. The points generated come from the gaussian +% distribution from within the subspace. +% +% Can optionally generate points on the subspace that are also on a +% hypershpere centered on the origin. This may be useful if the original +% data points were all from a hypershpere -- for example they were +% normalized via imnormalize. Set the optional hypershpere flag to +% 1 to generate points only on the hypersphere. +% +% INPUTS +% U - [returned by pca] -- see pca +% mu - [returned by pca] -- see pca +% variances - [returned by pca] -- see pca +% k - number of principal coordinates to use +% n - number of x to generate +% hypershpere - [optional] generate points on hypersphere (see above) +% show - [optional] figure to use for display (no display if == 0) +% +% OUTPUTS +% Xr - resulting randomly generated vectors +% +% DATESTAMP +% 29-Nov-2005 2:00pm +% +% See also PCA + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function Xr = pca_randomvector( U, mu, variances, k, n, hypershpere, show ) + %%% Little test - see if eigenvectors induced by randomly generated vectors + %%% are the same as the original eigenvectors. Assumes [U,mu,variances] exist. + % Xr = pca_randomvector( U, mu, variances, 3, 100 ); + % [ Ur, mur, variancesr ] = pca( Xr ); + % ind = 3; + % Uim = reshape( U(:,ind), [ size(mu,1), size(mu,2) ] ); + % Uimr = reshape( Ur(:,ind), [ size(mu,1), size(mu,2) ] ); + % if( sum(abs(Uim-Uimr))>sum(abs(Uim+Uimr))) Uimr=Uimr*-1; end; % might be off by a sign + % clf; subplot(3,1,1); im( Uim ); subplot(3,1,2); im( Uimr ); + % subplot(3,1,3); im( Uim - Uimr); + %%% + if( nargin<6 || isempty(hypershpere) ) hypershpere=0; end; + if( nargin<7 || isempty(show) ) show=0; end; + + siz = size(mu); + nd = ndims(mu); + sizX = [siz, n]; + d = prod(siz); + + % generate random vectors inside of subspace. + C = diag( variances(1:k).^-1 ); + Yr = C * randn(k,n); + Uk = U(:,1:k); + Xr = Uk * Yr; + + % use above method to try to generate points in the hyperspace that + % also lie on a hypersphere. + if(hypershpere) + % The final point must lie on the hypershpere. That is we need to + % scale each element xr of Xr so that after adding it to mu the + % resulting vector has length d. So we need to find k>0 such that + % (k*xr + mu) has length d. To find this k we simply solve the + % quadratic equation induced by ||(k*xr + mu)||=d, choosing the root + % such that k>0. Note that the mean of the resulting vector will not + % necessarily be 0, but the variance will pretty much be 1! + % Regardless, we restandardize at the end. + muv = mu(:); magmu = dot(muv,muv); + for i=1:n + xr = Xr(:,i); + rs = roots( [dot(xr,xr), 2 * dot(xr,muv), magmu-d] ); + Xr(:,i) = muv + max(rs)*xr; + end + + Xr = reshape( Xr, sizX ); + Xr = feval_arrays( Xr, @imnormalize ); + else + % simply add the mean to reshaped Xr + Xr = reshape( Xr, sizX ); + murep = repmat(mu, [ones(1,nd), n ] ); + Xr = Xr + murep; + end + + % optionaly show resulting vectors + if (show) + figure(show); montage2(Xr,1); + end + diff --git a/classify/pca_visualize.m b/classify/pca_visualize.m new file mode 100644 index 00000000..971fd9bd --- /dev/null +++ b/classify/pca_visualize.m @@ -0,0 +1,113 @@ +% Visualization of quality of approximation of X given principal components. +% +% X can either represent a single element (a single image or video), or a set of elements. +% In the latter case, index controls which element of X to apply visualization to, if +% unspecified it is chosen randomly. +% +% INPUTS +% U - [returned by pca] -- see pca +% mu - [returned by pca] -- see pca +% variances - [returned by pca] -- see pca +% X - Set of images or videos, or a single image or video +% index - [optional] If X is a set of images or videos, controls +% - which image or video to apply visualization to +% ks - [optional] ks values of k for pca_apply (ex. ks=[1 4 8 16]) +% filename - [optional] if specified outputs avis +% show - [optional] will display results in figure(show) and figure(show+1) +% +% OUTPUTS +% M - [only if X ia a movie] movie of xhats (see pcaapply) +% MDiff - [only if X ia a movie] movie of difference images +% MU - [only if X ia a movie] movie of eigenmovies +% +% DATESTAMP +% 29-Nov-2005 2:00pm +% +% See also PCA, PCA_APPLY + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function varargout = pca_visualize( U, mu, variances, X, index, ks, filename, show ) + siz = size(X); nd = ndims(X); [N,r] = size(U); + if (N==prod(siz) && ~(nd==2 && siz(2)==1)) siz=[siz, 1]; nd=nd+1; end; + fsiz = siz(1:end-1); d = prod(fsiz); + inds = {':'}; inds = inds(:,ones(1,nd-1)); + + if (d~=N ) error('incorrect size for X or U'); end; + if( nd~=3 && nd~=4 ) warning('use primarily on 3 or 4 dimensional data'); end; + if( nargin<5 || isempty(index) ) index = 1+randint(1,1,siz(end)); end; + if( index>siz(end) ) error(['X only has ' num2str(siz(end)) ' elements']); end; + if( nargin<6 || isempty(ks) ) maxp = floor( log2( r )); ks = 2.^[0:maxp]; end; + if( nargin<7 || isempty(filename)) filename = []; end; + if( nargin<8 || isempty(show)) show = 1; end; + + %%% create xhats image of PCA reconstruction + ks = ks( ks<=r ); + x = double( X(inds{:},index) ); + xhats = x; diffs = []; errors = []; + for k=ks + [ Yk, xhat, errors(end+1) ] = pca_apply( x, U, mu, variances, k ); + xhats = cat( nd, xhats, xhat ); + diffs = cat( nd, diffs, (xhat-x).^2 ); + end + + %%% calculate residual at each k for plot purposes + residuals = variances / sum(variances); + residuals = 1-cumsum(residuals); + residuals = [1; residuals(1:max(ks))]; + + % show decay image + figure(show); clf; + plot( 0:max(ks), residuals, 'r- .', ks, errors, 'g- .' ); + hold('on'); line( [0,max(ks)], [.1,.1] ); hold('off'); + title('error of approximation vs number of eigenbases used'); + legend('residuals','errors - actual'); + + %%% reshape U to have first dimensions same as x + k = min(100,r); st=0; + Uim = reshape( U(:,1+st:k+st), [ fsiz k ] ); + + %%% VISUALIZATION + labels = {}; for k=ks labels{end+1} = ['k=' num2str(k)]; end + if( nd==3 ) + % show images + figure(show+1); clf; + subplot(2,2,1); montage2( Uim, 1,0 ); title('principal components'); + subplot(2,2,2); im( mu ); title('mean'); + subplot(2,2,3); montage2( xhats, 1, 0, [], [], [], {'original' labels{:}} ); + title('various approximations of x'); + subplot(2,2,4); montage2( diffs, 1, 0, [], [], [], labels ); + title('difference images'); + + % optionally record image + if (~isempty(filename)) + print( [filename '_eigenanalysis.jpg'], '-djpeg' ); + end + + elseif( nd==4 ) + + % create movies + if( nargout>0 ) figure2(.6,show+1); clf; + M = makemovies( xhats, {0, [], [], 0, {'original' labels{:}}} ); + varargout={M}; end; + if( nargout>1 ) figure2(.6,show+1); clf; + MDiff = makemovies( diffs, {0, [], [], 0, labels} ); + varargout{2} = MDiff; end; + if( nargout>2 ) figure2(.6,show+1); clf; + MU = makemovies( Uim ); + varargout{3} = MU; end; + + % optionally record image and movie + if (~isempty(filename)) + print( [filename '_decay.jpg'], '-djpeg' ); + compr = { 'Compresion', 'Cinepak' }; + if( nargout>0 ) movie2avi( M, [filename '.avi'], compr{:} ); end + if( nargout>1 ) movie2avi( MDiff, [filename '_diff.avi'], compr{:} ); end; + if( nargout>2 ) movie2avi( MU, ['principal eigenimages.avi'], compr{:} ); end; + end + end + + + diff --git a/classify/private/IDX2order.m b/classify/private/IDX2order.m new file mode 100644 index 00000000..b0b681f0 --- /dev/null +++ b/classify/private/IDX2order.m @@ -0,0 +1,32 @@ +% Converts class labels into an ordering. +% +% Creates an ordering order such that IDX(order)=[1 1...1 2...2 ... k...k]. All points +% within a class retain the ordering in which they originally appeared. Also, Xb = +% X(order,:) has cluster labels IDX(order), ie adjacent elements in X typically belong to +% the same cluster. +% +% INPUTS +% IDX - cluster membership [see kmeans2.m] +% +% OUTPUTS +% order - n-by-1 vector containing a new ordering for the points. +% +% EXAMPLE +% order = IDX2order( [1 1 3 1 2 2] ), % order should be: [1 2 4 5 6 3] +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function order = IDX2order( IDX ) + k = max(IDX); n = length(IDX); + order = zeros(1,n); count = 0; + for i=1:k + locs = (IDX==i); orderi = cumsum(locs); + order(locs) = orderi(locs) + count; + count = count+sum(locs); + end + [dis,order] = sort(order); diff --git a/classify/private/meanshift1.c b/classify/private/meanshift1.c new file mode 100644 index 00000000..ff577734 --- /dev/null +++ b/classify/private/meanshift1.c @@ -0,0 +1,264 @@ +/********************************************************************* +* DATESTAMP 29-Sep-2005 2:00pm +* Piotr's Image&Video Toolbox Version 1.0 +* Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +* Adapted from code by: Sameer Agarwal || sagarwal-at-cs.ucsd.edu +* Please email me if you find bugs, or have suggestions or questions! +*********************************************************************/ + +#include +#include "mex.h" + +/* Input Arguments */ +#define DATA prhs[0] +#define RADIUS prhs[1] +#define RATE prhs[2] +#define ITERCOUNT prhs[3] +#define BLUR prhs[4] + +/* Output Arguments */ +#define IDX plhs[0] +#define FMEAN plhs[1] + +/* MIN MAX PI */ +#if !defined(MAX) +#define MAX(A, B) ((A) > (B) ? (A) : (B)) +#endif + +#if !defined(MIN) +#define MIN(A, B) ((A) < (B) ? (A) : (B)) +#endif + +#define PI 3.14159265 + + +/* + * Calculates the mean of all the points in data that lie on a sphere of + * radius^2==radius2 centered on the vector x. x has p dimensions, data has n + * points of dimension p. The pointer *mean will point to the array containing + * the mean, and the return is the number of points that were used to calculate + * the mean. + */ +/* had to remove 'inline' because my compiler sucks */ +static int meanvector( double *x, double *data, int p, int n, double radius2, double *mean) +{ + int i, j; + float value; + int counter = 0; + int npoints = 0; + + for(j=0;j0) */ + if (npoints) { + for (j = 0; j < p; j++) + means_next[i * p + j] = (1 - rate) * means_current[i * p + j] + rate*mean[j]; + } else { + for (j = 0; j < p; j++) + means_next[i * p + j] = means_current[i * p + j]; + } + } + } + + /* update means, after seeing if there was any change. */ + delta = 0; + for (i = 0; i < n; i++) { + if( deltas[i] && dist( means_next+i*p, means_current+i*p, p )>0.001 ) { + delta=1; deltas[i]=1; + } + } + means_current = (double*) memcpy (means_current, means_next, p * n * sizeof (double)); + + /* update progress indicator */ + /* HACK: use 'pause(.001)' otherwise no output fflush(stdout); */ + itercount++; + mexPrintf( "\b\b\b\b\b\b\b\b%f", ((float) itercount) / ((float) maxiter)); + mexEvalString("pause(.001);"); + } + mexPrintf( "\n" ); + + + /* CONSOLIDATE */ + /* Assign all points that are within a squared distance of radius2 of each other to + the same cluster. Also calculate their mean. */ + for (i = 0; i < n; i++) { + consolidated[i] = 0; + clusterlabels[i] = 0; + } + for (i = 0; i < n; i++) + if (!consolidated[i]) { + for (j = 0; j < n; j++) { + if (!consolidated[j]) + if (dist(means_current + i * p, means_current + j * p, p) < radius2) { + clusterlabels[j] = nclusterlabels; + consolidated[j] = 1; + } + } + nclusterlabels++; + } + means_final = (double*) memcpy (means_final, means_current, p * n * sizeof (double)); + nclusterlabels = nclusterlabels-1; + + + /* RELEASE MEMORY */ + free(means_next); + free(means_current); + free(mean); + free(consolidated); + free(deltas); +} + + + + +/******************************************************************************/ +void mexFunction (int nlhs, mxArray * plhs[], int nrhs, const mxArray * prhs[]) +{ + double radius; + double rate; + int maxiter; + double *data; + int p, n; + double *clusterlabels; + double *means_final; + int blur = 0; + + /* Check for proper number of arguments */ + if (nrhs < 4) + mexErrMsgTxt ("At least four input arguments required."); + else if (nlhs > 2) + mexErrMsgTxt("Too many output arguments."); + if (nrhs == 5) + blur = (int) mxGetScalar (BLUR); + + /* Get input arguments */ + data = mxGetPr (DATA); + radius = mxGetScalar (RADIUS); + rate = mxGetScalar (RATE); + maxiter = (int) mxGetScalar (ITERCOUNT); + p = mxGetM (DATA); + n = mxGetN (DATA); + + /* Create a matrix for the return argument */ + IDX = mxCreateNumericMatrix (n, 1, mxDOUBLE_CLASS, mxREAL); + clusterlabels = mxGetPr(IDX); + + FMEAN = mxCreateNumericMatrix(p, n, mxDOUBLE_CLASS, mxREAL); + means_final = mxGetPr(FMEAN); + + /* Do the actual computations in a subroutine */ + meanshift (data, p, n, radius, rate, maxiter, blur, clusterlabels, means_final); + return; +} diff --git a/classify/private/meanshift1.dll b/classify/private/meanshift1.dll new file mode 100644 index 0000000000000000000000000000000000000000..53aa406155ed7feaf80ef77fedec1809a5e868ca GIT binary patch literal 7680 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 literal 0 HcmV?d00001 diff --git a/classify/private/meanshift_post.m b/classify/private/meanshift_post.m new file mode 100644 index 00000000..0261eb74 --- /dev/null +++ b/classify/private/meanshift_post.m @@ -0,0 +1,44 @@ +% Some post processing routines for meanshift not currently being used. +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [IDX,C] = meanshift_post( X, IDX, C, minCsize, forceoutliers ) + k = max(IDX); n = length(IDX); + + %%% force outliers to belong to IDX if ~outliersflag (mainly for visualization) + if( forceoutliers ) + for i=find(IDX<0)' + D = dist_euclidean( X(i,:), C ); + [mind IDx] = min(D,[],2); + IDX(i) = IDx; + end + end; + + %%% Delete smallest cluster, reassign points, resort, delete smallest cluster.. + ticstatusid = ticstatus('meanshift_post',[],5); kinit = k; + while( 1 ) + % sort clusters [largest first] + ccounts = zeros(1,k); for i=1:k ccounts(i) = sum( IDX==i ); end + [ccounts,order] = sort( -ccounts ); ccounts = -ccounts; C = C(order,:); + IDX2 = IDX; for i=1:k IDX2(IDX==order(i))=i; end; IDX = IDX2; + + % stop if smallest cluster is big enough + if( ccounts(k)>= minCsize ) break; end; + + % otherwise discard smallest [last] cluster + C( end, : ) = []; + for i=find(IDX==k)' + D = dist_euclidean( X(i,:), C ); + [mind IDx] = min(D,[],2); + IDX(i) = IDx; + end; + k = k-1; + + tocstatus( ticstatusid, (kinit-k)/kinit ); + end + tocstatus( ticstatusid, 1 ); diff --git a/classify/softmin.m b/classify/softmin.m new file mode 100644 index 00000000..192c0a46 --- /dev/null +++ b/classify/softmin.m @@ -0,0 +1,58 @@ +% Calculates the softmin of a vector. +% +% Let d be a vector. Then the softmin of d is defined as: +% s = exp(-d/sigma^2) / sum( exp(-d/sigma^2) ) +% The softmin is a way of taking a dissimilarity (distance) vector d and converting it to +% a similarity vector s, such that sum(s)==1. +% +% Note that as sigma->0, softmin's behavior tends toward that of the standard min +% function. That is the softmin of a vector d has all zeros with a single 1 in the +% location of the smallest value of d. For example, "softmin([.2 .4 .1 .3],eps)" returns +% "[0 0 1 0]". As sigma->inf, then softmin(d,sigma) tends toward "ones(1,n)/n", where +% n==length(d). +% +% If D is an NxK array, is is treated as N K-dimensional vectors, and the return is +% likewise an NxK array. This is useful if D is a distance matrix, generated by the likes +% of dist_euclidean or dist_chisquared. +% +% If d contains the squared euclidean distance between a point y and k points xi, then +% there is a probabilistic interpretation for softmin. If we think of the k points +% representing equal variant gaussians each with mean xi and std sigma, then the softmin +% returns the relative probability of y being generated by each gaussian. +% +% INPUTS +% D - NxK dissimilarity matrix +% sigma - controls 'softness' of softmin +% +% OUTPUTS +% M - the softmin +% +% EXAMPLE +% % example 1 +% C = [0 0; 1 0; 0 1; 1 1]; x=[.7,.3; .1 .2]; +% D = dist_euclidean( x, C ); +% M = softmin( D, 1 ) +% % example 2 +% fplot( 'softmin( [0.5 0.2 .4], x )', [eps 10] ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also DIST_EUCLIDEAN, DIST_CHISQUARED + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function M = softmin( D, sigma ) + M = exp( -D / sigma^2 ); + sumM = sum( M, 2 ); + sumMzero = (sumM==0); + if( any(sumMzero) ) + [vs, inds] = min(D,[],2); [n k] = size(D); + Mhard = imsubs2array( [(1:n)' inds], ones( n,1 ), [n k] ); + M( sumMzero, : ) = Mhard( sumMzero, : ); + sumM = sum( M, 2 ); + end + M = M ./ sumM( :, ones(1,size(M,2)) ); + diff --git a/classify/visualize_data.m b/classify/visualize_data.m new file mode 100644 index 00000000..37f76afd --- /dev/null +++ b/classify/visualize_data.m @@ -0,0 +1,75 @@ +% Project high dim. data unto principal components (PCA) for visualization. +% +% Optionally IDX can be specified to indicate different classes for the points; +% in this case points in different classes are displayed using different colors. +% Up to 12 types are handled (for technical reasons involving plot), any +% cluster with a label>12 is assigned the label 12. +% +% INPUTS +% X - column vector of data - N vectors of dimension p (X is Nxp) +% k - dimension to which to reduce data (2 or 3) +% IDX - [optional] cluster membership [see kmeans2.m] +% types - [optional] cell array of length ntypes of text labels for each type +% +% EXAMPLE +% X=[randn(100,5); randn(100,5)+4]; +% IDX=[ones(100,1); 2*ones(100,1)]; +% visualize_data( X, 2, IDX, {'type1','type2' }); +% +% DATESTAMP +% 29-Nov-2005 2:00pm +% +% See also KMEANS2 + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function visualize_data( X, k, IDX, types ) + if( nargin<3 || isempty(IDX) ) IDX=[]; end; + if( nargin<4 || isempty(types) ) types=[]; end; + + % apply PCA if necessary + if( size(X,2)~= k ) + [ U, mu, variances ] = pca( X' ); + X = pca_apply( X', U, mu, variances, k )'; + end + + %%% get k + k = size(X,2); + if( k==1 ) X = [X zeros(size(X))]; k = 2; end; + if( k>3 ) error( 'k must be <= 3'); end; + + + %%% show points + if( isempty(IDX) ) + if( k==2 ) + plot( X(:,1), X(:,2), '.' ); + elseif( k==3 ) + plot3( X(:,1), X(:,2), X(:,3), '.' ); + end; + + %%% show color-coded points (by class) + else + IDX(IDX>12)=12; c=1; m=max(IDX); % limit on number of types + if( k==2) + for i=1:m + R{c}=X(IDX==i,1); R{c+1}=X(IDX==i,2); + R{c+2}='.'; c=c+3; + end; + R{c}=X(IDX==-1,1); R{c+1}=X(IDX==-1,2); + R{c+2}='k.'; c=c+3; + plot( R{:} ); axis('equal'); + elseif( k==3 ) + for i=1:m + R{c}=X(IDX==i,1); R{c+1}=X(IDX==i,2); + R{c+2}=X(IDX==i,3); R{c+3}='.'; c=c+4; + end; + R{c}=X(IDX==-1,1); R{c+1}=X(IDX==-1,2); + R{c+2}=X(IDX==-1,3); R{c+3}='.'; c=c+4; + plot3( R{:} ); axis('equal'); + end; + end; + + %%% show legend if types is provided + if(~isempty(types)) legend(types); end; diff --git a/doc/alpha.png b/doc/alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..c73de7b05000443a0842f2e915d30dc5efec0dd1 GIT binary patch literal 273 zcmV+s0q*{ZP)z zQ4WJJ2!`q6(c~&{CcFyX%{{O*3+<>*r)K@)L#;sgtx%hY2zp`w01>%5jgw&J!A6Ov z{oxj&d7k&j`4Qtd0>I2H(i=Rwz9Tqxf(W|?ki|=ctL(aA|es#WFKbc?zg4C=hd_}m12PXzTKJB+iB?u XpQ?QQ=I-(g00000NkvXXu0mjf#?^X; literal 0 HcmV?d00001 diff --git a/doc/c++.png b/doc/c++.png new file mode 100644 index 0000000000000000000000000000000000000000..24f56e6293df813f7699555d0fdd0224a33bdac9 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0YJ>p!2~4#tiFE(NUrMq>1fP(BLp1!W^mpLQ_Wwp7rPrm~SUGa2r45^s&cKTi3W&@s7VZD}9S!LiPTl|j(*)-gYW;;XAZ?5N!pnK5hG z+s}VG5+xWO6mIF=yOWvujML^HlXZ+Yu?Qyj=7(iWd!%tXIGN|}`LH!?g3;OMg0piY zXCLcLf98Km#%@Dm=Gw_oB65#C&Ig=Xv$e7}bMZ3wpl2`Gw(%Wrdp_NvM0oStJBj<- zw>I9sUd+GU{%T3g&-nYj{hnNcohMx1C8q6LzjX6wt1Wi%t17>Iemh??{C9K})9DTU VtbG#CZUOzr;OXk;vd$@?2>_TKh~WSL literal 0 HcmV?d00001 diff --git a/doc/c.png b/doc/c.png new file mode 100644 index 0000000000000000000000000000000000000000..c39fbf0e25ee296c5da082458363c45d945e55ac GIT binary patch literal 252 zcmVqm`?`neZy@-MWWPW6I1ran`JUPt^Pp2nEy;5sZWf01@dO#z`=%5EER@AM$q-T7II}~u7He5MzB*^2($9;r8$^sTRx!mG z*Y={Rp11gKlvQkAY5N${nZR6`uQXd6Q{e@Bh2dQhbZ(t1?070Ye8{5GRQ*|k);Is- zyZYFOBO(zQWDhg*y_Wu+*U+*r-a`3&yE1OHzojSttaK8#KYM}z0000 + + + Description of Contents + + + + + + + + + + +

Contents +

+ +

PURPOSE ^

+
CLASSIFY
+ +

SYNOPSIS ^

+
This is a script file.
+ +

DESCRIPTION ^

+
 CLASSIFY
+ See also
+
+ Clustering:
+   democluster         - Clustering demo.
+   demogendata         - Generate data drawn form a mixture of Gaussians.
+   kmeans2             - Very fast version of kmeans clustering.
+   meanshift           - meanshift clustering algorithm.
+   meanshiftim         - Applies the meanshift algorithm to a joint spatial/range image.
+   meanshiftim_explore - Visualization to help choose sigmas for meanshiftim.
+
+ Calculating distances efficiently:
+   dist_L1             - Calculates the L1 Distance between vectors (ie the City-Block distance).
+   dist_chisquared     - Calculates the Chi Squared Distance between vectors (usually histograms).
+   dist_emd            - Calculates Earth Mover's Distance (EMD) between positive vectors.
+   dist_euclidean      - Calculates the Euclidean distance between vectors [FAST].
+   distmatrix_show     - Useful visualization of a distance matrix of clustered points.
+   softmin             - Calculates the softmin of a vector.
+
+ Principal components analysis:
+   pca                 - principal components analysis (alternative to princomp).
+   pca_apply           - Companion function to pca.
+   pca_apply_large     - Wrapper for pca_apply that allows for application to large X.
+   pca_randomvector    - Generate random vectors in PCA subspace.
+   pca_visualize       - Visualization of quality of approximation of X given principal components.
+   visualize_data      - Project high dim. data unto principal components (PCA) for visualization.
+
+ Classification methods with a common interface:
+   democlassify        - A demo used to test and demonstrate the usage of classifiers (clf_*)
+   nfoldxval           - Runs n-fold cross validation on data with a given classifier.
+   confmatrix          - Generates a confusion matrix according to true and predicted data labels.
+   confmatrix_show     - Used to display a confusion matrix.
+   clf_dectree         - Wrapper for treefit that makes decision trees compatible with nfoldxval.
+   clf_dectree_fwd     - Apply the decision tree to data X.
+   clf_dectree_train   - Train a decision tree classifier.
+   clf_ecoc            - Wrapper for ecoc that makes ecoc compatible with nfoldxval.
+   clf_ecoc_code       - Generates optimal ECOC codes when 3<=nclasses<=7.
+   clf_knn             - Create a k nearest neighbor classifier.
+   clf_knn_dist        - k-nearest neighbor classifier based on a distance matrix D.
+   clf_knn_fwd         - Apply a k-nearest neighbor classifier to X.
+   clf_knn_train       - Train a k nearest neighbor classifier (memorization).
+   clf_lda             - Create a Linear Discriminant Analysis (LDA) classifier.
+   clf_lda_fwd         - Apply the Linear Discriminant Analysis (LDA) classifier to data X.
+   clf_lda_train       - Train a Linear Discriminant Analysis (LDA) classifier.
+   clf_svm             - Wrapper for svm that makes svm compatible with nfoldxval.
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_dectree.html b/doc/classify/clf_dectree.html new file mode 100644 index 00000000..25df7139 --- /dev/null +++ b/doc/classify/clf_dectree.html @@ -0,0 +1,54 @@ + + + + Description of clf_dectree + + + + + + + + + + +

clf_dectree +

+ +

PURPOSE ^

+
Wrapper for treefit that makes decision trees compatible with nfoldxval.
+ +

SYNOPSIS ^

+
function clf = clf_dectree( p, varargin )
+ +

DESCRIPTION ^

+
 Wrapper for treefit that makes decision trees compatible with nfoldxval.
+ 
+ INPUTS
+   p       - data dimension
+   params  - parameters for treefit, ex: 'splitmin'',2,'priorprob',ones(1,n)/n
+
+ OUTPUTS
+   clf     - model ready to be trained
+
+ DATESTAMP
+   11-Oct-2005  2:45pm
+
+ See also NFOLDXVAL, TREEFIT
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_dectree_fwd.html b/doc/classify/clf_dectree_fwd.html new file mode 100644 index 00000000..d165fb19 --- /dev/null +++ b/doc/classify/clf_dectree_fwd.html @@ -0,0 +1,54 @@ + + + + Description of clf_dectree_fwd + + + + + + + + + + +

clf_dectree_fwd +

+ +

PURPOSE ^

+
Apply the decision tree to data X.
+ +

SYNOPSIS ^

+
function Y = clf_dectree_fwd( clf, X )
+ +

DESCRIPTION ^

+
 Apply the decision tree to data X.
+
+ INPUTS
+   clf     - trained model
+   X       - nxp data array
+ 
+ OUTPUTS
+   Y       - nx1 vector of labels predicted according to the clf
+
+ DATESTAMP
+   11-Oct-2005  2:45pm
+
+ See also CLF_DECTREE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • clf_dectree Wrapper for treefit that makes decision trees compatible with nfoldxval.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_dectree_train.html b/doc/classify/clf_dectree_train.html new file mode 100644 index 00000000..54c7d85c --- /dev/null +++ b/doc/classify/clf_dectree_train.html @@ -0,0 +1,55 @@ + + + + Description of clf_dectree_train + + + + + + + + + + +

clf_dectree_train +

+ +

PURPOSE ^

+
Train a decision tree classifier.
+ +

SYNOPSIS ^

+
function clf = clf_dectree_train( clf, X, Y )
+ +

DESCRIPTION ^

+
 Train a decision tree classifier.
+
+ INPUTS
+   clf     - model to be trained
+   X       - nxp data array
+   Y       - nx1 array of labels
+ 
+ OUTPUTS
+   clf     - a trained binary clf_LDA clf 
+
+ DATESTAMP
+   11-Oct-2005  2:45pm
+
+ See also CLF_DECTREE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • c clc
  • int2str2 Convert integer to string of given length; improved version of int2str.
+This function is called by: +
    +
  • clf_dectree Wrapper for treefit that makes decision trees compatible with nfoldxval.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_ecoc.html b/doc/classify/clf_ecoc.html new file mode 100644 index 00000000..188a9170 --- /dev/null +++ b/doc/classify/clf_ecoc.html @@ -0,0 +1,59 @@ + + + + Description of clf_ecoc + + + + + + + + + + +

clf_ecoc +

+ +

PURPOSE ^

+
Wrapper for ecoc that makes ecoc compatible with nfoldxval.
+ +

SYNOPSIS ^

+
function clf = clf_ecoc(p,clfinit,clfparams,nclasses,use01targets)
+ +

DESCRIPTION ^

+
 Wrapper for ecoc that makes ecoc compatible with nfoldxval.
+
+ Requires the SVM toolbox by Anton Schwaighofer.
+
+ INPUTS
+   p               - data dimension
+   clfinit         - binary classifier init (see nfoldxval)
+   clfparams       - binary classifier parameters (see nfoldxval)
+   nclasses        - number of classes (currently only 3<=nclasses<=7 suppored)
+   use01targets    - see ecoc
+
+ OUTPUTS
+   clf             - see ecoc
+
+ DATESTAMP
+   11-Oct-2005  2:45pm
+
+ See also ECOC, NFOLDXVAL, CLF_ECOC_CODE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • clf_ecoc_code Generates optimal ECOC codes when 3<=nclasses<=7.
+This function is called by: +
    +
  • democlassify A demo used to test and demonstrate the usage of classifiers (clf_*)
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_ecoc_code.html b/doc/classify/clf_ecoc_code.html new file mode 100644 index 00000000..47d5418c --- /dev/null +++ b/doc/classify/clf_ecoc_code.html @@ -0,0 +1,50 @@ + + + + Description of clf_ecoc_code + + + + + + + + + + +

clf_ecoc_code +

+ +

PURPOSE ^

+
Generates optimal ECOC codes when 3<=nclasses<=7.
+ +

SYNOPSIS ^

+
function [C,nbits] = clf_ecoc_code( k )
+ +

DESCRIPTION ^

+
 Generates optimal ECOC codes when 3<=nclasses<=7.
+
+ INPUTS
+   nclasses - number of classes
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also CLF_ECOC
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • clf_ecoc Wrapper for ecoc that makes ecoc compatible with nfoldxval.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_knn.html b/doc/classify/clf_knn.html new file mode 100644 index 00000000..0a52ec21 --- /dev/null +++ b/doc/classify/clf_knn.html @@ -0,0 +1,55 @@ + + + + Description of clf_knn + + + + + + + + + + +

clf_knn +

+ +

PURPOSE ^

+
Create a k nearest neighbor classifier.
+ +

SYNOPSIS ^

+
function clf = clf_knn( p, k, dist_fn )
+ +

DESCRIPTION ^

+
 Create a k nearest neighbor classifier.
+ 
+ INPUTS
+   p       - data dimension
+   k       - number of nearest neighbors to look at 
+   dist_fn - [optional] distance function, squared euclidean by default
+
+ OUTPUTS
+   clf     - model ready to be trained
+
+ DATESTAMP
+   11-Oct-2005  2:45pm
+
+ See also NFOLDXVAL, CLF_KNN_TRAIN, CLF_KNN_FWD
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • clf_knn_fwd Apply a k-nearest neighbor classifier to X.
  • clf_knn_train Train a k nearest neighbor classifier (memorization).
  • dist_euclidean Calculates the Euclidean distance between vectors [FAST].
+This function is called by: +
    +
  • democlassify A demo used to test and demonstrate the usage of classifiers (clf_*)
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_knn_dist.html b/doc/classify/clf_knn_dist.html new file mode 100644 index 00000000..86bd8b27 --- /dev/null +++ b/doc/classify/clf_knn_dist.html @@ -0,0 +1,63 @@ + + + + Description of clf_knn_dist + + + + + + + + + + +

clf_knn_dist +

+ +

PURPOSE ^

+
k-nearest neighbor classifier based on a distance matrix D.
+ +

SYNOPSIS ^

+
function IDXpred = clf_knn_dist( D, IDX, k )
+ +

DESCRIPTION ^

+
 k-nearest neighbor classifier based on a distance matrix D.
+
+ k==1 is much faster than k>1.  For k>1, ties are broken randomly.
+
+ INPUTS
+   D       - MxN array of distances from M-TEST points to N-TRAIN points.
+   IDX     - ntrain length vector of class memberships 
+             if IDX(i)==IDX(j) than sample i and j are part of the same class
+   k       - [optional] number of nearest neighbors to use, 1 by default
+
+ OUTPUTS
+   IDXpred - length M vector of classes for training data
+
+ EXAMPLE
+   % [given D and IDX]
+   for k=1:size(D,2) err(k)=sum(IDX==clf_knn_dist(D,IDX,k)); end; 
+   figure(1); plot(err)
+
+ DATESTAMP
+   11-Oct-2005  8:00pm
+
+ See also CLF_KNN
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • clf_knn_fwd Apply a k-nearest neighbor classifier to X.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_knn_fwd.html b/doc/classify/clf_knn_fwd.html new file mode 100644 index 00000000..c0f054b6 --- /dev/null +++ b/doc/classify/clf_knn_fwd.html @@ -0,0 +1,54 @@ + + + + Description of clf_knn_fwd + + + + + + + + + + +

clf_knn_fwd +

+ +

PURPOSE ^

+
Apply a k-nearest neighbor classifier to X.
+ +

SYNOPSIS ^

+
function Y = clf_knn_fwd( clf, X )
+ +

DESCRIPTION ^

+
 Apply a k-nearest neighbor classifier to X.
+
+ INPUTS
+   clf     - trained model
+   X       - nxp data array
+ 
+ OUTPUTS
+   Y       - nx1 vector of labels predicted according to the clf
+
+ DATESTAMP
+   11-Oct-2005  2:45pm
+
+ See also CLF_KNN, CLF_KNN_TRAIN
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • clf_knn_dist k-nearest neighbor classifier based on a distance matrix D.
+This function is called by: +
    +
  • clf_knn Create a k nearest neighbor classifier.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_knn_train.html b/doc/classify/clf_knn_train.html new file mode 100644 index 00000000..2cb6c9e3 --- /dev/null +++ b/doc/classify/clf_knn_train.html @@ -0,0 +1,55 @@ + + + + Description of clf_knn_train + + + + + + + + + + +

clf_knn_train +

+ +

PURPOSE ^

+
Train a k nearest neighbor classifier (memorization).
+ +

SYNOPSIS ^

+
function clf = clf_knn_train( clf, X, Y )
+ +

DESCRIPTION ^

+
 Train a k nearest neighbor classifier (memorization).
+
+ INPUTS
+   clf     - model to be trained
+   X       - nxp data array
+   Y       - nx1 array of labels
+ 
+ OUTPUTS
+   clf     - a trained k-nearest neighbor classifier.
+
+ DATESTAMP
+   11-Oct-2005  2:45pm
+
+ See also CLF_KNN, CLF_KNN_FWD
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • clf_knn Create a k nearest neighbor classifier.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_lda.html b/doc/classify/clf_lda.html new file mode 100644 index 00000000..5ae6d453 --- /dev/null +++ b/doc/classify/clf_lda.html @@ -0,0 +1,60 @@ + + + + Description of clf_lda + + + + + + + + + + +

clf_lda +

+ +

PURPOSE ^

+
Create a Linear Discriminant Analysis (LDA) classifier.
+ +

SYNOPSIS ^

+
function clf = clf_lda( p, type, prior )
+ +

DESCRIPTION ^

+
 Create a Linear Discriminant Analysis (LDA) classifier.
+
+ Same algorithm as matlab's function 'classify' (in the statistics toolbox).  Nice
+ to have in form that actually stores a model that can be applied multiple times.
+ 
+ For the meaning and usage of prior and type see classify.m
+
+ INPUTS
+   p       - data dimension
+   type    - [optional] 'linear', 'quadratic', 'mahalanobis' [see classify.m]
+   prior   - [optional] prior to use [see classify.m]
+ 
+ OUTPUTS
+   clf     - an clf_LDA model ready to be trained (see clf_lda_train)
+
+ DATESTAMP
+   11-Oct-2005  2:45pm
+
+ See also NFOLDXVAL, CLASSIFY, CLF_LDA_TRAIN, CLF_LDA_FWD
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • clf_lda_fwd Apply the Linear Discriminant Analysis (LDA) classifier to data X.
  • clf_lda_train Train a Linear Discriminant Analysis (LDA) classifier.
+This function is called by: +
    +
  • democlassify A demo used to test and demonstrate the usage of classifiers (clf_*)
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_lda_fwd.html b/doc/classify/clf_lda_fwd.html new file mode 100644 index 00000000..20071691 --- /dev/null +++ b/doc/classify/clf_lda_fwd.html @@ -0,0 +1,54 @@ + + + + Description of clf_lda_fwd + + + + + + + + + + +

clf_lda_fwd +

+ +

PURPOSE ^

+
Apply the Linear Discriminant Analysis (LDA) classifier to data X.
+ +

SYNOPSIS ^

+
function Y = clf_LDAfwd( clf, X )
+ +

DESCRIPTION ^

+
 Apply the Linear Discriminant Analysis (LDA) classifier to data X.
+
+ INPUTS
+   clf     - trained model
+   X       - nxp data array
+ 
+ OUTPUTS
+   Y       - nx1 vector of labels predicted according to the model
+
+ DATESTAMP
+   11-Oct-2005  2:45pm
+
+ See also CLF_LDA, CLF_LDA_TRAIN
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • clf_lda Create a Linear Discriminant Analysis (LDA) classifier.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_lda_train.html b/doc/classify/clf_lda_train.html new file mode 100644 index 00000000..3021ce75 --- /dev/null +++ b/doc/classify/clf_lda_train.html @@ -0,0 +1,55 @@ + + + + Description of clf_lda_train + + + + + + + + + + +

clf_lda_train +

+ +

PURPOSE ^

+
Train a Linear Discriminant Analysis (LDA) classifier.
+ +

SYNOPSIS ^

+
function clf = clf_lda_train( clf, X, Y )
+ +

DESCRIPTION ^

+
 Train a Linear Discriminant Analysis (LDA) classifier.
+
+ INPUTS
+   clf     - model to be trained
+   X       - nxp data  array
+   Y       - nx1 array of labels (or cell array, see classify.m)
+ 
+ OUTPUTS
+   clf     - a trained clf_LDA model 
+
+ DATESTAMP
+   11-Oct-2005  2:45pm
+
+ See also CLF_LDA, CLF_LDA_FWD
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • clf_lda Create a Linear Discriminant Analysis (LDA) classifier.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/clf_svm.html b/doc/classify/clf_svm.html new file mode 100644 index 00000000..8da4fcd8 --- /dev/null +++ b/doc/classify/clf_svm.html @@ -0,0 +1,49 @@ + + + + Description of clf_svm + + + + + + + + + + +

clf_svm +

+ +

PURPOSE ^

+
Wrapper for svm that makes svm compatible with nfoldxval.
+ +

SYNOPSIS ^

+
function net = clf_svm(varargin)
+ +

DESCRIPTION ^

+
 Wrapper for svm that makes svm compatible with nfoldxval.
+
+ Requires the SVM toolbox by Anton Schwaighofer.
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also SVM, NFOLDXVAL
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • democlassify A demo used to test and demonstrate the usage of classifiers (clf_*)
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/confmatrix.html b/doc/classify/confmatrix.html new file mode 100644 index 00000000..a36bab64 --- /dev/null +++ b/doc/classify/confmatrix.html @@ -0,0 +1,63 @@ + + + + Description of confmatrix + + + + + + + + + + +

confmatrix +

+ +

PURPOSE ^

+
Generates a confusion matrix according to true and predicted data labels.
+ +

SYNOPSIS ^

+
function CM = confmatrix( IDXtrue, IDXpred, ntypes )
+ +

DESCRIPTION ^

+
 Generates a confusion matrix according to true and predicted data labels.
+
+ CM(i,j) denotes the number of elements of class i that were given label j.  In other
+ words, each row i contains the predictions for elements whos actual class was i.  If
+ IDXpred is perfect, then CM is a diagnol matrix with CM(i,i) equal to the number of
+ instances of class i.  
+
+ To normalize CM to fall between [0,1], divide each row by the sum of that row:
+   CMnorm = CM ./ repmat( sum(CM,2), [1 size(CM,2)] );
+
+ INPUTS
+   IDXtrue     - nx1 array of true labels [int values between 1 and ntypes]
+   IDXpred     - nx1 array of predicted labels [int values between 1 and ntypes]
+   ntypes      - maximum number of types (should be > max(IDX))
+
+ OUTPUTS
+   CM          - ntypes x ntypes confusion array with integer values
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also CONFMATRIX_SHOW
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • democlassify A demo used to test and demonstrate the usage of classifiers (clf_*)
  • nfoldxval Runs n-fold cross validation on data with a given classifier.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/confmatrix_show.html b/doc/classify/confmatrix_show.html new file mode 100644 index 00000000..d8a55e31 --- /dev/null +++ b/doc/classify/confmatrix_show.html @@ -0,0 +1,64 @@ + + + + Description of confmatrix_show + + + + + + + + + + +

confmatrix_show +

+ +

PURPOSE ^

+
Used to display a confusion matrix.
+ +

SYNOPSIS ^

+
function confmatrix_show( CM, types, pvpairs, ndigits )
+ +

DESCRIPTION ^

+
 Used to display a confusion matrix.  
+
+ See confmatrix for general format and info on confusion matricies.  This function
+ normalizes the CM before displaying (hence all values range in [0,1] and rows sum to 1. 
+
+ INPUTS
+   CM          - ntypes x ntypes confusion array -- see confusmatrix
+   types       - [optional] cell array of length ntypes of text labels for each type 
+   pvpairs     - [optional] parameter / value list for text.m
+   ndigits     - [optional] number of digits after decimal to display
+
+ OUTPUTS
+   NONE
+
+ EXAMPLE
+   cliptypes = { 'anger','disgust','fear','joy','sadness','surprise' };
+   confmatrix_show( rand(6)/3+eye(6), cliptypes, {'FontSize',20} )
+   title('confusion matrix','FontSize',24);
+
+ DATESTAMP
+   07-Oct-2005  5:00pm
+
+ See also CONFMATRIX, TEXT2
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • imlabel Improved method for labeling figure axes.
  • int2str2 Convert integer to string of given length; improved version of int2str.
+This function is called by: +
    +
  • nfoldxval Runs n-fold cross validation on data with a given classifier.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/democlassify.html b/doc/classify/democlassify.html new file mode 100644 index 00000000..c082c957 --- /dev/null +++ b/doc/classify/democlassify.html @@ -0,0 +1,47 @@ + + + + Description of democlassify + + + + + + + + + + +

democlassify +

+ +

PURPOSE ^

+
A demo used to test and demonstrate the usage of classifiers (clf_*)
+ +

SYNOPSIS ^

+
function democlassify
+ +

DESCRIPTION ^

+
 A demo used to test and demonstrate the usage of classifiers (clf_*)
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also CLF_KNN, CLF_LDA, CLF_SVM, CLF_ECOC
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • clf_ecoc Wrapper for ecoc that makes ecoc compatible with nfoldxval.
  • clf_knn Create a k nearest neighbor classifier.
  • clf_lda Create a Linear Discriminant Analysis (LDA) classifier.
  • clf_svm Wrapper for svm that makes svm compatible with nfoldxval.
  • confmatrix Generates a confusion matrix according to true and predicted data labels.
  • demogendata Generate data drawn form a mixture of Gaussians.
  • visualize_data Project high dim. data unto principal components (PCA) for visualization.
  • montage2 [3D] Used to display a stack of T images.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/democluster.html b/doc/classify/democluster.html new file mode 100644 index 00000000..3367fa21 --- /dev/null +++ b/doc/classify/democluster.html @@ -0,0 +1,50 @@ + + + + Description of democluster + + + + + + + + + + +

democluster +

+ +

PURPOSE ^

+
Clustering demo.
+ +

SYNOPSIS ^

+
function [IDX, X, k_true, noisefrac_true, IDX_true ] =democluster( X, k, noisefrac, IDX_true )
+ +

DESCRIPTION ^

+
 Clustering demo.
+
+ Used to test different clustering algorithms on 2D and 3D mixture of gaussian data.
+ Alter demo by edititing this file.
+ 
+ All input arguments are optional.
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • demogendata Generate data drawn form a mixture of Gaussians.
  • kmeans2 Very fast version of kmeans clustering.
  • meanshift meanshift clustering algorithm.
  • visualize_data Project high dim. data unto principal components (PCA) for visualization.
  • c clc
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/demogendata.html b/doc/classify/demogendata.html new file mode 100644 index 00000000..d5fd146d --- /dev/null +++ b/doc/classify/demogendata.html @@ -0,0 +1,65 @@ + + + + Description of demogendata + + + + + + + + + + +

demogendata +

+ +

PURPOSE ^

+
Generate data drawn form a mixture of Gaussians.
+ +

SYNOPSIS ^

+
function [X,IDX,T,IDT] = demogendata(n,m,k,d,c,e,f)
+ +

DESCRIPTION ^

+
 Generate data drawn form a mixture of Gaussians.
+
+ Adapted from code by [Nikos Vlassis, 2000].
+ For definitions see [Dasgupta, 1999].
+
+ INPUTS
+   n - size of training set 
+   m - size of test set 
+   k - number of components
+   d - dimension
+   c - separation degree
+   e - maximum eccentricity
+   f - [optional] fraction of points that are noise (uniformly distributed)
+
+ OUTPUTS
+   X    - training set (n x d)
+   IDX  - cluster membership [see kmeans2.m]
+   T    - test set (m x d) 
+   IDT  - cluster membership [see kmeans2.m]
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also VISUALIZE_DATA, DEMOCLUSTER, DEMOCLASSIFY
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • c clc
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/dist_L1.html b/doc/classify/dist_L1.html new file mode 100644 index 00000000..8308df74 --- /dev/null +++ b/doc/classify/dist_L1.html @@ -0,0 +1,66 @@ + + + + Description of dist_L1 + + + + + + + + + + +

dist_L1 +

+ +

PURPOSE ^

+
Calculates the L1 Distance between vectors (ie the City-Block distance).
+ +

SYNOPSIS ^

+
function D = dist_L1( X, Y )
+ +

DESCRIPTION ^

+
 Calculates the L1 Distance between vectors (ie the City-Block distance).
+
+ Assume X is an m-by-p matrix representing m points in p-dimensional space and Y is an
+ n-by-p matrix representing another set of points in the same space. This function
+ compute the m-by-n distance matrix D where D(i,j) is the L1 distance between X(i,:) and
+ Y(j,:).  
+
+ The L1 distance between two vectors is defined as:
+   d(x,y) = sum( abs(xi-yi) );
+
+ INPUTS
+   X   - m-by-p matrix of m p-bin histograms
+   Y   - n-by-p matrix of n p-bin histograms
+
+ OUTPUTS
+   D   - m-by-n distance matrix
+
+ EXAMPLE
+   X=[randn(100,5)]; Y=randn(40,5)+2;
+   D = dist_L1( [X; Y], [X; Y] ); im(D)
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also DIST_EUCLIDEAN
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/dist_chisquared.html b/doc/classify/dist_chisquared.html new file mode 100644 index 00000000..c4b1acb7 --- /dev/null +++ b/doc/classify/dist_chisquared.html @@ -0,0 +1,67 @@ + + + + Description of dist_chisquared + + + + + + + + + + +

dist_chisquared +

+ +

PURPOSE ^

+
Calculates the Chi Squared Distance between vectors (usually histograms).
+ +

SYNOPSIS ^

+
function D = dist_chisquared( X, Y )
+ +

DESCRIPTION ^

+
 Calculates the Chi Squared Distance between vectors (usually histograms).
+
+ Assume X is an m-by-p matrix representing m points in p-dimensional space and Y is an
+ n-by-p matrix representing another set of points in the same space. This function
+ compute the m-by-n distance matrix D where D(i,j) is the chi-squared distance between
+ X(i,:) and Y(j,:).  
+
+ The chi-squared distance between two vectors is defined as:
+   d(x,y) = sum( (xi-yi)^2 / (xi+yi) ) / 2;
+ The chi-squared distance is useful when comparing histograms.
+
+ INPUTS
+   X   - m-by-p matrix of m p-bin histograms
+   Y   - n-by-p matrix of n p-bin histograms
+
+ OUTPUTS
+   D   - m-by-n distance matrix
+
+ EXAMPLE
+   X=[randn(100,5)]; Y=randn(40,5)+2;
+   D = dist_chisquared( abs([X; Y]), abs([X; Y]) ); im(D)
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also DIST_EUCLIDEAN, DIST_EMD
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/dist_emd.html b/doc/classify/dist_emd.html new file mode 100644 index 00000000..fdb84ecf --- /dev/null +++ b/doc/classify/dist_emd.html @@ -0,0 +1,68 @@ + + + + Description of dist_emd + + + + + + + + + + +

dist_emd +

+ +

PURPOSE ^

+
Calculates Earth Mover's Distance (EMD) between positive vectors.
+ +

SYNOPSIS ^

+
function D = dist_emd( X, Y )
+ +

DESCRIPTION ^

+
 Calculates Earth Mover's Distance (EMD) between positive vectors.
+
+ Assume X is an m-by-p matrix representing m histograms with p bins each and Y is an
+ n-by-p matrix representing another set of n histograms with p bins each.  Each histogram
+ is assumed to have the same total weight. This function compute the m-by-n distance
+ matrix D where D(i,j) is the Earth Mover's Distance (EMD) between X(i,:) and Y(j,:). 
+
+ Note for 1D, with all histograms having equal weight, there is a simple closed form for
+ the calculation of the EMD.  The EMD between two histograms x and y is simply given by
+ the sum(abs(cdf(x)-cdf(y))), where cdf is the cumulative distribution function (computed
+ simply by cumsum).
+
+ INPUTS
+   X   - m-by-p matrix of m p-bin histograms
+   Y   - n-by-p matrix of n p-bin histograms
+
+ OUTPUTS
+   D   - m-by-n distance matrix
+
+ EXAMPLE
+   X=[randn(100,5)]; Y=randn(40,5)+2;
+   D = dist_emd( [X; Y], [X; Y] ); im(D)
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also DIST_EUCLIDEAN, DIST_CHISQUARED
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/dist_euclidean.html b/doc/classify/dist_euclidean.html new file mode 100644 index 00000000..e97c123c --- /dev/null +++ b/doc/classify/dist_euclidean.html @@ -0,0 +1,66 @@ + + + + Description of dist_euclidean + + + + + + + + + + +

dist_euclidean +

+ +

PURPOSE ^

+
Calculates the Euclidean distance between vectors [FAST].
+ +

SYNOPSIS ^

+
function D = dist_euclidean( X, Y )
+ +

DESCRIPTION ^

+
 Calculates the Euclidean distance between vectors [FAST].
+
+ Assume X is an m-by-p matrix representing m points in p-dimensional space and Y is an
+ n-by-p matrix representing another set of points in the same space. This function
+ compute the m-by-n distance matrix D where D(i,j) is the SQUARED Euclidean distance
+ between X(i,:) and Y(j,:).  Running time is O(m*n*p).
+
+ If x is a single data point, here is a faster, inline version to use:
+   D = sum( (Y - ones(size(Y,1),1)*x).^2, 2 )';
+
+ INPUTS
+   X   - m-by-p matrix of m p dimensional vectors 
+   Y   - n-by-p matrix of n p dimensional vectors 
+
+ OUTPUTS
+   D   - m-by-n distance matrix
+
+ EXAMPLE
+   X=[randn(100,5)]; Y=randn(40,5)+2;
+   D = dist_euclidean( [X; Y], [X; Y] ); im(D)
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also DIST_CHISQUARED, DIST_EMD
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • clf_knn Create a k nearest neighbor classifier.
  • kmeans2 Very fast version of kmeans clustering.
  • meanshiftim_explore Visualization to help choose sigmas for meanshiftim.
  • meanshift_post Some post processing routines for meanshift not currently being used.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/distmatrix_show.html b/doc/classify/distmatrix_show.html new file mode 100644 index 00000000..646dfe1d --- /dev/null +++ b/doc/classify/distmatrix_show.html @@ -0,0 +1,64 @@ + + + + Description of distmatrix_show + + + + + + + + + + +

distmatrix_show +

+ +

PURPOSE ^

+
Useful visualization of a distance matrix of clustered points.
+ +

SYNOPSIS ^

+
function distmatrix_show( D, IDX )
+ +

DESCRIPTION ^

+
 Useful visualization of a distance matrix of clustered points.
+
+ D is sorted into k blocks, where the ith block contains all the points in cluster i.
+ When D is displayed the blocks are shown explicitly.  Hence for a good clustering (under
+ a spherical gaussian assumption) the 'diagnol' blocks ought to be mostly dark, and all
+ other block ought to be relatively white.  One can thus quickly visualize the quality of
+ the clustering, or even how clusterable the points are.  Outliers (according to IDX) are
+ removed from D.
+
+ INPUTS
+   D       - nxn distance matrix
+   IDX     - cluster membership [see kmeans2.m]
+   
+ OUTPUTS
+   NONE
+
+ EXAMPLE
+  % not the best example since points are already ordered
+  [X,IDX_true] = demogendata(100,0,2,2,10,2,0);  
+  distmatrix_show( dist_euclidean(X,X), IDX_true );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • IDX2order Converts class labels into an ordering.
  • im IM [2D] Function for displaying grayscale images.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/kmeans2.html b/doc/classify/kmeans2.html new file mode 100644 index 00000000..02802ca9 --- /dev/null +++ b/doc/classify/kmeans2.html @@ -0,0 +1,113 @@ + + + + Description of kmeans2 + + + + + + + + + + +

kmeans2 +

+ +

PURPOSE ^

+
Very fast version of kmeans clustering.
+ +

SYNOPSIS ^

+
function [IDX,C,sumd] = kmeans2( X,k,varargin )
+ +

DESCRIPTION ^

+
 Very fast version of kmeans clustering.
+
+ Cluster the N x p matrix X into k clusters using the kmeans algorithm. It returns the
+ cluster memberships for each data point in the N x 1 vector IDX and the K x p matrix of
+ cluster means in C. 
+
+ Custom implementation of the kmeans algorithm.  In some ways it is less general (for
+ example only uses euclidian distance), but it has some options that the matlab version
+ does not (for example, it has a notion of outliers and min-cluster size).  It is also
+ many times faster than matlab's kmeans.  General kmeans help can be found in help for
+ the matlab implementation of kmeans. Note that the although the names and conventions
+ for this algorithm are taken from Matlab's implementation, there are slight
+ alterations (for example, IDX==-1 is used to indicate outliers).
+
+ 
+ -------------------------------------------------------------------------
+ INPUTS
+ 
+  X
+ n-by-p data matrix of n p-dimensional vectors.  That is X(i,:) is the ith point in X.
+
+  k
+ Integer indicating the maximum nuber of clusters for kmeans to find. Actual number may
+ be smaller (for example if clusters shrink and are eliminated).
+
+ -------------------------------------------------------------------------
+ ADDITIONAL INPUTS
+
+ [...] = kmeans2(...,'param1',val1,'param2',val2,...) enables you to
+ specify optional parameter name-value pairs to control the iterative
+ algorithm used by kmeans. Valid parameters are the following:
+   'replicates'  - Number of times to repeat the clustering, each with a
+                   new set of initial cluster centroid positions. kmeans
+                   returns the solution with the lowest value for sumd.
+   'maxiter'     - Maximum number of iterations. Default is 100.
+   'display'     - Whether or not to display algorithm status (default==0)
+   'randstate'   - seed with which to initialize kmeans.  Useful for
+                   replicability of algoirhtm.
+   'outlierfrac' - maximum fraction of points that can be treated as
+                   outliers   
+   'minCsize'    - minimum size for a cluster (smaller clusters get
+                   eliminated)
+
+ -------------------------------------------------------------------------
+ OUTPUTS
+
+  IDX
+ n-by-1 vector used to indicated cluster membership.  Let X be a set of n points.  Then
+ the ID of X - or IDX is a column vector of length n, where each element is an integer
+ indicating the cluster membership of the corresponding point in X.  That is IDX(i)=c
+ indicates that the ith point in X belongs to cluster c. Cluster labels range from 1 to
+ k, and thus k=max(IDX) is typically the number of clusters IDX divides X into.  The
+ cluster label "-1" is reserved for outliers.  That is IDX(i)==-1 indicates that the
+ given point does not belong to any of the discovered clusters.  Note that matlab's
+ version of kmeans does not have outliers.
+
+  C        
+ k-by-p matrix of centroid locations.  That is C(j,:) is the cluster centroid of points
+ belonging to cluster j.  In kmeans, given X and IDX, a cluster centroid is simply the
+ mean of the points belonging to the given cluster, ie: C(j,:) = mean( X(IDX==j,:) ). 
+
+  sumd
+ 1-by-k vector of within-cluster sums of point-to-centroid distances. That is sumd(j) is
+ the sum of the distances from X(IDX==j,:) to C(j,:). The total sum, sum(sumd), is a
+ typical error measure of the quality of a clustering. 
+
+ -------------------------------------------------------------------------
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also DEMOCLUSTER
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • dist_euclidean Calculates the Euclidean distance between vectors [FAST].
  • getargs Utility to process parameter name/value pairs.
  • int2str2 Convert integer to string of given length; improved version of int2str.
  • randint2 Faster but restricted version of randint.
  • randperm2 Returns a random permutation of integers.
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/meanshift.html b/doc/classify/meanshift.html new file mode 100644 index 00000000..0721ebaa --- /dev/null +++ b/doc/classify/meanshift.html @@ -0,0 +1,84 @@ + + + + Description of meanshift + + + + + + + + + + +

meanshift +

+ +

PURPOSE ^

+
meanshift clustering algorithm.
+ +

SYNOPSIS ^

+
function [IDX,M] = meanshift(X, radius, rate, maxiter, minCsize, blur )
+ +

DESCRIPTION ^

+
 meanshift clustering algorithm.
+
+ Based on code from Sameer Agarwal <sagarwal-at-cs.ucsd.edu>
+
+ For a broad discussion see:
+ Y. Cheng, Mean-shift, mode seeking, and clustering, IEEE Transactions on
+ Pattern Analysis and Machine Intelligence, Vol.17, 1995, pp. 790-799 
+
+ The radius or bandwidth is tied to the 'width' of the distribution and is
+ data dependent.  Note that the data should be normalized first so that
+ all the dimensions have the same bandwidth.  The rate determines how
+ large the gradient decent steps are.  The smaller the rate, the more
+ iterations are needed for convergence, but the more likely minima are not
+ overshot.  A reasonable value for the rate is .2.  Low value of the rate
+ may require an increase in maxiter.  Increase maxiter until convergence
+ occurs regularly for a given data set (versus the algorithm being cut off
+ at maxiter).  
+
+ Note the cluster means M do not refer to the actual mean of the points
+ that belong to the same cluster, but rather the values to which the 
+ meanshift algorithm converged for each given point (recall that cluster
+ membership is based on the mean converging to the same value from
+ different points).  Hence M is not the same as C, the centroid of the
+ points [see kmeans2 for a definition of C].
+
+ INPUTS
+   X           - column vector of data - N vectors of dimension p (X is Nxp)
+   radius      - the bandwidth (radius of the window)
+   rate        - [optional] gradient descent proportionality factor in (0,1]
+   maxiter     - [optional] maximum number of iterations
+   minCsize    - [optional] min size for a cluster (smaller clusters get eliminated)
+   blur        - [optional] if (blur==1) then at each iteration data is blurred 
+                 by the mean vector (the original data points move) - can
+                 cause 'incorrect' results
+
+ OUTPUTS
+   IDX         - cluster membership [see kmeans2.m]
+   M           - cluster means [see above]
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MEANSHIFTIM, DEMOCLUSTER
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/meanshiftim.html b/doc/classify/meanshiftim.html new file mode 100644 index 00000000..b3999468 --- /dev/null +++ b/doc/classify/meanshiftim.html @@ -0,0 +1,94 @@ + + + + Description of meanshiftim + + + + + + + + + + +

meanshiftim +

+ +

PURPOSE ^

+
Applies the meanshift algorithm to a joint spatial/range image.
+ +

SYNOPSIS ^

+
function [M,Vr,Vc] = meanshiftim( X, sig_spt, sig_rng, softflag, maxiter, mindelta )
+ +

DESCRIPTION ^

+
 Applies the meanshift algorithm to a joint spatial/range image.  
+
+ See "Mean Shift Analysis and Applications" by Comaniciu & Meer for info.
+
+ Assumes X is an MxNxP array, where an X(i,j,:) represents the range data at locations
+ (i,j).  This function runs meanshift on each of the MxN data points.  It takes advantage
+ of the lattice structure of an image for efficiency (it only needs to calculate full
+ distance between two points if they are near each other spatially). 
+
+ In the original formulation of the algorithm, after normalization of the data, the
+ search window around each point x has radius 1 (ie corresponding to 1 std of the data).
+ That is the search window only encloses 2*s+1 pixels, and of those, all which fall
+ within 1 unit from x are used to calcluate the new mean.  If softflag==0 the original
+ formulation is used.  If softflag==1, instead of using a fixed radius, each point p is
+ used in the calulation of the mean with points close to x given significantly more
+ weight.  Specifically, each point p is given weight exp(-dist(x,p)).  So instead of
+ having a fixed cutoff at r, the cutoff is 'soft' (same idea as in softmax), and occurs
+ at approximately r.  The implementation remains efficient by actually using a hard
+ cutoff at points further then 2r spatially from x.
+
+ The resulting matrix M is of size MxNx(P+2).  M(i,j,1) represents the convergent row
+ location of X(i,j,:) - (which had initial row location i) and M(i,j,2) represents the
+ final column location.  M(i,j,p+2) represents the convergent value for X(i,j,p).  The
+ optionaly outputs Vr and Vc are 2D arrays where Vr(i,j)=M(i,j,1)-i and
+ Vc(i,j)=M(i,j,2)-j.  That is they represent the spatial offset between the original
+ location of a point and its convergent location.  Display using quiver(Vc,Vr,0).
+
+ INPUTS
+   X        - MxNxP data array, P may be 1
+   sig_spt  - integer specifying spatial standard deviation
+   sig_rng  - value specifying the standard deviation of the range data
+   softflag - [optional] 0 or 1 [see above]
+   maxiter  - [optional] maximum number of iterations per data point
+   mindelta - [optional] minimum amount of spatial change defining convergence 
+
+ OUTPUTS
+   M       - array of convergent locations [see above]
+   Vr      - spatial motion in row direction
+   Vc      - spatial motion in col direction
+
+ EXAMPLE
+   I=double(imread('cameraman.tif'))/255;
+   [M,Vr,Vc] = meanshiftim( I,5,.2 );
+   figure(1); im(I); figure(2); im( M(:,:,3) );
+   % color image:
+   I=double(imread('hestain.png'))/255;
+   [M,Vr,Vc] = meanshiftim( I,5,.2 );
+   figure(1); im(I); figure(2); im( M(:,:,3:end) );
+
+ DATESTAMP
+   26-Oct-2005  4:00pm
+
+ See also MEANSHIFT, MEANSHIFTIM_EXPLORE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • c clc
  • checknumericargs Helper utility for checking numeric vector arguments.
  • ticstatus Used to display the progress of a long process.
  • tocstatus Used to display the progress of a long process.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/meanshiftim_explore.html b/doc/classify/meanshiftim_explore.html new file mode 100644 index 00000000..92bb2755 --- /dev/null +++ b/doc/classify/meanshiftim_explore.html @@ -0,0 +1,66 @@ + + + + Description of meanshiftim_explore + + + + + + + + + + +

meanshiftim_explore +

+ +

PURPOSE ^

+
Visualization to help choose sigmas for meanshiftim.
+ +

SYNOPSIS ^

+
function meanshiftim_explore( I, X, sig_spt, sig_rng, show )
+ +

DESCRIPTION ^

+
 Visualization to help choose sigmas for meanshiftim.
+
+ Displays the original image I, and prompts user to select a point on the image.  For
+ given point, calculates the distance (both spatial and range) to every other point in
+ the image.   It shows the results in a number of panes, which include 1) the original
+ image I, 2) Srange - similarity based on range only, 3) Seuc - similarity based on
+ Euclidean distance only, and 4) overall similarity.  Finally, in each image the green
+ dot (possibly occluded) shows the original point, and the blue dot shows the new mean of
+ the window after 1 step of meanshift.
+
+ INPUTS
+   I       - MxN image for display
+   X       - MxNxP data array, P may be 1 (X may be same as I)
+   sig_spt - integer specifying spatial standard deviation
+   sig_rng - value specifying the standard deviation of the range data
+   show    - [optional] will display results in figure(show)
+
+ EXAMPLE
+   I=double(imread('cameraman.tif'))/255;
+   meanshiftim_explore( I, I, 5, .2, 1 );
+
+ DATESTAMP
+   25-Oct-2005  4:00pm
+
+ See also MEANSHIFTIM
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • dist_euclidean Calculates the Euclidean distance between vectors [FAST].
  • im IM [2D] Function for displaying grayscale images.
  • c clc
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/menu.html b/doc/classify/menu.html new file mode 100644 index 00000000..a1f93793 --- /dev/null +++ b/doc/classify/menu.html @@ -0,0 +1,34 @@ + + + + Index for Directory classify + + + + + + + + + +
^ Master index ^
+ +

Index for classify

+
Contents
+ +

Matlab files in this directory:

+ + +

Other Matlab-specific files in this directory:

+
    +
  • clf_data.mat
  • pca_data.mat
+

Subsequent directories:

+ + + +
Generated by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/nfoldxval.html b/doc/classify/nfoldxval.html new file mode 100644 index 00000000..47072433 --- /dev/null +++ b/doc/classify/nfoldxval.html @@ -0,0 +1,97 @@ + + + + Description of nfoldxval + + + + + + + + + + +

nfoldxval +

+ +

PURPOSE ^

+
Runs n-fold cross validation on data with a given classifier.
+ +

SYNOPSIS ^

+
function CM=nfoldxval( data, IDX, clfinit, clfparams, types, ignoretypes, fname, show )
+ +

DESCRIPTION ^

+
 Runs n-fold cross validation on data with a given classifier.
+
+ Given n separate labeled data sets, trains classifier using n-1 data sets, test on
+ remaining one.  Average results over all n such runs.  Shows overall results in average
+ confusion matrix.
+
+ The classifier is passed in as a parameter.  For this to work the classifier (clf) must
+ follow certain conventions.  The conventions are as follows:
+   1) The following must initialize the clf ('p' is the dimension of the data):
+       clf = clfinit( p, clfparams{:} ) 
+   2) The created clf must point to 2 functions for training and applying it:
+       clf.fun_train    and   clf.fun_fwd
+   3) For training the following will be called:
+       clf = clf.fun_train( clf, X, Y );
+   4) For testing the following will be called:
+       pred = clf.fun_fwd( clf, Xtest );
+ The format for X is nxp where n is the number of data points and p is their dimension.
+ The format for Y is nx1.  Example of a classifier is: clfinit = @clf_lda
+
+ Given data in a cell array format, it might be useful to string out into single array:
+   IDX = cell2mat( permute( IDX, [2 1] ) );  data = cell2mat( permute( data, [2 1] ) );
+ For a simple, small dataset, can do the following to do leave one out classification:
+   [n,p]=size(data); IDX=mat2cell(IDX,ones(1,n),1);  data=mat2cell(data,ones(1,n),p);
+
+ Overall error can be calculated via:
+   er = 1-sum(diag(CM))/sum(CM(:))
+ Normalized confusion matrix can be calculated via:
+   CMn = CM ./ repmat( sum(CM,2), [1 size(CM,2)] );
+
+ INPUTS
+   data        - cell array of (n x p) arrays each of n samples of dim p
+   IDX         - cell array of (n x 1) arrays each of n labels
+   clfinit     - classifier initialization function
+   clfparams   - classifier parameters 
+   types       - [optional] cell array of string labels for types
+   ignoretypes - [optional] array of types we aren't interested in {eg: [1 4 5]}.
+   fname       - [optional] specify a file to save CM to, as well as image
+   show        - [optional] will display results in figure(show) 
+
+ OUTPUTS
+   CM          - confusion matrix
+
+ EXAMPLE
+   load clf_data; % 2 class data
+   nfoldxval( data, IDX, @clf_lda,{'linear'}, [],[],[],1 );      % LDA
+   nfoldxval( data, IDX, @clf_knn,{4},[],[],[],2 );              % 4 k nearest neighbor
+   nfoldxval( data, IDX, @clf_svm,{'poly',2},[],[],[],3 );       % polynomial SVM
+   nfoldxval( data, IDX, @clf_svm,{'rbf',2^-12},[],[],[],4 );    % rbf SVM
+   nfoldxval( data, IDX, @clf_dectree,{},[],[],[],5 );           % decision tree
+   % for multi-class data
+   nfoldxval( data, IDX, @clf_ecoc,{@clf_svm,{'rbf',2^-12},nclasses},[],[],[],6 ); % ECOC
+
+ DATESTAMP
+   11-Oct-2005  2:45pm
+
+ See also CLF_LDA, CLF_KNN, CLF_SVM, CLF_ECOC
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • confmatrix Generates a confusion matrix according to true and predicted data labels.
  • confmatrix_show Used to display a confusion matrix.
  • pca principal components analysis (alternative to princomp).
  • pca_apply Companion function to pca.
  • visualize_data Project high dim. data unto principal components (PCA) for visualization.
  • int2str2 Convert integer to string of given length; improved version of int2str.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/pca.html b/doc/classify/pca.html new file mode 100644 index 00000000..53472a38 --- /dev/null +++ b/doc/classify/pca.html @@ -0,0 +1,91 @@ + + + + Description of pca + + + + + + + + + + +

pca +

+ +

PURPOSE ^

+
principal components analysis (alternative to princomp).
+ +

SYNOPSIS ^

+
function [ U, mu, variances ] = pca( X )
+ +

DESCRIPTION ^

+
 principal components analysis (alternative to princomp).
+
+ A simple dimensionality reduction technique.  Use this function to create an orthonormal
+ basis for the space R^N.  This basis has the property that the coordinates of a vector x
+ in R^N are of decreasing importance.  Hence instead of using all N coordinates to
+ specify the location of x, using only the first k<N still gives a vector xhat that is
+ very close to x with high probability.  
+
+ Use this function to retrieve the basis U.  Use pca_apply.m to retrieve that basis
+ coefficients for a novel vector x.  Also, use pca_visualize(X,...) for visualization of
+ the approximated X. 
+
+ This function operates on arrays of arbitrary dimension, by first converting the array
+ to a vector.  That is if X is n dimensional, say of dims d1 x d2 x...x dn-1 x dn.  Then
+ the first n-1 dimensions of X are comined. That is X is flattened to be 2 dimensional:
+ (d1 * d2 * ...* dn-1) x dn.  
+
+ Once X is converted to 2 dimensions of size Nxn, each column represents a single 
+ observation, and each row is a different variable.  Note that this is the opposite of
+ many matlab functions such as princomp.  So if X is MxNxK, then X(:,:,i) representes the
+ ith observation.  This is useful if X is a stack of images (each image will
+ automatically get vectorized).  Likewise if X is MxNxKxR, then X(:,:,:,i) becomes the
+ ith observation, which is useful if X is a collection of videos each of size MxNxK.
+
+ If X is very large, it is samlped before running PCA, using randomsample.
+
+ To calculate residuals: 
+   residuals = variances / sum(variances); 
+   residuals = cumsum(residuals); plot( residuals, '- .' )
+
+ INPUTS
+   X           - n-dim array of size (d1 x d2 x...x dn-1) x dn (treated as dn elements)
+
+ OUTPUTS
+   U           - 2D array of size (d1 * d2 * ...* dn-1) x r, where each column represents 
+               - a principal component of X (after X is flattened).
+   mu          - Array of size d1 x d2 x...x dn-1 which represents the mean of X.
+   variances   - sorted eigenvalues corresponding to eigenvectors in U 
+
+ EXAMPLE
+   load pca_data;  
+   [ U, mu, variances ] = pca( I3D1(:,:,1:12) );
+   [ Y, Xhat, pe ] = pca_apply( I3D1(:,:,1), U, mu, variances, 5 );
+   figure(1); im(I3D1(:,:,1));  figure(2); im(Xhat);
+   pca_visualize( U, mu, variances, I3D1, 13, [0:12], [], 3 );
+
+ DATESTAMP
+   29-Nov-2005  2:00pm
+
+ See also PRINCOMP, PCA_APPLY, PCA_VISUALIZE, VISUALIZE_DATA, RANDOMSAMPLE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • randomsample Samples elements of X so result uses at most maxmegs megabytes of memory.
+This function is called by: +
    +
  • nfoldxval Runs n-fold cross validation on data with a given classifier.
  • visualize_data Project high dim. data unto principal components (PCA) for visualization.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/pca_apply.html b/doc/classify/pca_apply.html new file mode 100644 index 00000000..14b98213 --- /dev/null +++ b/doc/classify/pca_apply.html @@ -0,0 +1,78 @@ + + + + Description of pca_apply + + + + + + + + + + +

pca_apply +

+ +

PURPOSE ^

+
Companion function to pca.
+ +

SYNOPSIS ^

+
function [ Yk, Xhat, avsq, avsq_orig ] = pca_apply( X, U, mu, variances, k )
+ +

DESCRIPTION ^

+
 Companion function to pca.
+
+ Use pca to retrieve the principal components U and the mean mu from a
+ set fo vectors X1 via [U,mu,variances] = pca(X1).  Then given a new
+ vector x, use y = pca_apply( x, U, mu, variances, k ) to get the first k
+ coefficients of x in the space spanned by the columns of U.
+
+ The input x can be a matrix X, where each column represents a single
+ vector in R^N.  If X has higher dimension, the first n-1 dimensions are
+ used as the variables and the last dimension as an observation -- for
+ more information on this see pca.m
+
+ This may prove useful:
+   siz = size(X);  k = 100;
+   Uim = reshape( U(:,1:k), [ siz(1:end-1) k ]  );
+
+ It is also interesting to look at the distribution of the points Y's (their projection
+ onto 2D or 3D): 
+   plot( Y(1,:), Y(2,:), '.' );
+   plot3( Y(1,:), Y(2,:), Y(3,:), '.' );
+
+ INPUTS
+   X           - array for which to get PCA coefficients
+   U           - [returned by pca] -- see pca
+   mu          - [returned by pca] -- see pca
+   variances   - [returned by pca] -- see pca
+   k           - number of principal coordinates to approximate X with
+
+ OUTPUTS
+   Yk          - first k coordinates of X in column space of U
+   Xhat        - approximation of X corresponding to Yk
+   pixelerror  - measure of squared error per pixel normalized to fall between [0,1]
+
+ DATESTAMP
+   29-Nov-2005  2:00pm
+
+ See also PCA, PCA_APPLY_LARGE, PCA_VISUALIZE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • nfoldxval Runs n-fold cross validation on data with a given classifier.
  • pca_apply_large Wrapper for pca_apply that allows for application to large X.
  • pca_visualize Visualization of quality of approximation of X given principal components.
  • visualize_data Project high dim. data unto principal components (PCA) for visualization.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/pca_apply_large.html b/doc/classify/pca_apply_large.html new file mode 100644 index 00000000..63ae2420 --- /dev/null +++ b/doc/classify/pca_apply_large.html @@ -0,0 +1,57 @@ + + + + Description of pca_apply_large + + + + + + + + + + +

pca_apply_large +

+ +

PURPOSE ^

+
Wrapper for pca_apply that allows for application to large X.
+ +

SYNOPSIS ^

+
function [ Yk, Xhat, pixelerror ] = pca_apply_large( X, U, mu, variances, k )
+ +

DESCRIPTION ^

+
 Wrapper for pca_apply that allows for application to large X.
+
+ Wrapper for pca_apply that splits and processes X in parts, this may be
+ useful if processing cannot be done fully in parallel because of memory
+ constraints. See pca_apply for usage.
+
+ INPUTS
+   same as pca_apply
+
+ OUTPUTS
+   same as pca_apply
+
+ DATESTAMP
+   29-Nov-2005  2:00pm
+
+ See also PCA, PCA_APPLY, PCA_VISUALIZE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/pca_randomvector.html b/doc/classify/pca_randomvector.html new file mode 100644 index 00000000..18275aef --- /dev/null +++ b/doc/classify/pca_randomvector.html @@ -0,0 +1,69 @@ + + + + Description of pca_randomvector + + + + + + + + + + +

pca_randomvector +

+ +

PURPOSE ^

+
Generate random vectors in PCA subspace.
+ +

SYNOPSIS ^

+
function Xr = pca_randomvector( U, mu, variances, k, n, hypershpere, show )
+ +

DESCRIPTION ^

+
 Generate random vectors in PCA subspace.
+
+ Used to generate random vectors from the subspace spanned by the first k
+ principal components.  The points generated come from the gaussian
+ distribution from within the subspace.
+
+ Can optionally generate points on the subspace that are also on a
+ hypershpere centered on the origin.  This may be useful if the original
+ data points were all from a hypershpere -- for example they were
+ normalized via imnormalize.  Set the optional hypershpere flag to
+ 1 to generate points only on the hypersphere.
+
+ INPUTS
+   U           - [returned by pca] -- see pca
+   mu          - [returned by pca] -- see pca
+   variances   - [returned by pca] -- see pca
+   k           - number of principal coordinates to use
+   n           - number of x to generate
+   hypershpere - [optional] generate points on hypersphere (see above)
+   show        - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   Xr          - resulting randomly generated vectors
+
+ DATESTAMP
+   29-Nov-2005  2:00pm
+
+ See also PCA
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • imnormalize Various ways to normalize a (multidimensional) image.
  • montage2 [3D] Used to display a stack of T images.
  • feval_arrays Used to apply the same operation to a stack of array elements.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/pca_visualize.html b/doc/classify/pca_visualize.html new file mode 100644 index 00000000..241d4465 --- /dev/null +++ b/doc/classify/pca_visualize.html @@ -0,0 +1,67 @@ + + + + Description of pca_visualize + + + + + + + + + + +

pca_visualize +

+ +

PURPOSE ^

+
Visualization of quality of approximation of X given principal components.
+ +

SYNOPSIS ^

+
function varargout = pca_visualize( U, mu, variances, X, index, ks, filename, show )
+ +

DESCRIPTION ^

+
 Visualization of quality of approximation of X given principal components.
+
+ X can either represent a single element (a single image or video), or a set of elements.
+ In the latter case, index controls which element of X to apply visualization to, if
+ unspecified it is chosen randomly.
+
+ INPUTS
+   U           - [returned by pca] -- see pca
+   mu          - [returned by pca] -- see pca
+   variances   - [returned by pca] -- see pca
+   X           - Set of images or videos, or a single image or video
+   index       - [optional] If X is a set of images or videos, controls
+               - which image or video to apply visualization to
+   ks          - [optional] ks values of k for pca_apply (ex. ks=[1 4 8 16])
+   filename    - [optional] if specified outputs avis
+   show        - [optional] will display results in figure(show) and figure(show+1)
+
+ OUTPUTS
+   M       - [only if X ia a movie] movie of xhats (see pcaapply)
+   MDiff   - [only if X ia a movie] movie of difference images
+   MU      - [only if X ia a movie] movie of eigenmovies
+
+ DATESTAMP
+   29-Nov-2005  2:00pm
+ 
+ See also PCA, PCA_APPLY
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • pca_apply Companion function to pca.
  • im IM [2D] Function for displaying grayscale images.
  • makemovies [4D] Used to convert R sets of equal length videos into a single movie.
  • montage2 [3D] Used to display a stack of T images.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/private/IDX2order.html b/doc/classify/private/IDX2order.html new file mode 100644 index 00000000..05e3c2a7 --- /dev/null +++ b/doc/classify/private/IDX2order.html @@ -0,0 +1,59 @@ + + + + Description of IDX2order + + + + + + + + + + +

IDX2order +

+ +

PURPOSE ^

+
Converts class labels into an ordering.
+ +

SYNOPSIS ^

+
function order = IDX2order( IDX )
+ +

DESCRIPTION ^

+
 Converts class labels into an ordering.
+
+ Creates an ordering order such that IDX(order)=[1 1...1 2...2 ... k...k]. All points
+ within a class retain the ordering in which they originally appeared.  Also, Xb =
+ X(order,:) has cluster labels IDX(order), ie adjacent elements in X typically belong to
+ the same cluster.
+
+ INPUTS
+   IDX     - cluster membership [see kmeans2.m]
+
+ OUTPUTS
+   order   - n-by-1 vector containing a new ordering for the points.
+
+ EXAMPLE
+   order = IDX2order( [1 1 3 1 2 2] ),  % order should be: [1 2 4 5 6 3]
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • distmatrix_show Useful visualization of a distance matrix of clustered points.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/private/meanshift_post.html b/doc/classify/private/meanshift_post.html new file mode 100644 index 00000000..15bfbfb7 --- /dev/null +++ b/doc/classify/private/meanshift_post.html @@ -0,0 +1,45 @@ + + + + Description of meanshift_post + + + + + + + + + + +

meanshift_post +

+ +

PURPOSE ^

+
Some post processing routines for meanshift not currently being used.
+ +

SYNOPSIS ^

+
function [IDX,C] = meanshift_post( X, IDX, C, minCsize, forceoutliers )
+ +

DESCRIPTION ^

+
 Some post processing routines for meanshift not currently being used.
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • dist_euclidean Calculates the Euclidean distance between vectors [FAST].
  • ticstatus Used to display the progress of a long process.
  • tocstatus Used to display the progress of a long process.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/private/menu.html b/doc/classify/private/menu.html new file mode 100644 index 00000000..217a382e --- /dev/null +++ b/doc/classify/private/menu.html @@ -0,0 +1,30 @@ + + + + Index for Directory classify\private + + + + + + + + + +
^ Master index ^
+ +

Index for classify\private

+
Contents
+ +

Matlab files in this directory:

+ + + + + + +
Generated by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/softmin.html b/doc/classify/softmin.html new file mode 100644 index 00000000..53e59b81 --- /dev/null +++ b/doc/classify/softmin.html @@ -0,0 +1,82 @@ + + + + Description of softmin + + + + + + + + + + +

softmin +

+ +

PURPOSE ^

+
Calculates the softmin of a vector.
+ +

SYNOPSIS ^

+
function M = softmin( D, sigma )
+ +

DESCRIPTION ^

+
 Calculates the softmin of a vector.
+
+ Let d be a vector.  Then the softmin of d is defined as:
+   s = exp(-d/sigma^2) / sum( exp(-d/sigma^2) )
+ The softmin is a way of taking a dissimilarity (distance) vector d and converting it to
+ a similarity vector s, such that sum(s)==1.  
+
+ Note that as sigma->0, softmin's behavior tends toward that of the standard min
+ function.  That is the softmin of a vector d has all zeros with a single 1 in the
+ location of the smallest value of d. For example, "softmin([.2 .4 .1 .3],eps)" returns
+ "[0 0 1 0]".  As sigma->inf, then softmin(d,sigma) tends toward "ones(1,n)/n", where
+ n==length(d).
+
+ If D is an NxK array, is is treated as N K-dimensional vectors, and the return is
+ likewise an NxK array.  This is useful if D is a distance matrix, generated by the likes
+ of dist_euclidean or dist_chisquared.
+
+ If d contains the squared euclidean distance between a point y and k points xi, then
+ there is a probabilistic interpretation for softmin.  If we think of the k points
+ representing equal variant gaussians each with mean xi and std sigma, then the softmin
+ returns the relative probability of y being generated by each gaussian.
+
+ INPUTS
+   D       - NxK dissimilarity matrix 
+   sigma   - controls 'softness' of softmin
+
+ OUTPUTS
+   M       - the softmin
+
+ EXAMPLE
+   % example 1
+   C = [0 0; 1 0; 0 1; 1 1]; x=[.7,.3; .1 .2];
+   D = dist_euclidean( x, C );
+   M = softmin( D, 1 )
+   % example 2
+   fplot( 'softmin( [0.5 0.2 .4], x )', [eps 10] );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also DIST_EUCLIDEAN, DIST_CHISQUARED
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • imsubs2array Converts subs/vals image representation to array representation.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/classify/visualize_data.html b/doc/classify/visualize_data.html new file mode 100644 index 00000000..fab2922e --- /dev/null +++ b/doc/classify/visualize_data.html @@ -0,0 +1,63 @@ + + + + Description of visualize_data + + + + + + + + + + +

visualize_data +

+ +

PURPOSE ^

+
Project high dim. data unto principal components (PCA) for visualization.
+ +

SYNOPSIS ^

+
function visualize_data( X, k, IDX, types )
+ +

DESCRIPTION ^

+
 Project high dim. data unto principal components (PCA) for visualization.
+
+ Optionally IDX can be specified to indicate different classes for the points;
+ in this case points in different classes are displayed using different colors.
+ Up to 12 types are handled (for technical reasons involving plot), any 
+ cluster with a label>12 is assigned the label 12.
+
+ INPUTS
+   X       - column vector of data - N vectors of dimension p (X is Nxp)
+   k       - dimension to which to reduce data (2 or 3)
+   IDX     - [optional] cluster membership [see kmeans2.m]
+   types   - [optional] cell array of length ntypes of text labels for each type 
+
+ EXAMPLE
+   X=[randn(100,5); randn(100,5)+4];
+   IDX=[ones(100,1); 2*ones(100,1)];
+   visualize_data( X, 2, IDX, {'type1','type2' });
+
+ DATESTAMP
+   29-Nov-2005  2:00pm
+
+ See also KMEANS2
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • pca principal components analysis (alternative to princomp).
  • pca_apply Companion function to pca.
  • c clc
+This function is called by: +
    +
  • democlassify A demo used to test and demonstrate the usage of classifiers (clf_*)
  • democluster Clustering demo.
  • nfoldxval Runs n-fold cross validation on data with a given classifier.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/demoicon.gif b/doc/demoicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..c89e7acbc2a74f36f35d2ba23cdd095366563205 GIT binary patch literal 214 zcmZ?wbhEHb6krfwIKlt||NsBz;1LK4_4@xG$Oe)@|Nlq*|KIZe|D6B-*Z%*1?f?IK z|Nno#cAjDHE{X4-EuTMj+Ph8S`+Kir`@EcN1dbivDF(pUKia5*{N xtO-?WJ(Rf1$C7KR)AZ0H0j(>SR=H$6kJ)6-DZGJ)<+b45x|97Z4cdwf)&TUlSJMCh literal 0 HcmV?d00001 diff --git a/doc/down.png b/doc/down.png new file mode 100644 index 0000000000000000000000000000000000000000..d41104a26f3d09deda6ab54281affd82c981abb1 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^{2gTe~DWM4fiX0)Z literal 0 HcmV?d00001 diff --git a/doc/filters/Contents.html b/doc/filters/Contents.html new file mode 100644 index 00000000..a8776256 --- /dev/null +++ b/doc/filters/Contents.html @@ -0,0 +1,68 @@ + + + + Description of Contents + + + + + + + + + + +

Contents +

+ +

PURPOSE ^

+
FILTERS
+ +

SYNOPSIS ^

+
This is a script file.
+ +

DESCRIPTION ^

+
 FILTERS
+ See also
+
+ Filters:
+   filter_DOG_2D       - Difference of Gaussian (Dog) Filter.
+   filter_DOOG_1D      - 1D difference of offset Gaussian (DooG) filters.
+   filter_DOOG_2D      - 2D difference of offset Gaussian (DooG) filters.
+   filter_DOOG_3D      - 3D difference of offset Gaussian (DooG) filters.
+   filter_binomial_1D  - 1D binomial filter (approximation to Gaussian filter)
+   filter_gabor_1D     - 1D Gabor Filters.
+   filter_gabor_2D     - 2D Gabor filters.
+   filter_gauss_1D     - 1D Gaussian filter.
+   filter_gauss_nD     - n-dimensional Gaussian filter.
+   filter_steerable    - Steerable Gaussian derivative filter.
+   filter_visualize_1D - Used to help visualize the a 1D filter.
+   filter_visualize_2D - Used to help visualize a 2D filter.
+   filter_visualize_3D - Used to help visualize a 3D filter.
+
+ Operations involving a set of filters (a filter bank or FB):
+   FB_apply_2D         - Applies each of the filters in the filterbank FB to the image I.
+   FB_crop             - Crop a 2D filterbank (adjusting filter norms).
+   FB_make_1D          - Various ways to make filterbanks.  See inside of this file for details.
+   FB_make_2D          - Various ways to make filterbanks.  See inside of this file for details.
+   FB_make_3D          - Various ways to make filterbanks.  See inside of this file for details.
+   FB_reconstruct_2D   - Use to see how much image information is preserved in filter outputs.
+   FB_visualize_1D     - Used to visualize the Fourier spectra of a series of 1D filters.
+   FB_visualize_2D     - Used to visualize the Fourier spectra of a series of 2D filters.
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/FB_apply_2D.html b/doc/filters/FB_apply_2D.html new file mode 100644 index 00000000..adcf8d9a --- /dev/null +++ b/doc/filters/FB_apply_2D.html @@ -0,0 +1,62 @@ + + + + Description of FB_apply_2D + + + + + + + + + + +

FB_apply_2D +

+ +

PURPOSE ^

+
Applies each of the filters in the filterbank FB to the image I.
+ +

SYNOPSIS ^

+
function IF = FB_apply_2D( I, FB, shape, show )
+ +

DESCRIPTION ^

+
 Applies each of the filters in the filterbank FB to the image I.
+
+ To apply to a stack of images:
+   IFS = feval_arrays( images, @FB_apply_2D, FB, 'valid' );
+
+ INPUTS
+   I       - 2D input array
+   FB      - MxNxK set of K filters
+   shape   - [optional] option for conv2 'same', 'valid', ['full']
+   show    - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   IF      - 3D set of filtered images
+
+ EXAMPLE
+   load trees; X=imresize(X,.5);
+   load FB_DoG.mat;
+   IF = FB_apply_2D( X, FB, 'same', 1 );
+
+ DATESTAMP
+   30-Apr-2006  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • im IM [2D] Function for displaying grayscale images.
  • montage2 [3D] Used to display a stack of T images.
+This function is called by: +
    +
  • FB_reconstruct_2D Use to see how much image information is preserved in filter outputs.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/FB_crop.html b/doc/filters/FB_crop.html new file mode 100644 index 00000000..7735600c --- /dev/null +++ b/doc/filters/FB_crop.html @@ -0,0 +1,55 @@ + + + + Description of FB_crop + + + + + + + + + + +

FB_crop +

+ +

PURPOSE ^

+
Crop a 2D filterbank (adjusting filter norms).
+ +

SYNOPSIS ^

+
function FBC = FB_crop( FB, delta )
+ +

DESCRIPTION ^

+
 Crop a 2D filterbank (adjusting filter norms).
+
+ Takes a filter bank and crops it by cropping off delta from each side. Ensuresthat the
+ mean response of each filter is 0 and that the L1 norm is 1, i.e. sum(sum(abs(F)))==1.  
+
+ INPUTS
+   FB      - original filterbank
+   delta   - amount to crop by
+
+ OUTPUTS
+   FBC - cropped filterbank
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • arraycrop2dims Pads or crops I appropriately so that size(IC)==dims.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/FB_make_1D.html b/doc/filters/FB_make_1D.html new file mode 100644 index 00000000..f09382f7 --- /dev/null +++ b/doc/filters/FB_make_1D.html @@ -0,0 +1,47 @@ + + + + Description of FB_make_1D + + + + + + + + + + +

FB_make_1D +

+ +

PURPOSE ^

+
Various ways to make filterbanks. See inside of this file for details.
+ +

SYNOPSIS ^

+
function FB = FB_make_1D
+ +

DESCRIPTION ^

+
 Various ways to make filterbanks.  See inside of this file for details.
+
+ keep adding different filterbanks, don't alter old ones!
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/FB_make_2D.html b/doc/filters/FB_make_2D.html new file mode 100644 index 00000000..85084552 --- /dev/null +++ b/doc/filters/FB_make_2D.html @@ -0,0 +1,47 @@ + + + + Description of FB_make_2D + + + + + + + + + + +

FB_make_2D +

+ +

PURPOSE ^

+
Various ways to make filterbanks. See inside of this file for details.
+ +

SYNOPSIS ^

+
function FB = FB_make_2D
+ +

DESCRIPTION ^

+
 Various ways to make filterbanks.  See inside of this file for details.
+
+ keep adding different filterbanks, don't alter old ones!
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/FB_make_3D.html b/doc/filters/FB_make_3D.html new file mode 100644 index 00000000..f79a619f --- /dev/null +++ b/doc/filters/FB_make_3D.html @@ -0,0 +1,50 @@ + + + + Description of FB_make_3D + + + + + + + + + + +

FB_make_3D +

+ +

PURPOSE ^

+
Various ways to make filterbanks. See inside of this file for details.
+ +

SYNOPSIS ^

+
function FB = FB_make_3D
+ +

DESCRIPTION ^

+
 Various ways to make filterbanks.  See inside of this file for details.
+
+ keep adding different filterbanks, don't alter old ones!
+
+ To veiw use: 
+  montages( FB );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/FB_reconstruct_2D.html b/doc/filters/FB_reconstruct_2D.html new file mode 100644 index 00000000..fc31e87b --- /dev/null +++ b/doc/filters/FB_reconstruct_2D.html @@ -0,0 +1,63 @@ + + + + Description of FB_reconstruct_2D + + + + + + + + + + +

FB_reconstruct_2D +

+ +

PURPOSE ^

+
Use to see how much image information is preserved in filter outputs.
+ +

SYNOPSIS ^

+
function I2 = FB_reconstruct_2D( I, FB )
+ +

DESCRIPTION ^

+
 Use to see how much image information is preserved in filter outputs.
+
+ Reconstructs the orginal image from filter outputs. Does this independenly for each
+ pixel, and then just combines the pixel info.  Note that each patch is 0 mean, since no
+ mean information is captured by the filter outputs.  Alter flag below to either attempt
+ to reconstruct the entire image of just a patch (interactively specified).  Other flags
+ can also be changed, see file.
+
+ INPUTS
+   I       - original image
+   FB      - FB to apply and do reconstruction with
+
+ OUTPUTS
+   I2  - recovered image
+
+ EXAMPLE
+   load trees; X=imresize(X,.5);
+   load FB_DoG.mat;
+   I2 = FB_reconstruct_2D( X, FB );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • FB_apply_2D Applies each of the filters in the filterbank FB to the image I.
  • filter_binomial_1D 1D binomial filter (approximation to Gaussian filter)
  • im IM [2D] Function for displaying grayscale images.
  • montage2 [3D] Used to display a stack of T images.
  • arraycrop2dims Pads or crops I appropriately so that size(IC)==dims.
  • c clc
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/FB_visualize_1D.html b/doc/filters/FB_visualize_1D.html new file mode 100644 index 00000000..b6f20643 --- /dev/null +++ b/doc/filters/FB_visualize_1D.html @@ -0,0 +1,48 @@ + + + + Description of FB_visualize_1D + + + + + + + + + + +

FB_visualize_1D +

+ +

PURPOSE ^

+
Used to visualize the Fourier spectra of a series of 1D filters.
+ +

SYNOPSIS ^

+
function FB_visualize_1D( FB )
+ +

DESCRIPTION ^

+
 Used to visualize the Fourier spectra of a series of 1D filters.  
+
+ INPUTS
+   FB  - filter bank to visualize
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/FB_visualize_2D.html b/doc/filters/FB_visualize_2D.html new file mode 100644 index 00000000..3771d301 --- /dev/null +++ b/doc/filters/FB_visualize_2D.html @@ -0,0 +1,51 @@ + + + + Description of FB_visualize_2D + + + + + + + + + + +

FB_visualize_2D +

+ +

PURPOSE ^

+
Used to visualize the Fourier spectra of a series of 2D filters.
+ +

SYNOPSIS ^

+
function FB_visualize_2D( FB )
+ +

DESCRIPTION ^

+
 Used to visualize the Fourier spectra of a series of 2D filters.
+
+ Used to visualize the Fourier spectra of a series of filters.  Generally best if called
+ only on the part of the FB that contains the oriented filters.
+
+ INPUTS
+   FB  - filter bank to visualize
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • im IM [2D] Function for displaying grayscale images.
  • montage2 [3D] Used to display a stack of T images.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_DOG_2D.html b/doc/filters/filter_DOG_2D.html new file mode 100644 index 00000000..efa6dcb6 --- /dev/null +++ b/doc/filters/filter_DOG_2D.html @@ -0,0 +1,62 @@ + + + + Description of filter_DOG_2D + + + + + + + + + + +

filter_DOG_2D +

+ +

PURPOSE ^

+
Difference of Gaussian (Dog) Filter.
+ +

SYNOPSIS ^

+
function G = filter_DOG_2D( r, sig, order, show )
+ +

DESCRIPTION ^

+
 Difference of Gaussian (Dog) Filter.
+
+ Adapted from code by Serge Belongie.  Takes a "difference of Gaussian" - all centered
+ on the same point but with different values for sigma.  
+
+ INPUTS
+   r       - Final filter will be 2*r+1 on each side
+   sig     - standard deviation of central Gaussian
+   order   - should be either 1 or 2
+   show    - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   G       - final filter
+
+ EXAMPLE
+   G = filter_DOG_2D( 6, 3, 1, 1 );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also FILTER_DOOG_2D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • filter_visualize_2D Used to help visualize a 2D filter.
  • c clc
  • normpdf2 Normal prob. density function (pdf) with arbitrary covariance matrix.
+This function is called by: +
    +
  • FB_make_2D Various ways to make filterbanks. See inside of this file for details.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_DOOG_1D.html b/doc/filters/filter_DOOG_1D.html new file mode 100644 index 00000000..cf219660 --- /dev/null +++ b/doc/filters/filter_DOOG_1D.html @@ -0,0 +1,62 @@ + + + + Description of filter_DOOG_1D + + + + + + + + + + +

filter_DOOG_1D +

+ +

PURPOSE ^

+
1D difference of offset Gaussian (DooG) filters.
+ +

SYNOPSIS ^

+
function dG = filter_DOOG_1D( r, sig, deriv, show )
+ +

DESCRIPTION ^

+
 1D difference of offset Gaussian (DooG) filters.
+
+ Creates a 2D derivative of Gaussian kernel.  Use primarily for visualization purposes.
+ For filtering better to use the indvidiual seperable kernels for efficiency purposes.
+ 
+ INPUTS
+   r       - final mask will have length 2r+1
+   sig     - sigma for Gaussian 
+   deriv   - order of derivative 
+   show    - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   dG      - The derivative of Gaussian mask
+
+ EXAMPLE
+   dG = filter_DOOG_1D( 11, 2, 3, 1 );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also FILTER_DOOG_2D, FILTER_DOOG_3D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_DOOG_2D.html b/doc/filters/filter_DOOG_2D.html new file mode 100644 index 00000000..0be96c9c --- /dev/null +++ b/doc/filters/filter_DOOG_2D.html @@ -0,0 +1,63 @@ + + + + Description of filter_DOOG_2D + + + + + + + + + + +

filter_DOOG_2D +

+ +

PURPOSE ^

+
2D difference of offset Gaussian (DooG) filters.
+ +

SYNOPSIS ^

+
function dG = filter_DOOG_2D( r, sigx, sigy, nderivs, show )
+ +

DESCRIPTION ^

+
 2D difference of offset Gaussian (DooG) filters.
+
+ Creates a 2D derivative of Gaussian kernel.  Use primarily for visualization purposes.
+ For filtering better to use the indvidiual seperable kernels for efficiency purposes.
+ 
+ INPUTS
+   r       - final mask will be 2r+1 x 2r+1
+   sigx    - sigma for Gaussian in x direction
+   sigy    - sigma for Gaussian in y direction
+   nderivs - order of derivative along each dimension
+   show    - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   dG      - The derivative of Gaussian mask
+
+ EXAMPLE
+   dG = filter_DOOG_2D( 20, 3, 3, [1,1], 1 );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also FILTER_DOOG_1D, FILTER_DOOG_3D, FILTER_DOG_2D, FILTER_GABOR_2D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • FB_make_2D Various ways to make filterbanks. See inside of this file for details.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_DOOG_3D.html b/doc/filters/filter_DOOG_3D.html new file mode 100644 index 00000000..c35b9b17 --- /dev/null +++ b/doc/filters/filter_DOOG_3D.html @@ -0,0 +1,62 @@ + + + + Description of filter_DOOG_3D + + + + + + + + + + +

filter_DOOG_3D +

+ +

PURPOSE ^

+
3D difference of offset Gaussian (DooG) filters.
+ +

SYNOPSIS ^

+
function dG = filter_DOOG_3D( r, sigmas, nderivs, show )
+ +

DESCRIPTION ^

+
 3D difference of offset Gaussian (DooG) filters.
+
+ Creates a 3D derivative of Gaussian kernel.  Use primarily for visualization purposes.
+ For filtering better to use the indvidiual seperable kernels for efficiency purposes.
+ 
+ INPUTS
+   r       - final mask will be NxNxN where N=2r+1
+   sigmas  - sigmas for 3D Gaussian
+   nderivs - order of derivative along each dimension
+   show    - [optional] whether or not to visually display the kernel
+
+ OUTPUTS
+   dG      - The derivative of Gaussian mask
+
+ EXAMPLE
+   dG = filter_DOOG_3D( 50, [4,4,10], [1,1,0], 1 );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also FILTER_DOOG_1D, FILTER_DOOG_2D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • FB_make_3D Various ways to make filterbanks. See inside of this file for details.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_binomial_1D.html b/doc/filters/filter_binomial_1D.html new file mode 100644 index 00000000..fe5e689c --- /dev/null +++ b/doc/filters/filter_binomial_1D.html @@ -0,0 +1,67 @@ + + + + Description of filter_binomial_1D + + + + + + + + + + +

filter_binomial_1D +

+ +

PURPOSE ^

+
1D binomial filter (approximation to Gaussian filter)
+ +

SYNOPSIS ^

+
function f = filter_binomial_1D( r, show )
+ +

DESCRIPTION ^

+
 1D binomial filter (approximation to Gaussian filter)
+
+ Creates a binomial filter of size 2*r+1 x 1.  This can be used to approximate the
+ Gaussian distribution with sigma=sqrt((2*r+1)/4). For large r, should give same output
+ as:
+   g = fspecial( 'Gaussian', [2*r+1,1],sqrt((2*r+1)/4) );
+ Given sigma, use r ~= 2*sigma^2.
+
+ Use F = f*f' to get the equivalent 2d filter. 
+
+ INPUTS
+   r       - mask will have length 2r+1 and var=(2*r+1)/4
+   show    - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   f       - 1D binomial filter
+
+ EXAMPLE
+   r = 10;
+   fbinom = filter_binomial_1D( r, 1 );
+   fgauss = filter_gauss_1D( r, sqrt((2*r+1)/4), 2 );
+
+ DATESTAMP
+   11-Oct-2005  7:00pm
+   
+ See also FILTER_GAUSS_1D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • FB_reconstruct_2D Use to see how much image information is preserved in filter outputs.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_gabor_1D.html b/doc/filters/filter_gabor_1D.html new file mode 100644 index 00000000..b1c876ff --- /dev/null +++ b/doc/filters/filter_gabor_1D.html @@ -0,0 +1,64 @@ + + + + Description of filter_gabor_1D + + + + + + + + + + +

filter_gabor_1D +

+ +

PURPOSE ^

+
1D Gabor Filters.
+ +

SYNOPSIS ^

+
function [feven,fodd] = filter_gabor_1D( r, sig, omega, show );
+ +

DESCRIPTION ^

+
 1D Gabor Filters.
+
+ Creates a pair of 1D Gabor filters (even/odd).
+
+ INPUTS
+   r       - final mask will be 2r+1 (good choice for r is r=2*sig)
+   sig     - standard deviation of Gaussian mask
+   omega   - frequency of underlying sine/cosine 
+             should range between 1/(2r+1) and r/(2r+1)~.5 
+             otherwise false frequencies form
+   show    - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   feven   - even symmetric filter (-cosine masked with Gaussian)
+   fodd    - odd symmetric filter (-sine masked with Gaussian)
+
+ EXAMPLE
+   tau = 5; filter_gabor_1D(2*tau,tau,1/tau,1);
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also FILTER_GABOR_2D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • FB_make_1D Various ways to make filterbanks. See inside of this file for details.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_gabor_2D.html b/doc/filters/filter_gabor_2D.html new file mode 100644 index 00000000..c85b4b2d --- /dev/null +++ b/doc/filters/filter_gabor_2D.html @@ -0,0 +1,64 @@ + + + + Description of filter_gabor_2D + + + + + + + + + + +

filter_gabor_2D +

+ +

PURPOSE ^

+
2D Gabor filters.
+ +

SYNOPSIS ^

+
function [Feven,Fodd]=filter_gabor_2D(r,sig,lam,theta,show)
+ +

DESCRIPTION ^

+
 2D Gabor filters.
+
+ Creates a pair of Gabor filters (one odd one even) at the specified orientation.  
+ For Thomas' ECCV98 filters, use sig=sqrt(2), lam=4.
+
+ INPUTS
+   r       - final mask will be 2r+1 x 2r+1
+   sig     - standard deviation
+   lam     - elongation 
+   theta   - orientation
+   show    - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   Feven   - even symmetric filter (-cosine masked with Gaussian)
+   Fodd    - even symmetric filter (-sine masked with Gaussian)
+
+ EXAMPLE
+   [Feven,Fodd]=filter_gabor_2D(15,sqrt(2),4,45,1);
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also FILTER_GABOR_1D, FILTER_GAUSS_ND
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • FB_make_2D Various ways to make filterbanks. See inside of this file for details.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_gauss_1D.html b/doc/filters/filter_gauss_1D.html new file mode 100644 index 00000000..203feb2c --- /dev/null +++ b/doc/filters/filter_gauss_1D.html @@ -0,0 +1,62 @@ + + + + Description of filter_gauss_1D + + + + + + + + + + +

filter_gauss_1D +

+ +

PURPOSE ^

+
1D Gaussian filter.
+ +

SYNOPSIS ^

+
function f = filter_gauss_1D( r, sigma, show )
+ +

DESCRIPTION ^

+
 1D Gaussian filter.
+
+ Equivalent to: f = fspecial('Gaussian',[2*r+1,1],sigma)
+ Equivalent to: f = filter_gauss_nD( 2*r+1, r+1, sigma^2 );
+
+ INPUTS
+   r       - mask will have length 2r+1, if r=[] r is set to ceil(2.25*sigma)
+   sigma   - standard deviation of mask
+   show    - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   f       - 1D Gaussian filter
+
+ EXAMPLE
+   f1 = filter_gauss_1D( 10, 2, 1 );
+   f2 = filter_gauss_nD( 21, [], 2^2, 2);
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also FILTER_BINOMIAL_1D, FILTER_GAUSS_ND
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • gauss_smooth Applies Gaussian smoothing to a (multidimensional) image.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_gauss_nD.html b/doc/filters/filter_gauss_nD.html new file mode 100644 index 00000000..770f028c --- /dev/null +++ b/doc/filters/filter_gauss_nD.html @@ -0,0 +1,73 @@ + + + + Description of filter_gauss_nD + + + + + + + + + + +

filter_gauss_nD +

+ +

PURPOSE ^

+
n-dimensional Gaussian filter.
+ +

SYNOPSIS ^

+
function G = filter_gauss_nD( dims, mu, C, show )
+ +

DESCRIPTION ^

+
 n-dimensional Gaussian filter. 
+
+ Creates an image of a Gaussian with arbitrary covariance matrix. The point [x,y,z]
+ refers to the x-th column and y-th row, at the t-th frame.  So for example mu should
+ have the format [col,row,t].
+
+ If mu==[], it is calculated to be the center of the image.  C can be a full nxn
+ covariance matrix, or an nx1 vector of variance.  In the latter case C is calculated as
+ C=diag(C).  If C=[]; then C=(dims/6).^2, ie it is transformed into a vector of variances
+ such that along each dimension the variance is equal to (siz/6)^2.  
+
+ INPUTS
+   dims    - n element vector of dimensions of final Gaussian
+   mu      - [optional] n element vector specifying the mean or []
+   C       - [optional] nxn covariance matrix, nx1 set of variances, or variance, or []
+   show    - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   G   - image of the created Gaussian
+
+ EXAMPLE
+   % 2D
+   sigma=3; G = filter_gauss_nD( 4*[sigma sigma] + 1, [], [sigma sigma].^2, 1 );
+   % 3D
+   R = rotation_matrix3D( [1,1,0], pi/4 ); 
+   C = R'*[10^2 0 0; 0 5^2 0; 0 0 16^2]*R;
+   G = filter_gauss_nD( [50,50,50], [25,25,25], C, 1 );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also FILTER_GAUSS_1D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • filter_visualize_1D Used to help visualize the a 1D filter.
  • filter_visualize_3D Used to help visualize a 3D filter.
  • im IM [2D] Function for displaying grayscale images.
  • montage2 [3D] Used to display a stack of T images.
  • normpdf2 Normal prob. density function (pdf) with arbitrary covariance matrix.
  • plot_gaussellipses Plots 2D ellipses derived from 2D Gaussians specified by mus & Cs.
+This function is called by: +
    +
  • imageMLG Calculates maximum likelihood parameters of gaussian that gave rise to image G.
  • mask_gaussians Divides a volume into softly overlapping gaussian windows.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_steerable.html b/doc/filters/filter_steerable.html new file mode 100644 index 00000000..cb4c1f79 --- /dev/null +++ b/doc/filters/filter_steerable.html @@ -0,0 +1,57 @@ + + + + Description of filter_steerable + + + + + + + + + + +

filter_steerable +

+ +

PURPOSE ^

+
Steerable Gaussian derivative filter.
+ +

SYNOPSIS ^

+
function filter_steerable( theta )
+ +

DESCRIPTION ^

+
 Steerable Gaussian derivative filter.
+
+ This function is meant for visualization only.  It is a demonstration of steerable
+ filters.
+
+ Analytically find Gx = dxG and Gy = dxG.  Then find the derivative of G in some
+ arbitrary direction theta by taking a linear combination of Gx and Gy.  
+
+ INPUTS
+   theta   - orientation
+
+ EXAMPLE
+   filter_steerable( 30 )
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • im IM [2D] Function for displaying grayscale images.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_visualize_1D.html b/doc/filters/filter_visualize_1D.html new file mode 100644 index 00000000..7aac5a69 --- /dev/null +++ b/doc/filters/filter_visualize_1D.html @@ -0,0 +1,51 @@ + + + + Description of filter_visualize_1D + + + + + + + + + + +

filter_visualize_1D +

+ +

PURPOSE ^

+
Used to help visualize the a 1D filter.
+ +

SYNOPSIS ^

+
function filter_visualize_1D( f )
+ +

DESCRIPTION ^

+
 Used to help visualize the a 1D filter.
+
+ Marks local image maxima with a green '+' and minima with a red '+'.  Also shows the fft
+ response of the filter.
+
+ INPUTS
+   f   - filter to visualize
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_visualize_2D.html b/doc/filters/filter_visualize_2D.html new file mode 100644 index 00000000..b82d5b15 --- /dev/null +++ b/doc/filters/filter_visualize_2D.html @@ -0,0 +1,54 @@ + + + + Description of filter_visualize_2D + + + + + + + + + + +

filter_visualize_2D +

+ +

PURPOSE ^

+
Used to help visualize a 2D filter.
+ +

SYNOPSIS ^

+
function filter_visualize_2D( F, plotline )
+ +

DESCRIPTION ^

+
 Used to help visualize a 2D filter.  
+
+ Marks local image maxima with a green '+' and minima with a red '+'. Also shows the fft
+ response of the filter.  Can optionally also plot a scanline through either center row+2
+ or center column+2.  
+
+ INPUTS
+   F           - filter to visualize
+   plotline    - if 1, then draw line through center row+2, if 2 then 
+                 througt center col+2.  else no line. optional.
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • im IM [2D] Function for displaying grayscale images.
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/filter_visualize_3D.html b/doc/filters/filter_visualize_3D.html new file mode 100644 index 00000000..cfbde07a --- /dev/null +++ b/doc/filters/filter_visualize_3D.html @@ -0,0 +1,54 @@ + + + + Description of filter_visualize_3D + + + + + + + + + + +

filter_visualize_3D +

+ +

PURPOSE ^

+
Used to help visualize a 3D filter.
+ +

SYNOPSIS ^

+
function filter_visualize_3D( F, frac )
+ +

DESCRIPTION ^

+
 Used to help visualize a 3D filter. 
+
+ Dark lobes correspond to negative areas.  Surfaces shown are drawn at a percentage of
+ the peak filter response detemined by frac.  
+
+ INPUTS
+   F       - 3D filter to visualize
+   frac    - frac of max value of F at which to draw surfaces.
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also FILTER_VISUALIZE_2D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/filters/menu.html b/doc/filters/menu.html new file mode 100644 index 00000000..4b10716c --- /dev/null +++ b/doc/filters/menu.html @@ -0,0 +1,32 @@ + + + + Index for Directory filters + + + + + + + + + +
^ Master index ^
+ +

Index for filters

+
Contents
+ +

Matlab files in this directory:

+ + +

Other Matlab-specific files in this directory:

+
    +
  • FB_DoG.mat
  • FB_gabor.mat
+ + + +
Generated by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/fortran.png b/doc/fortran.png new file mode 100644 index 0000000000000000000000000000000000000000..350c572ee38fc5aa8cef025284caa41a46921cbf GIT binary patch literal 265 zcmV+k0rvihP)z zQ4Yf(2!?U#(c~&{CVCaUn|okwjJWCAv@Y{YACUYt5I|c;L@*Nz0Eo!wFm8gG7quL( z=eJ8jF~;-zT!i-?03M^mxSQz{PD1(=o)3a5h-huxIH1YJR@TpAUHLpGAzkjqF33Gq z5HW;M#1ulv?Ojv&dqVG&6;xWfSwIyu&pDe3Y?b*+^Nvd@T*dL)Y-z<7!R9u;!a16o zt!IDE1;u=7(6;lN@7iT2j)+8Ll6#n$r@xl|p4XvuY#=TA`S#1W+5VQEsg98Zwj;#Z P00000NkvXXu0mjf06Tac literal 0 HcmV?d00001 diff --git a/doc/history.txt b/doc/history.txt new file mode 100644 index 00000000..397aa925 --- /dev/null +++ b/doc/history.txt @@ -0,0 +1,21 @@ +Todo: + -faster meanshit code from vincent + +Version 1.03 (03-May-06) + -this file is now a standard part of the documentation + -thanks to everyone who gave me comments and helped make this toolbox more useful! + -added imtranslate.m + -playmovie/playmovies backward/forward playback + -comment nonmaxsupr < vs <= + -compile problems 'toolbox_compile' + -tweaked feval_images / imwrite2 to make more resilient + -added to imnormalize + -added scales to jitterimage + -added imwrite2split (useful extension to imwrite2 for writing/reading from mul dirs) + -lots of other minor fixes that I should have recorded... + +Version 1.02 (29-Nov-05) + -filmstrip/filstrips + -principal is misspelled in the PCA-related functions. + -fixed clustermontages (header was stripped) + -updated overview (add to path, recompile, description) \ No newline at end of file diff --git a/doc/hp.png b/doc/hp.png new file mode 100644 index 0000000000000000000000000000000000000000..d09f988fb289d659869dbb1b2f199fd967a93958 GIT binary patch literal 255 zcmVz z%MHUI3_wlAXs`;N$*f{_qX$Rw9FO zez{B`r8K|JmvGJjz-@IJXS2Omg-^gRJ-6O z&=syLR&U^^a}=eRZLpT@KTChlV@n^^it_t*Wz253r911aWh5p(A;kay002ovPDHLk FV1l-WYkL3y literal 0 HcmV?d00001 diff --git a/doc/images/Contents.html b/doc/images/Contents.html new file mode 100644 index 00000000..e87091dd --- /dev/null +++ b/doc/images/Contents.html @@ -0,0 +1,111 @@ + + + + Description of Contents + + + + + + + + + + +

Contents +

+ +

PURPOSE ^

+
IMAGE
+ +

SYNOPSIS ^

+
This is a script file.
+ +

DESCRIPTION ^

+
 IMAGE
+ See also
+
+ Display:
+   im                  - [2D] Function for displaying grayscale images.
+   montage2            - [3D] Used to display a stack of T images.
+   montages            - [4D] Used to display R sets of T images each.
+   montages2           - [4D] Used to display R sets of T images each.
+   filmstrip           - [3D] Used to display a stack of T images as a filmstrip.
+   filmstrips          - [4D] Used to display R sets of filmstrips.
+   makemovie           - [3D] Used to convert a stack of T images into a movie.
+   makemovies          - [4D] Used to convert R sets of equal length videos into a single movie.
+   makemoviesets       - [5D] Used to convert S sets of R videos into a movie.
+   makemoviesets2      - [5D] Used to convert S sets of R videos into a movie.
+   playmovie           - [3D] shows the image sequence I as a movie.
+   playmovies          - [4D] shows R videos simultaneously as a movie.
+   clustermontage      - Used for visualization of clusters of images and videos.
+   movie2images        - Creates a stack of images from a matlab movie M.
+
+ Histograms:
+   assign2bins         - Quantizes I according to values in edges.
+   histc_1D            - Generalized, version of histc (histogram count), allows weighted values.
+   histc_image         - Calculates histograms at every point in an array I.
+   histc_nD            - Generalized, multidimensional version of normalized histc (histogram count).
+   histc_sift          - Creates a series of locally position dependent histograms of the values in I.
+   histc_sift_nD       - Creates a series of locally position dependent histograms.
+   histmontage         - Used to display multiple 1D histograms.
+
+ Convolution:
+   convn_fast          - Fast convolution, replacement for both conv2 and convn.
+   gauss_smooth        - Applies Gaussian smoothing to a (multidimensional) image.
+
+ Generalized correlation:
+   normxcorrn          - Normalized n-dimensional cross-correlation.
+   normxcorrn_fg       - Normalized n-dimensional cross-correlation with a mask.
+   xcorrn              - n-dimensional cross-correlation.  Generalized version of xcorr2.
+   xeucn               - n-dimensional euclidean distance between each window in A and template T.
+
+ Image deformation:
+   apply_homography    - Applies the homography defined by H on the image I.
+   texture_map         - Maps texture in I according to row_dest and col_dest.
+   imnormalize         - Various ways to normalize a (multidimensional) image.
+   imrotate2           - Custom version of imrotate that demonstrates use of apply_homography.
+   imtranslate         - Translate an image to subpixel accuracy.
+   imshrink            - Used to shrink a multidimensional array I by integer amount.
+   imsubs2array        - Converts subs/vals image representation to array representation.
+   imsubs_resize       - Resizes subs in subs/vals image representation by resizevals.
+
+ Generalized nonmaximal suppression:
+   nonmaxsupr          - Applies nonmaximal suppression on an image of arbitrary dimension.
+   nonmaxsupr_list     - Applies nonmaximal suppression to a list.
+   nonmaxsupr_window   - Nonmaximal suppression of values outside of a given window.
+
+ Optical Flow:
+   optflow_corr        - Calculate optical flow using cross-correlation.
+   optflow_horn        - Calculate optical flow using Horn & Schunck.
+   optflow_lucaskanade - Calculate optical flow using Lucas & Kanade.  Fast, parallel code.
+
+ Miscellaneous:
+   imageMLG            - Calculates maximum likelihood parameters of gaussian that gave rise to image G.
+   imwrite2            - Similar to imwrite, except follows a strict naming convention.
+   imwrite2split       - Writes/reads a large set of images into/from multiple directories.
+   jitter_image        - Creates multiple, slightly jittered versions of an image.
+   jitter_video        - Creates multiple, slightly jittered versions of a video.
+   localsum            - Fast routine for box filtering.
+   localsum_block      - Calculates the sum in non-overlapping blocks of I of size dims.
+   mask_circle         - Creates an image of a 'pie slice' of a circle.
+   mask_ellipse        - Creates a binary image of an ellipse.
+   mask_gaussians      - Divides a volume into softly overlapping gaussian windows.
+   modefilt1           - One-dimensional mode filtering.
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/apply_homography.html b/doc/images/apply_homography.html new file mode 100644 index 00000000..0277627d --- /dev/null +++ b/doc/images/apply_homography.html @@ -0,0 +1,70 @@ + + + + Description of apply_homography + + + + + + + + + + +

apply_homography +

+ +

PURPOSE ^

+
Applies the homography defined by H on the image I.
+ +

SYNOPSIS ^

+
function IR = apply_homography( I, H, method, bbox, show )
+ +

DESCRIPTION ^

+
 Applies the homography defined by H on the image I.  
+
+ Takes the center of the image as the origin, not the top left corner.  Also, the
+ coordinate system is row/ column format, so H must be also.  
+
+ The bounding box of the image is set by the BBOX argument, a string that can be 'loose'
+ (default) or 'crop'. When BBOX is 'loose', IR includes the whole transformed image,
+ which generally is larger than I. When BBOX is 'crop' IR is cropped to include only the
+ central portion of the transformed image and is the same size as I.  Preserves I's type.
+
+ INPUTS
+   I       - input black and white image (2D double or unint8 array)
+   H       - 3x3 nonsingular homography matrix
+   method  - [optional] parameter for interp2 ('nearest',{'linear'},'spline','cubic');
+   bbox    - [optional] see above for meaning of bbox ({'loose'},'crop')
+   show    - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   IR -  result of applying H to I.
+
+ EXAMPLE
+   load trees; I=X;
+   R = rotation_matrix2D( pi/4 ); T = [1; 3]; H = [R T; 0 0 1];
+   IR = apply_homography( I, H, [], 'crop', 1 );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also TEXTURE_MAP, IMROTATE2
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • im IM [2D] Function for displaying grayscale images.
  • arraycrop2dims Pads or crops I appropriately so that size(IC)==dims.
+This function is called by: +
    +
  • imrotate2 Custom version of imrotate that demonstrates use of apply_homography.
  • imtranslate Translate an image to subpixel accuracy.
  • jitter_image Creates multiple, slightly jittered versions of an image.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/assign2bins.html b/doc/images/assign2bins.html new file mode 100644 index 00000000..b3af7f2d --- /dev/null +++ b/doc/images/assign2bins.html @@ -0,0 +1,65 @@ + + + + Description of assign2bins + + + + + + + + + + +

assign2bins +

+ +

PURPOSE ^

+
Quantizes I according to values in edges.
+ +

SYNOPSIS ^

+
function B = assign2bins( I, edges )
+ +

DESCRIPTION ^

+
 Quantizes I according to values in edges.  
+
+ assign2bins replaces each value in I with a value between [0,nbins] where
+ nbins=length(edges)-1.  edges must be a vector of monotonically increasing values.  Each
+ element v in I gets converted to a discrete value q such that edges(q)<=v< edges(q+1).
+ If v==edges(end) then q=nbins.  If v does not fall into any bin, then q=0. 
+
+ See histc_1D for more details about edges and nbins. 
+
+ INPUTS
+   I           - numeric array of arbitrary dimension
+   edges       - either nbins+1 length vector of quantization bounds, or scalar nbins
+
+ OUTPUTS
+   B           - size(I) array of quantization levels, int values between [0,nbins]
+
+ EXAMPLE
+   I = rand(5,5)
+   B = assign2bins(I,[0:.1:1])
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+   
+ See also HISTC_1D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • histc_image Calculates histograms at every point in an array I.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/clustermontage.html b/doc/images/clustermontage.html new file mode 100644 index 00000000..078b336c --- /dev/null +++ b/doc/images/clustermontage.html @@ -0,0 +1,69 @@ + + + + Description of clustermontage + + + + + + + + + + +

clustermontage +

+ +

PURPOSE ^

+
Used for visualization of clusters of images and videos.
+ +

SYNOPSIS ^

+
function XC = clustermontage( X, IDX, nvals, pad )
+ +

DESCRIPTION ^

+
 Used for visualization of clusters of images and videos.  
+
+ To display only a subset of clusters, given in a vector cs, use IDXb:
+   IDXb = zeros(size(IDX)); for i=1:length(cs) IDXb(IDX==cs(i))=i; end;
+
+ To save created movie:
+   movie2avi(M, ['example.avi'], 'compression','Cinepak');
+
+ INPUTS
+   X       - MxNxR array of images or MxNxTxR array of videos
+   IDX     - cluster membership (Rx1 integer vector) [see kmeans2.m]
+   nvals   - max number of instances to show of each cluster
+   pad     - pads each cluster w blanks so it has exactly nvals elements, if necessary
+
+ OUTPUTS
+   XC       - if pad==1
+              M x N x nvals x nclusters if X contains images
+              M x N x T x nvals x nclusters if X contains videos
+            - if pad==0
+              nclusters cell of M x N x c arrays if X contains images
+              nclusters cell of M x N x T x c arrays if X contains videos
+
+ EXAMPLE
+
+ DATESTAMP
+   29-Nov-2005  10:00am
+
+ See also KMEANS2, MONTAGES, MAKEMOVIESETS, CELL2ARRAY
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/convn_fast.html b/doc/images/convn_fast.html new file mode 100644 index 00000000..377783b0 --- /dev/null +++ b/doc/images/convn_fast.html @@ -0,0 +1,77 @@ + + + + Description of convn_fast + + + + + + + + + + +

convn_fast +

+ +

PURPOSE ^

+
Fast convolution, replacement for both conv2 and convn.
+ +

SYNOPSIS ^

+
function C = convn_fast( A, B, shape )
+ +

DESCRIPTION ^

+
 Fast convolution, replacement for both conv2 and convn. 
+
+ See conv2 or convn for more information on convolution in general.
+
+ This works as a replacement for both conv2 and convn.  Basically, performs convolution
+ in either the frequency or spatial domain, depending on which it thinks will be faster
+ (see below). In general, if A is much bigger then B then spatial convolution will be
+ faster, but if B is of similar size to A and both are fairly big (such as in the case of
+ correlation), convolution as multiplication in the frequency domain will tend to be
+ faster.  
+
+ The shape flag can take on 1 additional value which is 'smooth'.  This flag is intended
+ for use with smoothing kernels.  The returned matrix C is the same size as A with
+ boundary effects handled in a special manner.  That is instead of A being zero padded
+ before being convolved with B; near the boundaries a cropped version of the matrix B is
+ used, and the results is scaled by the fraction of the weight found in  the cropped
+ version of B.  In this case each dimension of B must be odd, and all elements of B must
+ be positive.  There are other restrictions on when this flag can be used, and in
+ general it is only useful for smoothing kernels.  For 2D filtering it does not have much
+ overhead, for 3D it has more and for higher dimensions much much more.
+
+ For optimal performance some timing constants must be set to choose between doing
+ convolution in the spatial and frequency domains, for more info see time_conv below.
+
+ INPUTS
+   A       - d dimensional input matrix 
+   B       - d dimensional matrix to convolve with A 
+   shape   - [optional] 'valid', ['full'], 'same', or 'smooth'
+
+ OUTPUS:
+   C       - result of convolution
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also CONV2, CONVN
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • convn_fast Fast convolution, replacement for both conv2 and convn.
  • arraycrop2dims Pads or crops I appropriately so that size(IC)==dims.
  • c clc
  • ind2sub2 Improved version of ind2sub.
+This function is called by: +
    +
  • convn_fast Fast convolution, replacement for both conv2 and convn.
  • gauss_smooth Applies Gaussian smoothing to a (multidimensional) image.
  • histc_image Calculates histograms at every point in an array I.
  • normxcorrn Normalized n-dimensional cross-correlation.
  • normxcorrn_fg Normalized n-dimensional cross-correlation with a mask.
  • xcorrn n-dimensional cross-correlation. Generalized version of xcorr2.
  • xeucn n-dimensional euclidean distance between each window in A and template T.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/filmstrip.html b/doc/images/filmstrip.html new file mode 100644 index 00000000..636f3c13 --- /dev/null +++ b/doc/images/filmstrip.html @@ -0,0 +1,58 @@ + + + + Description of filmstrip + + + + + + + + + + +

filmstrip +

+ +

PURPOSE ^

+
[3D] Used to display a stack of T images as a filmstrip.
+ +

SYNOPSIS ^

+
function F = filmstrip( I, overlap, delta, border )
+ +

DESCRIPTION ^

+
 [3D] Used to display a stack of T images as a filmstrip. 
+
+ INPUTS
+  I          - MxNxT or MxNx1xT or MxNx3xT array (of bw or color images)
+  overlap    - amount of overlap between successive frames
+  delta      - amount to shift each successive frame upward
+  border     - width of black border around each frame
+
+ EXAMPLE
+   load images;
+   F = filmstrip( video(:,:,1:15), 10, 2, 5 ); 
+   figure(1); im(F);
+
+ DATESTAMP
+   07-Oct-2005  5:00pm
+
+ See also MONTAGE2, FILMSTRIPS
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • filmstrips [4D] Used to display R sets of filmstrips.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/filmstrips.html b/doc/images/filmstrips.html new file mode 100644 index 00000000..820bc772 --- /dev/null +++ b/doc/images/filmstrips.html @@ -0,0 +1,58 @@ + + + + Description of filmstrips + + + + + + + + + + +

filmstrips +

+ +

PURPOSE ^

+
[4D] Used to display R sets of filmstrips.
+ +

SYNOPSIS ^

+
function F = filmstrips( I, overlap, delta, border )
+ +

DESCRIPTION ^

+
 [4D] Used to display R sets of filmstrips.
+
+ INPUTS
+  I          - MxNxTxR or MxNx1xTxR or MxNx3xTxR array 
+  overlap    - amount of overlap between successive frames
+  delta      - amount to shift each successive frame upward
+  border     - width of black border around each frame
+
+ EXAMPLE
+   load images;
+   F = filmstrips( videos(:,:,:,1:10), 5, 2, 3 ); 
+   figure(1); im(F);
+
+ DATESTAMP
+   07-Oct-2005  5:00pm
+
+ See also MONTAGES, FILMSTRIP
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • filmstrip [3D] Used to display a stack of T images as a filmstrip.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/gauss_smooth.html b/doc/images/gauss_smooth.html new file mode 100644 index 00000000..be3f3e1c --- /dev/null +++ b/doc/images/gauss_smooth.html @@ -0,0 +1,59 @@ + + + + Description of gauss_smooth + + + + + + + + + + +

gauss_smooth +

+ +

PURPOSE ^

+
Applies Gaussian smoothing to a (multidimensional) image.
+ +

SYNOPSIS ^

+
function [L,filters] = gauss_smooth( I, sigmas, shape, radius )
+ +

DESCRIPTION ^

+
 Applies Gaussian smoothing to a (multidimensional) image.
+
+ Smooths the n-dimensional array I with a n-dimensional gaussian with standard deviations
+ specified by sigmas.  This operation in linearly seperable and is implemented as such.
+
+ INPUTS
+   I       - imput image
+   sigmas  - either n dimensional or 1 dimensional vector of standard devs
+           - if sigmas(n)<=.3 then does not smooth along that dimension
+   shape   - [optional] shape to use in convolution [default == 'full']
+   radius  - [optional] radius in units of standard deviation [default == 2.25]
+
+ OUTPUTS
+   L       - smoothed image
+   filters - actual filters used, cell array of length n
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/histc_1D.html b/doc/images/histc_1D.html new file mode 100644 index 00000000..4280c1c9 --- /dev/null +++ b/doc/images/histc_1D.html @@ -0,0 +1,77 @@ + + + + Description of histc_1D + + + + + + + + + + +

histc_1D +

+ +

PURPOSE ^

+
Generalized, version of histc (histogram count), allows weighted values.
+ +

SYNOPSIS ^

+
function h = histc_1D( I, edges, weightmask )
+ +

DESCRIPTION ^

+
 Generalized, version of histc (histogram count), allows weighted values.
+
+ Creates a histogram h of the values in I, with edges as specified.  h will have length
+ nbins, where nbins=length(edges)-1.  Each value in I has associated weight given by
+ weightmask, which should have the same dimensions as I. h(q) contains the weighted
+ count of values v in I such that edges(q) <= v < edges(q+1). h(nbins) additionally
+ contains the weighted count of values in I such that v==edges(nbins+1) -- which is
+ different then how histc treates the boundary condition. Finally, h is normalized so
+ that sum(h(:))==1. 
+
+ It usually makes sense to specify edges explicitly, especially if different histograms
+ are going to be compared.  In general, edges must have monotonically non-decreasing
+ values.  Also, if the exact bounds are unknown then it is convenient to set the first
+ element in edges to -inf and the last to inf.  If h = histc_1D( I, nbins, ...), edges are
+ automatically generated and have bins equally spaced between min(I) and max(I). That is
+ edges is generated via: 'edges = linspace( minI-eps, maxI+eps, nbins+1 )'.  
+
+ See histc for more information.
+
+ INPUTS
+   I           - numeric array [treated as a vector]
+   edges       - either nbins+1 length vector of quantization bounds, or scalar nbins
+   weightmask  - [optional] size(I) numeric array of weights
+
+ OUTPUTS
+   h           - histogram (vector of size 1xnbins)
+ 
+ EXAMPLE
+   G = filter_gauss_nD([1000 1000],[],[],1);
+   h1 = histc_1D( G, 25 ); figure(1); bar(h1);
+   h2 = histc_1D( G, 25, G ); figure(2); bar(h2);
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also HISTC, ASSIGN2BINS
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • histc_sift_nD Creates a series of locally position dependent histograms.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/histc_image.html b/doc/images/histc_image.html new file mode 100644 index 00000000..73cb6a65 --- /dev/null +++ b/doc/images/histc_image.html @@ -0,0 +1,76 @@ + + + + Description of histc_image + + + + + + + + + + +

histc_image +

+ +

PURPOSE ^

+
Calculates histograms at every point in an array I.
+ +

SYNOPSIS ^

+
function HS = histc_image( I, edges, weightmask, shape )
+ +

DESCRIPTION ^

+
 Calculates histograms at every point in an array I.  
+
+ The qth bin of each histogram contains the count of the number of locations in I that
+ have value in between edges(q)<=v< edges(q+1).  HS(i,j,...,k,:) will contain the
+ histogram at location (i,j,...,k), as calculated by weighing values in I by placing
+ weightmask at that location.  For example, if weightmask is ones(window_size) then the
+ histogram at every location will simply be a histogram of the pixels within that window.
+
+ See histc_1D for more details about edges and nbins. 
+
+ The shape flag specifies what to do at boundaries.  See convn_fast for
+ possible flags such as 'same', 'valid', 'full, or 'smooth'.
+
+ INPUTS
+   I           - Array with integer values [see above]
+   edges       - either nbins+1 length vector of quantization bounds, or nbins
+   weightmask  - numeric array of weights, or cell array of seperable weight kernels
+   shape       - [optional] 'valid', ['full'], 'same', or 'smooth'
+
+ OUTPUTS
+   HS          - ~size(I)xQ array where each ~size(I) elt is a Q element
+                 histogram (~size(I) because depends on val of shape)
+
+ EXAMPLE
+   load trees;
+   L = conv2(X, filter_DOG_2D(10,4,1,0), 'valid' ); 
+   f1=filter_gauss_1D([],5);   HS1 = histc_image( L, 15, {f1,f1'}, 'same' ); 
+   f2=ones(1,15);              HS2 = histc_image( L, 15, {f2,f2'}, 'same' ); 
+   figure(1); im(X); figure(2); im(L);   figure(3); montage2(HS1,1,1); 
+   figure(4); montage2(HS2,1,1);         figure(5); montage2(HS1-HS2,1,1);
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also ASSIGN2BINS, HISTC_1D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • assign2bins Quantizes I according to values in edges.
  • convn_fast Fast convolution, replacement for both conv2 and convn.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/histc_nD.html b/doc/images/histc_nD.html new file mode 100644 index 00000000..e6b9d2a9 --- /dev/null +++ b/doc/images/histc_nD.html @@ -0,0 +1,77 @@ + + + + Description of histc_nD + + + + + + + + + + +

histc_nD +

+ +

PURPOSE ^

+
Generalized, multidimensional version of normalized histc (histogram count).
+ +

SYNOPSIS ^

+
function h = histc_nD( I, edges, weightmask )
+ +

DESCRIPTION ^

+
 Generalized, multidimensional version of normalized histc (histogram count).
+
+ Generalized version of normalized histc (histogram count) that allows for weighted
+ pixels and also multiple channels.  For example, suppose I is a nx2 array (n samples, 2
+ channels). Then histc_nD creates a 2D histogram such that h(q1,q2) contains the weighted
+ count of values [v1;v2] in I such that edges1(q1)<=v1<edges1(q1+1) and 
+ edges2(q2)<=v2<edges2(q2+1). 
+
+ The histogram edge vectors can be specified in a number of ways.  If edges is a scalar,
+ it is treated as a desired number of bins per dimension and a separate edges vector is
+ generated for each dimension, for details on how this works see histc_1D.  If edges is a
+ vector, than this vector is used as the edges vector along every dimension.  Finally, to
+ specify a different set of edges along each dimension use a cell vector of length nd
+ where each element is again a scalar or vector. Finally h is normalized so that
+ sum(h(:))==1.  
+
+ See histc_1D for more details about edges and nbins. 
+
+ INPUTS
+   I           - 2D numeric array [n x nd] 
+   edges       - either a scalar, vector, or length n cell vector of scalars and vectors
+   weightmask  - [optional] n length vector of weights
+
+ OUTPUTS
+   h           - histogram (array of size nbins1xnbins2x...)
+ 
+ EXAMPLE
+   G = filter_gauss_nD([1000 1000],[],[],0); G=G(:);
+   h=histc_nD( [G G], 25 ); figure(1); im(h); %decreasing vals along diagnol
+   h=histc_nD( [G G], 25, G ); figure(2); im(h); %constants along diagnol
+   h=histc_nD( [randn(size(G)) G], 5 ); figure(3); im(h); % symmetric about x, dec on y
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also HISTC_1D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • histc_sift_nD Creates a series of locally position dependent histograms.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/histc_sift.html b/doc/images/histc_sift.html new file mode 100644 index 00000000..92ed1d15 --- /dev/null +++ b/doc/images/histc_sift.html @@ -0,0 +1,68 @@ + + + + Description of histc_sift + + + + + + + + + + +

histc_sift +

+ +

PURPOSE ^

+
Creates a series of locally position dependent histograms of the values in I.
+ +

SYNOPSIS ^

+
function hs = histc_sift( I, edges, pargmask, weightmask )
+ +

DESCRIPTION ^

+
 Creates a series of locally position dependent histograms of the values in I.
+
+ Inspired by David Lowe's SIFT descriptor.  Takes I, divides it into a number of regions,
+ and creates a histogram for each region. I is divided into approximately equally sized
+ hyper-rectangular regions so that together these hyper-rectangles cover I.  The
+ hyper-rectangles are actually 'soft', in that each region is actually defined by a
+ gaussian mask, for details see mask_gaussians. pargmask, parameters to mask_gaussians,
+ controls details about how the masks are created.  Optionally, each value in I may have
+ associated weight given by weightmask, which should have the same exact dimensions as I. 
+
+ INPUTS
+   I           - M1xM2x...xMk numeric array
+   edges       - either nbins+1 length vector of quantization bounds, or nbins
+   pargmask    - cell of parameters to mask_gaussians
+   weightmask  - [optional] size(I) numeric array of weights
+
+ OUTPUTS
+   hs          - histograms (array of size nbins x nmasks)
+
+ EXAMPLE
+   G = filter_gauss_nD([100 100],[],[],0);
+   hs = histc_sift( G, 5, {2,.6,.1,0} ); figure(1); im(hs)
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also HISTC_1D, MASK_GAUSSIANS, HISTC_SIFT_ND
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • histc_sift_nD Creates a series of locally position dependent histograms.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/histc_sift_nD.html b/doc/images/histc_sift_nD.html new file mode 100644 index 00000000..d1cc8adc --- /dev/null +++ b/doc/images/histc_sift_nD.html @@ -0,0 +1,73 @@ + + + + Description of histc_sift_nD + + + + + + + + + + +

histc_sift_nD +

+ +

PURPOSE ^

+
Creates a series of locally position dependent histograms.
+ +

SYNOPSIS ^

+
function hs = histc_sift_nD( I, edges, pargmask, weightmask, multch )
+ +

DESCRIPTION ^

+
 Creates a series of locally position dependent histograms.
+
+ Creates a series of locally position dependent histograms of the values in the mutiple
+ channel multidimensional array I (this is a generalized version of histc_sift that
+ allows for multiple channels).
+
+ I is an M1xM2x...xMkxnd array, it consists of nd channels each of dimension
+ (M1xM2x...xMk).  histc_sift_nD works by dividing a (M1xM2x...xMk) array into seperate
+ regions and creating a 1D histogram for each using histc_1D.  histc_sift_nD does the same
+ thing except each region now has multiple channels, and an nd-dimensional histogram is
+ created for each using histc_nD.
+
+ INPUTS
+   I           - M1xM2x...xMkxnd array, (nd channels each of dim M1xM2x...xMk)
+   edges       - parameter to histc_nD, [either scalar, vector, or cell vector]
+   pargmask    - cell of parameters to mask_gaussians
+   weightmask  - [optional] M1xM2x...xMk numeric array of weights
+   multch      - [optional] if 0 this becomes same as histc_sift.m (nd==1)
+
+ OUTPUTS
+   hs          - histograms (array of size nmasks x nbins)
+
+ EXAMPLE
+   G = filter_gauss_nD([100 100],[],[],0); 
+   hs = histc_sift_nD( cat(3,G,G), 5, {2,.6,.1,0} ); 
+   hs = histc_sift_nD( cat(3,G,randn(size(G))),5,{2,.6,.1,0}); 
+   figure(1); montage2(hs,1);  figure(2); montage2(hs,1);
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also HISTC_1D, HISTC_SIFT, MASK_GAUSSIANS, HISTC_ND
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • gauss_smooth Applies Gaussian smoothing to a (multidimensional) image.
  • histc_1D Generalized, version of histc (histogram count), allows weighted values.
  • histc_nD Generalized, multidimensional version of normalized histc (histogram count).
  • mask_gaussians Divides a volume into softly overlapping gaussian windows.
+This function is called by: +
    +
  • histc_sift Creates a series of locally position dependent histograms of the values in I.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/histmontage.html b/doc/images/histmontage.html new file mode 100644 index 00000000..fb672047 --- /dev/null +++ b/doc/images/histmontage.html @@ -0,0 +1,56 @@ + + + + Description of histmontage + + + + + + + + + + +

histmontage +

+ +

PURPOSE ^

+
Used to display multiple 1D histograms.
+ +

SYNOPSIS ^

+
function histmontage( HS, mm, nn )
+ +

DESCRIPTION ^

+
 Used to display multiple 1D histograms.
+
+ INPUTS
+   HS  - nhist x nbins array where HS(i,j) is the jth bin in the ith histogram
+   mm  - [optional] #images/row (if [] then calculated based on nn)
+   nn  - [optional] #images/col(if [] then calculated based on mm)
+
+ EXAMPLE
+   h = histc_1D( randn(2000,1), 20 );
+   histmontage([h; h]);
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ 
+ See also HISTC, HISTC_1D, FILTER_GAUSS_1D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/im.html b/doc/images/im.html new file mode 100644 index 00000000..45bdb2c1 --- /dev/null +++ b/doc/images/im.html @@ -0,0 +1,58 @@ + + + + Description of im + + + + + + + + + + +

im +

+ +

PURPOSE ^

+
IM [2D] Function for displaying grayscale images.
+ +

SYNOPSIS ^

+
function im( I, range );
+ +

DESCRIPTION ^

+
IM [2D] Function for displaying grayscale images.
+
+ Handy function for showing a grayscale image with a colorbar and interactive pixel value
+ tool.
+
+ INPUTS
+   I       - image in a valid format
+   range   - [optional] minval/maxval for imagesc
+
+ EXAMPLE
+   load clown
+   im( X )
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also IMSHOW, IMVIEW
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/imageMLG.html b/doc/images/imageMLG.html new file mode 100644 index 00000000..8c967309 --- /dev/null +++ b/doc/images/imageMLG.html @@ -0,0 +1,88 @@ + + + + Description of imageMLG + + + + + + + + + + +

imageMLG +

+ +

PURPOSE ^

+
Calculates maximum likelihood parameters of gaussian that gave rise to image G.
+ +

SYNOPSIS ^

+
function varargout = imageMLG( G, symmFlag, show )
+ +

DESCRIPTION ^

+
 Calculates maximum likelihood parameters of gaussian that gave rise to image G.
+
+ Suppose G contains an image of a gaussian distribution.  One way to recover the
+ parameters of the gaussian is to threshold the image, and then estimate the
+ mean/covariance based on the coordinates of the thresholded points.  A better method is
+ to do no thresholding and instead use all the coordinates, weighted by their value.
+ This function does the latter, except in a very efficient manner since all computations
+ are done in parallel over the entire image. 
+
+ This function works over 2D or 3D images.  It makes most sense when G in fact contains
+ an image of a single gaussian, but a result will be returned regardless.  All operations
+ are performed on abs(G) in case it contains negative or complex values.
+
+ symmFlag is an optional flag that if set to 1 then imageMLG recovers the maximum
+ likelihood symmetric gaussian.  That is the variance in each direction is equal, and all
+ covariance terms are 0.  If symmFlag is set to 2 and G is 3D, imageMLG recovers the ML
+ guassian with equal variance in the 1st 2 dimensions (row and col) and all covariance
+ terms equal to 0, but a possibly different variance in the 3rd (z or t) dimension.
+
+ INPUTS
+   G           - image of a gaussian (weighted pixels)
+   symmFlag    - [optional] see above
+   show        - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   mu      - 2 or 3 element vector specifying the mean [row,col,z]
+   C       - 2x2 or 3x3 covariance matrix [row,col,z]
+   GR      - image of the recovered gaussian (faster if omitted)
+   logl    - log likelihood of G given the recovered gaussian (faster if omitted)
+
+ EXAMPLE
+   % example 1 [2D]
+   R = rotation_matrix2D( pi/6 );  C=R'*[10^2 0; 0 20^2]*R;
+   G = filter_gauss_nD( [200, 300], [150,100], C, 0 );
+   [mu,C,GR,logl] = imageMLG( G, 0, 1 );
+   mask = mask_ellipse( size(G,1), size(G,2), mu, C ); 
+   figure(3); im(mask)
+   % example 2 [3D]
+   R = rotation_matrix3D( [1,1,0], pi/4 ); 
+   C = R'*[5^2 0 0; 0 2^2 0; 0 0 4^2]*R;
+   G = filter_gauss_nD( [50,50,50], [25,25,25], C, 0 );
+   [mu,C,GR,logl] = imageMLG( G, 0, 1 );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also GAUSS2ELLIPSE, PLOT_GAUSSELLIPSES, MASK_ELLIPSE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • filter_gauss_nD n-dimensional Gaussian filter.
  • im IM [2D] Function for displaying grayscale images.
  • montage2 [3D] Used to display a stack of T images.
  • plot_gaussellipses Plots 2D ellipses derived from 2D Gaussians specified by mus & Cs.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/imnormalize.html b/doc/images/imnormalize.html new file mode 100644 index 00000000..e59004ce --- /dev/null +++ b/doc/images/imnormalize.html @@ -0,0 +1,70 @@ + + + + Description of imnormalize + + + + + + + + + + +

imnormalize +

+ +

PURPOSE ^

+
Various ways to normalize a (multidimensional) image.
+ +

SYNOPSIS ^

+
function X = imnormalize( X, flag )
+ +

DESCRIPTION ^

+
 Various ways to normalize a (multidimensional) image.
+
+ Sets image X to have zero mean and unit variance (if flag==1). 
+ Sets image X to range in [0,1] (if flag==2). 
+ Sets image X to have zero mean (if flag==3). 
+ Sets image X to have zero mean and unit magnitude (if flag==4). 
+ Sets image X to have zero mean and unit variance, furthermore throws out 
+   extreme values and normalized to [0,1] (if flag==5)
+
+ X may have arbitrary dimension (ie an image or video, etc).  X is treated as a vector of
+ pixel values.  Hence, the mean of X is the average pixel value, and likewise the
+ standard deviation is the std of the pixels from the mean pixel.
+
+ INPUTS
+   X       - n dimensional array to standardize
+   flag    - [optional] determines normalization procedure
+
+ OUTPUTS
+   X       - X after normalization.
+
+ DATESTAMP
+   18-Jan-2006  5:15pm
+
+ EXAMPLE
+   I = double(imread('cameraman.tif'));
+   N = imnormalize(I,1);
+   mean(I(:)), std(I(:)), mean(N(:)), std(N(:))
+
+ See also FEVAL_ARRAYS
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • imnormalize Various ways to normalize a (multidimensional) image.
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/imrotate2.html b/doc/images/imrotate2.html new file mode 100644 index 00000000..131beaf6 --- /dev/null +++ b/doc/images/imrotate2.html @@ -0,0 +1,65 @@ + + + + Description of imrotate2 + + + + + + + + + + +

imrotate2 +

+ +

PURPOSE ^

+
Custom version of imrotate that demonstrates use of apply_homography.
+ +

SYNOPSIS ^

+
function IR = imrotate2( I, angle, method, bbox )
+ +

DESCRIPTION ^

+
 Custom version of imrotate that demonstrates use of apply_homography.
+
+ Works exactly the same as imrotate.  For usage see imrotate.
+
+ INPUTS
+   I       - 2D image [converted to double]
+   angle   - angle to rotate in degrees
+   method  - 'nearest',{'linear'},'spline','cubic';
+   bbox    - {'loose'}, 'crop'
+
+ OUTPUTS
+   IR      - rotated image
+
+ EXAMPLE
+   load trees;
+   tic; X1 = imrotate( X, 55, 'bicubic' ); toc, 
+   tic; X2 = imrotate2( X, 55, 'bicubic' ); toc
+   clf;  subplot(2,2,1); im(X); subplot(2,2,2); im(X1-X2);
+   subplot(2,2,3); im(X1); subplot(2,2,4); im(X2);
+
+ DATESTAMP
+   2-May-2006  10:00pm
+
+ See also IMROTATE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/imshrink.html b/doc/images/imshrink.html new file mode 100644 index 00000000..f93159f1 --- /dev/null +++ b/doc/images/imshrink.html @@ -0,0 +1,62 @@ + + + + Description of imshrink + + + + + + + + + + +

imshrink +

+ +

PURPOSE ^

+
Used to shrink a multidimensional array I by integer amount.
+ +

SYNOPSIS ^

+
function I = imshrink( I, ratios )
+ +

DESCRIPTION ^

+
 Used to shrink a multidimensional array I by integer amount.
+
+ ratios specifies the block dimensions.  For example, ratios=[2 3 4] shrinks a 3
+ dimensional array I by a factor of 2 along the first dimension, 3 along the secong and 4
+ along the third.  ratios must be strictly positive integers.  A value of 1 means no
+ shrinking is done along a given dimension. 
+
+ Can handle very large arrays in a memory efficient manner.
+ All the work is done by localsum_block.
+
+ INPUTS
+   I       - k dimensional input array 
+   ratios  - k element vector of shrinking factors
+
+ OUTPUTS
+   I   - shrunk version of input
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also IMRESIZE, LOCALSUM_BLOCK
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • imshrink Used to shrink a multidimensional array I by integer amount.
  • localsum_block Calculates the sum in non-overlapping blocks of I of size dims.
  • arraycrop_full Used to crop a rectangular region from an n dimensional array.
  • checknumericargs Helper utility for checking numeric vector arguments.
+This function is called by: +
    +
  • imshrink Used to shrink a multidimensional array I by integer amount.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/imsubs2array.html b/doc/images/imsubs2array.html new file mode 100644 index 00000000..26402233 --- /dev/null +++ b/doc/images/imsubs2array.html @@ -0,0 +1,58 @@ + + + + Description of imsubs2array + + + + + + + + + + +

imsubs2array +

+ +

PURPOSE ^

+
Converts subs/vals image representation to array representation.
+ +

SYNOPSIS ^

+
function I = imsubs2array( subs, vals, siz, fillval )
+ +

DESCRIPTION ^

+
 Converts subs/vals image representation to array representation.
+
+ imsubs is a 'bag of pixels' image representation which is useful for sparse arrays.
+
+ INPUTS
+   subs    - subscripts of point locations (n x d) 
+   vals    - values at point locations (n x 1)
+   siz     - image size vector (1xd) - must fully contain subs
+   fillval - [optional] value to fill array with at nonspecified locs
+
+ OUTPUTS
+   I       - array of size siz
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also IMSUBS_RESIZE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • softmin Calculates the softmin of a vector.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/imsubs_resize.html b/doc/images/imsubs_resize.html new file mode 100644 index 00000000..da0d62e2 --- /dev/null +++ b/doc/images/imsubs_resize.html @@ -0,0 +1,62 @@ + + + + Description of imsubs_resize + + + + + + + + + + +

imsubs_resize +

+ +

PURPOSE ^

+
Resizes subs in subs/vals image representation by resizevals.
+ +

SYNOPSIS ^

+
function subs = imsubs_resize( subs, resizevals )
+ +

DESCRIPTION ^

+
 Resizes subs in subs/vals image representation by resizevals.
+
+ imsubs is a 'bag of pixels' image representation which is useful for sparse arrays.
+
+ This essentially repleces each sub by sub.*resizevals.  The only subtlety is that in
+ images the leftmost sub value is .5, so for example when resizing by a factor of 2, the
+ first pixel is replaced by 2 pixels and so location 1 in the original image goes to
+ location 1.5 in the second image, NOT 2.  It may be necessary to round the values
+ afterward.
+
+ INPUTS
+   subs        - subscripts of point locations (n x d) 
+   resizevals  - k element vector of shrinking factors
+
+ OUTPUTS
+   subs    - transformed subscripts of point locations (n x d) 
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also IMSUBS2ARRAY
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/imtranslate.html b/doc/images/imtranslate.html new file mode 100644 index 00000000..c1d3e6a8 --- /dev/null +++ b/doc/images/imtranslate.html @@ -0,0 +1,64 @@ + + + + Description of imtranslate + + + + + + + + + + +

imtranslate +

+ +

PURPOSE ^

+
Translate an image to subpixel accuracy.
+ +

SYNOPSIS ^

+
function IR = imtranslate( I, dx, dy, method, bbox )
+ +

DESCRIPTION ^

+
 Translate an image to subpixel accuracy.
+
+ Note that for subplixel accuracy cannot use nearest neighbor interpolation.
+
+ INPUTS
+   I       - 2D image [converted to double]
+   dx      - x translation (right)
+   dy      - y translation (up)
+   method  - 'nearest',{'linear'},'spline','cubic';
+   bbox    - {'loose'}, 'crop'
+
+ OUTPUTS
+   IR      - rotated image
+
+ EXAMPLE
+   load trees;
+   XT = imtranslate(X,0,1.5,'bicubic','crop');
+   figure(1); im(X,[0 255]); figure(2); im(XT,[0 255]);
+
+ DATESTAMP
+   2-May-2006  10:00pm
+
+ See also IMROTATE2
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/imwrite2.html b/doc/images/imwrite2.html new file mode 100644 index 00000000..dc214347 --- /dev/null +++ b/doc/images/imwrite2.html @@ -0,0 +1,83 @@ + + + + Description of imwrite2 + + + + + + + + + + +

imwrite2 +

+ +

PURPOSE ^

+
Similar to imwrite, except follows a strict naming convention.
+ +

SYNOPSIS ^

+
function I = imwrite2( I, multflag, imagei, path, name, ext, ndigits, varargin )
+ +

DESCRIPTION ^

+
 Similar to imwrite, except follows a strict naming convention.
+
+ Wrapper for imwrite that writes file to the filename:
+   imagename = [path name int2str2(i,ndigits) '.' ext];
+ Using imwrite: 
+   imwrite( I, imagename, writeparams )
+
+ If I represents a stack of images, the ith image is written to:
+   imagenamei = [path name int2str2(i+imagei-1,ndigits) '.' ext];
+   
+ If I=[], then imwrite2 will attempt to read images from disk instead.
+
+ multflag controls how I is interpreted.  If multflag==0, then I is intrepreted as a
+ single image, otherwise I is interpreted as a stack of images, where I(:,:,...,j)
+ represents the jth image (see feval_arrays for more info).
+
+ If the directory specified by 'path' does not exist, imwrite2 attempts to create it.
+ 
+ INPUTS
+   I           - image or array or cell of images (if [] reads else writes)
+   multflag    - set to 1 if I represents a stack of images
+   imagei      - first image number
+   path        - directory where images are
+   name        - base name of images
+   ext         - extension of image 
+   ndigits     - number of digits for filename index
+   writeparams - [varargin] additional parameters to imwrite
+
+ OUTPUTS
+   I           - image or images (read from disk if input I=[])
+
+ EXAMPLE
+   load images; clear IDXi IDXv t video videos;
+   imwrite2( images(:,:,1), 0, 0, 'rats/', 'rats', 'png', 5 );    % writes first frame
+   imwrite2( images(:,:,1:5), 1, 0, 'rats/', 'rats', 'png', 5 );  % writes first 5 frames
+   images2 = imwrite2( [], 1, 0, 'rats/', 'rats', 'png', 5 );     % reads first 5 frames
+   images2 = feval_images(@(x) x,{},'rats/','rats','png',0,4,5);  % reads first 5 frames
+
+ DATESTAMP
+   26-Jan-2005  2:00pm
+
+ See also FEVAL_IMAGES, FEVAL_ARRAYS
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • feval_arrays Used to apply the same operation to a stack of array elements.
  • feval_images Used to apply the same operation to all images in given directory.
  • int2str2 Convert integer to string of given length; improved version of int2str.
+This function is called by: +
    +
  • imwrite2split Writes/reads a large set of images into/from multiple directories.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/imwrite2split.html b/doc/images/imwrite2split.html new file mode 100644 index 00000000..ba7ada86 --- /dev/null +++ b/doc/images/imwrite2split.html @@ -0,0 +1,66 @@ + + + + Description of imwrite2split + + + + + + + + + + +

imwrite2split +

+ +

PURPOSE ^

+
Writes/reads a large set of images into/from multiple directories.
+ +

SYNOPSIS ^

+
function I = imwrite2split( I, nSplits, spliti, path, varargin )
+ +

DESCRIPTION ^

+
 Writes/reads a large set of images into/from multiple directories.
+
+ This is useful since certain OS handle very large directories (of say >20K images)
+ rather poorly (I'm talking to you Bill).  Thus, can take 100K images, and write into 5
+ separate directories, then read them back in.
+
+ INPUTS
+   I           - image or images (if [] reads else writes)
+   nSplits     - number of directories to split data into
+   spliti      - first split number
+   path        - directory where images are
+   writeparams - [varargin] additional parameters to imwrite2
+
+ OUTPUTS
+   I           - image or images (read from disk if input I=[])
+
+ EXAMPLE
+   load images; clear IDXi IDXv t video videos;
+   imwrite2split( images, 2, 0, 'rats', 'rats', 'png', 5 );
+   images2=imwrite2split( [], 2, 0, 'rats', 'rats', 'png', 5 );
+
+ DATESTAMP
+   23-Jan-2005  2:00pm
+
+ See also IMWRITE2
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • imwrite2 Similar to imwrite, except follows a strict naming convention.
  • int2str2 Convert integer to string of given length; improved version of int2str.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/jitter_image.html b/doc/images/jitter_image.html new file mode 100644 index 00000000..9215eeee --- /dev/null +++ b/doc/images/jitter_image.html @@ -0,0 +1,94 @@ + + + + Description of jitter_image + + + + + + + + + + +

jitter_image +

+ +

PURPOSE ^

+
Creates multiple, slightly jittered versions of an image.
+ +

SYNOPSIS ^

+
function IJ = jitter_image( I, nphis, maxphi, ntrans, maxtrans, jsiz, reflectflag, scales )
+ +

DESCRIPTION ^

+
 Creates multiple, slightly jittered versions of an image.
+
+ Takes an image I, and generates a number of images that are copies of the original image
+ with slight translation and rotation applied.  The original image also appears in the
+ final set.  
+
+ The parameter jsiz controls the size of the cropped images.  If jsiz gives a size that's
+ substantially smaller than I then all data in the the final set will come from I.
+ However, if this is not the case then I may need to be padded first.  The way this is
+ done is with padarray with the 'replicate' method.  If jsiz is not specified, it is set
+ to be the size of the original image. A warning appears if the image needs to be grown. 
+ 
+ Rotations and translations are specified by giving a range and a maximum value for each.
+ For example, if maxphi=10 and nphis=5, then the actual rotations applied are [-10 -5 0 5
+ 10]. Uses: linspace( -maxphi, maxphi, nphis ); Likewise if maxtrans=3 and ntrans=3 then
+ the translations are [-3 0 3]. Each translation is applied in the x direction as well as
+ the y direction.  Each combination of rotation, translation in x, and translation in y
+ is used (for example phi=5, transx=-3, transy=0), so the total number of images
+ generated is R=ntrans*ntrans*nphis).  This function works faster if all of the 
+ translation end up being integer valued.
+
+ If the input image is actually a MxNxK stack of images then applies op to each image in
+ stack and returns an MxNxKxR where R=(ntrans*ntrans*nphis) set of images. 
+
+ INPUTS
+   I           - BW input image (MxN) or images (MxNxK), must have odd dimensions
+   nphis       - number of rotations
+   maxphis     - max value for rotation
+   ntrans      - number of translations 
+   maxtrans    - max value for translation
+   jsiz        - [optional] Final size of each image in IJ 
+   reflectflag - [optional] if true then also adds reflection of each image
+   scales      - [optional] nscalesx2 array of vert/horiz scalings
+
+ OUTPUTS
+   IJ          - MxNxR or MxNxKxR set of images where R=(ntrans*ntrans*nphis*nscales)
+ 
+ EXAMPLE
+   load trees; I = ind2gray(X,map); I = imresize(I,[41 41]); clear X caption map
+   % creates 7^2*2 images of slight translations with reflection (but no rotation) 
+   IJ = jitter_image( I, 0, 0, 7, 3, [35 35], 1 ); montage2(IJ,1,1)
+   % creates 5 images of slight rotations (no translations)
+   IJ = jitter_image( I, 5, 25, 0, 0, size(I) ); montage2(IJ,1,1)
+   % creates 45 images of both rotation and slight translations
+   % alternatively use (maxtrans=3) OR (nphis=5)
+   IJ = jitter_image( I, 5, 10, 3, 2 ); montage2(IJ,1,1)
+   % additionally create multiple scaled versions
+   IJ = jitter_image( I, 1, 0, 1, 0, [], [], [1 1; 2 1; 1 2; 2 2] ); montage2(IJ,1)
+
+ DATESTAMP
+   27-Feb-2005  2:00pm
+
+ See also JITTER_VIDEO
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • jitter_video Creates multiple, slightly jittered versions of a video.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/jitter_video.html b/doc/images/jitter_video.html new file mode 100644 index 00000000..ab8b6565 --- /dev/null +++ b/doc/images/jitter_video.html @@ -0,0 +1,67 @@ + + + + Description of jitter_video + + + + + + + + + + +

jitter_video +

+ +

PURPOSE ^

+
Creates multiple, slightly jittered versions of a video.
+ +

SYNOPSIS ^

+
function IS = jitter_video( I, nphis, maxphi, ntrans, maxtrans, nttrans, maxttrans, jsiz )
+ +

DESCRIPTION ^

+
 Creates multiple, slightly jittered versions of a video.
+
+ Takes a video and creats multiple versions of the video with offsets in both space and
+ time and rotations in space.  Basically, for each frame in the video calls jitter_image,
+ and then also adds some temporal offsets. In all respects this it basically functions
+ like jitter_image -- see that function for more information.
+
+ Note: All temporal translations must have integer size.
+
+ INPUTS
+   I           - BW input video (MxNxT) or videos (MxNxTxK), must have odd dimensions
+   nphis       - number of spatial rotations (must be odd)
+   maxphis     - max value for spatial rotation
+   ntrans      - number of spatial translations (must be odd)
+   maxtrans    - max value for spatial translations
+   nttrans     - number of temporal translations (must be odd)
+   maxttrans   - max value for temporal translations
+   jsiz        - [optional] Final size of each video in IJ 
+
+ OUTPUTS
+   IS          - MxNxTxR or MxNxTxKxR set of videos where R=(ntrans*ntrans*nphis)
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also JITTER_IMAGE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • jitter_image Creates multiple, slightly jittered versions of an image.
  • feval_arrays Used to apply the same operation to a stack of array elements.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/localsum.html b/doc/images/localsum.html new file mode 100644 index 00000000..e43a5cc8 --- /dev/null +++ b/doc/images/localsum.html @@ -0,0 +1,64 @@ + + + + Description of localsum + + + + + + + + + + +

localsum +

+ +

PURPOSE ^

+
Fast routine for box filtering.
+ +

SYNOPSIS ^

+
function I = localsum( I, dims, shape )
+ +

DESCRIPTION ^

+
 Fast routine for box filtering.
+
+ Same effect as calling 'C=convn( I, ones(dims), shape)', except more efficient.
+ Computes local sums by using running sums.
+
+ INPUTS
+   I       - matrix to compute sum over
+   dims    - size of volume to compute sum over 
+   shape   - [optional] 'valid', 'full', or 'same', see conv2 help
+
+ OUTPUTS
+   C       - matrix of sums
+
+ EXAMPLE
+   A = rand(20); dim=31; shape='valid'; 
+   B = localsum(A,dim,shape); 
+   C = conv2(A,ones(dim),shape); 
+   diff=B-C; sum(abs(diff(:)))
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also LOCALSUM_BLOCK
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • nlfilt_sep Efficient multidimensional nonlinear but seperable filtering operation.
+This function is called by: +
    +
  • mask_circle Creates an image of a 'pie slice' of a circle.
  • modefilt1 One-dimensional mode filtering.
  • normxcorrn Normalized n-dimensional cross-correlation.
  • optflow_corr Calculate optical flow using cross-correlation.
  • xeucn n-dimensional euclidean distance between each window in A and template T.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/localsum_block.html b/doc/images/localsum_block.html new file mode 100644 index 00000000..ad481fc9 --- /dev/null +++ b/doc/images/localsum_block.html @@ -0,0 +1,57 @@ + + + + Description of localsum_block + + + + + + + + + + +

localsum_block +

+ +

PURPOSE ^

+
Calculates the sum in non-overlapping blocks of I of size dims.
+ +

SYNOPSIS ^

+
function I = localsum_block( I, dims )
+ +

DESCRIPTION ^

+
 Calculates the sum in non-overlapping blocks of I of size dims.  
+
+ Similar to localsum except gets sum in non-overlapping windows. Equivalent to doing
+ localsum, and then subsampling (except more efficient).
+
+ INPUTS
+   I       - matrix to compute sum over
+   dims    - size of volume to compute sum over 
+
+ OUTPUTS
+   I       - resulting array 
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ 
+ See also LOCALSUM
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • nlfiltblock_sep Efficient multidimensional nonlinear but seperable filtering operation.
+This function is called by: +
    +
  • imshrink Used to shrink a multidimensional array I by integer amount.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/makemovie.html b/doc/images/makemovie.html new file mode 100644 index 00000000..c2c233c8 --- /dev/null +++ b/doc/images/makemovie.html @@ -0,0 +1,60 @@ + + + + Description of makemovie + + + + + + + + + + +

makemovie +

+ +

PURPOSE ^

+
[3D] Used to convert a stack of T images into a movie.
+ +

SYNOPSIS ^

+
function M = makemovie( IS )
+ +

DESCRIPTION ^

+
 [3D] Used to convert a stack of T images into a movie.  
+
+ To display same data statically use montage.
+
+ INPUTS
+   IS              - MxNxT or MxNx1xT or MxNx3xT array of movies.
+
+ OUTPUTS
+   M               - resulting movie
+
+ EXAMPLE
+   load( 'images.mat' );
+   M = makemovie( videos(:,:,:,1) );
+   movie( M );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MONTAGE2, MAKEMOVIES, PLAYMOVIE, CELL2ARRAY, FEVAL_ARRAYS, IMMOVIE, MOVIE2AVI
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/makemovies.html b/doc/images/makemovies.html new file mode 100644 index 00000000..d081cc02 --- /dev/null +++ b/doc/images/makemovies.html @@ -0,0 +1,63 @@ + + + + Description of makemovies + + + + + + + + + + +

makemovies +

+ +

PURPOSE ^

+
[4D] Used to convert R sets of equal length videos into a single movie.
+ +

SYNOPSIS ^

+
function M = makemovies( IS, montage2params )
+ +

DESCRIPTION ^

+
 [4D] Used to convert R sets of equal length videos into a single movie. 
+
+ To display same data statically use montages.
+ Works by calling montage2 once per frame.
+
+ INPUTS
+   IS              - MxNxTxR or MxNx1xTxR or MxNx3xTxR array, or cell array where each
+                     element is an MxNxT or MxNx1xT or MxNx3xT array
+   montage2params  - [optional] params for montage2 -- ex: {showlines, extrainfo}
+
+ OUTPUTS
+   M               - resulting movie
+
+ EXAMPLE
+   load( 'images.mat' );
+   M = makemovies( videos );
+   movie( M );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MONTAGES, MONTAGE2, MAKEMOVIE, MAKEMOVIESETS, PLAYMOVIES
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • montage2 [3D] Used to display a stack of T images.
  • cell2array Converts a cell array into a regular array.
  • figureresized Creates a figures that takes up certain area of screen.
+This function is called by: +
    +
  • pca_visualize Visualization of quality of approximation of X given principal components.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/makemoviesets.html b/doc/images/makemoviesets.html new file mode 100644 index 00000000..4337b04c --- /dev/null +++ b/doc/images/makemoviesets.html @@ -0,0 +1,64 @@ + + + + Description of makemoviesets + + + + + + + + + + +

makemoviesets +

+ +

PURPOSE ^

+
[5D] Used to convert S sets of R videos into a movie.
+ +

SYNOPSIS ^

+
function M = makemoviesets( IS, montagesparams )
+ +

DESCRIPTION ^

+
 [5D] Used to convert S sets of R videos into a movie.
+
+ Each group of videos is shown in a subplot. 
+ Works by calling montages once per frame.
+
+ INPUTS
+   IS              - MxNxTxRxS or MxNx1xTxRxS or MxNx3xTxRxS array, or cell array where
+                     each element is an MxNxTxR or MxNx1xTxR or MxNx3xTxR array
+   montagesparams  - [optional] cell array of params for montages
+
+ OUTPUTS
+   M               - resulting movie
+
+ EXAMPLE
+   load( 'images.mat' );
+   videoclusters = clustermontage( videos, IDXv, 9, 1 );
+   M = makemoviesets( videoclusters );
+   movie( M );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MAKEMOVIE, MAKEMOVIESETS2, CLUSTERMONTAGE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • montages [4D] Used to display R sets of T images each.
  • c clc
  • figureresized Creates a figures that takes up certain area of screen.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/makemoviesets2.html b/doc/images/makemoviesets2.html new file mode 100644 index 00000000..c0aba8ba --- /dev/null +++ b/doc/images/makemoviesets2.html @@ -0,0 +1,66 @@ + + + + Description of makemoviesets2 + + + + + + + + + + +

makemoviesets2 +

+ +

PURPOSE ^

+
[5D] Used to convert S sets of R videos into a movie.
+ +

SYNOPSIS ^

+
function M = makemoviesets2( IS, montagesparams )
+ +

DESCRIPTION ^

+
 [5D] Used to convert S sets of R videos into a movie.
+
+ Displays one set per row.  Each of the S sets is flattened to a single long image by
+ concatenating the T images in the set.
+
+ Alternative to makemoviesets.
+ Works by calling montages2 once per frame.
+
+ INPUTS
+   IS              - MxNxTxRxS or MxNx1xTxRxS or MxNx3xTxRxS array
+   montagesparams  - [optional] cell array of params for montages2
+
+ OUTPUTS
+   M               - resulting movie
+
+ EXAMPLE
+   load( 'images.mat' );
+   videoclusters = clustermontage( videos, IDXv, 9, 1 );
+   M = makemoviesets2( videoclusters );
+   movie( M );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MAKEMOVIE, MAKEMOVIESETS, CLUSTERMONTAGE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • montages2 MONTAGES2 [4D] Used to display R sets of T images each.
  • figureresized Creates a figures that takes up certain area of screen.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/mask_circle.html b/doc/images/mask_circle.html new file mode 100644 index 00000000..38a607bf --- /dev/null +++ b/doc/images/mask_circle.html @@ -0,0 +1,72 @@ + + + + Description of mask_circle + + + + + + + + + + +

mask_circle +

+ +

PURPOSE ^

+
Creates an image of a 'pie slice' of a circle.
+ +

SYNOPSIS ^

+
function mask = mask_circle( angle_start, angle_size, r, nsamples )
+ +

DESCRIPTION ^

+
 Creates an image of a 'pie slice' of a circle.
+
+ Creates a 2D array of size (2rx2r) with values between 0 and 1.  Specifically, mask has
+ values 1 inside the pie slice of the circle defined by angle_start and angle_size.  For
+ example, using angle_start=-pi/4 and angle_size=pi/2 would give a quarter circle facing
+ right.  nsample conrols the accuracty of the circle at its boundaries.  That is if
+ nsamples>1, pixels at the boundary which will have fractions values (when a pixel should
+ be say half inside the circle and half outside of the circle).  Note that running time
+ is O(nsamples^2*radius^2), so don't use a value that is too high for either.  A series
+ of masks whose angles together go from 0-2pi will sum exactly to form a radius r circle.
+ r may be either an integer, or an integer + .5.  A pixel is considered to belong to the
+ circle iff it is within the given angle and has a value strictly smaller then r.
+ 
+ INPUTS
+   angle_start       - start position of circle
+   angle_size        - number of radians to continue circle for
+   r                 - mask radius (integer or integer+.5)
+   nsamples          - [optional] controls sampling accuracy [1 by default]
+
+ OUTPUTS
+   mask      - the created image, size 2r by 2r
+
+ EXAMPLE
+   mask1 = mask_circle( -pi/8, pi/4, 20, 20 ); figure(1); im(mask1); 
+   mask2 = mask_circle( pi/8, pi/8, 20, 20 );  figure(2); im(mask2); 
+   figure(3); im(mask1+mask2);
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MASK_ELLIPSE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • localsum Fast routine for box filtering.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/mask_ellipse.html b/doc/images/mask_ellipse.html new file mode 100644 index 00000000..39bb8640 --- /dev/null +++ b/doc/images/mask_ellipse.html @@ -0,0 +1,82 @@ + + + + Description of mask_ellipse + + + + + + + + + + +

mask_ellipse +

+ +

PURPOSE ^

+
Creates a binary image of an ellipse.
+ +

SYNOPSIS ^

+
function mask = mask_ellipse( mrows, ncols, varargin )
+ +

DESCRIPTION ^

+
 Creates a binary image of an ellipse.
+
+ Creats a binary image of size (mrows x ncols), with all pixels off except inside of the
+ specified ellipse.  The ellipse is given by 5 parameters,  a semimajor axis of ra, a
+ semminor axis of radius rb, angle phi (in radians), centered at (crow,ccol).
+
+ An alternative method of specifying the ellipse parameters is in terms of the parameters
+ of a 2d gaussian.  For more information on how a gaussian relates to an ellipse see
+ gauss2ellipse.
+ 
+ USAGE
+   mask = mask_ellipse( mrows, ncols, crow, ccol, ra, rb, phi )
+   mask = mask_ellipse( mrows, ncols, mu, C, d )
+
+ INPUTS
+   % version 1
+   mrows   - number of rows in mask
+   ncols   - number of columns in mask
+   crow    - the row location of the center of the ellipse
+   ccol    - the column location of the center of the ellipse
+   ra      - semi-major axis length (in pixels) of the ellipse
+   rb      - semi-minor axis length (in pixels) of the ellipse
+   phi     - rotation angle (in radians) of the semimajor axis from the x-axis
+   % version 2
+   mrows   - number of rows in mask
+   ncols   - number of columns in mask
+   mu      - 1x2 vector representing the center of the ellipse
+   C       - 2x2 cov matrix
+   d       - [optional] Number of std to create the ellipse to (2 is default)
+
+ OUTPUTS
+   mask    - created image mask
+
+ EXAMPLE
+   mask = mask_ellipse(  200, 200, 40, 100,  20, 15, pi/4 );
+   figure(1); im(mask); [mu,C] = imageMLG( mask, 0, 2 );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also PLOT_ELLIPSE, GAUSS2ELLIPSE, MASK_CIRCLE, MASK_GAUSSIANS, IMAGEMLG
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • gauss2ellipse Creates an ellipse representing the 2D Gaussian distribution.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/mask_gaussians.html b/doc/images/mask_gaussians.html new file mode 100644 index 00000000..58e81d1c --- /dev/null +++ b/doc/images/mask_gaussians.html @@ -0,0 +1,87 @@ + + + + Description of mask_gaussians + + + + + + + + + + +

mask_gaussians +

+ +

PURPOSE ^

+
Divides a volume into softly overlapping gaussian windows.
+ +

SYNOPSIS ^

+
function [masks,keeplocs] = mask_gaussians( siz, M, windowwidth, offset, show )
+ +

DESCRIPTION ^

+
 Divides a volume into softly overlapping gaussian windows.
+
+ Return M^nd masks each of size siz.  Each mask represents a symmetric gaussian window
+ centered at a different location.  The locations are evenly spaced throughout the array
+ of size siz.  For example, if M=2, then along each dimension d the location of each mask
+ is either 1/4 or 3/4 of siz(d) and likewise if M=3 that mask is at 1/6,3/6, or 5/6 of
+ siz(d). For higher M the locations are: 1/2M,3/2M,...,M-1/2M. 
+
+ See examples below to visualize the masks.
+
+ The std of each gaussian is set to be equal to the spacing between two adjacent masks
+ multiplied by windowwidth.  Reducing the widths of the gaussians causes there to be less
+ overlap between masks, but if the width is reduced too far certain pixels in between
+ masks receive very little weight.  A desired property of the masks is that their
+ coverage (the total weight placed on the pixel by all the masks) is approximately
+ constant.  Typically, we settle for having the coverage be monotonically decreasing as
+ we move away from the center.  (In reality the coverage oscilates as we move past peaks,
+ it's just that the oscillations tend to be tiny).  The default value of windowidth is
+ .6, which minimizes overlap while still providing good overall coverage. Values lower
+ tend to produce noticeable oscillations in coverage.
+
+ offset (in [-1,1]) controls the spacing of the locations.  Essentially, a positive
+ offset moves the locations away from the center of the array and a negative offset moves
+ the windows away from the center.  Using a positive offset gives better coverage to
+ areas near the borders.
+
+ INPUTS
+   siz         - dimensions of each mask
+   M           - # of mask locations along each dimension [either scalar or vector]
+   windowwidth - [optional] see above - default: .6
+   offset      - [optional] see above - default: .1
+   show        - [optional] figure to use for display (no display if == 0) (nd<=3)
+
+ OUTPUTS
+   masks       - [see above] array of size [siz x M^nd]
+   keeplocs    - logical array of all location where masks is (almost) nonzero
+
+ EXAMPLE
+   masks = mask_gaussians( 100, 10, .6, -.1, 1 );  %1D
+   masks = mask_gaussians( [35 35], 3, .6, .1, 1 );  %2D
+   masks = mask_gaussians( [35 35 35], [2 2 4], .6, .1, 1 ); %3D
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also HISTC_SIFT
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • filter_gauss_nD n-dimensional Gaussian filter.
  • im IM [2D] Function for displaying grayscale images.
  • montage2 [3D] Used to display a stack of T images.
  • montages2 MONTAGES2 [4D] Used to display R sets of T images each.
  • c clc
  • checknumericargs Helper utility for checking numeric vector arguments.
  • ind2sub2 Improved version of ind2sub.
  • simplecache A very simply cache that can be used to store results of computations.
+This function is called by: +
    +
  • histc_sift_nD Creates a series of locally position dependent histograms.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/menu.html b/doc/images/menu.html new file mode 100644 index 00000000..11e5412b --- /dev/null +++ b/doc/images/menu.html @@ -0,0 +1,34 @@ + + + + Index for Directory images + + + + + + + + + +
^ Master index ^
+ +

Index for images

+
Contents
+ +

Matlab files in this directory:

+ + +

Other Matlab-specific files in this directory:

+
    +
  • images.mat
  • optflow_data.mat
+

Subsequent directories:

+ + + +
Generated by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/modefilt1.html b/doc/images/modefilt1.html new file mode 100644 index 00000000..bb158339 --- /dev/null +++ b/doc/images/modefilt1.html @@ -0,0 +1,65 @@ + + + + Description of modefilt1 + + + + + + + + + + +

modefilt1 +

+ +

PURPOSE ^

+
One-dimensional mode filtering.
+ +

SYNOPSIS ^

+
function y = modefilt1( x, s )
+ +

DESCRIPTION ^

+
 One-dimensional mode filtering.
+
+ Applies an order 2*r+1 one-dimensional mode filter to vector x.  That is each element of
+ the output y(i) corresponds to the mode of x(i-s/2:i+s/2). At boundary regions, y is
+ calculated on smaller windows, for example y(1) is calculated over x(1:1+s/2).  Note
+ that for this function to make sense x should take on only a number of discrete values.
+
+ INPUTS
+   x   - length n vector 
+   s   - filter size
+
+ OUTPUTS
+   y   - filtered vector x
+ 
+ EXAMPLE
+   x=[0, 1, 0, 0, 0, 3, 0, 1, 3, 1, 2, 2, 0, 1]; s=4;
+   ymedian = medfilt1( x, s );
+   ymode   = modefilt1( x, s );
+   [x; ymedian; ymode]
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MEDFILT1
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/montage2.html b/doc/images/montage2.html new file mode 100644 index 00000000..9dab9fad --- /dev/null +++ b/doc/images/montage2.html @@ -0,0 +1,70 @@ + + + + Description of montage2 + + + + + + + + + + +

montage2 +

+ +

PURPOSE ^

+
[3D] Used to display a stack of T images.
+ +

SYNOPSIS ^

+
function varargout = montage2( IS, showlines, extrainfo, clim, mm, nn, labels )
+ +

DESCRIPTION ^

+
 [3D] Used to display a stack of T images. 
+
+ Improved version of montage, with more control over display.  
+
+ NOTE: Can convert between MxNxT and MxNx3xT image stack via:
+   I = repmat( I, [1,1,1,3] ); I = permute(I, [1,2,4,3] );
+
+ INPUTS
+   IS          - MxNxT or MxNx1xT or MxNx3xT array (of bw or color images)
+   showlines   - [optional] whether to show lines separating the various frames
+   extrainfo   - [optional] if 1 then a colorbar is shown as well as pixval bar
+   clim        - [optional] clim = [clow chigh] optional scaling of data
+   mm          - [optional] #images/row (if [] then calculated)
+   nn          - [optional] #images/col (if [] then calculated)
+   labels      - [optional] cell array of strings specifying labels for each image
+
+ OUTPUTS
+   h           - image handle
+   mm          - #images/row 
+   nn          - #images/col
+
+ EXAMPLE
+   load( 'images.mat' );
+   montage2( images );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MONTAGE, MAKEMOVIE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • democlassify A demo used to test and demonstrate the usage of classifiers (clf_*)
  • pca_randomvector Generate random vectors in PCA subspace.
  • pca_visualize Visualization of quality of approximation of X given principal components.
  • FB_apply_2D Applies each of the filters in the filterbank FB to the image I.
  • FB_reconstruct_2D Use to see how much image information is preserved in filter outputs.
  • FB_visualize_2D Used to visualize the Fourier spectra of a series of 2D filters.
  • filter_DOOG_3D 3D difference of offset Gaussian (DooG) filters.
  • filter_gauss_nD n-dimensional Gaussian filter.
  • imageMLG Calculates maximum likelihood parameters of gaussian that gave rise to image G.
  • makemovies [4D] Used to convert R sets of equal length videos into a single movie.
  • mask_gaussians Divides a volume into softly overlapping gaussian windows.
  • montages [4D] Used to display R sets of T images each.
  • montages2 MONTAGES2 [4D] Used to display R sets of T images each.
  • playmovies [4D] shows R videos simultaneously as a movie.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/montages.html b/doc/images/montages.html new file mode 100644 index 00000000..7524d26e --- /dev/null +++ b/doc/images/montages.html @@ -0,0 +1,65 @@ + + + + Description of montages + + + + + + + + + + +

montages +

+ +

PURPOSE ^

+
[4D] Used to display R sets of T images each.
+ +

SYNOPSIS ^

+
function varargout = montages( IS, montage2params, labels, montage2labels )
+ +

DESCRIPTION ^

+
 [4D] Used to display R sets of T images each.
+
+ Displays one montage (see montage2) per subplot. 
+
+ INPUTS
+   IS               - MxNxTxR or MxNx1xTxR or MxNx3xTxR array, or cell array where each
+                      element is an MxNxT or MxNx1xT or MxNx3xT array
+   montage2params   - [optional] params for montage2 EXCEPT labels; ex: {showlines}
+   lables           - [optional] cell array of strings - titles for subplots
+   montage2labels   - [optional] cell of cells of strings: montage2 lables for subplots
+
+ OUTPUTS
+   mm          - #montages/row 
+   nn          - #montages/col
+
+ EXAMPLE
+   load( 'images.mat' );
+   imageclusters = clustermontage( images, IDXi, 16, 1 );
+   montages( imageclusters );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MONTAGES2, MAKEMOVIES, MONTAGE2, CLUSTERMONTAGE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • montage2 [3D] Used to display a stack of T images.
+This function is called by: +
    +
  • makemoviesets [5D] Used to convert S sets of R videos into a movie.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/montages2.html b/doc/images/montages2.html new file mode 100644 index 00000000..bae5549f --- /dev/null +++ b/doc/images/montages2.html @@ -0,0 +1,66 @@ + + + + Description of montages2 + + + + + + + + + + +

montages2 +

+ +

PURPOSE ^

+
MONTAGES2 [4D] Used to display R sets of T images each.
+ +

SYNOPSIS ^

+
function varargout = montages2( IS, montage2params, padsize )
+ +

DESCRIPTION ^

+
MONTAGES2 [4D] Used to display R sets of T images each.  
+
+ Displays one montage (see montage2) per row.  Each of the R image sets is flattened to
+ a single long image by concatenating the T images in the set.
+ Alternative to montages.
+
+ INPUTS
+   IS                  - MxNxTxR or MxNx1xTxR or MxNx3xTxR array 
+   montage2params      - [optional] params for montage2; ex: {showlines, extrainfo}
+   padsize             - [optional] total amount of vertical or horizontal padding
+
+ OUTPUTS
+   I                   - 3D or 4D array of flattened images, displayed with montage2
+   mm                  - #montages/row
+   nn                  - #montages/col
+
+ EXAMPLE
+   load( 'images.mat' );
+   imageclusters = clustermontage( images, IDXi, 16, 1 );
+   montages2( imageclusters );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MONTAGES, MAKEMOVIES, MONTAGE2, CLUSTERMONTAGE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • montage2 [3D] Used to display a stack of T images.
  • arraycrop2dims Pads or crops I appropriately so that size(IC)==dims.
  • checknumericargs Helper utility for checking numeric vector arguments.
+This function is called by: +
    +
  • makemoviesets2 [5D] Used to convert S sets of R videos into a movie.
  • mask_gaussians Divides a volume into softly overlapping gaussian windows.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/movie2images.html b/doc/images/movie2images.html new file mode 100644 index 00000000..8c24e4e2 --- /dev/null +++ b/doc/images/movie2images.html @@ -0,0 +1,61 @@ + + + + Description of movie2images + + + + + + + + + + +

movie2images +

+ +

PURPOSE ^

+
Creates a stack of images from a matlab movie M.
+ +

SYNOPSIS ^

+
function I = movie2images( M )
+ +

DESCRIPTION ^

+
 Creates a stack of images from a matlab movie M.
+
+ Repeatedly calls frame2im. 
+ Useful for playback with playmovie.
+ 
+ INPUTS
+   M   - a matlab movie
+   
+ OUTPUTS
+   I   - MxNxT array (of images)
+
+ EXAMPLE
+   load( 'images.mat' );
+   M = makemovies( videos );
+   playmovie(movie2images(M));
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also PLAYMOVIE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • feval_arrays Used to apply the same operation to a stack of array elements.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/nonmaxsupr.html b/doc/images/nonmaxsupr.html new file mode 100644 index 00000000..3e999888 --- /dev/null +++ b/doc/images/nonmaxsupr.html @@ -0,0 +1,86 @@ + + + + Description of nonmaxsupr + + + + + + + + + + +

nonmaxsupr +

+ +

PURPOSE ^

+
Applies nonmaximal suppression on an image of arbitrary dimension.
+ +

SYNOPSIS ^

+
function [subs,vals] = nonmaxsupr( I, radii, thresh, maxn )
+ +

DESCRIPTION ^

+
 Applies nonmaximal suppression on an image of arbitrary dimension.
+
+ nonmaxsupr( I, ... ) returns the pixel location and values of local maximums - that is a
+ location is returned only if it has a value greater then or equal to all pixels in the
+ surrounding window of size radii. I can be smoothed first to make method more robust.
+ The first output is an array of the subscript locations of maximal values in I and the
+ second output contains the corresponding maximal values.  One can convert subs/vals back
+ to an array representation using imsubs2array. Note that values are suppressed iff there
+ are strictly greater values in the neighborhood.  Hences nonmaxsupr(ones(10),5) would
+ not suppress any values.
+
+ INPUTS 
+   I       - matrix to apply nonmaxsupr to
+   radii   - suppression window dimensions 
+   thresh  - [optional] minimum value below which not to look for maxes
+   maxn:   - [optional] return at most maxn of the largest vals 
+
+ OUTPUTS
+   subs    - subscripts of non-suppressed point locations (n x d) 
+   vals    - values at non-suppressed point locations (n x 1)
+
+ EXAMPLE
+   % example 1
+   G = filter_gauss_nD( [25 25], [13,13], 3*eye(2), 1 );
+   siz=[11 11]; G = filter_gauss_nD( siz, (siz+1)/2, eye(2), 1 ); 
+   [subs,vals] = nonmaxsupr( G, 1, eps );
+   figure(2); im( imsubs2array( subs, vals, siz ) );
+   [subs,vals] = nonmaxsupr_list( ind2sub2(siz,(1:prod(siz))'), G(:)',1 );
+   figure(3); im( imsubs2array( subs, vals, siz ) );
+   % example 2
+   siz=[30 30]; I=ones(siz); I(22,23)=I(22,23)+3;  
+   I(12,23)=I(12,23)+5; I(7,1)=I(7,1)-.5; figure(1); im(I); 
+   r=3; supr_eq = 1; maxn=[]; thresh=eps; 
+   [subs,vals] = nonmaxsupr(I,r,thresh,maxn); 
+   figure(2); im( imsubs2array( subs, vals, siz ) ); 
+   [subs,vals] = nonmaxsupr_window(subs,vals,[1 1]+6,siz-6);
+   figure(3); im( imsubs2array( subs, vals, siz ) ); 
+   [subs2,vals2] = nonmaxsupr_list( ind2sub2(siz,(1:prod(siz))'), ...
+                                            I(:)',r,thresh,maxn,supr_eq );
+   figure(4); im( imsubs2array( subs2, vals2, siz ) );
+
+ DATESTAMP
+   05-May-2006  2:00pm
+
+ See also IMSUBS2ARRAY, NONMAXSUPR_LIST, NONMAXSUPR_WINDOW
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • nlfilt_sep Efficient multidimensional nonlinear but seperable filtering operation.
  • ind2sub2 Improved version of ind2sub.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/nonmaxsupr_list.html b/doc/images/nonmaxsupr_list.html new file mode 100644 index 00000000..84c37c6b --- /dev/null +++ b/doc/images/nonmaxsupr_list.html @@ -0,0 +1,71 @@ + + + + Description of nonmaxsupr_list + + + + + + + + + + +

nonmaxsupr_list +

+ +

PURPOSE ^

+
Applies nonmaximal suppression to a list.
+ +

SYNOPSIS ^

+
function [subs,vals,keeplocs] = nonmaxsupr_list( subs, vals, radii, thresh, maxn, supr_eq)
+ +

DESCRIPTION ^

+
 Applies nonmaximal suppression to a list.
+
+ See nonmaxsupr for more information.  Has the same effect as nonmaxsupr except it
+ operates on a list of position/values pairs.  Running time is n^2 in the number of such
+ pairs.  For comparison running time of nonmaxsupr is order( sum( size(I,d)*radii(d) ).
+ 
+ This function has an additional parameter - supr_eq that causes a value in a given
+ window to be suppressed unless it is the UNIQUE maximum in the window.  This is if
+ supr_eq==1, then all locations that are not strictly the biggest in their window are
+ suppressed.  This can be useful for large flat regions -- nonmaxsupr(ones(30),3) does no
+ suppression since all values are equal in each window, but nonmaxsupr_list(ones(30),3)
+ suppresses all locations. 
+ 
+ INPUTS
+   subs    - subscripts of point locations (m x d) 
+   vals    - values at point locations (m x 1)
+   radii   - suppression window dimensions 
+   thresh  - [optional] minimum value below which not to look for (or [])
+   maxn:   - [optional] return at most maxn of the largest vals 
+   supr_eq - [optional] suppress equal vals (see above)
+
+ OUTPUTS
+   subs        - subscripts of non-suppressed point locations (n x d) 
+   vals        - values at non-suppressed point locations (n x 1)
+   keeplocs    - indicies of kept locations from subs (n x 1)
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also IMSUBS2ARRAY, NONMAXSUPR, NONMAXSUPR_WINDOW
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/nonmaxsupr_window.html b/doc/images/nonmaxsupr_window.html new file mode 100644 index 00000000..898ce288 --- /dev/null +++ b/doc/images/nonmaxsupr_window.html @@ -0,0 +1,65 @@ + + + + Description of nonmaxsupr_window + + + + + + + + + + +

nonmaxsupr_window +

+ +

PURPOSE ^

+
Nonmaximal suppression of values outside of a given window.
+ +

SYNOPSIS ^

+
function [subs,vals,keeplocs] = nonmaxsupr_window( subs, vals,start_locs, end_locs, thresh, maxn )
+ +

DESCRIPTION ^

+
 Nonmaximal suppression of values outside of a given window.
+
+ Suppresses all location in subs that do not fall in given range (defined by start_locs
+ and end_locs).  For example, if subs are 3D coordinates of maxes over an array of size
+ siz,  "nonmaxsupr_window( subs, vals, [1,1,1]+10, siz-10 )" suppreses all locations
+ within 10 pixels of the border of I.
+
+ INPUTS
+   subs        - subscripts of point locations (m x d) 
+   vals        - values at point locations (m x 1)
+   start_locs  - locations at which to start cropping along each dim
+   end_locs    - locations at which to end cropping along each dim
+   thresh      - [optional] minimum value below which not to look fo
+   maxn        - [optional] return at most maxn of the largest vals 
+
+ OUTPUTS
+   subs        - subscripts of non-suppressed point locations (n x d) 
+   vals        - values at non-suppressed point locations (n x 1)
+   keeplocs    - indicies of kept locations from subs (n x 1)
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also IMSUBS2ARRAY, NONMAXSUPR, NONMAXSUPR_LIST
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/normxcorrn.html b/doc/images/normxcorrn.html new file mode 100644 index 00000000..2854a6df --- /dev/null +++ b/doc/images/normxcorrn.html @@ -0,0 +1,73 @@ + + + + Description of normxcorrn + + + + + + + + + + +

normxcorrn +

+ +

PURPOSE ^

+
Normalized n-dimensional cross-correlation.
+ +

SYNOPSIS ^

+
function C = normxcorrn( T, A, shape )
+ +

DESCRIPTION ^

+
 Normalized n-dimensional cross-correlation.
+
+ For 2 dimensional inputs this function is exactly the same as normxcorr2, but also works
+ in higher dimensions.   For more information see help on normxcorr2.m.  Also see Forsyth
+ & Ponce 11.3.1 (p241).
+
+ INPUTS:
+   T           - template to correlate to each window in A, must be smaller than A
+   A           - matrix to correlate T to
+   shape       - [optional] 'valid', 'full', or 'same', see convn_fast help
+
+ OUTPUTS
+   C           - correlation matrix
+
+ EXAMPLE
+   T = filter_gauss_nD( [21 21], [], [], 0 )*100;  A = rand(100); 
+   C1=normxcorrn(T,A);  C2=normxcorr2(T,A);  C3=xcorr2(A,T);
+   C4=xcorrn(A,T); C4r = rot90( xcorrn(T,A),2 );
+   C5=xeucn(A,T);  C5r = rot90( xeucn(T,A), 2 );
+   show=1;
+   figure(show); show=show+1; im(C1);   title('normxcorrn');
+   figure(show); show=show+1; im(C2);   title('normxcorr2');
+   figure(show); show=show+1; im(C3);   title('xcorr2');
+   figure(show); show=show+1; im(C4);   title('xcorrn');
+   figure(show); show=show+1; im(C4r);  title('xcorrn rev&rot');
+   figure(show); show=show+1; im(-C5);  title('xeucn');
+   figure(show); show=show+1; im(-C5r); title('xeucn rev&rot');
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also NORMXCORRN_FG, XEUCN, XCORRN
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • convn_fast Fast convolution, replacement for both conv2 and convn.
  • localsum Fast routine for box filtering.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/normxcorrn_fg.html b/doc/images/normxcorrn_fg.html new file mode 100644 index 00000000..d3214700 --- /dev/null +++ b/doc/images/normxcorrn_fg.html @@ -0,0 +1,72 @@ + + + + Description of normxcorrn_fg + + + + + + + + + + +

normxcorrn_fg +

+ +

PURPOSE ^

+
Normalized n-dimensional cross-correlation with a mask.
+ +

SYNOPSIS ^

+
function C = normxcorrn_fg( T, T_fg, A, shape )
+ +

DESCRIPTION ^

+
 Normalized n-dimensional cross-correlation with a mask.
+
+ Similar to normxcorrn, except takes an additional argument that specifies a figure
+ ground mask for the T.  That is T_fg must be of the same dimensions as T, with each
+ entry being 0 or 1, where zero specifies regions to ignore (the ground) and 1 specifies
+ interesting regions (the figure).  Essentially T_fg specifies regions in T that are
+ interesting and should be taken into account when doing normalized cross correlation.
+ This allows for templates of arbitrary shape, and not just squares.  
+
+ Note: this function is approximately 3 times slower then normxcorr2 because it cannot
+ use the trick of precomputing sums.
+
+ INPUTS
+   T    - template to correlate to each window in A
+   T_fg - figure/ground mask for the template
+   A           - matrix to correlate template to
+   shape       - [optional] 'valid', 'full', or 'same', see convn_fast help
+
+ OUTPUTS
+   C           - correlation matrix
+
+ EXAMPLE
+   A=rand(50);  B=rand(11);  Bfg=ones(11);
+   C1=normxcorrn_fg(B,Bfg,A);  C2=normxcorr2(B,A);     
+   figure(1); im(C1); figure(2); im(C2); 
+   figure(3); im(abs(C1-C2));
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also NORMXCORRN
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • convn_fast Fast convolution, replacement for both conv2 and convn.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/optflow_corr.html b/doc/images/optflow_corr.html new file mode 100644 index 00000000..6482783b --- /dev/null +++ b/doc/images/optflow_corr.html @@ -0,0 +1,72 @@ + + + + Description of optflow_corr + + + + + + + + + + +

optflow_corr +

+ +

PURPOSE ^

+
Calculate optical flow using cross-correlation.
+ +

SYNOPSIS ^

+
function [Vx,Vy,reliab] = optflow_corr( I1, I2, patch_r, search_r, sigma, thr, show )
+ +

DESCRIPTION ^

+
 Calculate optical flow using cross-correlation.
+ 
+ Calculate optical flow using correlation, followed by lucas & kanade on
+ aligned squares for subpixel accuracy.  Locally, the closest patch within
+ some search radius is found.  The distance measure used is the euclidean
+ distance between patches -- NOT normalized correlation since we assume
+ pixel brightness constancy.  Once the closest matching patch is found,
+ the alignment between the two patches is further refined using lucas &
+ kanade to find the subpixel translation vector relating the two patches.
+
+ This code has been refined for speed, but since it is nonvectorized code
+ it can be fairly slow.  Running time is linear in the number of pixels
+ but the constant is fairly large.  Test on small image (150x150) before
+ running on anything bigger.
+
+ INPUTS
+   I1, I2      - input images to calculate flow between
+   patch_r     - determines correlation patch size around each pixel
+   search_r    - search radius for corresponding patch
+   sigma       - [optional] amount to smooth by (may be 0)
+   thr         - [optional] RELATIVE reliability threshold (.01 by default)
+   show        - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   Vx, Vy  - x,y components of optical flow [Vx>0 -> flow is right, Vy>0 -> flow is down]
+   reliab  - reliability of optical flow in given window (cornerness of window)  
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also OPTFLOW_HORN, OPTFLOW_LUCASKANADE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • gauss_smooth Applies Gaussian smoothing to a (multidimensional) image.
  • im IM [2D] Function for displaying grayscale images.
  • localsum Fast routine for box filtering.
  • arraycrop2dims Pads or crops I appropriately so that size(IC)==dims.
  • c clc
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/optflow_horn.html b/doc/images/optflow_horn.html new file mode 100644 index 00000000..760e8cda --- /dev/null +++ b/doc/images/optflow_horn.html @@ -0,0 +1,55 @@ + + + + Description of optflow_horn + + + + + + + + + + +

optflow_horn +

+ +

PURPOSE ^

+
Calculate optical flow using Horn & Schunck.
+ +

SYNOPSIS ^

+
function [Vx,Vy] = optflow_horn( I1, I2, sigma, show )
+ +

DESCRIPTION ^

+
 Calculate optical flow using Horn & Schunck.
+
+ INPUTS
+   I1, I2      - input images to calculate flow between
+   sigma       - [optional] amount to smooth by (may be 0)
+   show        - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   Vx, Vy  - x,y components of optical flow [Vx>0 -> flow is right, Vy>0 -> flow is down]
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also OPTFLOW_CORR, OPTFLOW_LUCASKANADE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • gauss_smooth Applies Gaussian smoothing to a (multidimensional) image.
  • im IM [2D] Function for displaying grayscale images.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/optflow_lucaskanade.html b/doc/images/optflow_lucaskanade.html new file mode 100644 index 00000000..4a03ead9 --- /dev/null +++ b/doc/images/optflow_lucaskanade.html @@ -0,0 +1,76 @@ + + + + Description of optflow_lucaskanade + + + + + + + + + + +

optflow_lucaskanade +

+ +

PURPOSE ^

+
Calculate optical flow using Lucas & Kanade. Fast, parallel code.
+ +

SYNOPSIS ^

+
function [Vx,Vy,reliab]=optflow_lucaskanade( I1, I2, win_n, win_sig, sigma, thr, show )
+ +

DESCRIPTION ^

+
 Calculate optical flow using Lucas & Kanade.  Fast, parallel code.
+
+ Note that the window of integration can either be a hard square window of radius win_n
+ or it can be a soft 'gaussian' window with sigma win_sig.  In general the soft window
+ should be more accurate.
+
+ INPUTS
+   I1, I2  - input images to calculate flow between
+   win_n   - window radius for hard window (should be [] if win_sig is provided)
+   win_sig - [optional] sigma for soft 'gauss' window (should be [] if win_n is provided)
+   sigma   - [optional] amount to smooth by (may be 0)
+   thr     - [optional] ABSOLUTE reliability threshold (min eigenvalue), [default: 3e-6]
+   show    - [optional] figure to use for display (no display if == 0)
+
+ OUTPUTS
+   Vx, Vy  - x,y components of optical flow [Vx>0 -> flow is right, Vy>0 -> flow is down]
+   reliab  - reliability of optical flow in given window (cornerness of window)  
+
+ EXAMPLE
+   % create square + translated square (B) + rotated square (C)
+   A=zeros(50,50); A(16:35,16:35)=1;
+   B=zeros(50,50); B(17:36,17:36)=1;
+   C=imrotate(A,5,'bil','crop'); 
+   optflow_lucaskanade( A, B, [], 2, 2, 3e-6, 1 );
+   optflow_lucaskanade( A, C, [], 2, 2, 3e-6, 4 );
+   % compare on stored real images (of mice)
+   load optflow_data;
+   [Vx,Vy,reliab] = optflow_lucaskanade( I5A, I5B, [], 4, 1.2, 3e-6, 1 );
+   [Vx,Vy,reliab] = optflow_corr( I5A, I5B, 3, 5, 1.2, .01, 2 );
+   [Vx,Vy] = optflow_horn( I5A, I5B, 2, 3 );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also OPTFLOW_HORN, OPTFLOW_CORR
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • gauss_smooth Applies Gaussian smoothing to a (multidimensional) image.
  • im IM [2D] Function for displaying grayscale images.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/playmovie.html b/doc/images/playmovie.html new file mode 100644 index 00000000..af0bef64 --- /dev/null +++ b/doc/images/playmovie.html @@ -0,0 +1,62 @@ + + + + Description of playmovie + + + + + + + + + + +

playmovie +

+ +

PURPOSE ^

+
[3D] shows the image sequence I as a movie.
+ +

SYNOPSIS ^

+
function playmovie( I, fps, loop )
+ +

DESCRIPTION ^

+
 [3D] shows the image sequence I as a movie.
+
+ To play a matlab movie file, as an alternative to movie, use:
+   playmovie(movie2images(M));
+
+ INPUTS
+   I       - MxNxT or MxNx1xT or MxNx3xT array (of images)
+   fps     - [optional] maximum number of frames to display per second
+             use fps==0 to introduce no pause and have the movie play as fast as possible
+   loop    - [optional] number of time to loop video (may be inf),
+             if neg plays video forward then backward then forward etc.
+
+ EXAMPLE
+   load( 'images.mat' );
+   playmovie( videos(:,:,:,1) );
+   playmovie( video(:,:,1:3), [], -50 );
+
+ DATESTAMP
+   5-May-2006  11:10pm
+
+ See also MONTAGE2, PLAYMOVIES, MAKEMOVIE, MOVIE2IMAGES, MOVIE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/playmovies.html b/doc/images/playmovies.html new file mode 100644 index 00000000..8bb86fcb --- /dev/null +++ b/doc/images/playmovies.html @@ -0,0 +1,58 @@ + + + + Description of playmovies + + + + + + + + + + +

playmovies +

+ +

PURPOSE ^

+
[4D] shows R videos simultaneously as a movie.
+ +

SYNOPSIS ^

+
function playmovies( I, fps, loop )
+ +

DESCRIPTION ^

+
 [4D] shows R videos simultaneously as a movie.
+
+ INPUTS
+   I       - MxNxTxR or MxNx1xTxR or MxNx3xTxR array
+   fps     - [optional] maximum number of frames to display per second
+             use fps==0 to introduce no pause and have the movie play as fast as possible
+   loop    - [optional] number of time to loop video (may be inf)
+             if neg plays video forward then backward then forward etc.
+
+ EXAMPLE
+   load( 'images.mat' );
+   playmovies( videos );
+
+ DATESTAMP
+   5-May-2006  11:10pm
+
+ See also MONTAGES, PLAYMOVIE, MAKEMOVIES
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • montage2 [3D] Used to display a stack of T images.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/private/menu.html b/doc/images/private/menu.html new file mode 100644 index 00000000..5d044ea7 --- /dev/null +++ b/doc/images/private/menu.html @@ -0,0 +1,30 @@ + + + + Index for Directory images\private + + + + + + + + + +
^ Master index ^
+ +

Index for images\private

+
Contents
+ +

Matlab files in this directory:

+ + + + + + +
Generated by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/private/nlfilt_sep.html b/doc/images/private/nlfilt_sep.html new file mode 100644 index 00000000..22ea024c --- /dev/null +++ b/doc/images/private/nlfilt_sep.html @@ -0,0 +1,75 @@ + + + + Description of nlfilt_sep + + + + + + + + + + +

nlfilt_sep +

+ +

PURPOSE ^

+
Efficient multidimensional nonlinear but seperable filtering operation.
+ +

SYNOPSIS ^

+
function I = nlfilt_sep( I, dims, shape, fun, varargin )
+ +

DESCRIPTION ^

+
 Efficient multidimensional nonlinear but seperable filtering operation.
+
+ The concept of a nonlinear seperable filter is not very common, but nevertheless can
+ prove very useful since computation time can be reduced greatly.  Consider a funciton
+ like max that is applied to a 2 dimensional window.  max could also be applied to each
+ row of the window, then to the resulting column, insead of being applied to the entire
+ window simultaneously.  This is what is meant here by a seperable nonlinear filter.   
+
+ The function fun must be able to take an input of the form
+ C=fun(I,radius,param1,...paramk).  The return C must have the same size as I, and each
+ element of C must be the result of applying the nlfilt operation to the local column (of
+ size 2r+1) of A.  
+
+ For example:
+   % COMPUTES LOCAL SUMS:
+   C = nlfilt_sep( I, dims, shape, @rnlfilt_sum );
+
+   % COMPUTES LOCAL MAXES:
+   C = nlfilt_sep( I, dims, shape, @rnlfilt_max ); 
+
+ INPUTS
+   I       - matrix to compute fun over
+   dims    - size of volume to compute fun over 
+   shape   - 'valid', 'full', or 'same', see conv2 help
+   fun     - nonlinear filter 
+   params  - optional parameters for nonlinear filter
+
+ OUTPUTS
+   I      - resulting image
+
+ DATESTAMP
+   26-Jan-2006  2:00pm
+
+ See also NLFILTBLOCK_SEP, RNLFILT_SUM, RNLFILT_MAX
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • localsum Fast routine for box filtering.
  • nonmaxsupr Applies nonmaximal suppression on an image of arbitrary dimension.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/private/nlfiltblock_sep.html b/doc/images/private/nlfiltblock_sep.html new file mode 100644 index 00000000..b925741e --- /dev/null +++ b/doc/images/private/nlfiltblock_sep.html @@ -0,0 +1,70 @@ + + + + Description of nlfiltblock_sep + + + + + + + + + + +

nlfiltblock_sep +

+ +

PURPOSE ^

+
Efficient multidimensional nonlinear but seperable filtering operation.
+ +

SYNOPSIS ^

+
function I = nlfiltblock_sep( I, dims, fun, varargin )
+ +

DESCRIPTION ^

+
 Efficient multidimensional nonlinear but seperable filtering operation.
+
+ See nlfilt_sep for a basic discussion of the he concept of a nonlinear
+ seperable filters.  This is similar, instead applies operations to
+ nonoveralpping blocks (versus a sliding window approach in which all
+ overlapping blocks are considered).  Also, as opposed to nlfilt_sep, the
+ output returned by this function is smaller then the input I.
+
+ The function fun must be able to take an input of the form
+ C=fun(I,radius,param1,...paramk).  The return C must be the result of
+ applying the nlfilt operation to the local column (of size 2r+1) of A.  
+
+ For example:
+   % COMPUTES LOCAL BLOCK SUMS (see localsum_block):
+   I = nlfiltblock_sep( I, dims, @rnlfiltblock_sum );
+
+ INPUTS
+   I       - matrix to compute fun over
+   dims    - size of volume to compute fun over 
+   fun     - nonlinear filter 
+   params  - optional parameters for nonlinear filter
+
+ OUTPUTS
+   I      - resulting image
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ 
+ See also NLFILT_SEP, RNLFILTBLOCK_SUM
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • localsum_block Calculates the sum in non-overlapping blocks of I of size dims.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/texture_map.html b/doc/images/texture_map.html new file mode 100644 index 00000000..bb3d8fea --- /dev/null +++ b/doc/images/texture_map.html @@ -0,0 +1,73 @@ + + + + Description of texture_map + + + + + + + + + + +

texture_map +

+ +

PURPOSE ^

+
Maps texture in I according to row_dest and col_dest.
+ +

SYNOPSIS ^

+
function IR = texture_map( I, row_dest, col_dest, bbox )
+ +

DESCRIPTION ^

+
 Maps texture in I according to row_dest and col_dest.
+
+ I has (nrows*ncols) coordinates.  Each coordinate has an associated intensity value.  A
+ transformation on I can be defined by giving the destination (r',c') of the intensity
+ associated with coordinate (r,c) in I -- ie I(r,c).  Applying the transformation, we ask
+ what intensity is associated with a coordinate (r0',c0') by interpolating between the 
+ intensities at the closest coordinates (r',c').  In the function below specify the
+ destination of (r,c) by (row_dest(r,c), col_dest(r,c)).
+
+ If the inverse mapping is also available -- ie if we can go from the coordinates in the
+ destination to the coordinates in the source, then a much more efficient procedure can
+ be used to texture_map that involves interp2 instead of griddata.  See apply_homography
+ for example usage in this case.
+
+ The bounding box of the image is set by the BBOX argument, a string that can be 'loose'
+ (default) or 'crop'. When BBOX is 'loose', IR includes the whole transformed image,
+ which generally is larger than I. When BBOX is 'crop' IR is cropped to include only the
+ central portion of the transformed image and is the same size as I. 
+
+ INPUTS
+   I           - 2D input image
+   row_dest    - row_dest(i,j) is row loc where I(i,j) gets mapped to
+   col_dest    - col_dest(i,j) is col loc where I(i,j) gets mapped to
+   bbox        - [optional] see above for meaning of bbox ({'loose'},'crop')
+
+ OUTPUTS
+   IR          - result of texture mapping
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also APPLY_HOMOGRAPHY
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/xcorrn.html b/doc/images/xcorrn.html new file mode 100644 index 00000000..76f490b7 --- /dev/null +++ b/doc/images/xcorrn.html @@ -0,0 +1,65 @@ + + + + Description of xcorrn + + + + + + + + + + +

xcorrn +

+ +

PURPOSE ^

+
n-dimensional cross-correlation. Generalized version of xcorr2.
+ +

SYNOPSIS ^

+
function C = xcorrn( A, T, shape )
+ +

DESCRIPTION ^

+
 n-dimensional cross-correlation.  Generalized version of xcorr2.
+
+ For 2 dimensional inputs this function is exactly the same as xcorr2, but also works in
+ higher dimensions.   It can also be more efficient because it performs convolution in
+ either the spatial or frequency domain.   
+
+ The order of parameters is reversed from normxcorrn.  This is to be compatible with the
+ matlab functions normxcorr2 anc xcorr2 which take parameters in different orders.
+
+ For more information see help on xcorr2.m.
+ For example usage see normxcorrn.  
+
+ INPUTS
+   A           - first d-dimensional matrix 
+   T           - second d-dimensional matrix 
+   shape       - [optional] 'valid', 'full', or 'same', see convn_fast help
+
+ OUTPUTS
+   C           - correlation matrix
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ 
+ See also XCORR2, NORMXCORRN, XEUCN
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • convn_fast Fast convolution, replacement for both conv2 and convn.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/images/xeucn.html b/doc/images/xeucn.html new file mode 100644 index 00000000..f10810b5 --- /dev/null +++ b/doc/images/xeucn.html @@ -0,0 +1,65 @@ + + + + Description of xeucn + + + + + + + + + + +

xeucn +

+ +

PURPOSE ^

+
n-dimensional euclidean distance between each window in A and template T.
+ +

SYNOPSIS ^

+
function C = xeucn( A, T, shape )
+ +

DESCRIPTION ^

+
 n-dimensional euclidean distance between each window in A and template T.
+
+ Similar to normxcorrn, except at each point (i,j) calculates the euclidean distance
+ between the T and the window in A surrounding the point, storing the result in C(i,j).
+
+ The order of parameters is reversed from normxcorrn.  This is to be compatible with the
+ matlab functions normxcorr2 anc xcorr2 which take parameters in different orders. Also,
+ note that normxcorrn gives a similarity matrix, whereas xeucn gives a dissimilarity
+ (distance) matrix. 
+
+ For example usage see normxcorrn.  
+
+ INPUTS
+   A           - first d-dimensional matrix 
+   T           - second d-dimensional matrix 
+   shape       - [optional] 'valid', 'full', or 'same', see convn_fast help
+
+ OUTPUTS
+   C           - correlation matrix
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also NORMXCORRN, XEUCN, XCORRN
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • convn_fast Fast convolution, replacement for both conv2 and convn.
  • localsum Fast routine for box filtering.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 00000000..50efd894 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,22 @@ + + + + Piotr's Matlab Toolbox + + + + + + + + + + + + +Sorry, your browser doesn't support frames. +Go to menu.html for the documentation of all +the Matlab functions. + + diff --git a/doc/left.png b/doc/left.png new file mode 100644 index 0000000000000000000000000000000000000000..404df045f40970496c71ca6b8c1f1357af271e27 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^{2}w1qqB3TN5VEvJYV8 a;bDlI$G>{!EB$9cJq(_%elF{r5}E)JMz zQ4WJ342H|%(dbp$Gu5lqySaxtLO>W(rpx%_LnVK(UrGTT5y42B06;|UPU9jm^JJ0Z z`TTUN(6TJ&=lPPn_WX zId~2>0yJfGb3Up-MDlH7S}Vx-I*N`iO3-5Ff$K-Ed9Nepzm`zojRl WMtq7>mNL`;0000 + + + Description of Contents + + + + + + + + + + +

Contents +

+ +

PURPOSE ^

+
MATLAB
+ +

SYNOPSIS ^

+
This is a script file.
+ +

DESCRIPTION ^

+
 MATLAB
+ See also
+
+ Quick clear:
+   c                    - clc
+   cc                   - close all, clc
+   ccc                  - clear, close all, clc, clear global
+
+ Convenient [but no faster] replacement of "for loops":
+   feval_arrays         - Used to apply the same operation to a stack of array elements.
+   feval_images         - Used to apply the same operation to all images in given directory.
+   feval_mats           - Used to apply the same operation to all .mat files in given directory.
+
+ Timing:
+   ticstatus            - Used to display the progress of a long process.
+   tocstatus            - Used to display the progress of a long process.
+
+ Array manipulation:
+   arraycrop2dims       - Pads or crops I appropriately so that size(IC)==dims.
+   arraycrop_full       - Used to crop a rectangular region from an n dimensional array.
+   cell2array           - Converts a cell array into a regular array.
+   mat2cell2            - Break matrix up into a cell array of same sized matrices.
+
+ Display:
+   imlabel              - Improved method for labeling figure axes.
+   plot_ellipse         - Adds an ellipse to the current plot.
+   plot_gaussellipses   - Plots 2D ellipses derived from 2D Gaussians specified by mus & Cs.
+   text2                - Wrapper for text.m that ensures displayed text fits in figure.
+   figureresized        - Creates a figures that takes up certain area of screen.
+
+ Miscellaneous:
+   checknumericargs     - Helper utility for checking numeric vector arguments.
+   gauss2ellipse        - Creates an ellipse representing the 2D Gaussian distribution.
+   getargs              - Utility to process parameter name/value pairs.
+   ind2sub2             - Improved version of ind2sub.
+   int2str2             - Convert integer to string of given length; improved version of int2str.
+   isfield2             - More comprehensive version of isfield.
+   mode                 - Returns the mode of a vector.
+   normpdf2             - Normal prob. density function (pdf) with arbitrary covariance matrix.
+   num2strs             - Applies num2str to each element of an array X.
+   randint2             - Faster but restricted version of randint.
+   randomsample         - Samples elements of X so result uses at most maxmegs megabytes of memory.
+   randperm2            - Returns a random permutation of integers.
+   recover_rotation3D   - Takes a rotation matrix and extracts the rotation angle and axis.
+   rotation_matrix2D    - Returns the matrix: R=[cos(t) -sin(t); sin(t) cos(t)].
+   rotation_matrix3D    - Uses Rodrigues's formula to create a 3x3 rotation matrix R.
+   simplecache          - A very simply cache that can be used to store results of computations.
+   sub2ind2             - Improved version of sub2ind.
+
+ Thin plate splines:
+   tps_getwarp          - Given two sets of corresponding points, calculates warp between them.
+   tps_interpolate      - Apply warp (obtained by tps_getwarp) to a set of new points.
+   tps_interpolateimage - Interpolate I_source according to the warp from I_source->I_dest.
+   tps_random           - Obtain a random warp with the same bending energy as the original.
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/arraycrop2dims.html b/doc/matlab/arraycrop2dims.html new file mode 100644 index 00000000..64dd6296 --- /dev/null +++ b/doc/matlab/arraycrop2dims.html @@ -0,0 +1,65 @@ + + + + Description of arraycrop2dims + + + + + + + + + + +

arraycrop2dims +

+ +

PURPOSE ^

+
Pads or crops I appropriately so that size(IC)==dims.
+ +

SYNOPSIS ^

+
function IC = arraycrop2dims( I, dims, padelement )
+ +

DESCRIPTION ^

+
 Pads or crops I appropriately so that size(IC)==dims.  
+
+ For each dimension d, if size(I,d) is larger then dims(d) then symmetrically crops along
+ d (if cropping amount is odd crops one more unit from the start of the dimension).  If
+ size(I,d) is smaller then dims(d) then symmetrically pads along d with padelement (if
+ padding amount is even then pads one more unit along the start of the dimension).
+
+ INPUTS
+   I             - n dimensional array to crop window from
+                   does not support cell arrays (except for cropping)
+   dims          - dimensions to make I
+   padelement    - [optional] element with which to pad (0 by default)
+
+ OUTPUTS
+   IC            - cropped array
+
+ EXAMPLE
+   I = randn(10);
+   delta=1; IC = arraycrop2dims( I, size(I)-2*delta  );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also ARRAYCROP_FULL, PADARRAY
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • FB_crop Crop a 2D filterbank (adjusting filter norms).
  • FB_reconstruct_2D Use to see how much image information is preserved in filter outputs.
  • apply_homography Applies the homography defined by H on the image I.
  • convn_fast Fast convolution, replacement for both conv2 and convn.
  • jitter_image Creates multiple, slightly jittered versions of an image.
  • montages2 MONTAGES2 [4D] Used to display R sets of T images each.
  • optflow_corr Calculate optical flow using cross-correlation.
  • cell2array Converts a cell array into a regular array.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/arraycrop_full.html b/doc/matlab/arraycrop_full.html new file mode 100644 index 00000000..f5a0efe7 --- /dev/null +++ b/doc/matlab/arraycrop_full.html @@ -0,0 +1,59 @@ + + + + Description of arraycrop_full + + + + + + + + + + +

arraycrop_full +

+ +

PURPOSE ^

+
Used to crop a rectangular region from an n dimensional array.
+ +

SYNOPSIS ^

+
function I = arraycrop_full( I, start_locs, end_locs, padelement )
+ +

DESCRIPTION ^

+
 Used to crop a rectangular region from an n dimensional array.  
+ 
+ Guarantees that the resulting array will have dimensions as specified by rect by filling
+ in locations with padelement if the locations are outside of the image.
+
+ INPUTS
+   I             - n dimensional array to crop window from
+   start_locs    - locations at which to start cropping along each dim
+   end_locs      - locations at which to end cropping along each dim
+   padelement    - [optional] element with which to pad (0 by default)
+
+ OUTPUTS
+   I             - cropped array
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ 
+ See also PADARRAY
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • imshrink Used to shrink a multidimensional array I by integer amount.
  • nlfilt_sep Efficient multidimensional nonlinear but seperable filtering operation.
  • nlfiltblock_sep Efficient multidimensional nonlinear but seperable filtering operation.
  • arraycrop2dims Pads or crops I appropriately so that size(IC)==dims.
  • mat2cell2 Break matrix up into a cell array of same sized matrices.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/c.html b/doc/matlab/c.html new file mode 100644 index 00000000..8f027758 --- /dev/null +++ b/doc/matlab/c.html @@ -0,0 +1,45 @@ + + + + Description of c + + + + + + + + + + +

c +

+ +

PURPOSE ^

+
clc
+ +

SYNOPSIS ^

+
This is a script file.
+ +

DESCRIPTION ^

+
 clc
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/cc.html b/doc/matlab/cc.html new file mode 100644 index 00000000..1f1d061c --- /dev/null +++ b/doc/matlab/cc.html @@ -0,0 +1,45 @@ + + + + Description of cc + + + + + + + + + + +

cc +

+ +

PURPOSE ^

+
close all, clc
+ +

SYNOPSIS ^

+
This is a script file.
+ +

DESCRIPTION ^

+
 close all, clc
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/ccc.html b/doc/matlab/ccc.html new file mode 100644 index 00000000..be90d5be --- /dev/null +++ b/doc/matlab/ccc.html @@ -0,0 +1,45 @@ + + + + Description of ccc + + + + + + + + + + +

ccc +

+ +

PURPOSE ^

+
clear, close all, clc, clear global
+ +

SYNOPSIS ^

+
This is a script file.
+ +

DESCRIPTION ^

+
 clear, close all, clc, clear global
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/cell2array.html b/doc/matlab/cell2array.html new file mode 100644 index 00000000..3ed3f249 --- /dev/null +++ b/doc/matlab/cell2array.html @@ -0,0 +1,64 @@ + + + + Description of cell2array + + + + + + + + + + +

cell2array +

+ +

PURPOSE ^

+
Converts a cell array into a regular array.
+ +

SYNOPSIS ^

+
function Y = cell2array( X, padelement )
+ +

DESCRIPTION ^

+
 Converts a cell array into a regular array. 
+
+ Each element of X must be a regular array, and must have the same number of dimensions
+ k.  Converts X to an array Y of dimension k+1 where Y(:,:...,:,i) is X{i} padded to be
+ as big as the biggest element in X (along each dimension).   
+
+ Specifically, let di1..dik be the k dimensions of element X{i}.  Let dj=max(dij) for
+ each j.  Then each element of X{i} is padded to have size [d1 ... dk], and then the
+ elements of X are stacked into a vector.
+
+ Treats the cell array X as a vector (so ignores the layout of X).
+
+ INPUTS
+   X               - cell array where each element is a regular array with dimension k
+   padelement      - [optional] element with which to pad (0 by default)
+
+ OUTPUTS
+   Y   - resulting array of dimension k+1
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MAT2CELL2
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • arraycrop2dims Pads or crops I appropriately so that size(IC)==dims.
+This function is called by: +
    +
  • makemovies [4D] Used to convert R sets of equal length videos into a single movie.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/checknumericargs.html b/doc/matlab/checknumericargs.html new file mode 100644 index 00000000..7529757b --- /dev/null +++ b/doc/matlab/checknumericargs.html @@ -0,0 +1,77 @@ + + + + Description of checknumericargs + + + + + + + + + + +

checknumericargs +

+ +

PURPOSE ^

+
Helper utility for checking numeric vector arguments.
+ +

SYNOPSIS ^

+
function [x,er] = checknumericargs( x, siz, integerflag, signflag )
+ +

DESCRIPTION ^

+
 Helper utility for checking numeric vector arguments.
+
+ Runs a number of tests on the numeric array x.  Tests to see if x has all integer
+ values, all positive values, and so on, depending on the values for integerflag and
+ signflag. Also tests to see if the size of x matches siz (unless siz==[]).  If x is a
+ scalar, x is converted to a array simply by creating a matrix of size siz with x in each
+ entry.  This is why the function returns x.  siz=M is equivalent to siz=[M M]. 
+
+ If x does not satisfy some criteria, an error message is returned in er. If x satisfied
+ all the criteria er=''.  Note that error('') has no effect, so can always use: "[x,er] =
+ checknumericargs( x, ... ); error(er);", which will throw an error only if something was
+ wrong with x.
+
+ INPUTS
+   x           - numeric array
+   siz         - [if []]: does not test size of x
+               - [if not []]: intended size for x
+   integerflag - [if -1]: no need for integer x
+                 [if  0]: error if non integer x
+                 [if  1]: error if non odd integers
+                 [if  2]: error if non even integers
+   signflag    - [if -2]: entires of x must be strictly negative
+                 [if -1]: entires of x must be negative
+                 [if  0]: no contstraints on sign of entries in x
+                 [if  1]: entires of x must be positive
+                 [if  2]: entires of x must be strictly positive
+
+ OUTPUTS
+   x   - if x was a scalar it may have been replicated into a matrix 
+   er  - contains error msg if anything was wrong with x
+
+ EXAMPLE
+   a=1;  [a,er] = checknumericargs( a, [1 3], 2, 0 ); a, error(er)
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • clf_knn_train Train a k nearest neighbor classifier (memorization).
  • confmatrix Generates a confusion matrix according to true and predicted data labels.
  • meanshiftim Applies the meanshift algorithm to a joint spatial/range image.
  • imshrink Used to shrink a multidimensional array I by integer amount.
  • imsubs_resize Resizes subs in subs/vals image representation by resizevals.
  • mask_gaussians Divides a volume into softly overlapping gaussian windows.
  • montages2 MONTAGES2 [4D] Used to display R sets of T images each.
  • nonmaxsupr_list Applies nonmaximal suppression to a list.
  • nonmaxsupr_window Nonmaximal suppression of values outside of a given window.
  • nlfilt_sep Efficient multidimensional nonlinear but seperable filtering operation.
  • nlfiltblock_sep Efficient multidimensional nonlinear but seperable filtering operation.
  • arraycrop2dims Pads or crops I appropriately so that size(IC)==dims.
  • arraycrop_full Used to crop a rectangular region from an n dimensional array.
  • mat2cell2 Break matrix up into a cell array of same sized matrices.
  • tocstatus Used to display the progress of a long process.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/feval_arrays.html b/doc/matlab/feval_arrays.html new file mode 100644 index 00000000..fd43f1df --- /dev/null +++ b/doc/matlab/feval_arrays.html @@ -0,0 +1,83 @@ + + + + Description of feval_arrays + + + + + + + + + + +

feval_arrays +

+ +

PURPOSE ^

+
Used to apply the same operation to a stack of array elements.
+ +

SYNOPSIS ^

+
function B = feval_arrays( A, fhandle, varargin )
+ +

DESCRIPTION ^

+
 Used to apply the same operation to a stack of array elements.
+
+ The only constraint on the function specified in fhandle is that given two differrent
+ input arrays a1 and a2, if a1 and a2 have the same dimensions then the outputs b1 and b2
+ must have the same dimensions. For long operations shows progress information.
+
+ A can have arbitrary dimension.  Suppose A has size d1 x d2 ... x dn. Then for the
+ purpose of this function A has dn elements, where A(:,:,...,i) is the ith element.  This
+ function then applies the operation in fhandle, with paramters given in varargin, to
+ each element in A. The results are returned in the array B, of size f1 x f2 x ... x fk x
+ dn.  Each of the n element of B of the form B(:,:,...,i) is the the result of applying
+ fhandle to A(:,:,...,i).  A may also be a cell array, see the last example.
+
+ This can be extremely useful.  Suppose A is an MxNxR collection of R MxN images.  Then
+ "B = feval_arrays( A, @imresize, .5 )" resizes each of the R images in A by 1/2.  B has
+ size M/2 x N/2 X R.  As another motivating example, suppose A is an MxNx3xR array of R
+ MxN rgb images.  Then "B = feval_arrays( A, @rgb2gray )" converts each of the R color
+ images to a grayscale image.  B has size M x N x R.
+
+ A limitation of feval_arrays is that it does not pass state information to fhandle.  For
+ example, fhandle may want to know how many times it's been called.  This can be overcome
+ by saving state information inside fhandle using 'persistent' variables.  For an example
+ see imwrite2. 
+
+ INPUTS
+   A        - input array
+   fhandle  - operation to apply to each 'element' of A
+   params   - [varargin] parameters for each operation specified by fhandle
+
+ OUTPUTS
+   B        - output array
+
+ EXAMPLE
+   B = feval_arrays( A, @rgb2gray );      % where A is MxNx3xR
+   B = feval_arrays( A, @imresize, .5 );  % where A is MxNxR
+   B = feval_arrays( A, @imnormalize );   % where A has arbitrary dims
+   B = feval_arrays( A, @(x) {imresize(x{1},.5)} ); % resize each element in cell array
+
+ DATESTAMP
+   25-Jan-2005  2:00pm
+
+ See also FEVAL_IMAGES, IMWRITE2, PERSISTENT, TICSTATUS
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • ticstatus Used to display the progress of a long process.
  • tocstatus Used to display the progress of a long process.
+This function is called by: +
    +
  • pca_randomvector Generate random vectors in PCA subspace.
  • imwrite2 Similar to imwrite, except follows a strict naming convention.
  • jitter_image Creates multiple, slightly jittered versions of an image.
  • jitter_video Creates multiple, slightly jittered versions of a video.
  • movie2images Creates a stack of images from a matlab movie M.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/feval_images.html b/doc/matlab/feval_images.html new file mode 100644 index 00000000..832c4cc6 --- /dev/null +++ b/doc/matlab/feval_images.html @@ -0,0 +1,94 @@ + + + + Description of feval_images + + + + + + + + + + +

feval_images +

+ +

PURPOSE ^

+
Used to apply the same operation to all images in given directory.
+ +

SYNOPSIS ^

+
function X = feval_images( fhandle, params, srcdir, name, ext, nstart, nend, ndigits )
+ +

DESCRIPTION ^

+
 Used to apply the same operation to all images in given directory.
+
+ For each image in  srcdir, loads the image, applies the function in fhandle and stores
+ the result.  The result x=fhandle(I,params{:}) on the ith image is stored in
+ X(:,...:,i).  If the size of x depends on the size of I, then all images in the
+ directory must have the same size.  Also I may have a different format depending on how
+ it is stored on disk - example: MxN for grayscale, MxNx3 for RGB, MxNx4 for CMYK. This
+ function is very similar to feval_arrays, except instead of operating on images in
+ memory it operates on images on disk.  For long operations shows progress information.
+ 
+ The srcdir must contain nothing but images.  Either the images follow no naming
+ convention, or they follow a very rigid naming convention that consists of a string
+ followed by ndigits-number specifying the image number, followed by an extension.  The
+ advantage of the more rigid naming convention is that it allows a certain range of
+ images to be operated on, specified by [nstart,nend]. For example, to operate on images
+ "rats0003.tif ... rats0113.tif" in directory '../rats/' use:   
+    feval_images( fhandle, params, '../rats/', 'rats' , 'tif', 3, 113, 4 );
+ If the parameter name is specified ('rats' in the example above), the rigid naming
+ convention is assumed.  All further input arguments are optional.
+
+ imwrite2 writes images in the format described above.  
+
+ If the function in fhandle is identity (f=@(x) x), the result is to read in all images
+ in the directory.  
+
+ A limitation of feval_images is that it does not pass state information to fhandle.  For
+ example, fhandle may want to know how many times it's been  called. This can be overcome
+ by saving state information inside fhandle using 'persistent' variables.  For an example
+ see imwrite2 (which uses persistent variables with feval_arrays). 
+
+ INPUTS
+   fhandle   - function to apply to each image [see above]
+   params    - cell array of additional parameters to fhandle (may be {} )
+   srcdir    - directory containing images 
+   name      - [optional] base name of images
+   ext       - [optional] extension of image 
+   nstart    - [optional] image number on which to start
+   nend      - [optional] image number on which to end
+   ndigits   - [optional] number of digits for filename index
+
+ OUTPUTS
+   X        - output array [see above]
+
+ EXAMPLE
+ % reads in all images in directory (note that fhandle is identity!):
+   X = feval_images( @(x) x, {}, srcdir );  
+ % reads in all images converting to grayscale:
+   X = feval_images( @(x) rgb2gray(x), {}, srcdir ); 
+
+ DATESTAMP
+   30-Apr-2006 12:00pm
+
+ See also FEVAL_ARRAYS, IMWRITE2, PERSISTENT, TICSTATUS
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • int2str2 Convert integer to string of given length; improved version of int2str.
  • ticstatus Used to display the progress of a long process.
  • tocstatus Used to display the progress of a long process.
+This function is called by: +
    +
  • imwrite2 Similar to imwrite, except follows a strict naming convention.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/feval_mats.html b/doc/matlab/feval_mats.html new file mode 100644 index 00000000..8de21f8e --- /dev/null +++ b/doc/matlab/feval_mats.html @@ -0,0 +1,71 @@ + + + + Description of feval_mats + + + + + + + + + + +

feval_mats +

+ +

PURPOSE ^

+
Used to apply the same operation to all .mat files in given directory.
+ +

SYNOPSIS ^

+
function X = feval_mats( fhandle, matcontents, params, srcdir, prefix )
+ +

DESCRIPTION ^

+
 Used to apply the same operation to all .mat files in given directory.
+
+ For each mat in srcdir, loads the mat file, extracts the variables denoted by
+ matcontents, applies the function fhandle and stores the result.  matcontents must be a
+ cell array of strings, where each string denotes the variable stored in the mat files.
+ For example, if each mat file contains two variables y and z, then matcontents should be
+ {'y','z'}.  For long operations shows progress information.
+
+ fhandle must point to a function that takes two inputs: vals and params.
+ vals is a cell array that contains the values for the variables denoted by matcontents
+ and contained in the mat file, and params are the additional static parameters passed to
+ feval_arrays.  Continuing the example above vals would be {y,z} - (use deal to extract):
+    x=feval(fhandle,{y,z},params) 
+ Each returned x must have the same dimensions, X is a concatentation of the returned x's
+ along the (d+1) dimension.  
+
+ INPUTS
+   fhandle     - function to apply to contents of each mat file [see above]
+   matcontents - cell array of strings that denote expected contents of each mat file
+   params      - cell array of additional parameters to fhandle (may be {})
+   srcdir      - directory containg mat files
+   prefix      - [optional] only consider mat files in srcdir of the form prefix_*.mat
+
+ OUTPUTS
+   X        - output array [see above]
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also FEVAL_IMAGES, FEVAL_ARRAYS
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • ticstatus Used to display the progress of a long process.
  • tocstatus Used to display the progress of a long process.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/figureresized.html b/doc/matlab/figureresized.html new file mode 100644 index 00000000..3fb3fc3d --- /dev/null +++ b/doc/matlab/figureresized.html @@ -0,0 +1,60 @@ + + + + Description of figureresized + + + + + + + + + + +

figureresized +

+ +

PURPOSE ^

+
Creates a figures that takes up certain area of screen.
+ +

SYNOPSIS ^

+
function varargout = figuresized( screenratio, varargin )
+ +

DESCRIPTION ^

+
 Creates a figures that takes up certain area of screen.
+
+ Almost same as figure, except get to specify what fraction of available screen space
+ figure should take up.  Figure appears in center of screen.
+
+ INPUTS
+   screenratio - controls fraction of screen image takes out (<=.8)
+   varargin    - parameters to figure
+
+ OUTPUTS
+   varargin    - parameters from figure
+
+ EXAMPLE
+   figureresized( .75 )
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ 
+ See also FIGURE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • makemovies [4D] Used to convert R sets of equal length videos into a single movie.
  • makemoviesets [5D] Used to convert S sets of R videos into a movie.
  • makemoviesets2 [5D] Used to convert S sets of R videos into a movie.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/gauss2ellipse.html b/doc/matlab/gauss2ellipse.html new file mode 100644 index 00000000..4f283337 --- /dev/null +++ b/doc/matlab/gauss2ellipse.html @@ -0,0 +1,63 @@ + + + + Description of gauss2ellipse + + + + + + + + + + +

gauss2ellipse +

+ +

PURPOSE ^

+
Creates an ellipse representing the 2D Gaussian distribution.
+ +

SYNOPSIS ^

+
function [ crow, ccol, ra, rb, phi ] = gauss2ellipse( mu, C, d )
+ +

DESCRIPTION ^

+
 Creates an ellipse representing the 2D Gaussian distribution.
+ 
+ Creates an ellipse representing the 2D Gaussian distribution with mean mu and covariance
+ matrix C.  Returns 5 parameters that specify the ellipse: a semimajor axis of ra, a
+ semiminor axis of radius rb, angle phi, centered at (crow,ccol).  
+
+ INPUTS
+   mu  - 1x2 vector representing the center of the ellipse
+   C   - 2x2 cov matrix
+   d   - [optional] Number of std to create the ellipse to (2 is default)
+
+ OUTPUTS
+   crow    - the row location of the center of the ellipse
+   ccol    - the column location of the center of the ellipse
+   ra      - semi-major axis length (in pixels) of the ellipse
+   rb      - semi-minor axis length (in pixels) of the ellipse
+   phi     - rotation angle (in radians) of the semimajor axis from the x-axis
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also PLOT_ELLIPSE, PLOT_GAUSSELLIPSES, MASK_ELLIPSE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/getargs.html b/doc/matlab/getargs.html new file mode 100644 index 00000000..f03f7ae1 --- /dev/null +++ b/doc/matlab/getargs.html @@ -0,0 +1,69 @@ + + + + Description of getargs + + + + + + + + + + +

getargs +

+ +

PURPOSE ^

+
Utility to process parameter name/value pairs.
+ +

SYNOPSIS ^

+
function [emsg,varargout]=getargs(pnames,dflts,varargin)
+ +

DESCRIPTION ^

+
 Utility to process parameter name/value pairs.
+
+ Based on code fromt the Matlab Statistics Toolobox "private/statgetargs.m"
+
+ [EMSG,A,B,...]=GETARGS(PNAMES,DFLTS,'NAME1',VAL1,'NAME2',VAL2,...) accepts a cell
+ array PNAMES of valid parameter names, a cell array DFLTS of default values for the
+ parameters named in PNAMES, and additional parameter name/value pairs.  Returns
+ parameter values A,B,... in the same order as the names in PNAMES.  Outputs
+ corresponding to entries in PNAMES that are not specified in the name/value pairs are
+ set to the corresponding value from DFLTS.  If nargout is equal to length(PNAMES)+1,
+ then unrecognized name/value pairs are an error.  If nargout is equal to
+ length(PNAMES)+2, then all unrecognized name/value pairs are returned in a single cell
+ array following any other outputs.
+
+ EMSG is empty if the arguments are valid, or the text of an error message if an error
+ occurs.  GETARGS does not actually throw any errors, but rather returns an error
+ message so that the caller may throw the error. Outputs will be partially processed
+ after an error occurs.
+
+ EXAMPLE
+   pnames = {'color' 'linestyle', 'linewidth'}
+   dflts  = {    'r'         '_'          '1'}
+   v = {'linew' 2 'nonesuch' [1 2 3] 'linestyle' ':'};
+   [emsg,color,linestyle,linewidth,unrec] = getargs(pnames,dflts,v{:}) % ok
+   [emsg,color,linestyle,linewidth] = getargs(pnames,dflts,v{:})    % error
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • kmeans2 Very fast version of kmeans clustering.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/imlabel.html b/doc/matlab/imlabel.html new file mode 100644 index 00000000..b116c62b --- /dev/null +++ b/doc/matlab/imlabel.html @@ -0,0 +1,59 @@ + + + + Description of imlabel + + + + + + + + + + +

imlabel +

+ +

PURPOSE ^

+
Improved method for labeling figure axes.
+ +

SYNOPSIS ^

+
function imlabel( labels, position, slant, pvpairs )
+ +

DESCRIPTION ^

+
 Improved method for labeling figure axes.
+
+ INPUTS
+   labels          - cell array of strings, labels for display
+   position        - 'left', 'right', 'bottom', or 'top'
+   slant           - [optional] rotation for top and bottom labels in [-90,90]
+   pvpairs         - [optional] parameter / value list for text
+
+ EXAMPLE
+   load( 'images.mat' );
+   clf; cla; montage2( images(:,:,1:9), 1 );
+   imlabel( {'row1','row2','row3'}, 'left',[],{'FontSize',20} );
+   imlabel( {'column 1','column 2','column 3'}, 'bottom', -25, {'FontSize',20} );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MONTAGE2, TEXT2, TEXT
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • text2 Wrapper for text.m that ensures displayed text fits in figure.
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/ind2sub2.html b/doc/matlab/ind2sub2.html new file mode 100644 index 00000000..ce26b46b --- /dev/null +++ b/doc/matlab/ind2sub2.html @@ -0,0 +1,63 @@ + + + + Description of ind2sub2 + + + + + + + + + + +

ind2sub2 +

+ +

PURPOSE ^

+
Improved version of ind2sub.
+ +

SYNOPSIS ^

+
function sub = ind2sub2(siz,ind)
+ +

DESCRIPTION ^

+
 Improved version of ind2sub.
+ 
+ Almost the same as ind2sub, except always returns only a single output that contains all
+ the index locations.  Also handles multiple linear indicies at the same time.
+
+ See help for ind2sub for mor info.
+
+ INPUTS
+   siz     - size of array into which ind is an index
+   ind     - linear index (or vector of indicies) into given array
+ 
+ OUTPUTS   
+   sub     - sub(i,:) is the ith set of subscripts into the array.
+
+ EXAMPLE
+   sub = ind2sub2( [10,10], 20 )
+   sub = ind2sub2( [10,10], [19 20] )
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also IND2SUB, SUB2IND2
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • convn_fast Fast convolution, replacement for both conv2 and convn.
  • mask_gaussians Divides a volume into softly overlapping gaussian windows.
  • nonmaxsupr Applies nonmaximal suppression on an image of arbitrary dimension.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/int2str2.html b/doc/matlab/int2str2.html new file mode 100644 index 00000000..354e33db --- /dev/null +++ b/doc/matlab/int2str2.html @@ -0,0 +1,61 @@ + + + + Description of int2str2 + + + + + + + + + + +

int2str2 +

+ +

PURPOSE ^

+
Convert integer to string of given length; improved version of int2str.
+ +

SYNOPSIS ^

+
function nstr = int2str2( n, ndigits )
+ +

DESCRIPTION ^

+
 Convert integer to string of given length; improved version of int2str.  
+
+ Pads string with zeros on the left.  If input n is an array, output is a cell array of
+ strings of the same dimension as n.
+ 
+ INPUTS
+   n           - integer to convert to string
+   ndigits     - minimum number of digits to use
+
+
+ OUTPUTS
+   nstr    - string representation of n (or cell array of strings in n is an array)
+
+ EXAMPLE
+   s = int2str2( 3, 3 )
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also INT2STR
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • clf_dectree_train Train a decision tree classifier.
  • confmatrix_show Used to display a confusion matrix.
  • kmeans2 Very fast version of kmeans clustering.
  • nfoldxval Runs n-fold cross validation on data with a given classifier.
  • imwrite2 Similar to imwrite, except follows a strict naming convention.
  • imwrite2split Writes/reads a large set of images into/from multiple directories.
  • feval_images Used to apply the same operation to all images in given directory.
  • simplecache A very simply cache that can be used to store results of computations.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/isfield2.html b/doc/matlab/isfield2.html new file mode 100644 index 00000000..0b0bada2 --- /dev/null +++ b/doc/matlab/isfield2.html @@ -0,0 +1,59 @@ + + + + Description of isfield2 + + + + + + + + + + +

isfield2 +

+ +

PURPOSE ^

+
More comprehensive version of isfield.
+ +

SYNOPSIS ^

+
function tf = isfield2( S, fs, isinit )
+ +

DESCRIPTION ^

+
 More comprehensive version of isfield.
+
+ A more comprehensive test of what fields are present [and optionally initialized] in a
+ stuct S.  fs is either a single field name or a cell array of field name.  The presence
+ of all fields in fs are tested for in S, tf is true iif all fs are present.
+ Additionally, if isinit==1, then tf is true iff every field fs of every element of S
+ is nonempty (test done using isempty).
+
+ INPUTS
+   S       - struct array
+   fs      - cell of string name or string
+   isinit  - [optional] if true than additionally test if all fields are initialized
+
+ OUTPUTS
+   tf      - true or false, depending on results of above tests
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/mat2cell2.html b/doc/matlab/mat2cell2.html new file mode 100644 index 00000000..5b3ea9c8 --- /dev/null +++ b/doc/matlab/mat2cell2.html @@ -0,0 +1,67 @@ + + + + Description of mat2cell2 + + + + + + + + + + +

mat2cell2 +

+ +

PURPOSE ^

+
Break matrix up into a cell array of same sized matrices.
+ +

SYNOPSIS ^

+
function C = mat2cell2( X, parts )
+ +

DESCRIPTION ^

+
 Break matrix up into a cell array of same sized matrices.
+
+ Useful wrapper for matlab function mat2cell.  Instead of specifying locations along each
+ dimension at which to split the matrix, this function takes the number of parts along
+ each dimension to break X into.  That is if X is d1xd2x...xdk and parts=[p1 p2 ... pk];
+ then X is split into p1*p2*...*pk matricies of dimension d1/p1 x d2/p2 x ... x dk/pk.
+ If di/pi is not an integer, floor(di/pi) is used.  Leftover chunks of X are discarded.
+ Using a scalar p for parts is equivalent to using [p p ... p].
+
+ So for example if X is 10*16, mat2cell2( X, [2 3] ) break X into 2*3 parts, each of size
+ 5x5, and the last column of X is discarded.
+
+ INPUTS
+   X       - matrix to split
+   parts   - see above
+
+ OUTPUTS
+   C       - cell array adjacent submatrices of X
+
+ EXAMPLE
+   A=rand(4), B = mat2cell2(A,2), B{:}
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also MAT2CELL, CELL2ARRAY, CELL2MAT
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/menu.html b/doc/matlab/menu.html new file mode 100644 index 00000000..7deacade --- /dev/null +++ b/doc/matlab/menu.html @@ -0,0 +1,30 @@ + + + + Index for Directory matlab + + + + + + + + + +
^ Master index ^
+ +

Index for matlab

+
Contents
+ +

Matlab files in this directory:

+ + + + + + +
Generated by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/mode.html b/doc/matlab/mode.html new file mode 100644 index 00000000..f7d82c43 --- /dev/null +++ b/doc/matlab/mode.html @@ -0,0 +1,55 @@ + + + + Description of mode + + + + + + + + + + +

mode +

+ +

PURPOSE ^

+
Returns the mode of a vector.
+ +

SYNOPSIS ^

+
function y=mode(x)
+ +

DESCRIPTION ^

+
 Returns the mode of a vector.
+ 
+ INPUTS
+   x   - vector of integers
+
+ OUTPUTS   
+   y   - mode
+
+ EXAMPLE
+   x = randint2( 1, 10, [1 3] )
+   mode( x )
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/normpdf2.html b/doc/matlab/normpdf2.html new file mode 100644 index 00000000..eac8b1d4 --- /dev/null +++ b/doc/matlab/normpdf2.html @@ -0,0 +1,57 @@ + + + + Description of normpdf2 + + + + + + + + + + +

normpdf2 +

+ +

PURPOSE ^

+
Normal prob. density function (pdf) with arbitrary covariance matrix.
+ +

SYNOPSIS ^

+
function ps = normpdf2(xs,m,C);
+ +

DESCRIPTION ^

+
 Normal prob. density function (pdf) with arbitrary covariance matrix.
+
+ Evaluate the multi-variate density with mean vector m and covariance matrix C for the
+ input vector xs.  Assumes that the N datapoints are d dimensional.  Then m is dx1 or
+ 1xd, C is dxd, and xs is dxN or NxD where N is the number of samples to be evaluated.
+
+ INPUTS
+   xs  - points to evaluated (Nxd or dxN)
+   m   - mean vector (dx1 or 1xd)
+   C   - Covariance matrix (dxd)
+
+ OUTPUTS
+   ps  - probability density at each x
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/num2strs.html b/doc/matlab/num2strs.html new file mode 100644 index 00000000..b08cb7a4 --- /dev/null +++ b/doc/matlab/num2strs.html @@ -0,0 +1,54 @@ + + + + Description of num2strs + + + + + + + + + + +

num2strs +

+ +

PURPOSE ^

+
Applies num2str to each element of an array X.
+ +

SYNOPSIS ^

+
function Y = num2strs( X, varargin )
+ +

DESCRIPTION ^

+
 Applies num2str to each element of an array X.
+
+ INPUTS
+   X           - array of number to convert to strings
+   varargin    - input to num2str
+
+ OUTPUTS
+   Y           - cell array of strings
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also NUM2STR
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/plot_ellipse.html b/doc/matlab/plot_ellipse.html new file mode 100644 index 00000000..827e6296 --- /dev/null +++ b/doc/matlab/plot_ellipse.html @@ -0,0 +1,60 @@ + + + + Description of plot_ellipse + + + + + + + + + + +

plot_ellipse +

+ +

PURPOSE ^

+
Adds an ellipse to the current plot.
+ +

SYNOPSIS ^

+
function varargout = plot_ellipse( crow, ccol, ra, rb, phi, color, npoints )
+ +

DESCRIPTION ^

+
 Adds an ellipse to the current plot.
+
+ INPUTS
+   crow    - the row location of the center of the ellipse
+   ccol    - the column location of the center of the ellipse
+   ra      - semi-major axis radius length (in pixels) of the ellipse
+   rb      - semi-minor axis radius length (in pixels) of the ellipse
+   phi     - rotation angle (in radians) of the semimajor axis from the x-axis
+   color   - [optional] color for ellipse
+   npoints - [optional] number of points used to draw each ellipse
+
+ OUTPUT
+   h       - handle to ellipse
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ EXAMPLE
+   plot_ellipse( 3, 2, 1, 5, pi/6, 'g')
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/plot_gaussellipses.html b/doc/matlab/plot_gaussellipses.html new file mode 100644 index 00000000..6f1eb5b9 --- /dev/null +++ b/doc/matlab/plot_gaussellipses.html @@ -0,0 +1,55 @@ + + + + Description of plot_gaussellipses + + + + + + + + + + +

plot_gaussellipses +

+ +

PURPOSE ^

+
Plots 2D ellipses derived from 2D Gaussians specified by mus & Cs.
+ +

SYNOPSIS ^

+
function plot_gaussellipses( mus, Cs, d )
+ +

DESCRIPTION ^

+
 Plots 2D ellipses derived from 2D Gaussians specified by mus & Cs.  
+
+ INPUTS
+   mu      - kx2 matrix of means
+   Cs      - 2 x 2 x k  covariance matricies
+   d       - [optional] Number of std to create the ellipse to (2 is default)
+
+ EXAMPLE
+   plot_gaussellipses( [ 10 10 ], eye(2), 2 );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also PLOT_ELLIPSE, GAUSS2ELLIPSE
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • gauss2ellipse Creates an ellipse representing the 2D Gaussian distribution.
  • plot_ellipse Adds an ellipse to the current plot.
+This function is called by: +
    +
  • filter_gauss_nD n-dimensional Gaussian filter.
  • imageMLG Calculates maximum likelihood parameters of gaussian that gave rise to image G.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/randint2.html b/doc/matlab/randint2.html new file mode 100644 index 00000000..df5d8337 --- /dev/null +++ b/doc/matlab/randint2.html @@ -0,0 +1,61 @@ + + + + Description of randint2 + + + + + + + + + + +

randint2 +

+ +

PURPOSE ^

+
Faster but restricted version of randint.
+ +

SYNOPSIS ^

+
function R = randint2( m, n, range )
+ +

DESCRIPTION ^

+
 Faster but restricted version of randint.
+
+ Generate matrix of uniformly distributed random integers.  R = randint2(m,n,range)
+ generates an m-by-n matrix of random integers between [range(1), range(2)].
+ 
+ InPUTS
+   m        - m rows
+   n        - n cols
+   range    - range of ints
+
+ OUTPUTS
+   R        - mxn matrix of integers
+
+ EXAMPLE
+   R = randint2( 2, 5, [0 1] )
+
+ DATESTAMP
+   19-Nov-2005  4:00pm
+
+ See also RANDINT
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • kmeans2 Very fast version of kmeans clustering.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/randomsample.html b/doc/matlab/randomsample.html new file mode 100644 index 00000000..9d61b09c --- /dev/null +++ b/doc/matlab/randomsample.html @@ -0,0 +1,74 @@ + + + + Description of randomsample + + + + + + + + + + +

randomsample +

+ +

PURPOSE ^

+
Samples elements of X so result uses at most maxmegs megabytes of memory.
+ +

SYNOPSIS ^

+
function [X,keeplocs] = randomsample( X, maxmegs )
+ +

DESCRIPTION ^

+
 Samples elements of X so result uses at most maxmegs megabytes of memory.
+ 
+ X must be an n dimensional array with the last dimension used to index samples of X. So
+ for example if X has size d1 x d2 x...x dn-1 x dn, it is treated as having dn elements
+ of size (d1 x d2 x...x dn-1), and the resulting array Xsam will have dimension d1 x d2
+ x...x dn-1 x dn' where dn' <= dn.
+
+ Different types of arrays require different amounts of memory.  Each double requries 8
+ bytes of memory, hence an array with 1.024 million elements of type double requires 8MB
+ memory.  Each uint8 requires 1 byte, so the same size array would require 1MB.  Note
+ that when saved to .mat files arrays may take up more or less memory.  
+
+ Note, to see how much memory a variable x is using in memory, use:
+   s=whos('x'); mb=s.bytes/2^20
+
+ INPUTS
+   X           - n-dim array of size (d1 x d2 x...x dn-1) x dn (treated as dn elements)
+   maxmegs     - maximum number of megs Xsam is allowed to take up
+ 
+ OUTPUTS
+   Xsam        - n-dim array of size (d1 x d2 x...x dn-1) x dn' where dn'<=dn
+   keeplocs    - vector of indicies kept from X;  Xsam=X(:,..,:,keeplocs)
+
+ EXAMPLE
+   % Xsam should have size: 1024xround(1024/10)
+   X = uint8(ones(2^10,2^10));
+   Xsam = randomsample( X, 1/10 );
+   % Xsam should have size: 100x10x~(1000/8) 
+   X = rand(100,10,1000);
+   Xsam = randomsample( X, 1 );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • pca principal components analysis (alternative to princomp).
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/randperm2.html b/doc/matlab/randperm2.html new file mode 100644 index 00000000..4643cd14 --- /dev/null +++ b/doc/matlab/randperm2.html @@ -0,0 +1,66 @@ + + + + Description of randperm2 + + + + + + + + + + +

randperm2 +

+ +

PURPOSE ^

+
Returns a random permutation of integers.
+ +

SYNOPSIS ^

+
function p = randperm2(n,k);
+ +

DESCRIPTION ^

+
 Returns a random permutation of integers. 
+
+ randperm2(n) is a random permutation of the integers from 1 to n.  For example,
+ randperm2(6) might be [2 4 5 6 1 3].  randperm2(n,k) is only returns the first k
+ elements of the permuation, so for example randperm2(6) might be [2 4].
+ 
+ This is a faster version of randperm.m if only need first k<<n elements of the random
+ permutation.  Also uses less random bits (only k).  Note that this is an implementation
+ O(k), versus the matlab implementation which is O(nlogn), however, in practice it is
+ often slower for k=n because it uses a loop.
+
+ INPUTS
+   n     - permute 1:n
+   k   - keep only first k outputs
+
+ OUTPUTS
+   p     - k length vector of permutations
+
+ EXAMPLE
+   randperm2(10,5)
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also RANDPERM
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • kmeans2 Very fast version of kmeans clustering.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/recover_rotation3D.html b/doc/matlab/recover_rotation3D.html new file mode 100644 index 00000000..6ecad02f --- /dev/null +++ b/doc/matlab/recover_rotation3D.html @@ -0,0 +1,58 @@ + + + + Description of recover_rotation3D + + + + + + + + + + +

recover_rotation3D +

+ +

PURPOSE ^

+
Takes a rotation matrix and extracts the rotation angle and axis.
+ +

SYNOPSIS ^

+
function [u,theta] = recover_rotation3D( R )
+ +

DESCRIPTION ^

+
 Takes a rotation matrix and extracts the rotation angle and axis.
+
+ INPUTS
+   R       - 3x3 Rotation matrix
+
+ OUTPUTS
+   u       - axis of rotation
+   theta   - angle of rotation (radians)
+
+ EXAMPLE
+   R = rotation_matrix3D( [0 0 1], pi/4 );
+   [u,theta]  = recover_rotation3D( R )
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also ROTATION_MATRIX3D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/rotation_matrix2D.html b/doc/matlab/rotation_matrix2D.html new file mode 100644 index 00000000..e5ef1f75 --- /dev/null +++ b/doc/matlab/rotation_matrix2D.html @@ -0,0 +1,59 @@ + + + + Description of rotation_matrix2D + + + + + + + + + + +

rotation_matrix2D +

+ +

PURPOSE ^

+
Returns the matrix: R=[cos(t) -sin(t); sin(t) cos(t)].
+ +

SYNOPSIS ^

+
function R = rotation_matrix2D( theta )
+ +

DESCRIPTION ^

+
 Returns the matrix: R=[cos(t) -sin(t); sin(t) cos(t)].
+
+ y=R*x is the result of rotating x theta degress clockwise about the z-axis.  
+ One can retrive the angle of rotation via theta = acos(R(1)).
+
+ INPUTS
+   theta   - angle of rotation (radians)
+
+ OUTPUTS
+   R       - 2x2 Rotation matrix
+
+ EXAMPLE
+   R = rotation_matrix2D( pi/6 )
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also ROTATION_MATRIX3D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • imrotate2 Custom version of imrotate that demonstrates use of apply_homography.
  • jitter_image Creates multiple, slightly jittered versions of an image.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/rotation_matrix3D.html b/doc/matlab/rotation_matrix3D.html new file mode 100644 index 00000000..8117dd9b --- /dev/null +++ b/doc/matlab/rotation_matrix3D.html @@ -0,0 +1,60 @@ + + + + Description of rotation_matrix3D + + + + + + + + + + +

rotation_matrix3D +

+ +

PURPOSE ^

+
Uses Rodrigues's formula to create a 3x3 rotation matrix R.
+ +

SYNOPSIS ^

+
function R = rotation_matrix3D( u, theta )
+ +

DESCRIPTION ^

+
 Uses Rodrigues's formula to create a 3x3 rotation matrix R.
+
+ The results of R*xMatrix is x rotated theta degrees about u.
+
+ INPUTS
+   u       - axis of rotation - specified as (x,y,z)
+   theta   - angle of rotation (radians)
+
+ OUTPUTS
+   R       - 3x3 Rotation matrix
+
+ EXAMPLE
+   R = rotation_matrix3D( [0 0 1], pi/4 )
+   R * [1 0 0]'
+
+ DATESTAMP
+   11-Oct-2005  9:00pm
+
+ See also RECOVER_ROTATION3D, ROTATION_MATRIX2D
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/simplecache.html b/doc/matlab/simplecache.html new file mode 100644 index 00000000..235d4234 --- /dev/null +++ b/doc/matlab/simplecache.html @@ -0,0 +1,81 @@ + + + + Description of simplecache + + + + + + + + + + +

simplecache +

+ +

PURPOSE ^

+
A very simply cache that can be used to store results of computations.
+ +

SYNOPSIS ^

+
function varargout = simplecache( op, cache, varargin )
+ +

DESCRIPTION ^

+
 A very simply cache that can be used to store results of computations.  
+
+ Can save and retrieve arbitrary values using a vector (includnig char vectors) as a key.
+ Especially useful if a function must perform heavy computation but is often called with
+ the same inputs (for which it will give the same outputs).  Note that the current
+ implementation does a linear search for the key (a more refined implementation would use
+ a hash table), so it is not meant for large scale usage.
+
+ To use inside a function, make the cache persistent: 
+   persistent cache; if( isempty(cache) ) cache=simplecache('init'); end;
+ The following line, when placed inside a function, means the cache will stay in memory
+ until the matlab environment changes.  For an example usage see mask_gaussians.
+
+ USAGE:
+   %%% initialize a cache:
+   cache = simplecache('init');   
+
+   %%% put something in a cache.  Note that key must be a numeric vector.
+   %%% if cache already contained an object with the same key that obj is overwritten.
+   cache = simplecache( 'put', cache, key, val );
+
+   %%% attempt to get something from cache.  found==1 if obj was found, val is the obj.
+   [found,val] = simplecache( 'get', cache, key );
+
+   %%% free key
+   [cache,found] = simplecache( 'remove', cache, key );
+
+
+ EXAMPLE
+   cache = simplecache('init');
+   hellokey=rand(1,3); worldkey=rand(1,11);
+   cache = simplecache( 'put', cache, hellokey, 'hello' );
+   cache = simplecache( 'put', cache, worldkey, 'world' );
+   [f,v]=simplecache( 'get', cache, hellokey ); disp(v);
+   [f,v]=simplecache( 'get', cache, worldkey ); disp(v);
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also PERSISTENT, MASK_GAUSSIANS
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • int2str2 Convert integer to string of given length; improved version of int2str.
+This function is called by: +
    +
  • mask_gaussians Divides a volume into softly overlapping gaussian windows.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/sub2ind2.html b/doc/matlab/sub2ind2.html new file mode 100644 index 00000000..3ff37cb4 --- /dev/null +++ b/doc/matlab/sub2ind2.html @@ -0,0 +1,64 @@ + + + + Description of sub2ind2 + + + + + + + + + + +

sub2ind2 +

+ +

PURPOSE ^

+
Improved version of sub2ind.
+ +

SYNOPSIS ^

+
function ind = sub2ind2(siz,sub)
+ +

DESCRIPTION ^

+
 Improved version of sub2ind.
+ 
+ Almost the same as sub2ind, except always returns only a single output that contains all
+ the subscript locations.  Also handles multiple linear subscripts at the same time more
+ conviniently then matlab's version.  
+
+ See help for sub2ind for more info.
+
+ INPUTS
+   siz     - size of array into which sub is an index
+   sub     - sub(i,:) is the ith set of subscripts into the array.
+ 
+ OUTPUTS   
+   ind     - linear index (or vector of indicies) into given array
+
+ EXAMPLE
+   ind = sub2ind2( [10,10], [10 2] );
+   ind = sub2ind2( [10,10], [9 2; 10 2] );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also SUB2IND, IND2SUB2
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • imsubs2array Converts subs/vals image representation to array representation.
  • modefilt1 One-dimensional mode filtering.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/text2.html b/doc/matlab/text2.html new file mode 100644 index 00000000..90912929 --- /dev/null +++ b/doc/matlab/text2.html @@ -0,0 +1,59 @@ + + + + Description of text2 + + + + + + + + + + +

text2 +

+ +

PURPOSE ^

+
Wrapper for text.m that ensures displayed text fits in figure.
+ +

SYNOPSIS ^

+
function varargout = text2( varargin )
+ +

DESCRIPTION ^

+
 Wrapper for text.m that ensures displayed text fits in figure.
+
+ When text is called, Matlab displays the text, but does nothing to ensure that all of
+ the text fits in the figure.  This function, after calling text, shrinks the axes until
+ the text is fully visible.  Note that since font doesn't resize as the figure does, just
+ because the text fully fits after text2 is called, no guaranties are made after the
+ figure is resized.  Hence it is a good idea to resize the figure appropriately before
+ calling text2.
+
+ Same input/output options as Matlab's text.m command.  
+
+ EXAMPLE
+   text2( -3 , 11, 'hello world' )
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also TEXT
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • imlabel Improved method for labeling figure axes.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/ticstatus.html b/doc/matlab/ticstatus.html new file mode 100644 index 00000000..653de799 --- /dev/null +++ b/doc/matlab/ticstatus.html @@ -0,0 +1,89 @@ + + + + Description of ticstatus + + + + + + + + + + +

ticstatus +

+ +

PURPOSE ^

+
Used to display the progress of a long process.
+ +

SYNOPSIS ^

+
function id = ticstatus( msg, updatefreq, updatemint, eraseprev )
+ +

DESCRIPTION ^

+
 Used to display the progress of a long process.
+ 
+ Essentially, use 'ticstatusid = ticstatus' to start a new progress indicator, and then
+ update the progress indicator with a call to 'tocstatus( ticstatusid, fracdone )', where
+ fracdone is the fraction of the work completed.  The progress indicator is shown as a
+ text message (sent to stdout).  For example in a loop over i where about the same amount
+ of work is done each iteration, the indicator would be added as follows:
+     ticstatusid = ticstatus('my message');
+     for i=1:n
+         ...
+         tocstatus( ticstatusid, i/n );
+     end
+ Before the loop the timer is initialized, and then at the end of each iteration a call
+ to tocstatus is made 'tocstatus( ticstatusid, i/n )'.  The progress indicator is of the
+ form:   'my message   completed=4.5% [elapsed=1.0s / remaining~=21.5s]'
+
+ The parameters passed to ticstatus control the behavior of the progress indicator.  The
+ updatefreq is the minimum time (in seconds) between updates to the progress indicator
+ (a typical value is 1 second).  So even if 'tocstatus( ticstatusid, i/n )' is called
+ 100/second, an update occurs only once per updatefreq seconds.  Next updatemint is used
+ to control if a progress message shows at all.  If a process is projected to take time <
+ updatemint then no progress indicator is shown at all.  The form of the progress
+ indicator is a text message.  If eraseprev is set to true, then the previously displayed
+ message is erased.  This ONLY WORKS if no other output was sent to stdout since the last
+ call to tocstatus.  Otherwise, each new update is simply sent to the progress indicator
+ without first tyring to erase any previous text.  Finally msg allows customization of
+ the actual udpate message displayed.
+
+ ticstatus returns an id that uniquely identifies the progress indicator.  tocstatus
+ takes this id as its first input.  Once tocstatus is called with a fracdone==1, then the
+ memory of the progress indicator that corresponds to id is set free (make sure to call
+ tocstatus(id,1) if the progress indicator is no longer needed).  Nesting of progress
+ indicators is possible; however, in this case eraseprev should be set to false (otherwise
+ the various progress messages may erase each other).
+ 
+ INPUTS
+   msg         - [optinoal] additional msg to display in progress
+   updatefreq  - [optional] frequency with which to update progress (in seconds)
+   updatemint  - [optional] no progress is shown if process takes time < updatemint
+   eraseprev   - [optional] whether to attempt to erase prev message
+
+ OUTPUTS
+   ticstatusid - unique id of progress indicator
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also TOCSTATUS
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
  • meanshiftim Applies the meanshift algorithm to a joint spatial/range image.
  • meanshift_post Some post processing routines for meanshift not currently being used.
  • feval_arrays Used to apply the same operation to a stack of array elements.
  • feval_images Used to apply the same operation to all images in given directory.
  • feval_mats Used to apply the same operation to all .mat files in given directory.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/tocstatus.html b/doc/matlab/tocstatus.html new file mode 100644 index 00000000..844816fd --- /dev/null +++ b/doc/matlab/tocstatus.html @@ -0,0 +1,56 @@ + + + + Description of tocstatus + + + + + + + + + + +

tocstatus +

+ +

PURPOSE ^

+
Used to display the progress of a long process.
+ +

SYNOPSIS ^

+
function tocstatus( id, fracdone )
+ +

DESCRIPTION ^

+
 Used to display the progress of a long process.
+
+ For more information see ticstatus.
+
+ INPUTS
+   ticstatusid - unique id of progress indicator
+   fracdone    - value in (0,1] indicating percent of operation that is done
+
+ OUTPUTS
+   none
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also TICSTATUS
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: +
    +
  • meanshiftim Applies the meanshift algorithm to a joint spatial/range image.
  • meanshift_post Some post processing routines for meanshift not currently being used.
  • feval_arrays Used to apply the same operation to a stack of array elements.
  • feval_images Used to apply the same operation to all images in given directory.
  • feval_mats Used to apply the same operation to all .mat files in given directory.
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/tps_getwarp.html b/doc/matlab/tps_getwarp.html new file mode 100644 index 00000000..9ef9b5dc --- /dev/null +++ b/doc/matlab/tps_getwarp.html @@ -0,0 +1,76 @@ + + + + Description of tps_getwarp + + + + + + + + + + +

tps_getwarp +

+ +

PURPOSE ^

+
Given two sets of corresponding points, calculates warp between them.
+ +

SYNOPSIS ^

+
function [wx, affinex, wy, affiney, L, Ln_inv, bend_energy ] =tps_getwarp( lambda, xs_source, ys_source, xs_dest, ys_dest )
+ +

DESCRIPTION ^

+
 Given two sets of corresponding points, calculates warp between them.
+
+ Uses booksteins PAMI89 method.  Can then apply warp to a new set of
+ points (tps_interpolate), or even an image (tps_interpolateiamge).
+
+ INPUTS
+   lambda                      - contolls rigidity of warp 
+                                 (lambda->inf means warp becomes affine)
+   xs_source, ys_source        - correspondence points from source image
+   xs_dest, ys_dest            - correspondence points from destination image
+
+ OUTPUTS
+   wx, affinex, wy, affiney    - booksteain warping parameters
+   L, Ln_inv                    - see bookstein
+   bend_energy                 - bending energy
+
+ EXAMPLE
+   % example 1
+   xs = [ 0 -1 0 1 ]; ys = [1 0 -1 0]; xs_dest = xs; ys_dest = [3/4 1/4 -5/4 1/4];
+   [grid_xs, grid_ys] = meshgrid( -1.25:.25:1.25, -1.25:.25:1.25 );
+   [wx,ax,wy,ay,L,Ln_inv,benden] = tps_getwarp( 0, xs, ys, xs_dest, ys_dest );
+   tps_interpolate( xs, ys, xs_dest, ys_dest, wx, ax, wy, ay, grid_xs, grid_ys, 1 );
+   % example 2
+   xs = [3.6929 6.5827 6.7756 4.8189 5.6969 ]; 
+   ys = [10.3819 8.8386 12.0866 11.2047 10.0748 ]; 
+   xs_dest = [ 3.9724 6.6969 6.5394 5.4016 5.7756 ]; 
+   ys_dest = [ 6.5354 4.1181 7.2362 6.4528 5.1142 ]; 
+   [grid_xs, grid_ys] = meshgrid( 3.5:.25:7, 8.5:.25: 12.5  );
+   [wx,ax,wy,ay,L,Ln_inv,benden] = tps_getwarp( 0, xs, ys, xs_dest, ys_dest );
+   tps_interpolate( xs, ys, xs_dest, ys_dest, wx, ax, wy, ay, grid_xs, grid_ys, 1 );
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also TPS_INTERPOLATE, TPS_INTERPOLATEIMAGE, TPS_RANDOM
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/tps_interpolate.html b/doc/matlab/tps_interpolate.html new file mode 100644 index 00000000..c66f0d54 --- /dev/null +++ b/doc/matlab/tps_interpolate.html @@ -0,0 +1,57 @@ + + + + Description of tps_interpolate + + + + + + + + + + +

tps_interpolate +

+ +

PURPOSE ^

+
Apply warp (obtained by tps_getwarp) to a set of new points.
+ +

SYNOPSIS ^

+
function [ xs_p, ys_p ] = tps_interpolate( xs_source, ys_source, xs_dest, ys_dest,wx, affinex, wy, affiney, xs, ys, show )
+ +

DESCRIPTION ^

+
 Apply warp (obtained by tps_getwarp) to a set of new points. 
+
+ INPUTS
+   xs_source, ys_source        - correspondence points from source image
+   xs_dest, ys_dest            - correspondence points from destination image
+   wx, affinex, wy, affiney    - booksteain warping parameters
+   xs, ys                      - points to apply warp to
+   show                        - whether or not to show the output
+
+ OUTPUTS
+   xs_p, ys_p                  - result of warp applied to xs, ys
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+ 
+ See also TPS_GETWARP
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: + + + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/tps_interpolateimage.html b/doc/matlab/tps_interpolateimage.html new file mode 100644 index 00000000..de8abfbc --- /dev/null +++ b/doc/matlab/tps_interpolateimage.html @@ -0,0 +1,58 @@ + + + + Description of tps_interpolateimage + + + + + + + + + + +

tps_interpolateimage +

+ +

PURPOSE ^

+
Interpolate I_source according to the warp from I_source->I_dest.
+ +

SYNOPSIS ^

+
function IR = tps_interpolateimage( I_source, xs_source, ys_source,xs_dest, ys_dest, wx, affinex, wy, affiney )
+ +

DESCRIPTION ^

+
 Interpolate I_source according to the warp from I_source->I_dest.  
+
+ Use tps_getwarp to obtain the warp.
+
+ INPUTS
+   I_source                    - image to interpolate
+   xs_source, ys_source        - correspondence points from source image
+   xs_dest, ys_dest            - correspondence points from destination image
+   wx, affinex, wy, affiney    - booksteain warping parameters
+
+ OUTPUTS
+   IR      - warped image
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also TPS_GETWARP
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
  • texture_map Maps texture in I according to row_dest and col_dest.
  • tps_interpolate Apply warp (obtained by tps_getwarp) to a set of new points.
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlab/tps_random.html b/doc/matlab/tps_random.html new file mode 100644 index 00000000..3c25918f --- /dev/null +++ b/doc/matlab/tps_random.html @@ -0,0 +1,54 @@ + + + + Description of tps_random + + + + + + + + + + +

tps_random +

+ +

PURPOSE ^

+
Obtain a random warp with the same bending energy as the original.
+ +

SYNOPSIS ^

+
function w = tps_random( Ln_inv, bend_energy )
+ +

DESCRIPTION ^

+
 Obtain a random warp with the same bending energy as the original.
+
+ INPUTS
+   Ln_inv           - obtain from tps_getwarp (see Bookstein)
+   bend_energy     - amount of bening energy for random warp to have
+
+ OUTPUTS
+   w               - nonlinear component of warp for use in tps_interpolate
+
+ DATESTAMP
+   29-Sep-2005  2:00pm
+
+ See also TPS_GETWARP
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: +
    +
+This function is called by: +
    +
+ + + + +
Generated on Wed 03-May-2006 23:48:50 by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/matlabicon.gif b/doc/matlabicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c2b5e6e2225ede10ed4a95138d8c8df0a0fcfa2 GIT binary patch literal 574 zcmZ?wbhEHb6krfwc*Xz%|NsAYmy|MAPz?4D)YH*5(Km9k^EZu6QcKQIFtf07b<0@1 zT)&{uy`(f{{sI|ySG|y6y`Vtr!~~nlvVh)B-slDkd7sMUhm~nn@(#}qULHtXTzoc}*_9Non9cn|mMot$6xao(HD{Btemfo7KftJ(gq<~Y~G z@qZoHkA=+tS8)7W&Uw9q`Tr8me+#(&&u0HSm+S9Tw*NEO-*s^O@8dn4!TPz8qu!P4 zK_1Jw46grGoai}Etj@tK_}C@RCk z%#`S6Zs-xzlqxAD$1kf8AM0wN?c%>SMNC?Phc6~Pz{yO{A+R?kRa_)AA;iir?(CQ-4ncIv-nB)Nx{hL?F`wWg|rwizO*(ixxOASOWm3r><21 literal 0 HcmV?d00001 diff --git a/doc/menu.html b/doc/menu.html new file mode 100644 index 00000000..bdef5c66 --- /dev/null +++ b/doc/menu.html @@ -0,0 +1,33 @@ + + + + Piotr's Image & Video Toolbox for Matlab + + + + + + + + + +

Piotr's Image & Video Toolbox for Matlab

+

Download & Description

+

Matlab Directories

+ + + +
Generated by m2html © 2003
+ + \ No newline at end of file diff --git a/doc/mex.png b/doc/mex.png new file mode 100644 index 0000000000000000000000000000000000000000..396f1bc943e311539c64aa839ba14242c3b1493c GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^GC<7D!VDzmefZDNn{1``2&1H zT>k^XH6VupNCU}&+~7Mvim@cfFPOpM*^M+1C&}C0g`tC0)&t1lEbxdd1{y2`!i<;h z*8KqrvX^-Jy0Ty9km3|#4DWEh2o&=1ba4!+m=oK_$albigXt^#BmNKn`(>_}oOavV zHb=Afht|Vg%9B``@)jwvpOrK#Ny(Hf&TUq{A5ne4dvCr*%)z?JLGp XX&kFA6^pR}&1LX(^>bP0l+XkK#Yar! literal 0 HcmV?d00001 diff --git a/doc/overview.html b/doc/overview.html new file mode 100644 index 00000000..3eb0b1c7 --- /dev/null +++ b/doc/overview.html @@ -0,0 +1,66 @@ + + + + + Piotr's Image & Video Toolbox for Matlab + + + + + + + + + + +

Overview

+

DESCRIPTION^

+
+

This toolbox is meant to facilitate the manipulation of images and +video in Matlab. Its purpose is to complement, not replace, Matlab's Image +Processing Toolbox, and in fact it requires that the Matlab Image Toolbox +be installed.   Emphasis has been placed on code efficiency and +code reuse.

+

Thanks to everyone who has given me feedback and suggestions -- +you've helped make this toolbox more useful and easier to +use.

+

CONTENTS^

The toolbox is divided into 4 parts, arranged by +directory: +
    +
  • classify Classification algorithms + with a unified interface and fast clustering. +
  • filters Routines for filtering + images. +
  • images Routines for manipulating and + displaying images and videos. +
  • matlab General Matlab functions that + should have been a part of Matlab.
+

DOWNLOAD^

+
+

To download the current version of the toolbox, click here.

+

Simply unzip, then add all directories to the Matlab path:
  +>> addpath(genpath('c:\toolbox')); savepath;

+

Finally, run the compile script for the mex +files:
  >> cd('c:\toolbox'); +
toolbox_compile;

+

Version 1.03; May. 3, 2006 (history)

+

CONTACT^

+
If you have a question or a suggestion, or if you find a bug, +please email me at +pdollar-at-cs.ucsd.edu
+ + diff --git a/doc/right.png b/doc/right.png new file mode 100644 index 0000000000000000000000000000000000000000..067c5baf250318b85ede9047ea56e394244a8712 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^{2ujP)z zZ3@F642I+A(ex_uOz|q|-Q16CA~DKXHy!h#6nPc#A=(dzh_Dj}01(mYWlSQ*cu32| zbbY!^c%J9=dA@}A9sq8umob~|g)?E>&V+Ie#O(HQu@+QR?< N002ovPDHLkV1hx>d=3Br literal 0 HcmV?d00001 diff --git a/doc/simulinkicon.gif b/doc/simulinkicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..1386ddd4ce654071015610e81fdea82461d8e28b GIT binary patch literal 977 zcmbu8u}_m>5XK)83^3Uu8;SX77?CI^3B-XItA?P13elB7PXr>Q5E~tEP-6{~F%D-K z)WpFqI=OT~2IKIO5C(b~XFmOKi{R_TBlgr&b_q*r5UY@)(Ha=TG0e=CHm)y-= z-NhXdrR2#xsVDJ-NLq3;H+2&?M6D)Qb5&PyMYKwCF&A|a7f{KO9Oh7mI2cfy($r!z zs}XbJSxTCcq=XpD$Sj#AlVk`ACe@N^Qb~${Vy##bO(ID^Mz$tcf+k1;r;?gtgeE1i znB!n-Q<_?AMl2LDpPGpoVn2>$q-rXrh;>Q9q^OCQfZG#_wFWhaf$Px^VzQfdaDPH@ zLsCc`!iKu|Sa$Qm|sSpKyq|-EjTr8*2+?H0- z4`Q;Lc94k+b3;;7jL_^P7CAVW+LT6|D5{xe%m-eKMsh!nWh97?BYe&89m)KJVRL?! zsLhQI*K_ZpHMb*1{#n2u&8oRKvdcS(-_QHDh{>=FJST?;-$*#_> zFWg+IF0Bn^lXvHav-8W#Szfc2RV!b=VRFa{1fJ1Bvn_=*1$x~u5G{^07%?ML0m zHxB3bGCb|+8kyh!`1T@vWbw!Thc`P>6y|3Oo@O9$!+|lO2pBq=~ z?6HkkzgKp4CuH{I*7l2^yRRR1_MTc?@7vp&8a;gcZ2H%?cU{-M_dgh2`cl7D{M1<} G;M_lk-mF{z literal 0 HcmV?d00001 diff --git a/doc/solaris.png b/doc/solaris.png new file mode 100644 index 0000000000000000000000000000000000000000..e31e8a2a48078233e65bf10502de055609469206 GIT binary patch literal 286 zcmV+(0pb3MP)LJX0GRn|87F~=qO=0d z$LTWTx~|80zJzI-0N{4DjI%Mk;moMpnNcohj7EB(iPVo~iqGKm_8{s|W(+hpPU=N2 zz2$E5rj(XtF(bOm8L*eKNAeVg;o46LO1s$e-HK3o_b;p)l_XJ5>4v`(0TG#bkaL)bhCi169@`rB kx1WB<=i4tMjP|#52ZwT~UP>&M!~g&Q07*qoM6N<$g3~#GJpcdz literal 0 HcmV?d00001 diff --git a/doc/up.png b/doc/up.png new file mode 100644 index 0000000000000000000000000000000000000000..b348b9a1b19bd5030efd3df293d84a18b41ef6a4 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^{2x4R4De4J#NJjgjrM8h9Te~(8G kcWyrh{e1gnl+pf{?#tSrFr=&ZY5)KL07*qoM6N<$f*5RoFaQ7m literal 0 HcmV?d00001 diff --git a/external/exportfig/applytofig.m b/external/exportfig/applytofig.m new file mode 100644 index 00000000..34970511 --- /dev/null +++ b/external/exportfig/applytofig.m @@ -0,0 +1,20 @@ +function old = applytofig(h,varargin) +%APPLYTOFIG Apply EXPORTFIG options to figure. +% OLD = APPLYTOFIG(H) applies the default EXPORTFIG options to +% the figure with handle H and returns the state-difference +% structure in OLD. +% OLD = APPLYTOFIG(H, OPTIONS) applies OPTIONS to H as described +% in EXPORTFIG. +% OLD = APPLYTOFIG(...,PARAM1,VAL1,PARAM2,VAL2,...) applies the +% specified parameter-value pairs to H as described in EXPORTFIG. +% +% Use RESTOREFIG(H,OLD) to restore the figure to its state before +% applyfig was called. +% +% See also EXPORTFIG, PREVIEWFIG, RESTOREFIG. + +% Copyright 2000 Ben Hinkle +% Email bug reports and comments to bhinkle@mathworks.com + +temp = tempname; +old = exportfig(h,temp, varargin{:},'applystyle',1); diff --git a/external/exportfig/exportfig.m b/external/exportfig/exportfig.m new file mode 100644 index 00000000..0f4e90fd --- /dev/null +++ b/external/exportfig/exportfig.m @@ -0,0 +1,991 @@ +function varargout = exportfig(varargin) +%EXPORTFIG Export a figure. +% EXPORTFIG(H, FILENAME) writes the figure H to FILENAME. H is +% a figure handle and FILENAME is a string that specifies the +% name of the output file. +% +% EXPORTFIG(H, FILENAME, OPTIONS) writes the figure H to FILENAME +% with options initially specified by the structure OPTIONS. The +% field names of OPTIONS must be legal parameters listed below +% and the field values must be legal values for the corresponding +% parameter. Default options can be set in releases prior to R12 +% by storing the OPTIONS structure in the root object's appdata +% with the command +% setappdata(0,'exportfigdefaults', OPTIONS) +% and for releases after R12 by setting the preference with the +% command +% setpref('exportfig', 'defaults', OPTIONS) +% +% EXPORTFIG(...,PARAM1,VAL1,PARAM2,VAL2,...) specifies +% parameters that control various characteristics of the output +% file. Any parameter value can be the string 'auto' which means +% the parameter uses the default factory behavior, overriding +% any other default for the parameter. +% +% Format Paramter: +% 'Format' a string +% specifies the output format. Defaults to 'eps'. For a +% list of export formats type 'help print'. +% 'Preview' one of the strings 'none', 'tiff' +% specifies a preview for EPS files. Defaults to 'none'. +% +% Size Parameters: +% 'Width' a positive scalar +% specifies the width in the figure's PaperUnits +% 'Height' a positive scalar +% specifies the height in the figure's PaperUnits +% 'Bounds' one of the strings 'tight', 'loose' +% specifies a tight or loose bounding box. Defaults to 'tight'. +% 'Reference' an axes handle or a string +% specifies that the width and height parameters +% are relative to the given axes. If a string is +% specified then it must evaluate to an axes handle. +% +% Specifying only one dimension sets the other dimension +% so that the exported aspect ratio is the same as the +% figure's or reference axes' current aspect ratio. +% If neither dimension is specified the size defaults to +% the width and height from the figure's or reference +% axes' size. Tight bounding boxes are only computed for +% 2-D views and in that case the computed bounds enclose all +% text objects. +% +% Rendering Parameters: +% 'Color' one of the strings 'bw', 'gray', 'cmyk' +% 'bw' specifies that lines and text are exported in +% black and all other objects in grayscale +% 'gray' specifies that all objects are exported in grayscale +% 'rgb' specifies that all objects are exported in color +% using the RGB color space +% 'cmyk' specifies that all objects are exported in color +% using the CMYK color space +% 'Renderer' one of 'painters', 'zbuffer', 'opengl' +% specifies the renderer to use +% 'Resolution' a positive scalar +% specifies the resolution in dots-per-inch. +% 'LockAxes' one of 0 or 1 +% specifies that all axes limits and ticks should be fixed +% while exporting. +% +% The default color setting is 'bw'. +% +% Font Parameters: +% 'FontMode' one of the strings 'scaled', 'fixed' +% 'FontSize' a positive scalar +% in 'scaled' mode multiplies with the font size of each +% text object to obtain the exported font size +% in 'fixed' mode specifies the font size of all text +% objects in points +% 'DefaultFixedFontSize' a positive scalar +% in 'fixed' mode specified the default font size in +% points +% 'FontSizeMin' a positive scalar +% specifies the minimum font size allowed after scaling +% 'FontSizeMax' a positive scalar +% specifies the maximum font size allowed after scaling +% 'FontEncoding' one of the strings 'latin1', 'adobe' +% specifies the character encoding of the font +% 'SeparateText' one of 0 or 1 +% specifies that the text objects are stored in separate +% file as EPS with the base filename having '_t' appended. +% +% If FontMode is 'scaled' but FontSize is not specified then a +% scaling factor is computed from the ratio of the size of the +% exported figure to the size of the actual figure. +% +% The default 'FontMode' setting is 'scaled'. +% +% Line Width Parameters: +% 'LineMode' one of the strings 'scaled', 'fixed' +% 'LineWidth' a positive scalar +% 'DefaultFixedLineWidth' a positive scalar +% 'LineWidthMin' a positive scalar +% specifies the minimum line width allowed after scaling +% 'LineWidthMax' a positive scalar +% specifies the maximum line width allowed after scaling +% The semantics of 'Line' parameters are exactly the +% same as the corresponding 'Font' parameters, except that +% they apply to line widths instead of font sizes. +% +% Style Map Parameter: +% 'LineStyleMap' one of [], 'bw', or a function name or handle +% specifies how to map line colors to styles. An empty +% style map means styles are not changed. The style map +% 'bw' is a built-in mapping that maps lines with the same +% color to the same style and otherwise cycles through the +% available styles. A user-specified map is a function +% that takes as input a cell array of line objects and +% outputs a cell array of line style strings. The default +% map is []. +% +% Examples: +% exportfig(gcf,'fig1.eps','height',3); +% Exports the current figure to the file named 'fig1.eps' with +% a height of 3 inches (assuming the figure's PaperUnits is +% inches) and an aspect ratio the same as the figure's aspect +% ratio on screen. +% +% opts = struct('FontMode','fixed','FontSize',10,'height',3); +% exportfig(gcf, 'fig2.eps', opts, 'height', 5); +% Exports the current figure to 'fig2.eps' with all +% text in 10 point fonts and with height 5 inches. +% +% See also PREVIEWFIG, APPLYTOFIG, RESTOREFIG, PRINT. + +% Copyright 2000 Ben Hinkle +% Email bug reports and comments to bhinkle@mathworks.com + +if (nargin < 2) + error('Too few input arguments'); +end + +% exportfig(H, filename, [options,] ...) +H = varargin{1}; +if ~LocalIsHG(H,'figure') + error('First argument must be a handle to a figure.'); +end +filename = varargin{2}; +if ~ischar(filename) + error('Second argument must be a string.'); +end +paramPairs = {varargin{3:end}}; +if nargin > 2 + if isstruct(paramPairs{1}) + pcell = LocalToCell(paramPairs{1}); + paramPairs = {pcell{:}, paramPairs{2:end}}; + end +end +verstr = version; +majorver = str2num(verstr(1)); +defaults = []; +if majorver > 5 + if ispref('exportfig','defaults') + defaults = getpref('exportfig','defaults'); + end +elseif exist('getappdata') + defaults = getappdata(0,'exportfigdefaults'); +end +if ~isempty(defaults) + dcell = LocalToCell(defaults); + paramPairs = {dcell{:}, paramPairs{:}}; +end + +% Do some validity checking on param-value pairs +if (rem(length(paramPairs),2) ~= 0) + error(['Invalid input syntax. Optional parameters and values' ... + ' must be in pairs.']); +end + +auto.format = 'eps'; +auto.preview = 'none'; +auto.width = -1; +auto.height = -1; +auto.color = 'bw'; +auto.defaultfontsize=10; +auto.fontsize = -1; +auto.fontmode='scaled'; +auto.fontmin = 8; +auto.fontmax = 60; +auto.defaultlinewidth = 1.0; +auto.linewidth = -1; +auto.linemode=[]; +auto.linemin = 0.5; +auto.linemax = 100; +auto.fontencoding = 'latin1'; +auto.renderer = []; +auto.resolution = []; +auto.stylemap = []; +auto.applystyle = 0; +auto.refobj = -1; +auto.bounds = 'tight'; +explicitbounds = 0; +auto.lockaxes = 1; +auto.separatetext = 0; +opts = auto; + +% Process param-value pairs +args = {}; +for k = 1:2:length(paramPairs) + param = lower(paramPairs{k}); + if ~ischar(param) + error('Optional parameter names must be strings'); + end + value = paramPairs{k+1}; + + switch (param) + case 'format' + opts.format = LocalCheckAuto(lower(value),auto.format); + if strcmp(opts.format,'preview') + error(['Format ''preview'' no longer supported. Use PREVIEWFIG' ... + ' instead.']); + end + case 'preview' + opts.preview = LocalCheckAuto(lower(value),auto.preview); + if ~strcmp(opts.preview,{'none','tiff'}) + error('Preview must be ''none'' or ''tiff''.'); + end + case 'width' + opts.width = LocalToNum(value, auto.width); + if ~ischar(value) | ~strcmp(value,'auto') + if ~LocalIsPositiveScalar(opts.width) + error('Width must be a numeric scalar > 0'); + end + end + case 'height' + opts.height = LocalToNum(value, auto.height); + if ~ischar(value) | ~strcmp(value,'auto') + if(~LocalIsPositiveScalar(opts.height)) + error('Height must be a numeric scalar > 0'); + end + end + case 'color' + opts.color = LocalCheckAuto(lower(value),auto.color); + if ~strcmp(opts.color,{'bw','gray','rgb','cmyk'}) + error('Color must be ''bw'', ''gray'',''rgb'' or ''cmyk''.'); + end + case 'fontmode' + opts.fontmode = LocalCheckAuto(lower(value),auto.fontmode); + if ~strcmp(opts.fontmode,{'scaled','fixed'}) + error('FontMode must be ''scaled'' or ''fixed''.'); + end + case 'fontsize' + opts.fontsize = LocalToNum(value,auto.fontsize); + if ~ischar(value) | ~strcmp(value,'auto') + if ~LocalIsPositiveScalar(opts.fontsize) + error('FontSize must be a numeric scalar > 0'); + end + end + case 'defaultfixedfontsize' + opts.defaultfontsize = LocalToNum(value,auto.defaultfontsize); + if ~ischar(value) | ~strcmp(value,'auto') + if ~LocalIsPositiveScalar(opts.defaultfontsize) + error('DefaultFixedFontSize must be a numeric scalar > 0'); + end + end + case 'fontsizemin' + opts.fontmin = LocalToNum(value,auto.fontmin); + if ~ischar(value) | ~strcmp(value,'auto') + if ~LocalIsPositiveScalar(opts.fontmin) + error('FontSizeMin must be a numeric scalar > 0'); + end + end + case 'fontsizemax' + opts.fontmax = LocalToNum(value,auto.fontmax); + if ~ischar(value) | ~strcmp(value,'auto') + if ~LocalIsPositiveScalar(opts.fontmax) + error('FontSizeMax must be a numeric scalar > 0'); + end + end + case 'fontencoding' + opts.fontencoding = LocalCheckAuto(lower(value),auto.fontencoding); + if ~strcmp(opts.fontencoding,{'latin1','adobe'}) + error('FontEncoding must be ''latin1'' or ''adobe''.'); + end + case 'linemode' + opts.linemode = LocalCheckAuto(lower(value),auto.linemode); + if ~strcmp(opts.linemode,{'scaled','fixed'}) + error('LineMode must be ''scaled'' or ''fixed''.'); + end + case 'linewidth' + opts.linewidth = LocalToNum(value,auto.linewidth); + if ~ischar(value) | ~strcmp(value,'auto') + if ~LocalIsPositiveScalar(opts.linewidth) + error('LineWidth must be a numeric scalar > 0'); + end + end + case 'defaultfixedlinewidth' + opts.defaultlinewidth = LocalToNum(value,auto.defaultlinewidth); + if ~ischar(value) | ~strcmp(value,'auto') + if ~LocalIsPositiveScalar(opts.defaultlinewidth) + error(['DefaultFixedLineWidth must be a numeric scalar >' ... + ' 0']); + end + end + case 'linewidthmin' + opts.linemin = LocalToNum(value,auto.linemin); + if ~ischar(value) | ~strcmp(value,'auto') + if ~LocalIsPositiveScalar(opts.linemin) + error('LineWidthMin must be a numeric scalar > 0'); + end + end + case 'linewidthmax' + opts.linemax = LocalToNum(value,auto.linemax); + if ~ischar(value) | ~strcmp(value,'auto') + if ~LocalIsPositiveScalar(opts.linemax) + error('LineWidthMax must be a numeric scalar > 0'); + end + end + case 'linestylemap' + opts.stylemap = LocalCheckAuto(value,auto.stylemap); + case 'renderer' + opts.renderer = LocalCheckAuto(lower(value),auto.renderer); + if ~ischar(value) | ~strcmp(value,'auto') + if ~strcmp(opts.renderer,{'painters','zbuffer','opengl'}) + error(['Renderer must be ''painters'', ''zbuffer'' or' ... + ' ''opengl''.']); + end + end + case 'resolution' + opts.resolution = LocalToNum(value,auto.resolution); + if ~ischar(value) | ~strcmp(value,'auto') + if ~(isnumeric(value) & (prod(size(value)) == 1) & (value >= 0)); + error('Resolution must be a numeric scalar >= 0'); + end + end + case 'applystyle' % means to apply the options and not export + opts.applystyle = 1; + case 'reference' + if ischar(value) + if strcmp(value,'auto') + opts.refobj = auto.refobj; + else + opts.refobj = eval(value); + end + else + opts.refobj = value; + end + if ~LocalIsHG(opts.refobj,'axes') + error('Reference object must evaluate to an axes handle.'); + end + case 'bounds' + opts.bounds = LocalCheckAuto(lower(value),auto.bounds); + explicitbounds = 1; + if ~strcmp(opts.bounds,{'tight','loose'}) + error('Bounds must be ''tight'' or ''loose''.'); + end + case 'lockaxes' + opts.lockaxes = LocalToNum(value,auto.lockaxes); + case 'separatetext' + opts.separatetext = LocalToNum(value,auto.separatetext); + otherwise + error(['Unrecognized option ' param '.']); + end +end + +% make sure figure is up-to-date +drawnow; + +allLines = findall(H, 'type', 'line'); +allText = findall(H, 'type', 'text'); +allAxes = findall(H, 'type', 'axes'); +allImages = findall(H, 'type', 'image'); +allLights = findall(H, 'type', 'light'); +allPatch = findall(H, 'type', 'patch'); +allSurf = findall(H, 'type', 'surface'); +allRect = findall(H, 'type', 'rectangle'); +allFont = [allText; allAxes]; +allColor = [allLines; allText; allAxes; allLights]; +allMarker = [allLines; allPatch; allSurf]; +allEdge = [allPatch; allSurf]; +allCData = [allImages; allPatch; allSurf]; + +old.objs = {}; +old.prop = {}; +old.values = {}; + +% Process format +if strncmp(opts.format,'eps',3) & ~strcmp(opts.preview,'none') + args = {args{:}, ['-' opts.preview]}; +end + +hadError = 0; +oldwarn = warning; +try + + % lock axes limits, ticks and labels if requested + if opts.lockaxes + old = LocalManualAxesMode(old, allAxes, 'TickMode'); + old = LocalManualAxesMode(old, allAxes, 'TickLabelMode'); + old = LocalManualAxesMode(old, allAxes, 'LimMode'); + end + + % Process size parameters + figurePaperUnits = get(H, 'PaperUnits'); + oldFigureUnits = get(H, 'Units'); + oldFigPos = get(H,'Position'); + set(H, 'Units', figurePaperUnits); + figPos = get(H,'Position'); + refsize = figPos(3:4); + if opts.refobj ~= -1 + oldUnits = get(opts.refobj, 'Units'); + set(opts.refobj, 'Units', figurePaperUnits); + r = get(opts.refobj, 'Position'); + refsize = r(3:4); + set(opts.refobj, 'Units', oldUnits); + end + aspectRatio = refsize(1)/refsize(2); + if (opts.width == -1) & (opts.height == -1) + opts.width = refsize(1); + opts.height = refsize(2); + elseif (opts.width == -1) + opts.width = opts.height * aspectRatio; + elseif (opts.height == -1) + opts.height = opts.width / aspectRatio; + end + wscale = opts.width/refsize(1); + hscale = opts.height/refsize(2); + sizescale = min(wscale,hscale); + old = LocalPushOldData(old,H,'PaperPositionMode', ... + get(H,'PaperPositionMode')); + set(H, 'PaperPositionMode', 'auto'); + newPos = [figPos(1) figPos(2)+figPos(4)*(1-hscale) ... + wscale*figPos(3) hscale*figPos(4)]; + set(H, 'Position', newPos); + set(H, 'Units', oldFigureUnits); + + % process line-style map + if ~isempty(opts.stylemap) & ~isempty(allLines) + oldlstyle = LocalGetAsCell(allLines,'LineStyle'); + old = LocalPushOldData(old, allLines, {'LineStyle'}, ... + oldlstyle); + newlstyle = oldlstyle; + if ischar(opts.stylemap) & strcmpi(opts.stylemap,'bw') + newlstyle = LocalMapColorToStyle(allLines); + else + try + newlstyle = feval(opts.stylemap,allLines); + catch + warning(['Skipping stylemap. ' lasterr]); + end + end + set(allLines,{'LineStyle'},newlstyle); + end + + % Process rendering parameters + switch (opts.color) + case {'bw', 'gray'} + if ~strcmp(opts.color,'bw') & strncmp(opts.format,'eps',3) + opts.format = [opts.format 'c']; + end + args = {args{:}, ['-d' opts.format]}; + + %compute and set gray colormap + oldcmap = get(H,'Colormap'); + newgrays = 0.30*oldcmap(:,1) + 0.59*oldcmap(:,2) + 0.11*oldcmap(:,3); + newcmap = [newgrays newgrays newgrays]; + old = LocalPushOldData(old, H, 'Colormap', oldcmap); + set(H, 'Colormap', newcmap); + + %compute and set ColorSpec and CData properties + old = LocalUpdateColors(allColor, 'color', old); + old = LocalUpdateColors(allAxes, 'xcolor', old); + old = LocalUpdateColors(allAxes, 'ycolor', old); + old = LocalUpdateColors(allAxes, 'zcolor', old); + old = LocalUpdateColors(allMarker, 'MarkerEdgeColor', old); + old = LocalUpdateColors(allMarker, 'MarkerFaceColor', old); + old = LocalUpdateColors(allEdge, 'EdgeColor', old); + old = LocalUpdateColors(allEdge, 'FaceColor', old); + old = LocalUpdateColors(allCData, 'CData', old); + + case {'rgb','cmyk'} + if strncmp(opts.format,'eps',3) + opts.format = [opts.format 'c']; + args = {args{:}, ['-d' opts.format]}; + if strcmp(opts.color,'cmyk') + args = {args{:}, '-cmyk'}; + end + else + args = {args{:}, ['-d' opts.format]}; + end + otherwise + error('Invalid Color parameter'); + end + if (~isempty(opts.renderer)) + args = {args{:}, ['-' opts.renderer]}; + end + if (~isempty(opts.resolution)) | ~strncmp(opts.format,'eps',3) + if isempty(opts.resolution) + opts.resolution = 0; + end + args = {args{:}, ['-r' int2str(opts.resolution)]}; + end + + % Process font parameters + if ~isempty(opts.fontmode) + oldfonts = LocalGetAsCell(allFont,'FontSize'); + oldfontunits = LocalGetAsCell(allFont,'FontUnits'); + set(allFont,'FontUnits','points'); + switch (opts.fontmode) + case 'fixed' + if (opts.fontsize == -1) + set(allFont,'FontSize',opts.defaultfontsize); + else + set(allFont,'FontSize',opts.fontsize); + end + case 'scaled' + if (opts.fontsize == -1) + scale = sizescale; + else + scale = opts.fontsize; + end + newfonts = LocalScale(oldfonts,scale,opts.fontmin,opts.fontmax); + set(allFont,{'FontSize'},newfonts); + otherwise + error('Invalid FontMode parameter'); + end + old = LocalPushOldData(old, allFont, {'FontSize'}, oldfonts); + old = LocalPushOldData(old, allFont, {'FontUnits'}, oldfontunits); + end + if strcmp(opts.fontencoding,'adobe') & strncmp(opts.format,'eps',3) + args = {args{:}, '-adobecset'}; + end + + % Process line parameters + if ~isempty(opts.linemode) + oldlines = LocalGetAsCell(allMarker,'LineWidth'); + old = LocalPushOldData(old, allMarker, {'LineWidth'}, oldlines); + switch (opts.linemode) + case 'fixed' + if (opts.linewidth == -1) + set(allMarker,'LineWidth',opts.defaultlinewidth); + else + set(allMarker,'LineWidth',opts.linewidth); + end + case 'scaled' + if (opts.linewidth == -1) + scale = sizescale; + else + scale = opts.linewidth; + end + newlines = LocalScale(oldlines, scale, opts.linemin, opts.linemax); + set(allMarker,{'LineWidth'},newlines); + end + end + + % adjust figure bounds to surround axes + if strcmp(opts.bounds,'tight') + if (~strncmp(opts.format,'eps',3) & LocalHas3DPlot(allAxes)) | ... + (strncmp(opts.format,'eps',3) & opts.separatetext) + if (explicitbounds == 1) + warning(['Cannot compute ''tight'' bounds. Using ''loose''' ... + ' bounds.']); + end + opts.bounds = 'loose'; + end + end + warning('off'); + if ~isempty(allAxes) + if strncmp(opts.format,'eps',3) + if strcmp(opts.bounds,'loose') + args = {args{:}, '-loose'}; + end + old = LocalPushOldData(old,H,'Position', oldFigPos); + elseif strcmp(opts.bounds,'tight') + oldaunits = LocalGetAsCell(allAxes,'Units'); + oldapos = LocalGetAsCell(allAxes,'Position'); + oldtunits = LocalGetAsCell(allText,'units'); + oldtpos = LocalGetAsCell(allText,'Position'); + set(allAxes,'units','points'); + apos = LocalGetAsCell(allAxes,'Position'); + oldunits = get(H,'Units'); + set(H,'units','points'); + origfr = get(H,'position'); + fr = []; + for k=1:length(allAxes) + if ~strcmpi(get(allAxes(k),'Tag'),'legend') + axesR = apos{k}; + r = LocalAxesTightBoundingBox(axesR, allAxes(k)); + r(1:2) = r(1:2) + axesR(1:2); + fr = LocalUnionRect(fr,r); + end + end + if isempty(fr) + fr = [0 0 origfr(3:4)]; + end + for k=1:length(allAxes) + ax = allAxes(k); + r = apos{k}; + r(1:2) = r(1:2) - fr(1:2); + set(ax,'Position',r); + end + old = LocalPushOldData(old, allAxes, {'Position'}, oldapos); + old = LocalPushOldData(old, allText, {'Position'}, oldtpos); + old = LocalPushOldData(old, allText, {'Units'}, oldtunits); + old = LocalPushOldData(old, allAxes, {'Units'}, oldaunits); + old = LocalPushOldData(old, H, 'Position', oldFigPos); + old = LocalPushOldData(old, H, 'Units', oldFigureUnits); + r = [origfr(1) origfr(2)+origfr(4)-fr(4) fr(3:4)]; + set(H,'Position',r); + else + args = {args{:}, '-loose'}; + old = LocalPushOldData(old,H,'Position', oldFigPos); + end + end + + % Process text in a separate file if needed + if opts.separatetext & ~opts.applystyle + % First hide all text and export + oldtvis = LocalGetAsCell(allText,'visible'); + set(allText,'visible','off'); + oldax = LocalGetAsCell(allAxes,'XTickLabel',1); + olday = LocalGetAsCell(allAxes,'YTickLabel',1); + oldaz = LocalGetAsCell(allAxes,'ZTickLabel',1); + null = cell(length(oldax),1); + [null{:}] = deal([]); + set(allAxes,{'XTickLabel'},null); + set(allAxes,{'YTickLabel'},null); + set(allAxes,{'ZTickLabel'},null); + print(H, filename, args{:}); + set(allText,{'Visible'},oldtvis); + set(allAxes,{'XTickLabel'},oldax); + set(allAxes,{'YTickLabel'},olday); + set(allAxes,{'ZTickLabel'},oldaz); + % Now hide all non-text and export as eps in painters + [path, name, ext] = fileparts(filename); + tfile = fullfile(path,[name '_t.eps']); + tfile2 = fullfile(path,[name '_t2.eps']); + foundRenderer = 0; + for k=1:length(args) + if strncmp('-d',args{k},2) + args{k} = '-deps'; + elseif strncmp('-zbuffer',args{k},8) | ... + strncmp('-opengl', args{k},6) + args{k} = '-painters'; + foundRenderer = 1; + end + end + if ~foundRenderer + args = {args{:}, '-painters'}; + end + allNonText = [allLines; allLights; allPatch; ... + allImages; allSurf; allRect]; + oldvis = LocalGetAsCell(allNonText,'visible'); + oldc = LocalGetAsCell(allAxes,'color'); + oldaxg = LocalGetAsCell(allAxes,'XGrid'); + oldayg = LocalGetAsCell(allAxes,'YGrid'); + oldazg = LocalGetAsCell(allAxes,'ZGrid'); + [null{:}] = deal('off'); + set(allAxes,{'XGrid'},null); + set(allAxes,{'YGrid'},null); + set(allAxes,{'ZGrid'},null); + set(allNonText,'Visible','off'); + set(allAxes,'Color','none'); + print(H, tfile2, args{:}); + set(allNonText,{'Visible'},oldvis); + set(allAxes,{'Color'},oldc); + set(allAxes,{'XGrid'},oldaxg); + set(allAxes,{'YGrid'},oldayg); + set(allAxes,{'ZGrid'},oldazg); + %hack up the postscript file + fid1 = fopen(tfile,'w'); + fid2 = fopen(tfile2,'r'); + line = fgetl(fid2); + while ischar(line) + if strncmp(line,'%%Title',7) + fprintf(fid1,'%s\n',['%%Title: ', tfile]); + elseif (length(line) < 3) + fprintf(fid1,'%s\n',line); + elseif ~strcmp(line(end-2:end),' PR') & ... + ~strcmp(line(end-1:end),' L') + fprintf(fid1,'%s\n',line); + end + line = fgetl(fid2); + end + fclose(fid1); + fclose(fid2); + delete(tfile2); + + elseif ~opts.applystyle + drawnow; + print(H, filename, args{:}); + end + warning(oldwarn); + +catch + warning(oldwarn); + hadError = 1; +end + +% Restore figure settings +if opts.applystyle + varargout{1} = old; +else + for n=1:length(old.objs) + if ~iscell(old.values{n}) & iscell(old.prop{n}) + old.values{n} = {old.values{n}}; + end + set(old.objs{n}, old.prop{n}, old.values{n}); + end +end + +if hadError + error(deblank(lasterr)); +end + +% +% Local Functions +% + +function outData = LocalPushOldData(inData, objs, prop, values) +outData.objs = {objs, inData.objs{:}}; +outData.prop = {prop, inData.prop{:}}; +outData.values = {values, inData.values{:}}; + +function cellArray = LocalGetAsCell(fig,prop,allowemptycell); +cellArray = get(fig,prop); +if nargin < 3 + allowemptycell = 0; +end +if ~iscell(cellArray) & (allowemptycell | ~isempty(cellArray)) + cellArray = {cellArray}; +end + +function newArray = LocalScale(inArray, scale, minv, maxv) +n = length(inArray); +newArray = cell(n,1); +for k=1:n + newArray{k} = min(maxv,max(minv,scale*inArray{k}(1))); +end + +function gray = LocalMapToGray1(color) +gray = color; +if ischar(color) + switch color(1) + case 'y' + color = [1 1 0]; + case 'm' + color = [1 0 1]; + case 'c' + color = [0 1 1]; + case 'r' + color = [1 0 0]; + case 'g' + color = [0 1 0]; + case 'b' + color = [0 0 1]; + case 'w' + color = [1 1 1]; + case 'k' + color = [0 0 0]; + end +end +if ~ischar(color) + gray = 0.30*color(1) + 0.59*color(2) + 0.11*color(3); +end + +function newArray = LocalMapToGray(inArray); +n = length(inArray); +newArray = cell(n,1); +for k=1:n + color = inArray{k}; + if ~isempty(color) + color = LocalMapToGray1(color); + end + if isempty(color) | ischar(color) + newArray{k} = color; + else + newArray{k} = [color color color]; + end +end + +function newArray = LocalMapColorToStyle(inArray); +inArray = LocalGetAsCell(inArray,'Color'); +n = length(inArray); +newArray = cell(n,1); +styles = {'-','--',':','-.'}; +uniques = []; +nstyles = length(styles); +for k=1:n + gray = LocalMapToGray1(inArray{k}); + if isempty(gray) | ischar(gray) | gray < .05 + newArray{k} = '-'; + else + if ~isempty(uniques) & any(gray == uniques) + ind = find(gray==uniques); + else + uniques = [uniques gray]; + ind = length(uniques); + end + newArray{k} = styles{mod(ind-1,nstyles)+1}; + end +end + +function newArray = LocalMapCData(inArray); +n = length(inArray); +newArray = cell(n,1); +for k=1:n + color = inArray{k}; + if (ndims(color) == 3) & isa(color,'double') + gray = 0.30*color(:,:,1) + 0.59*color(:,:,2) + 0.11*color(:,:,3); + color(:,:,1) = gray; + color(:,:,2) = gray; + color(:,:,3) = gray; + end + newArray{k} = color; +end + +function outData = LocalUpdateColors(inArray, prop, inData) +value = LocalGetAsCell(inArray,prop); +outData.objs = {inData.objs{:}, inArray}; +outData.prop = {inData.prop{:}, {prop}}; +outData.values = {inData.values{:}, value}; +if (~isempty(value)) + if strcmp(prop,'CData') + value = LocalMapCData(value); + else + value = LocalMapToGray(value); + end + set(inArray,{prop},value); +end + +function bool = LocalIsPositiveScalar(value) +bool = isnumeric(value) & ... + prod(size(value)) == 1 & ... + value > 0; + +function value = LocalToNum(value,auto) +if ischar(value) + if strcmp(value,'auto') + value = auto; + else + value = str2num(value); + end +end + +%convert a struct to {field1,val1,field2,val2,...} +function c = LocalToCell(s) +f = fieldnames(s); +v = struct2cell(s); +opts = cell(2,length(f)); +opts(1,:) = f; +opts(2,:) = v; +c = {opts{:}}; + +function c = LocalIsHG(obj,hgtype) +c = 0; +if (length(obj) == 1) & ishandle(obj) + c = strcmp(get(obj,'type'),hgtype); +end + +function c = LocalHas3DPlot(a) +zticks = LocalGetAsCell(a,'ZTickLabel'); +c = 0; +for k=1:length(zticks) + if ~isempty(zticks{k}) + c = 1; + return; + end +end + +function r = LocalUnionRect(r1,r2) +if isempty(r1) + r = r2; +elseif isempty(r2) + r = r1; +elseif max(r2(3:4)) > 0 + left = min(r1(1),r2(1)); + bot = min(r1(2),r2(2)); + right = max(r1(1)+r1(3),r2(1)+r2(3)); + top = max(r1(2)+r1(4),r2(2)+r2(4)); + r = [left bot right-left top-bot]; +else + r = r1; +end + +function c = LocalLabelsMatchTicks(labs,ticks) +c = 0; +try + t1 = num2str(ticks(1)); + n = length(ticks); + tend = num2str(ticks(n)); + c = strncmp(labs(1),t1,length(labs(1))) & ... + strncmp(labs(n),tend,length(labs(n))); +end + +function r = LocalAxesTightBoundingBox(axesR, a) +r = []; +atext = findall(a,'type','text','visible','on'); +if ~isempty(atext) + set(atext,'units','points'); + res=LocalGetAsCell(atext,'extent'); + for n=1:length(atext) + r = LocalUnionRect(r,res{n}); + end +end +if strcmp(get(a,'visible'),'on') + r = LocalUnionRect(r,[0 0 axesR(3:4)]); + oldunits = get(a,'fontunits'); + set(a,'fontunits','points'); + label = text(0,0,'','parent',a,... + 'units','points',... + 'fontsize',get(a,'fontsize'),... + 'fontname',get(a,'fontname'),... + 'fontweight',get(a,'fontweight'),... + 'fontangle',get(a,'fontangle'),... + 'visible','off'); + fs = get(a,'fontsize'); + + % handle y axis tick labels + ry = [0 -fs/2 0 axesR(4)+fs]; + ylabs = get(a,'yticklabels'); + yticks = get(a,'ytick'); + maxw = 0; + if ~isempty(ylabs) + for n=1:size(ylabs,1) + set(label,'string',ylabs(n,:)); + ext = get(label,'extent'); + maxw = max(maxw,ext(3)); + end + if ~LocalLabelsMatchTicks(ylabs,yticks) & ... + strcmp(get(a,'xaxislocation'),'bottom') + ry(4) = ry(4) + 1.5*ext(4); + end + if strcmp(get(a,'yaxislocation'),'left') + ry(1) = -(maxw+5); + else + ry(1) = axesR(3); + end + ry(3) = maxw+5; + r = LocalUnionRect(r,ry); + end + + % handle x axis tick labels + rx = [0 0 0 fs+5]; + xlabs = get(a,'xticklabels'); + xticks = get(a,'xtick'); + if ~isempty(xlabs) + if strcmp(get(a,'xaxislocation'),'bottom') + rx(2) = -(fs+5); + if ~LocalLabelsMatchTicks(xlabs,xticks); + rx(4) = rx(4) + 2*fs; + rx(2) = rx(2) - 2*fs; + end + else + rx(2) = axesR(4); + % exponent is still below axes + if ~LocalLabelsMatchTicks(xlabs,xticks); + rx(4) = rx(4) + axesR(4) + 2*fs; + rx(2) = -2*fs; + end + end + set(label,'string',xlabs(1,:)); + ext1 = get(label,'extent'); + rx(1) = -ext1(3)/2; + set(label,'string',xlabs(size(xlabs,1),:)); + ext2 = get(label,'extent'); + rx(3) = axesR(3) + (ext2(3) + ext1(3))/2; + r = LocalUnionRect(r,rx); + end + set(a,'fontunits',oldunits); + delete(label); +end + +function c = LocalManualAxesMode(old, allAxes, base) +xs = ['X' base]; +ys = ['Y' base]; +zs = ['Z' base]; +oldXMode = LocalGetAsCell(allAxes,xs); +oldYMode = LocalGetAsCell(allAxes,ys); +oldZMode = LocalGetAsCell(allAxes,zs); +old = LocalPushOldData(old, allAxes, {xs}, oldXMode); +old = LocalPushOldData(old, allAxes, {ys}, oldYMode); +old = LocalPushOldData(old, allAxes, {zs}, oldZMode); +set(allAxes,xs,'manual'); +set(allAxes,ys,'manual'); +set(allAxes,zs,'manual'); +c = old; + +function val = LocalCheckAuto(val, auto) +if ischar(val) & strcmp(val,'auto') + val = auto; +end diff --git a/external/exportfig/previewfig.m b/external/exportfig/previewfig.m new file mode 100644 index 00000000..0e9276f1 --- /dev/null +++ b/external/exportfig/previewfig.m @@ -0,0 +1,49 @@ +function f = previewfig(h,varargin) +%PREVIEWFIG Preview a figure to be exported using EXPORTFIG. +% F = PREVIEWFIG(H) creates a preview of H with the default +% EXPORTFIG options and returns the preview's figure handle in F. +% F = PREVIEWFIG(H,OPTIONS) creates a preview with OPTIONS as +% described in EXPORTFIG. +% PREVIEWFIG(...,PARAM1,VAL1,PARAM2,VAL2,...) creates a preview +% with the specified parameter-value pairs to H as described in +% EXPORTFIG. +% +% See also EXPORTFIG, APPLYTOFIG, RESTOREFIG. + +% Copyright 2000 Ben Hinkle +% Email bug reports and comments to bhinkle@mathworks.com + +filename = [tempname, '.png']; +args = {'resolution',0,'format','png'}; +if nargin > 1 + exportfig(h, filename, varargin{:}, args{:}); +else + exportfig(h, filename, args{:}); +end + +X = imread(filename,'png'); +height = size(X,1); +width = size(X,2); +delete(filename); +f = figure( 'Name', 'Preview', ... + 'Menubar', 'none', ... + 'NumberTitle', 'off', ... + 'Visible', 'off'); +image(X); +axis image; +ax = findobj(f, 'type', 'axes'); +axesPos = [0 0 width height]; +set(ax, 'Units', 'pixels', ... + 'Position', axesPos, ... + 'Visible', 'off'); +figPos = get(f,'Position'); +rootSize = get(0,'ScreenSize'); +figPos(3:4) = axesPos(3:4); +if figPos(1) + figPos(3) > rootSize(3) + figPos(1) = rootSize(3) - figPos(3) - 50; +end +if figPos(2) + figPos(4) > rootSize(4) + figPos(2) = rootSize(4) - figPos(4) - 50; +end +set(f, 'Position',figPos, ... + 'Visible', 'on'); diff --git a/external/exportfig/restorefig.m b/external/exportfig/restorefig.m new file mode 100644 index 00000000..9f1d1880 --- /dev/null +++ b/external/exportfig/restorefig.m @@ -0,0 +1,20 @@ +function restorefig(h,old) +%RESTOREFIG Restore a figure's properties +% RESTOREFIG(H,OLD) restores the properties of H specified in +% OLD. The state-difference structure OLD is the output of the +% function APPLYTOFIG. Deleting object handles after the call to +% APPLYFIG might cause undesired behavior. +% +% See also EXPORTFIG, PREVIEWFIG, APPLYTOFIG. + +% Copyright 2000 Ben Hinkle +% Email bug reports and comments to bhinkle@mathworks.com + +for n=1:length(old.objs) + try + if ~iscell(old.values{n}) & iscell(old.prop{n}) + old.values{n} = {old.values{n}}; + end + set(old.objs{n}, old.prop{n}, old.values{n}); + end +end diff --git a/external/history.txt b/external/history.txt new file mode 100644 index 00000000..9d7da2d8 --- /dev/null +++ b/external/history.txt @@ -0,0 +1,27 @@ +Todo: + -faster meanshit code from vincent + + +Version 1.04 + -fixed display bug in kmeans2 + -changed behavior of gauss_smooth if extra sigmas specified + -tweaked playmovies + +Version 1.03 (03-May-06) + -this file is now a standard part of the documentation + -thanks to everyone who gave me comments and helped make this toolbox more useful! + -added imtranslate.m + -playmovie/playmovies backward/forward playback + -comment nonmaxsupr < vs <= + -compile problems 'toolbox_compile' + -tweaked feval_images / imwrite2 to make more resilient + -added to imnormalize + -added scales to jitterimage + -added imwrite2split (useful extension to imwrite2 for writing/reading from mul dirs) + -lots of other minor fixes that I should have recorded... + +Version 1.02 (29-Nov-05) + -filmstrip/filstrips + -principal is misspelled in the PCA-related functions. + -fixed clustermontages (header was stripped) + -updated overview (add to path, recompile, description) \ No newline at end of file diff --git a/external/m2html/@template/char.m b/external/m2html/@template/char.m new file mode 100644 index 00000000..51a2fdd9 --- /dev/null +++ b/external/m2html/@template/char.m @@ -0,0 +1,15 @@ +function s = char(tpl) +%TEMPLATE Convert a template object in a one line description string +% S = CHAR(TPL) is a class convertor from Template to a string, used +% in online display. +% +% See also DISPLAY + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/05/05 22:19:51 $ + +s = ['Template Object: root ''',... + tpl.root,''', ',... + num2str(length(tpl.file)), ' files, ',... + num2str(length(tpl.varkeys)), ' keys, ',... + tpl.unknowns, ' unknowns.']; diff --git a/external/m2html/@template/display.m b/external/m2html/@template/display.m new file mode 100644 index 00000000..62496673 --- /dev/null +++ b/external/m2html/@template/display.m @@ -0,0 +1,18 @@ +function display(tpl) +%TEMPLATE Display a template object in Matlab window +% DISPLAY(TPL) displays informations about the content of template +% object TPL: +% Template Object: root '.', 2 files, 9 keys, comment unknowns. +% root element of template files, number of template files, number of +% keywords defined and the way of handling unknowns tags. + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/05/05 22:19:51 $ + +disp(' '); +disp([inputname(1),' = ']); +disp(' '); +for i=1:prod(size(tpl)) + disp([blanks(length(inputname(1))+3) char(tpl(i))]); +end +disp(' '); diff --git a/external/m2html/@template/get.m b/external/m2html/@template/get.m new file mode 100644 index 00000000..944622f3 --- /dev/null +++ b/external/m2html/@template/get.m @@ -0,0 +1,50 @@ +function varargout = get(tpl,action,varargin) +%TEMPLATE/GET Access data stored in a Template object +% TPL = GET(TPL,ACTION,VARARGIN) +% ACTION 'var' +% ACTION 'undefined' + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/05/05 22:19:51 $ + +error(nargchk(2,3,nargin)); + +switch lower(action) + case 'var' + error(nargchk(2,3,nargin)); + if nargin == 2 + varargout{1} = tpl.varvals; + elseif iscellstr(varargin{1}) + varargout{1} = {}; + for i=1:length(varargin{1}) + key = find(ismember(tpl.varkeys,varargin{1}{i})); + if isempty(key) + %error('[Template] No such variable name.'); + varargout{1}{end+1} = ''; + else + varargout{1}{end+1} = tpl.varvals{key}; + end + end + elseif ischar(varargin{1}) + varargout{1} = char(get(tpl,'var',cellstr(varargin{1}))); + else + varargout{1} = ''; + end + case 'undefined' + error(nargchk(3,3,nargin)); + tpl = loadtpl(tpl,varargin{1}); + str = get(tpl,'var',varargin{1}); + varargout{1} = {}; + + %%%%%%%%%%%%%%%%%%%%%%%% WIH REGEXP ONLY %%%%%%%%%%%%%%%%%%%% + % [b, e] = regexp(str,'{[^ \t\r\n}]+}'); + % for i=1:length(b) + % if ~any(ismember(tpl.varkeys,str(b(i)+1:e(i)-1))) + % varargout{1}{end+1} = str(b(i)+1:e(i)-1); + % end + % end + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + otherwise + varargout{1} = finish(get(tpl,'var',action),tpl.unknowns); +end diff --git a/external/m2html/@template/parse.m b/external/m2html/@template/parse.m new file mode 100644 index 00000000..1473506f --- /dev/null +++ b/external/m2html/@template/parse.m @@ -0,0 +1,33 @@ +function [tpl, str] = parse(tpl,target,handle,append) +%TEMPLATE/PARSE Fill in replacement fields with the class properties +% [TPL, STR] = PARSE(TPL,TARGET,HANDLE) fills in the replacement field +% HANDLE using previously defined variables of template TPL and store +% it in field TARGET. HANDLE can also be a cell array of field names. +% Output is also provided in output STR (content of TARGET). +% [TPL, STR] = PARSE(TPL,TARGET,HANDLE,APPEND) allows to specify if +% TARGET field is reseted before being filled or if new content is +% appended to the previous one. + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/05/05 22:19:51 $ + +error(nargchk(3,4,nargin)); +if nargin == 3 + append = 0; +end + +if iscellstr(handle) + for i=1:length(handle) + [tpl, str] = subst(tpl,handle{i}); + tpl = set(tpl,'var',target,str); + end +elseif ischar(handle) + [tpl, str] = subst(tpl,handle); + if append + tpl = set(tpl,'var',target,[get(tpl,'var',target) str]); + else + tpl = set(tpl,'var',target,str); + end +else + error('[Template] Badly formed handle.'); +end diff --git a/external/m2html/@template/private/finish.m b/external/m2html/@template/private/finish.m new file mode 100644 index 00000000..eefc34f6 --- /dev/null +++ b/external/m2html/@template/private/finish.m @@ -0,0 +1,31 @@ +function str = finish(str,unknowns) +%TEMPLATE/FINISH Apply given strategy to unknown fields in a string +% STR = FINISH(STR,UNKNOWNS) applies on string STR the strategy defined +% in UNKNOWNS to unknowns fields '{UNKNOWNS_FIELDS}'. +% UNKNOWNS may be: +% * 'keep' to do nothing +% * 'remove' to remove all undefined fields +% * 'comment' to replace undefined fields by a warning HTML comment. +% This function uses Matlab REGEXPREP function coming with R13. If you +% hold an older version, please comment lines 38 and 42: then you can +% only apply the 'keep' strategy. + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/05/05 22:19:51 $ + +error(nargchk(2,2,nargin)); + +switch lower(unknowns) + case 'keep' + %- do nothing + case 'remove' + %%%%%%%%%%%%%%%%%%%%%%%% WIH REGEXP ONLY %%%%%%%%%%%%%%%%%%%% + % str = regexprep(str,'{[^ \t\r\n}]+}',''); + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + case 'comment' + %%%%%%%%%%%%%%%%%%%%%%%% WIH REGEXP ONLY %%%%%%%%%%%%%%%%%%%% + % str = regexprep(str,'{[^ \t\r\n}]+}',''); + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + otherwise + error('[Template] Unknown action.'); +end diff --git a/external/m2html/@template/private/loadtpl.m b/external/m2html/@template/private/loadtpl.m new file mode 100644 index 00000000..9bc2edb7 --- /dev/null +++ b/external/m2html/@template/private/loadtpl.m @@ -0,0 +1,24 @@ +function tpl = loadtpl(tpl,handle) +%TEMPLATE/LOADTPL Read a template from file +% TPL = LOADTPL(TPL,HANDLE) read the template file associated with the +% handle HANDLE in the template TPL and store it in the variable HANDLE. + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/05/05 22:19:51 $ + +if ~isempty(get(tpl,'var',handle)) + return; +else + ind = find(ismember(tpl.handles,handle)); + if isempty(ind) + error('[Template] No such template handle.'); + else + filename = tpl.file{ind}; + [fid, errmsg] = fopen(filename,'rt'); + if ~isempty(errmsg) + error(sprintf('Cannot open template file %s.',filename)); + end + tpl = set(tpl,'var',handle,fscanf(fid,'%c')); + fclose(fid); + end +end diff --git a/external/m2html/@template/private/subst.m b/external/m2html/@template/private/subst.m new file mode 100644 index 00000000..4bbcef06 --- /dev/null +++ b/external/m2html/@template/private/subst.m @@ -0,0 +1,14 @@ +function [tpl, str] = subst(tpl,handle) +%TEMPLATE/SUBST Substitute a replacement field by its value +% STR = SUBST(TPL,HANDLE) substitute all the known fields of variable HANDLE +% in the template TPL. + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/05/05 22:19:51 $ + +tpl = loadtpl(tpl,handle); + +str = get(tpl,'var',handle); +for i=1:length(tpl.varkeys) + str = strrep(str, strcat('{',tpl.varkeys{i},'}'), tpl.varvals{i}); +end diff --git a/external/m2html/@template/set.m b/external/m2html/@template/set.m new file mode 100644 index 00000000..f0ffa887 --- /dev/null +++ b/external/m2html/@template/set.m @@ -0,0 +1,110 @@ +function tpl = set(tpl,action,varargin) +%TEMPLATE/SET Edit data stored in a Template object +% TPL = SET(TPL,ACTION,VARARGIN) +% ACTION 'root' +% ACTION 'unknowns' +% ACTION 'file' +% ACTION 'block' +% ACTION 'var' + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/05/05 22:19:51 $ + +error(nargchk(3,5,nargin)); + +switch lower(action) + case 'root' + error(nargchk(3,3,nargin)); + if exist(varargin{1},'dir') + tpl.root = varargin{1}; + else + error('[Template] No such directory.'); + end + case 'unknowns' + error(nargchk(3,3,nargin)); + if ismember(varargin{1},{'remove' 'comment' 'keep'}) + tpl.unknowns = varargin{1}; + else + error('[Template] Unknowns: ''remove'', ''comment'' or ''keep''.'); + end + case 'file' + error(nargchk(4,4,nargin)); + if iscellstr(varargin{1}) + for i=1:length(varargin{1}) + ind = find(ismember(tpl.handles,varargin{1}{i})); + if isempty(ind) + tpl.handles{end+1} = varargin{1}{i}; + if strcmp(varargin{2}{i}(1),filesep) %- absolute path (Unix) + tpl.file{end+1} = varargin{2}{i}; + else %- relative path + tpl.file{end+1} = fullfile(tpl.root,varargin{2}{i}); + end + else + if strcmp(varargin{2}{i}(1),filesep) %- absolute path (Unix) + tpl.file{ind} = varargin{2}{i}; + else %- relative path + tpl.file{ind} = fullfile(tpl.root,varargin{2}{i}); + end + end + end + elseif ischar(varargin{1}) + tpl = set(tpl,'file',cellstr(varargin{1}),cellstr(varargin{2})); + else + error('[Template] Badly formed handles.'); + end + case 'block' + error(nargchk(4,5,nargin)); + tpl = loadtpl(tpl,varargin{1}); + if nargin == 4 + name = varargin{2}; + else + name = varargin{3}; + end + str = get(tpl,'var',varargin{1}); + blk = ''; + %- look like this (keep the same number (1) of spaces between characters!) + % + % + + %%%%%%%%%%%%%%%%%%%%%%%%% WIH REGEXP %%%%%%%%%%%%%%%%%%%%%%%% + % reg = ['(.*)\n\s*']; + % [b, e] = regexp(str,reg,'once'); + % if ~isempty(b), blk = str(b:e); end %- should also remove BEGIN and END comments + % str = regexprep(str,reg,['{' name '}']); + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %%%%%%%%%%%%%%%%%%%%%% WIHTOUT REGEXP %%%%%%%%%%%%%%%%%%%%%%% + indbegin = findstr(str,['']); + indend = findstr(str,['']); + if ~isempty(indbegin) & ~isempty(indend) + blk = str(indbegin+length([''])+1:indend-1); + str = [str(1:indbegin-1) '{' name '}' str(indend+length([''])+1:end)]; + end + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + tpl = set(tpl,'var',varargin{2},blk); + tpl = set(tpl,'var',varargin{1},str); + case 'var' + error(nargchk(3,4,nargin)); + if iscellstr(varargin{1}) + for i=1:length(varargin{1}) + ind = find(ismember(tpl.varkeys,varargin{1}{i})); + if isempty(ind) + tpl.varkeys{end+1} = varargin{1}{i}; + if nargin == 4 + tpl.varvals{end+1} = varargin{2}{i}; + else + tpl.varvals{end+1} = ''; + end + else + tpl.varvals{ind} = varargin{2}{i}; + end + end + elseif ischar(varargin{1}) + tpl = set(tpl,'var',cellstr(varargin{1}),cellstr(varargin{2})); + else + error('[Template] Badly formed variable names.'); + end + otherwise + error('[Template] Unknown action to perform.'); +end diff --git a/external/m2html/@template/template.m b/external/m2html/@template/template.m new file mode 100644 index 00000000..24931c2d --- /dev/null +++ b/external/m2html/@template/template.m @@ -0,0 +1,47 @@ +function tpl = template(root,unknowns) +%TEMPLATE HTML Template Toolbox Constructor +% TPL = TEMPLATE returns a template object using default values for the +% root path of the template files ('.') and for the way of handling unknown +% replacement fields (default is 'remove'). +% TPL = TEMPLATE(ROOT) allows to specify the root path of the template files +% that will then be provided relative to this path. +% TPL = TEMPLATE(ROOT,UNKNOWNS) also allows to specify the strategy to apply +% to unkown fields. UNKNOWNS may be: +% * 'keep' to do nothing +% * 'remove' to remove all undefined fields +% * 'comment' to replace undefined fields by a warning HTML comment. +% +% The template class allows you to keep your HTML code in some external +% files which are completely free of Matlab code, but contain replacement +% fields. The class provides you with functions which can fill in the +% replacement fields with arbitrary strings. These strings can become very +% large, e.g. entire tables. +% See the PHPLib: +% See also GET, SET, PARSE + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/05/05 22:19:51 $ + +error(nargchk(0,2,nargin)); + +switch nargin + case 0 + tpl = struct('root','.',... + 'file',{{}},... + 'handles',{{}},... + 'varkeys',{{}},... + 'varvals',{{}},... + 'unknowns','remove'); + tpl = class(tpl,'template'); + case 1 + if isa(root,'template') + tpl = root; + else + tpl = template; + tpl = set(tpl,'root',root); + end + case 2 + tpl = template; + tpl = set(tpl,'root',root); + tpl = set(tpl,'unknowns',unknowns); +end diff --git a/external/m2html/Changelog b/external/m2html/Changelog new file mode 100644 index 00000000..7dd3bbe9 --- /dev/null +++ b/external/m2html/Changelog @@ -0,0 +1,54 @@ +M2HTML Release 1.4 (2004/05/05): +================================ + +Changes: + - a warning is printed if the HTML index file is going to overwrite an HTML M-file + - 'load' parameter can be a MAT-file (m2html.mat) or the HTML output directory + - added 'rootdir' and 'language' fields in options, for further use + (=> previously saved mat-files may appear incomplete) + +New features: + - PHP search engine available (but slow search index generation) in beta version. + works as a Matlab offline search engine + - full dependency graph output when 'graph' and 'global' options are 'on' + - Graphical User Interface in beta version + +Bug fixes: + - corrected the checking of template files (...) (thanks Peter) + - added a call to when writing "purpose" to escape HTML entities + - detected a bug with on Matlab R13: display of a warning + - added quotes around 'dot_exec' to handle white spaces (thanks Mattias) + - a default 'mex' icon is displayed even if no source code is found + - replaced strtok delimiter [9:13 32 '('] by [9:13 32 40] + +M2HTML Release 1.3 (2003/10/26): +================================ + +Changes: + - default input M-files ('mFiles') are now the M-files found in the direct + subdirectories of the current directory (pwd). + - default output directory ('htmlDir') is now 'doc' + - added link to online tutorial in m2html help + - modified for an optional search engine + - added a javascript to redirect to frame index in frame's + +New features: + - added an optional download link for each M-file + - added for a future search engine + - added (idem) + - added (idem) + - added and in templates (idem) + - added in templates for Pre-Parsed Pseudo-code files (P-files) + - added and for a future GUI front-end + +Bug fixes: + - added 't' permission when reading/writing files + - rewrote subfunction to handle behaviour + - return a specific warning if an argument of 'mFiles' is a full path + - handle white spaces in directories name + +M2HTML Release 1.2 (2003/08/31): +================================ + +Available for download on Matlab Central (2003-10-05): + diff --git a/external/m2html/Contents.m b/external/m2html/Contents.m new file mode 100644 index 00000000..31ab303f --- /dev/null +++ b/external/m2html/Contents.m @@ -0,0 +1,21 @@ +% M2HTML Toolbox - A Documentation Generator for Matlab in HTML +% Version 1.4 16-Jun-2004 +% +% M2HTML main functions. +% m2html - Documentation System for Matlab M-files in HTML. +% mdot - Wrapper to GraphViz's for dependency graphs. +% mwizard - Graphical user interface for m2html. +% private - Internal functions. +% +% Template toolbox. +% @template - HTML template class +% +% Templates files. +% templates/blue - Default HTML template. +% templates/frame - Identical to but using frames. +% +% Others. +% Changelog, GPL, INSTALL, LICENSE, README, TODO. + +% Copyright (C) 2003-2005 Guillaume Flandin +% $Revision: 1.4 $Date: 2004/06/16 12:45:24 $ diff --git a/external/m2html/GPL b/external/m2html/GPL new file mode 100644 index 00000000..507aa1d7 --- /dev/null +++ b/external/m2html/GPL @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/external/m2html/INSTALL b/external/m2html/INSTALL new file mode 100644 index 00000000..5af5d44f --- /dev/null +++ b/external/m2html/INSTALL @@ -0,0 +1,32 @@ + M2HTML - Documentation System for Matlab .m files in HTML + ========================================================= + + 0/ Requirements: + - Matlab 5.3 or above + - Operating system: any. + + 1/ Download the latest m2html.zip on this website: + + + 2/ Extract files in your Matlab Repository /home/foo/matlab/ : + unzip m2html.zip + + 3/ Add the m2html directory in your Matlab path: + addpath /home/foo/matlab/m2html/ + + 5/ Ready to use ! + help m2html + + Please read the README file. + A tutorial and a FAQ (Frequently Asked Questions) are available online at: + + + + If you want to generate dependency graphs, you need to install GraphViz (a + graph visualization software), free and cross-platform, from: + + + ------------------------------------------------------------------------------- + Matlab is a Registered Trademark of The Mathworks, Inc. + + Copyright (C) 2003-2005 Guillaume Flandin diff --git a/external/m2html/LICENSE b/external/m2html/LICENSE new file mode 100644 index 00000000..36cfe031 --- /dev/null +++ b/external/m2html/LICENSE @@ -0,0 +1,16 @@ + M2HTML - Documentation System for Matlab .m files in HTML + Copyright (C) 2003-2005 Guillaume Flandin + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation Inc, 59 Temple Pl. - Suite 330, Boston, MA 02111-1307, USA. diff --git a/external/m2html/README b/external/m2html/README new file mode 100644 index 00000000..9c1304b7 --- /dev/null +++ b/external/m2html/README @@ -0,0 +1,122 @@ + M2HTML - Documentation System for Matlab .m files in HTML + ========================================================= + + Copyright (C) 2003-2005 Guillaume Flandin + http://www.artefact.tk/software/matlab/m2html/ + + This toolbox is intended to provide automatic generation of M-files + documentation in HTML. It reads each M-file in a set of directories + (eventually recursively) to produce a corresponding HTML file containing + synopsis, H1 line, help, function calls and called functions with + hypertext links, syntax highlighted source code with hypertext, ... + + Here is a summary of the features of the toolbox: + o extraction of H1 lines and help of each function + o hypertext documentation with functions calls and called functions + o extraction of subfunctions (hypertext links) + o ability to work recursively over the subdirectories of a file tree + o ability to choose whether the source code must be included or not + o syntax highlighting of the source code (as in the Matlab Editor) + o ability to choose HTML index file name and extension + o automatic creation of a TODO list (using % TODO % syntax) + o "skins": fully customizable output thanks to HTML templates (see below) + + M2HTML may be particularly useful if you want to study code written by + someone else (a downloaded toolbox, ...) because you will obtain an + hypertext documentation in which you can easily walk through, thanks + to your web browser. + + INSTALLATION + ============ + + Please read the INSTALL file for installation instructions. + + LICENSE + ======= + + Please read the LICENSE file for license details. + + TUTORIAL + ======== + + Note that a tutorial is available online at: + + as well as a Frequently Asked Questions repository: + + + An *important* thing to take care is the Matlab current directory: m2html + must be launched one directory above the directory your wanting to generate + documentation for. + For example, imagine your Matlab code is in the directory /home/foo/matlab/ + (or C:\foo\matlab\ on Windows), then you need to go in the foo directory: + + >> cd /home/foo % (or cd C:\foo on Windows) + Then you can launch m2html with the command: + + >> m2html('mfiles','matlab', 'htmldir','doc'); + + It will populate all the m-files just within the 'matlab' directory, will parse + them and then will write in the newly created 'doc' directory (/home/foo/doc/, + resp., C:\foot\doc\) an HTML file for each M-file. + + You can also specify several subdirectories using a cell array of directories: + + >> m2html('mfiles',{'matlab/signal' 'matlab/image'}, 'htmldir','doc'); + + If you want m2html to walk recursively within the 'matlab' directory then you + need to set up the recursive option: + + >> m2html('mfiles','matlab', 'htmldir','doc', 'recursive','on'); + + You can also specify whether you want the source code to be displayed in the + HTML files (do you want the source code to be readable from everybody ?): + + >> m2html('mfiles','matlab', 'htmldir','doc', 'source','off'); + + You can also specify whether you want global hypertext links (links among + separate Matlab directories). By default, hypertext links are only among + functions in the same directory (be aware that setting this option may + significantly slow down the process). + + >> m2html('mfiles','matlab', 'htmldir','doc', 'global','on'); + + Other parameters can be tuned for your documentation, see the M2HTML help: + + >> help m2html + + CUSTOMIZATION + ============= + + This toolbox uses the HTML Template class so that you can fully customize the + output. You can modify .tpl files in templates/blue/ or create new templates + in a new directory (templates/othertpl) + You can then use the newly created template in specifying it: + + >> m2html( ... , 'template','othertpl'); + + M2HTML will use your .tpl files (master, mdir, mfile, graph, search and + todo.tpl) and will copy all the other files (CSS, images, ....) in the root + directory of the HTML documentation. + + See the template class documentation for more details. + + + + Using templates, you can obtain a frame version of the documentation. + (I don't like frames but it can be useful for documentation purpose with one + frame with functions list and another with selected function description) + To do so, use M2HTML like this (*delete* a previous documentation): + + >> m2html( ... , 'template','frame', 'index','menu'); + + You need to specify a new HTML index basename because index.html is used + by the template system as the frame index. So if your HTML extension is not + '.html' you need to rename the file template/frame/index.html to your needs. + Furthermore, 'menu' then becomes a M2HTML keyword and a function cannot have + this name (if it is your case, use another keyword in the M2HTML syntax and + modify the content of the file template/frame/index.html accordingly). + + ------------------------------------------------------------------------------- + Matlab is a Registered Trademark of The Mathworks, Inc. + + Copyright (C) 2003-2005 Guillaume Flandin diff --git a/external/m2html/TODO b/external/m2html/TODO new file mode 100644 index 00000000..82d36214 --- /dev/null +++ b/external/m2html/TODO @@ -0,0 +1,95 @@ + M2HTML - Documentation System for Matlab .m files in HTML + ========================================================= + + Wish list: + ========== + o special handling of Matlab classes and private directories + o special handling of Java code + o special handling of MEX files (C/C++ or Fortran) and P-files + o special handling of Simulink (*.mdl) files (see load_system,open_system,get/set_param) + o PDF output (LaTeX), Rich Text Format (RTF) output ? + o search engine (in PHP, following Doxygen) + o Javascript menu for lists of files (http://www.treemenu.com/ or http://www.treeview.net/) + o detect urls (http, ftp) and mailto in source code and create links + o 'previous function' and 'next function' links in templates + o special template compatible with Matlab helpwin + o create another template example looking like Chora (http://cvs.php.net/) + o do not display any list in cross-references if empty + o set H1 to the first *not empty* line in help + o hierarchical graph of directories ? + o list of used keywords using ? + o use in to distinguish functions or variables + with same names and other subtilities + o 'end' is sometimes badly identified (end,:) or (2:end,1) + o detect 'Usage' or 'Syntax' in help + o if 'download' on and 'recursive' on, if m2html launched twice, if htmldir + in mfiles, then it will also document m-files to be downloaded... + o copyfile may wait for a if the file still exists (on Linux) + + optional link to original M-file (implemented with copies of M-files, maybe + a link to their original location would be enough (but not 'portable'). + o creation of the output directories may be buggy because of which + also check the existence in the Matlab path (never observed bug at that time) + o add a 'rootdir' option like in to specify the output dir (pwd). + + if 'global' and 'graph' are 'on', then there should be a link in master + directory file for a full dependency graph with hypertext links + o build a graphical interface for the fill in of the arguments. + o toolbbar icons for the GUI should be saved in m2htmltoolbarimages.mat + in a struct array with fields as help, new, open, save, wheel, ... + (as in camtoolbarimages.mat) + o lines should have an anchor so that ToDO links go + directly to the requested line + o H1Lines in A HREF title are printed without using to escape reserved + characters (this bug may appear everywhere text is sent to output without calling + on it. + o would be great if using written functions, it would be possible to write a function + that would return a .tex file containing documentation of a single file, or maybe + there should be a M2LaTeX that would do the same as m2html + o add a page with source code statistics : nb folders, classes, files, functions, lines + o allow to add options when calling (resize image output, etc) + o support different languages (english, french, german, ...) + o remove : only used for debug purpose, replaced by + o explain in the online tutorial / FAQ how does the PHP search engine work + o Bugs in the search index with upper/lower case ? + o explain in the online tutorial the several ways to give parameters : struct, key/value + and the possibility of using short keys as in get/set + + .map file created with the full dependency graph does not handle directory changes + + prevent or display a warning when an html matlab file overwrite the 'index' file + o explain in FAQ what to do when a warning index file overwritten appears... + o creating a ToDo list including all the directories rather than only one by directory + o See Also functions are with hypertext only if in the same directory : should be hypertexted + when 'global' is on + o Add an option to automatically generate a Contents.m file in M-files directory + o ability to parse template headers as proposed by Denis Gilbert ? + o See if or or or might be useful for 'search' + o Modify call to overcome the Matlab bug: + http://www.mathworks.com/support/solutions/data/1-1B5JY.html + o See what to do with new R14 functions : , ... + o should I move in the private folder ? + o extract LateX string in code and display them as images using from MatlabCentral + (or use MathML) + o see http://www.mathworks.com/support/solutions/data/1-18U6Q.html?solution=1-18U6Q + for adding third-party documentation to the MATLAB Help System and generate index.db + + check that the command line invoking dot works with directories with spaces => added "" + + Matlab 7 has an old dot version (1.8) which does not handle png : add in FAQ what to do... + o there's a bug remaining with space handling in directories name + on Unix, one can use '\' to escape them. See what to do on Windows. + o get dependencies from callbacks in GUI ('Callback', 'ClickedCallback', 'CreateFcn', 'DeleteFcn', + 'OffCallback', 'OnCallback')... + o replace 'exist(c) == 2' by 'exist(c,'file')' and 'exist(d,'dir')' + to work with files and directories which have same name as built-in + (thanks to Alois Schloegl). Need to do it everywhere is used ? + Reverted for the moment because it then didn't work properly for unknown reasons. + o propose to split long lines with '...' (see from Michael Wild) + o have a look to 'SubFuns' in MatlabCentral, and hyperlinks in the command window (matlab7) + o handle preprocessor statements used by the Matlab Compiler (from Robert van Kuijk) + %#function checkconn checkinput checknargin + o remove the last call (to find other Matlab-specific files) + o use 'matlab:' as a protocol to launch Matlab code from a browser + o create a to integrate in the Matlab help system (request from Stefan Mangard) + o label object directories '@something' a class and inside functions methods. + o group functions using structure provided in (request from Stefan Mangard) + + ------------------------------------------------------------------------------- + Matlab is a Registered Trademark of The Mathworks, Inc. + + Copyright (C) 2003-2005 Guillaume Flandin diff --git a/external/m2html/m2html.m b/external/m2html/m2html.m new file mode 100644 index 00000000..0f444962 --- /dev/null +++ b/external/m2html/m2html.m @@ -0,0 +1,1405 @@ +function m2html(varargin) +%M2HTML - Documentation Generator for Matlab M-files and Toolboxes in HTML +% M2HTML by itself generates an HTML documentation of the Matlab M-files found +% in the direct subdirectories of the current directory. HTML files are +% written in a 'doc' directory (created if necessary). All the others options +% are set to default (in brackets in the following). +% M2HTML('PropertyName1',PropertyValue1,'PropertyName2',PropertyValue2,...) +% sets multiple option values. The list of option names and default values is: +% o mFiles - Cell array of strings or character array containing the +% list of M-files and/or directories of M-files for which an HTML +% documentation will be built (use relative paths without backtracking). +% Launch M2HTML one directory above the directory your wanting to +% generate documentation for [ ] +% o htmlDir - Top level directory for generated HTML files [ 'doc' ] +% o recursive - Process subdirectories recursively [ on | {off} ] +% o source - Include Matlab source code in the generated documentation +% [ {on} | off ] +% o download - Add a link to download each M-file separately [ on | {off} ] +% o syntaxHighlighting - Source Code Syntax Highlighting [ {on} | off ] +% o tabs - Replace '\t' (horizontal tab) in source code by n white space +% characters [ 0 ... {4} ... n ] +% o globalHypertextLinks - Hypertext links among separate Matlab +% directories [ on | {off} ] +% o todo - Create a TODO list in each directory summarizing all the +% '% TODO %' lines found in Matlab code [ on | {off}] +% o graph - Compute a dependency graph using GraphViz [ on | {off}] +% 'dot' required, see +% o indexFile - Basename of the HTML index file [ 'index' ] +% o extension - Extension of generated HTML files [ '.html' ] +% o template - HTML template name to use [ {'blue'} | 'frame' | ... ] +% o search - Add a PHP search engine [ on | {off}] - beta version! +% o save - Save current state after M-files parsing in 'm2html.mat' +% in directory htmlDir [ on | {off}] +% o load - Load a previously saved '.mat' M2HTML state to generate HTML +% files once again with possibly other options [ ] +% o verbose - Verbose mode [ {on} | off ] +% +% For more information, please read the M2HTML tutorial and FAQ at: +% +% +% Examples: +% >> m2html('mfiles','matlab', 'htmldir','doc'); +% >> m2html('mfiles',{'matlab/signal' 'matlab/image'}, 'htmldir','doc'); +% >> m2html('mfiles','matlab', 'htmldir','doc', 'recursive','on'); +% >> m2html('mfiles','mytoolbox', 'htmldir','doc', 'source','off'); +% >> m2html('mfiles','matlab', 'htmldir','doc', 'global','on'); +% >> m2html( ... , 'template','frame', 'index','menu'); +% +% See also MWIZARD, MDOT, TEMPLATE. + +% Copyright (C) 2005 Guillaume Flandin +% $Revision: 1.5 $Date: 2005/04/29 16:04:17 $ + +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License +% as published by the Free Software Foundation; either version 2 +% of the License, or any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation Inc, 59 Temple Pl. - Suite 330, Boston, MA 02111-1307, USA. + +% Suggestions for improvement and fixes are always welcome, although no +% guarantee is made whether and when they will be implemented. +% Send requests to Guillaume@artefact.tk + +% For tips on how to write Matlab code, see: +% * MATLAB Programming Style Guidelines, by R. Johnson: +% +% * For tips on creating help for your m-files 'type help.m'. +% * Matlab documentation on M-file Programming: +% + +% This function uses the Template class so that you can fully customize +% the output. You can modify .tpl files in templates/blue/ or create new +% templates in a new directory. +% See the template class documentation for more details. +% + +% Latest information on M2HTML is available on the web through: +% + +% Other Matlab to HTML converters available on the web: +% 1/ mat2html.pl, J.C. Kantor, in Perl, 1995: +% +% 2/ htmltools, B. Alsberg, in Matlab, 1997: +% +% 3/ mtree2html2001, H. Pohlheim, in Perl, 1996, 2001: +% +% 4/ MatlabToHTML, T. Kristjansson, binary, 2001: +% +% 5/ Highlight, G. Flandin, in Matlab, 2003: +% +% 6/ mdoc, P. Brinkmann, in Matlab, 2003: +% +% 7/ Ocamaweb, Miriad Technologies, in Ocaml, 2002: +% +% 8/ Matdoc, M. Kaminsky, in Perl, 2003: +% +% 9/ Matlab itself, The Mathworks Inc, with HELPWIN, DOC and PUBLISH (R14) + +%------------------------------------------------------------------------------- +%- Set up options and default parameters +%------------------------------------------------------------------------------- +t0 = clock; % for statistics +msgInvalidPair = 'Bad value for argument: ''%s'''; + +options = struct('verbose', 1,... + 'mFiles', {{'.'}},... + 'htmlDir', 'doc',... + 'recursive', 0,... + 'source', 1,... + 'download',0,... + 'syntaxHighlighting', 1,... + 'tabs', 4,... + 'globalHypertextLinks', 0,... + 'graph', 0,... + 'todo', 0,... + 'load', 0,... + 'save', 0,... + 'search', 0,... + 'helptocxml', 0,... + 'indexFile', 'index',... + 'extension', '.html',... + 'template', 'blue',... + 'rootdir', pwd,... + 'language', 'english'); + +if nargin == 1 & isstruct(varargin{1}) + paramlist = [ fieldnames(varargin{1}) ... + struct2cell(varargin{1}) ]'; + paramlist = { paramlist{:} }; +else + if mod(nargin,2) + error('Invalid parameter/value pair arguments.'); + end + paramlist = varargin; +end + +optionsnames = lower(fieldnames(options)); +for i=1:2:length(paramlist) + pname = paramlist{i}; + pvalue = paramlist{i+1}; + ind = strmatch(lower(pname),optionsnames); + if isempty(ind) + error(['Invalid parameter: ''' pname '''.']); + elseif length(ind) > 1 + error(['Ambiguous parameter: ''' pname '''.']); + end + switch(optionsnames{ind}) + case 'verbose' + if strcmpi(pvalue,'on') + options.verbose = 1; + elseif strcmpi(pvalue,'off') + options.verbose = 0; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'mfiles' + if iscellstr(pvalue) + options.mFiles = pvalue; + elseif ischar(pvalue) + options.mFiles = cellstr(pvalue); + else + error(sprintf(msgInvalidPair,pname)); + end + options.load = 0; + case 'htmldir' + if ischar(pvalue) + if isempty(pvalue), + options.htmlDir = '.'; + else + options.htmlDir = pvalue; + end + else + error(sprintf(msgInvalidPair,pname)); + end + case 'recursive' + if strcmpi(pvalue,'on') + options.recursive = 1; + elseif strcmpi(pvalue,'off') + options.recursive = 0; + else + error(sprintf(msgInvalidPair,pname)); + end + options.load = 0; + case 'source' + if strcmpi(pvalue,'on') + options.source = 1; + elseif strcmpi(pvalue,'off') + options.source = 0; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'download' + if strcmpi(pvalue,'on') + options.download = 1; + elseif strcmpi(pvalue,'off') + options.download = 0; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'syntaxhighlighting' + if strcmpi(pvalue,'on') + options.syntaxHighlighting = 1; + elseif strcmpi(pvalue,'off') + options.syntaxHighlighting = 0; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'tabs' + if pvalue >= 0 + options.tabs = pvalue; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'globalhypertextlinks' + if strcmpi(pvalue,'on') + options.globalHypertextLinks = 1; + elseif strcmpi(pvalue,'off') + options.globalHypertextLinks = 0; + else + error(sprintf(msgInvalidPair,pname)); + end + options.load = 0; + case 'graph' + if strcmpi(pvalue,'on') + options.graph = 1; + elseif strcmpi(pvalue,'off') + options.graph = 0; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'todo' + if strcmpi(pvalue,'on') + options.todo = 1; + elseif strcmpi(pvalue,'off') + options.todo = 0; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'load' + if ischar(pvalue) + if exist(pvalue) == 7 % directory provided + pvalue = fullfile(pvalue,'m2html.mat'); + end + try + load(pvalue); + catch + error(sprintf('Unable to load %s.', pvalue)); + end + options.load = 1; + [dummy options.template] = fileparts(options.template); + else + error(sprintf(msgInvalidPair,pname)); + end + case 'save' + if strcmpi(pvalue,'on') + options.save = 1; + elseif strcmpi(pvalue,'off') + options.save = 0; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'search' + if strcmpi(pvalue,'on') + options.search = 1; + elseif strcmpi(pvalue,'off') + options.search = 0; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'helptocxml' + if strcmpi(pvalue,'on') + options.helptocxml = 1; + elseif strcmpi(pvalue,'off') + options.helptocxml = 0; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'indexfile' + if ischar(pvalue) + options.indexFile = pvalue; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'extension' + if ischar(pvalue) & pvalue(1) == '.' + options.extension = pvalue; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'template' + if ischar(pvalue) + options.template = pvalue; + else + error(sprintf(msgInvalidPair,pname)); + end + case 'language' + if ischar(pvalue) + options.language = pvalue; + else + error(sprintf(msgInvalidPair,pname)); + end + otherwise + error(['Invalid parameter: ''' pname '''.']); + end +end + +%------------------------------------------------------------------------------- +%- Get template files location +%------------------------------------------------------------------------------- +s = fileparts(which(mfilename)); +options.template = fullfile(s,'templates',options.template); +if exist(options.template) ~= 7 + error('[Template] Unknown template.'); +end + +%------------------------------------------------------------------------------- +%- Get list of M-files +%------------------------------------------------------------------------------- +if ~options.load + if strcmp(options.mFiles,'.') + d = dir(pwd); d = {d([d.isdir]).name}; + options.mFiles = {d{~ismember(d,{'.' '..'})}}; + end + mfiles = getmfiles(options.mFiles,{},options.recursive); + if ~length(mfiles), fprintf('Nothing to be done.\n'); return; end + if options.verbose, + fprintf('Found %d M-files.\n',length(mfiles)); + end + mfiles = sort(mfiles); % sort list of M-files in dictionary order +end + +%------------------------------------------------------------------------------- +%- Get list of (unique) directories and (unique) names +%------------------------------------------------------------------------------- +if ~options.load + mdirs = {}; + names = {}; + for i=1:length(mfiles) + [mdirs{i}, names{i}] = fileparts(mfiles{i}); + if isempty(mdirs{i}), mdirs{i} = '.'; end + end + + mdir = unique(mdirs); + if options.verbose, + fprintf('Found %d unique Matlab directories.\n',length(mdir)); + end + + name = names; + %name = unique(names); % output is sorted + %if options.verbose, + % fprintf('Found %d unique Matlab files.\n',length(name)); + %end +end + +%------------------------------------------------------------------------------- +%- Create output directory, if necessary +%------------------------------------------------------------------------------- +if isempty(dir(options.htmlDir)) + %- Create the top level output directory + if options.verbose + fprintf('Creating directory %s...\n',options.htmlDir); + end + if options.htmlDir(end) == filesep, + options.htmlDir(end) = []; + end + [pathdir, namedir] = fileparts(options.htmlDir); + if isempty(pathdir) + [status, msg] = mkdir(escapeblank(namedir)); + else + [status, msg] = mkdir(escapeblank(pathdir), escapeblank(namedir)); + end + if ~status, error(msg); end +end + +%------------------------------------------------------------------------------- +%- Get synopsis, H1 line, script/function, subroutines, cross-references, todo +%------------------------------------------------------------------------------- +if ~options.load + synopsis = cell(size(mfiles)); + h1line = cell(size(mfiles)); + subroutine = cell(size(mfiles)); + hrefs = sparse(length(mfiles), length(mfiles)); + todo = struct('mfile',[], 'line',[], 'comment',{{}}); + ismex = zeros(length(mfiles), length(mexexts)); + statlist = {}; + statinfo = sparse(1,length(mfiles)); + kw = cell(size(mfiles)); + freq = cell(size(mfiles)); + + for i=1:length(mfiles) + if options.verbose + fprintf('Processing file %s...',mfiles{i}); + end + s = mfileparse(mfiles{i}, mdirs, names, options); + synopsis{i} = s.synopsis; + h1line{i} = s.h1line; + subroutine{i} = s.subroutine; + hrefs(i,:) = s.hrefs; + todo.mfile = [todo.mfile repmat(i,1,length(s.todo.line))]; + todo.line = [todo.line s.todo.line]; + todo.comment = {todo.comment{:} s.todo.comment{:}}; + ismex(i,:) = s.ismex; + if options.search + if options.verbose, fprintf('search...'); end + [kw{i}, freq{i}] = searchindex(mfiles{i}); + statlist = union(statlist, kw{i}); + end + if options.verbose, fprintf('\n'); end + end + hrefs = hrefs > 0; + if options.search + if options.verbose + fprintf('Creating the search index...'); + end + statinfo = sparse(length(statlist),length(mfiles)); + for i=1:length(mfiles) + i1 = find(ismember(statlist, kw{i})); + i2 = repmat(i,1,length(i1)); + if ~isempty(i1) + statinfo(sub2ind(size(statinfo),i1,i2)) = freq{i}; + end + if options.verbose, fprintf('.'); end + end + clear kw freq; + if options.verbose, fprintf('\n'); end + end +end + +%------------------------------------------------------------------------------- +%- Save M-filenames and cross-references for further analysis +%------------------------------------------------------------------------------- +matfilesave = 'm2html.mat'; + +if options.save + if options.verbose + fprintf('Saving MAT file %s...\n',matfilesave); + end + save(fullfile(options.htmlDir,matfilesave), ... + 'mfiles', 'names', 'mdirs', 'name', 'mdir', 'options', ... + 'hrefs', 'synopsis', 'h1line', 'subroutine', 'todo', 'ismex', ... + 'statlist', 'statinfo'); +end + +%------------------------------------------------------------------------------- +%- Setup the output directories +%------------------------------------------------------------------------------- +for i=1:length(mdir) + if exist(fullfile(options.htmlDir,mdir{i})) ~= 7 + ldir = splitpath(mdir{i}); + for j=1:length(ldir) + if exist(fullfile(options.htmlDir,ldir{1:j})) ~= 7 + %- Create the output directory + if options.verbose + fprintf('Creating directory %s...\n',... + fullfile(options.htmlDir,ldir{1:j})); + end + if j == 1 + [status, msg] = mkdir(escapeblank(options.htmlDir), ... + escapeblank(ldir{1})); + else + [status, msg] = mkdir(escapeblank(options.htmlDir), ... + escapeblank(fullfile(ldir{1:j}))); + end + error(msg); + end + end + end +end + +%------------------------------------------------------------------------------- +%- Write the master index file +%------------------------------------------------------------------------------- +tpl_master = 'master.tpl'; +tpl_master_identifier_nbyline = 4; +php_search = 'search.php'; +dotbase = 'graph'; + +%- Create the HTML template +tpl = template(options.template,'remove'); +tpl = set(tpl,'file','TPL_MASTER',tpl_master); +tpl = set(tpl,'block','TPL_MASTER','rowdir','rowdirs'); +tpl = set(tpl,'block','TPL_MASTER','idrow','idrows'); +tpl = set(tpl,'block','idrow','idcolumn','idcolumns'); +tpl = set(tpl,'block','TPL_MASTER','search','searchs'); +tpl = set(tpl,'block','TPL_MASTER','graph','graphs'); + +%- Open for writing the HTML master index file +curfile = fullfile(options.htmlDir,[options.indexFile options.extension]); +if options.verbose + fprintf('Creating HTML file %s...\n',curfile); +end +fid = openfile(curfile,'w'); + +%- Set some template variables +tpl = set(tpl,'var','DATE',[datestr(now,8) ' ' datestr(now,1) ' ' ... + datestr(now,13)]); +tpl = set(tpl,'var','MASTERPATH', './'); +tpl = set(tpl,'var','DIRS', sprintf('%s ',mdir{:})); + +%- Print list of unique directories +for i=1:length(mdir) + tpl = set(tpl,'var','L_DIR',... + fullurl(mdir{i},[options.indexFile options.extension])); + tpl = set(tpl,'var','DIR',mdir{i}); + tpl = parse(tpl,'rowdirs','rowdir',1); +end + +%- Print full list of M-files (sorted by column) +[sortnames, ind] = sort(names); +m_mod = mod(length(sortnames), tpl_master_identifier_nbyline); +ind = [ind zeros(1,tpl_master_identifier_nbyline-m_mod)]; +m_floor = floor(length(ind) / tpl_master_identifier_nbyline); +ind = reshape(ind,m_floor,tpl_master_identifier_nbyline)'; + +for i=1:prod(size(ind)) + if ind(i) + tpl = set(tpl,'var','L_IDNAME',... + fullurl(mdirs{ind(i)},[names{ind(i)} options.extension])); + tpl = set(tpl,'var','T_IDNAME',mdirs{ind(i)}); + tpl = set(tpl,'var','IDNAME',names{ind(i)}); + tpl = parse(tpl,'idcolumns','idcolumn',1); + else + tpl = set(tpl,'var','L_IDNAME',''); + tpl = set(tpl,'var','T_IDNAME',''); + tpl = set(tpl,'var','IDNAME',''); + tpl = parse(tpl,'idcolumns','idcolumn',1); + end + if mod(i,tpl_master_identifier_nbyline) == 0 + tpl = parse(tpl,'idrows','idrow',1); + tpl = set(tpl,'var','idcolumns',''); + end +end + +%- Add a search form if necessary +tpl = set(tpl,'var','searchs',''); +if options.search + tpl = set(tpl,'var','PHPFILE',php_search); + tpl = parse(tpl,'searchs','search',1); +end + +%- Link to a full dependency graph, if necessary +tpl = set(tpl,'var','graphs',''); +if options.graph & options.globalHypertextLinks & length(mdir) > 1 + tpl = set(tpl,'var','LGRAPH',[dotbase options.extension]); + tpl = parse(tpl,'graphs','graph',1); +end + +%- Print the template in the HTML file +tpl = parse(tpl,'OUT','TPL_MASTER'); +fprintf(fid,'%s',get(tpl,'OUT')); +fclose(fid); + +%------------------------------------------------------------------------------- +%- Copy template files (CSS, images, ...) +%------------------------------------------------------------------------------- +% Get list of files +d = dir(options.template); +d = {d(~[d.isdir]).name}; +% Copy files +for i=1:length(d) + [p, n, ext] = fileparts(d{i}); + if ~strcmp(ext,'.tpl') ... % do not copy .tpl files + & ~strcmp([n ext],'Thumbs.db') % do not copy this Windows generated file + if isempty(dir(fullfile(options.htmlDir,d{i}))) + if options.verbose + fprintf('Copying template file %s...\n',d{i}); + end + %- there is a bug with in Matlab 6.5 : + % http://www.mathworks.com/support/solutions/data/1-1B5JY.html + %- and does not overwrite files even if newer... + [status, errmsg] = copyfile(fullfile(options.template,d{i}),... + options.htmlDir); + %- If you encounter this bug, please uncomment one of the following lines + % eval(['!cp -rf ' fullfile(options.template,d{i}) ' ' options.htmlDir]); + % eval(['!copy ' fullfile(options.template,d{i}) ' ' options.htmlDir]); + % status = 1; + if ~status + if ~isempty(errmsg) + error(errmsg) + else + warning(sprintf([' failed to do its job...\n' ... + 'This is a known bug in Matlab 6.5 (R13).\n' ... + 'See http://www.mathworks.com/support/solutions/data/1-1B5JY.html'])); + end + end + end + end +end + +%------------------------------------------------------------------------------- +%- Search engine (index file and PHP script) +%------------------------------------------------------------------------------- +tpl_search = 'search.tpl'; +idx_search = 'search.idx'; + +% TODO % improving the fill in of 'statlist' and 'statinfo' +% TODO % improving the search template file and update the CSS file + +if options.search + %- Write the search index file in output directory + if options.verbose + fprintf('Creating Search Index file %s...\n', idx_search); + end + docinfo = cell(length(mfiles),2); + for i=1:length(mfiles) + docinfo{i,1} = h1line{i}; + docinfo{i,2} = fullurl(mdirs{i}, [names{i} options.extension]); + end + doxywrite(fullfile(options.htmlDir,idx_search),statlist,statinfo,docinfo); + + %- Create the PHP template + tpl = template(options.template,'remove'); + tpl = set(tpl,'file','TPL_SEARCH',tpl_search); + + %- Open for writing the PHP search script + curfile = fullfile(options.htmlDir, php_search); + if options.verbose + fprintf('Creating PHP script %s...\n',curfile); + end + fid = openfile(curfile,'w'); + + %- Set template fields + tpl = set(tpl,'var','INDEX',[options.indexFile options.extension]); + tpl = set(tpl,'var','MASTERPATH','./'); + tpl = set(tpl,'var','DATE',[datestr(now,8) ' ' datestr(now,1) ' ' ... + datestr(now,13)]); + tpl = set(tpl,'var','IDXFILE',idx_search); + tpl = set(tpl,'var','PHPFILE',php_search); + + %- Print the template in the HTML file + tpl = parse(tpl,'OUT','TPL_SEARCH'); + fprintf(fid,'%s',get(tpl,'OUT')); + fclose(fid); +end + +%------------------------------------------------------------------------------- +%- Create needed to display hierarchical entries in Contents panel +%------------------------------------------------------------------------------- +% See http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_env/guiref16.html +% and http://www.mathworks.com/support/solutions/data/1-18U6Q.html?solution=1-18U6Q + +% TODO % display directories in TOC hierarchically instead of linearly +if options.helptocxml + curfile = fullfile(options.htmlDir, 'helptoc.xml'); + if options.verbose + fprintf('Creating XML Table-Of-Content %s...\n',curfile); + end + fid = openfile(curfile,'w'); + fprintf(fid,'\n'); + fprintf(fid,'\n\n', datestr(now,31)); + fprintf(fid,'\n\n'); + fprintf(fid,['%s\n'], ... + [options.indexFile options.extension],'Toolbox'); + for i=1:length(mdir) + fprintf(fid,['%s\n'], ... + fullfile(mdir{i}, ... + [options.indexFile options.extension]),mdir{i}); + if options.graph + fprintf(fid,['\t%s\n'], ... + fullfile(mdir{i},... + [dotbase options.extension]),'Dependency Graph'); + end + if options.todo + if ~isempty(intersect(find(strcmp(mdir{i},mdirs)),todo.mfile)) + fprintf(fid,['\t%s\n'], ... + fullfile(mdir{i},... + ['todo' options.extension]),'Todo list'); + end + end + for j=1:length(mdirs) + if strcmp(mdirs{j},mdir{i}) + curfile = fullfile(mdir{i},... + [names{j} options.extension]); + fprintf(fid,'\t%s\n', ... + curfile,names{j}); + end + end + fprintf(fid,'\n'); + end + fprintf(fid,'\n'); + fprintf(fid,'\n\n'); + fclose(fid); +end + +%------------------------------------------------------------------------------- +%- Write an index for each output directory +%------------------------------------------------------------------------------- +tpl_mdir = 'mdir.tpl'; +tpl_mdir_link = '%s'; +%dotbase defined earlier + +%- Create the HTML template +tpl = template(options.template,'remove'); +tpl = set(tpl,'file','TPL_MDIR',tpl_mdir); +tpl = set(tpl,'block','TPL_MDIR','row-m','rows-m'); +tpl = set(tpl,'block','row-m','mexfile','mex'); +tpl = set(tpl,'block','TPL_MDIR','othermatlab','other'); +tpl = set(tpl,'block','othermatlab','row-other','rows-other'); +tpl = set(tpl,'block','TPL_MDIR','subfolder','subfold'); +tpl = set(tpl,'block','subfolder','subdir','subdirs'); +tpl = set(tpl,'block','TPL_MDIR','todolist','todolists'); +tpl = set(tpl,'block','TPL_MDIR','graph','graphs'); +tpl = set(tpl,'var','DATE',[datestr(now,8) ' ' datestr(now,1) ' ' ... + datestr(now,13)]); + +for i=1:length(mdir) + %- Open for writing each output directory index file + curfile = fullfile(options.htmlDir,mdir{i},... + [options.indexFile options.extension]); + if options.verbose + fprintf('Creating HTML file %s...\n',curfile); + end + fid = openfile(curfile,'w'); + + %- Set template fields + tpl = set(tpl,'var','INDEX', [options.indexFile options.extension]); + tpl = set(tpl,'var','MASTERPATH',backtomaster(mdir{i})); + tpl = set(tpl,'var','MDIR', mdir{i}); + + %- Display Matlab m-files, their H1 line and their Mex status + tpl = set(tpl,'var','rows-m',''); + for j=1:length(mdirs) + if strcmp(mdirs{j},mdir{i}) + tpl = set(tpl,'var','L_NAME', [names{j} options.extension]); + tpl = set(tpl,'var','NAME', names{j}); + tpl = set(tpl,'var','H1LINE', h1line{j}); + if any(ismex(j,:)) + tpl = parse(tpl,'mex','mexfile'); + else + tpl = set(tpl,'var','mex',''); + end + tpl = parse(tpl,'rows-m','row-m',1); + end + end + + %- Display other Matlab-specific files (.mat,.mdl,.p) + tpl = set(tpl,'var','other',''); + tpl = set(tpl,'var','rows-other',''); + w = what(mdir{i}); w = w(1); + w = {w.mat{:} w.mdl{:} w.p{:}}; + for j=1:length(w) + tpl = set(tpl,'var','OTHERFILE',w{j}); + tpl = parse(tpl,'rows-other','row-other',1); + end + if ~isempty(w) + tpl = parse(tpl,'other','othermatlab'); + end + + %- Display subsequent directories and classes + tpl = set(tpl,'var','subdirs',''); + tpl = set(tpl,'var','subfold',''); + d = dir(mdir{i}); + d = {d([d.isdir]).name}; + d = {d{~ismember(d,{'.' '..'})}}; + for j=1:length(d) + if ismember(fullfile(mdir{i},d{j}),mdir) + tpl = set(tpl,'var','SUBDIRECTORY',... + sprintf(tpl_mdir_link,... + fullurl(d{j},[options.indexFile options.extension]),d{j})); + else + tpl = set(tpl,'var','SUBDIRECTORY',d{j}); + end + tpl = parse(tpl,'subdirs','subdir',1); + end + if ~isempty(d) + tpl = parse(tpl,'subfold','subfolder'); + end + + %- Link to the TODO list if necessary + tpl = set(tpl,'var','todolists',''); + if options.todo + if ~isempty(intersect(find(strcmp(mdir{i},mdirs)),todo.mfile)) + tpl = set(tpl,'var','LTODOLIST',['todo' options.extension]); + tpl = parse(tpl,'todolists','todolist',1); + end + end + + %- Link to the dependency graph if necessary + tpl = set(tpl,'var','graphs',''); + if options.graph + tpl = set(tpl,'var','LGRAPH',[dotbase options.extension]); + tpl = parse(tpl,'graphs','graph',1); + end + + %- Print the template in the HTML file + tpl = parse(tpl,'OUT','TPL_MDIR'); + fprintf(fid,'%s',get(tpl,'OUT')); + fclose(fid); +end + +%------------------------------------------------------------------------------- +%- Write a TODO list file for each output directory, if necessary +%------------------------------------------------------------------------------- +tpl_todo = 'todo.tpl'; + +if options.todo + %- Create the HTML template + tpl = template(options.template,'remove'); + tpl = set(tpl,'file','TPL_TODO',tpl_todo); + tpl = set(tpl,'block','TPL_TODO','filelist','filelists'); + tpl = set(tpl,'block','filelist','row','rows'); + tpl = set(tpl,'var','DATE',[datestr(now,8) ' ' datestr(now,1) ' ' ... + datestr(now,13)]); + + for i=1:length(mdir) + mfilestodo = intersect(find(strcmp(mdir{i},mdirs)),todo.mfile); + if ~isempty(mfilestodo) + %- Open for writing each TODO list file + curfile = fullfile(options.htmlDir,mdir{i},... + ['todo' options.extension]); + if options.verbose + fprintf('Creating HTML file %s...\n',curfile); + end + fid = openfile(curfile,'w'); + + %- Set template fields + tpl = set(tpl,'var','INDEX',[options.indexFile options.extension]); + tpl = set(tpl,'var','MASTERPATH', backtomaster(mdir{i})); + tpl = set(tpl,'var','MDIR', mdir{i}); + tpl = set(tpl,'var','filelists', ''); + + for k=1:length(mfilestodo) + tpl = set(tpl,'var','MFILE',names{mfilestodo(k)}); + tpl = set(tpl,'var','rows',''); + nbtodo = find(todo.mfile == mfilestodo(k)); + for l=1:length(nbtodo) + tpl = set(tpl,'var','L_NBLINE',... + [names{mfilestodo(k)} ... + options.extension ... + '#l' num2str(todo.line(nbtodo(l)))]); + tpl = set(tpl,'var','NBLINE',num2str(todo.line(nbtodo(l)))); + tpl = set(tpl,'var','COMMENT',todo.comment{nbtodo(l)}); + tpl = parse(tpl,'rows','row',1); + end + tpl = parse(tpl,'filelists','filelist',1); + end + + %- Print the template in the HTML file + tpl = parse(tpl,'OUT','TPL_TODO'); + fprintf(fid,'%s',get(tpl,'OUT')); + fclose(fid); + end + end +end + +%------------------------------------------------------------------------------- +%- Create dependency graphs using GraphViz, if requested +%------------------------------------------------------------------------------- +tpl_graph = 'graph.tpl'; +% You may have to modify the following line with Matlab7 (R14) to specify +% the full path to where GraphViz is installed +dot_exec = 'dot'; +%dotbase defined earlier + +if options.graph + %- Create the HTML template + tpl = template(options.template,'remove'); + tpl = set(tpl,'file','TPL_GRAPH',tpl_graph); + tpl = set(tpl,'var','DATE',[datestr(now,8) ' ' datestr(now,1) ' ' ... + datestr(now,13)]); + + %- Create a full dependency graph for all directories if possible + if options.globalHypertextLinks & length(mdir) > 1 + mdotfile = fullfile(options.htmlDir,[dotbase '.dot']); + if options.verbose + fprintf('Creating full dependency graph %s...',mdotfile); + end + mdot({hrefs, names, options, mdirs}, mdotfile); %mfiles + calldot(dot_exec, mdotfile, ... + fullfile(options.htmlDir,[dotbase '.map']), ... + fullfile(options.htmlDir,[dotbase '.png'])); + if options.verbose, fprintf('\n'); end + fid = openfile(fullfile(options.htmlDir, [dotbase options.extension]),'w'); + tpl = set(tpl,'var','INDEX',[options.indexFile options.extension]); + tpl = set(tpl,'var','MASTERPATH', './'); + tpl = set(tpl,'var','MDIR', 'the whole toolbox'); + tpl = set(tpl,'var','GRAPH_IMG', [dotbase '.png']); + try % if failed... + fmap = openfile(fullfile(options.htmlDir,[dotbase '.map']),'r'); + tpl = set(tpl,'var','GRAPH_MAP', fscanf(fmap,'%c')); + fclose(fmap); + end + tpl = parse(tpl,'OUT','TPL_GRAPH'); + fprintf(fid,'%s', get(tpl,'OUT')); + fclose(fid); + end + + %- Create a dependency graph for each output directory + for i=1:length(mdir) + mdotfile = fullfile(options.htmlDir,mdir{i},[dotbase '.dot']); + if options.verbose + fprintf('Creating dependency graph %s...',mdotfile); + end + ind = find(strcmp(mdirs,mdir{i})); + href1 = zeros(length(ind),length(hrefs)); + for j=1:length(hrefs), href1(:,j) = hrefs(ind,j); end + href2 = zeros(length(ind)); + for j=1:length(ind), href2(j,:) = href1(j,ind); end + mdot({href2, {names{ind}}, options}, mdotfile); %{mfiles{ind}} + calldot(dot_exec, mdotfile, ... + fullfile(options.htmlDir,mdir{i},[dotbase '.map']), ... + fullfile(options.htmlDir,mdir{i},[dotbase '.png'])); + if options.verbose, fprintf('\n'); end + fid = openfile(fullfile(options.htmlDir,mdir{i},... + [dotbase options.extension]),'w'); + tpl = set(tpl,'var','INDEX',[options.indexFile options.extension]); + tpl = set(tpl,'var','MASTERPATH', backtomaster(mdir{i})); + tpl = set(tpl,'var','MDIR', mdir{i}); + tpl = set(tpl,'var','GRAPH_IMG', [dotbase '.png']); + try % if failed, no '.map' file has been created + fmap = openfile(fullfile(options.htmlDir,mdir{i},[dotbase '.map']),'r'); + tpl = set(tpl,'var','GRAPH_MAP', fscanf(fmap,'%c')); + fclose(fmap); + end + tpl = parse(tpl,'OUT','TPL_GRAPH'); + fprintf(fid,'%s', get(tpl,'OUT')); + fclose(fid); + end +end + +%------------------------------------------------------------------------------- +%- Write an HTML file for each M-file +%------------------------------------------------------------------------------- +%- List of Matlab keywords (output from iskeyword) +matlabKeywords = {'break', 'case', 'catch', 'continue', 'elseif', 'else', ... + 'end', 'for', 'function', 'global', 'if', 'otherwise', ... + 'persistent', 'return', 'switch', 'try', 'while'}; + %'keyboard', 'pause', 'eps', 'NaN', 'Inf' + +tpl_mfile = 'mfile.tpl'; + +tpl_mfile_code = '%s'; +tpl_mfile_keyword = '%s'; +tpl_mfile_comment = '%s'; +tpl_mfile_string = '%s'; +tpl_mfile_aname = '%s'; +tpl_mfile_line = '%04d %s\n'; + +%- Delimiters used in strtok: some of them may be useless (% " .), removed '.' +strtok_delim = sprintf(' \t\n\r(){}[]<>+-*~!|\\@&/,:;="''%%'); + +%- Create the HTML template +tpl = template(options.template,'remove'); +tpl = set(tpl,'file','TPL_MFILE',tpl_mfile); +tpl = set(tpl,'block','TPL_MFILE','pathline','pl'); +tpl = set(tpl,'block','TPL_MFILE','mexfile','mex'); +tpl = set(tpl,'block','TPL_MFILE','script','scriptfile'); +tpl = set(tpl,'block','TPL_MFILE','crossrefcall','crossrefcalls'); +tpl = set(tpl,'block','TPL_MFILE','crossrefcalled','crossrefcalleds'); +tpl = set(tpl,'block','TPL_MFILE','subfunction','subf'); +tpl = set(tpl,'block','subfunction','onesubfunction','onesubf'); +tpl = set(tpl,'block','TPL_MFILE','source','thesource'); +tpl = set(tpl,'block','TPL_MFILE','download','downloads'); +tpl = set(tpl,'var','DATE',[datestr(now,8) ' ' datestr(now,1) ' ' ... + datestr(now,13)]); + +nblinetot = 0; +for i=1:length(mdir) + for j=1:length(mdirs) + if strcmp(mdirs{j},mdir{i}) + + curfile = fullfile(options.htmlDir,mdir{i},... + [names{j} options.extension]); + + %- Copy M-file for download, if necessary + if options.download + if options.verbose + fprintf('Copying M-file %s.m to %s...\n',names{j},... + fullfile(options.htmlDir,mdir{i})); + end + [status, errmsg] = copyfile(mfiles{j},... + fullfile(options.htmlDir,mdir{i})); + error(errmsg); + end + + %- Open for writing the HTML file + if options.verbose + fprintf('Creating HTML file %s...\n',curfile); + end + fid = openfile(curfile,'w'); + if strcmp(names{j},options.indexFile) + fprintf(['Warning: HTML index file %s will be ' ... + 'overwritten by Matlab function %s.\n'], ... + [options.indexFile options.extension], mfiles{j}); + end + + %- Open for reading the M-file + fid2 = openfile(mfiles{j},'r'); + + %- Set some template fields + tpl = set(tpl,'var','INDEX', [options.indexFile options.extension]); + tpl = set(tpl,'var','MASTERPATH', backtomaster(mdir{i})); + tpl = set(tpl,'var','MDIR', mdirs{j}); + tpl = set(tpl,'var','NAME', names{j}); + tpl = set(tpl,'var','H1LINE', entity(h1line{j})); + tpl = set(tpl,'var','scriptfile', ''); + if isempty(synopsis{j}) + tpl = set(tpl,'var','SYNOPSIS',get(tpl,'var','script')); + else + tpl = set(tpl,'var','SYNOPSIS', synopsis{j}); + end + s = splitpath(mdir{i}); + tpl = set(tpl,'var','pl',''); + for k=1:length(s) + c = cell(1,k); for l=1:k, c{l} = filesep; end + cpath = {s{1:k};c{:}}; cpath = [cpath{:}]; + if ~isempty(cpath), cpath = cpath(1:end-1); end + if ismember(cpath,mdir) + tpl = set(tpl,'var','LPATHDIR',[repmat('../',... + 1,length(s)-k) options.indexFile options.extension]); + else + tpl = set(tpl,'var','LPATHDIR','#'); + end + tpl = set(tpl,'var','PATHDIR',s{k}); + tpl = parse(tpl,'pl','pathline',1); + end + + %- Handle mex files + tpl = set(tpl,'var','mex', ''); + samename = dir(fullfile(mdir{i},[names{j} '.*'])); + samename = {samename.name}; + tpl = set(tpl,'var','MEXTYPE', 'mex'); + for k=1:length(samename) + [dummy, dummy, ext] = fileparts(samename{k}); + switch ext + case '.c' + tpl = set(tpl,'var','MEXTYPE', 'c'); + case {'.cpp' '.c++' '.cxx' '.C'} + tpl = set(tpl,'var','MEXTYPE', 'c++'); + case {'.for' '.f' '.FOR' '.F'} + tpl = set(tpl,'var','MEXTYPE', 'fortran'); + otherwise + %- Unknown mex file source + end + end + [exts, platform] = mexexts; + mexplatforms = sprintf('%s, ',platform{find(ismex(j,:))}); + if ~isempty(mexplatforms) + tpl = set(tpl,'var','PLATFORMS', mexplatforms(1:end-2)); + tpl = parse(tpl,'mex','mexfile'); + end + + %- Set description template field + descr = ''; + flagsynopcont = 0; + flag_seealso = 0; + while 1 + tline = fgets(fid2); + if ~ischar(tline), break, end + tline = entity(fliplr(deblank(fliplr(tline)))); + %- Synopsis line + if ~isempty(strmatch('function',tline)) + if ~isempty(strmatch('...',fliplr(deblank(tline)))) + flagsynopcont = 1; + end + %- H1 line and description + elseif ~isempty(strmatch('%',tline)) + %- Hypertext links on the "See also" line + ind = findstr(lower(tline),'see also'); + if ~isempty(ind) | flag_seealso + %- "See also" only in files in the same directory + indsamedir = find(strcmp(mdirs{j},mdirs)); + hrefnames = {names{indsamedir}}; + r = deblank(tline); + flag_seealso = 1; %(r(end) == ','); + tline = ''; + while 1 + [t,r,q] = strtok(r,sprintf(' \t\n\r.,;%%')); + tline = [tline q]; + if isempty(t), break, end; + ii = strcmpi(hrefnames,t); + if any(ii) + jj = find(ii); + tline = [tline sprintf(tpl_mfile_code,... + [hrefnames{jj(1)} options.extension],... + synopsis{indsamedir(jj(1))},t)]; + else + tline = [tline t]; + end + end + tline = sprintf('%s\n',tline); + end + descr = [descr tline(2:end)]; + elseif isempty(tline) + if ~isempty(descr), break, end; + else + if flagsynopcont + if isempty(strmatch('...',fliplr(deblank(tline)))) + flagsynopcont = 0; + end + else + break; + end + end + end + tpl = set(tpl,'var','DESCRIPTION',... + horztab(descr,options.tabs)); + + %- Set cross-references template fields: + % Function called + ind = find(hrefs(j,:) == 1); + tpl = set(tpl,'var','crossrefcalls',''); + for k=1:length(ind) + if strcmp(mdirs{j},mdirs{ind(k)}) + tpl = set(tpl,'var','L_NAME_CALL', ... + [names{ind(k)} options.extension]); + else + tpl = set(tpl,'var','L_NAME_CALL', ... + fullurl(backtomaster(mdirs{j}), ... + mdirs{ind(k)}, ... + [names{ind(k)} options.extension])); + end + tpl = set(tpl,'var','SYNOP_CALL', synopsis{ind(k)}); + tpl = set(tpl,'var','NAME_CALL', names{ind(k)}); + tpl = set(tpl,'var','H1LINE_CALL', h1line{ind(k)}); + tpl = parse(tpl,'crossrefcalls','crossrefcall',1); + end + % Callers + ind = find(hrefs(:,j) == 1); + tpl = set(tpl,'var','crossrefcalleds',''); + for k=1:length(ind) + if strcmp(mdirs{j},mdirs{ind(k)}) + tpl = set(tpl,'var','L_NAME_CALLED', ... + [names{ind(k)} options.extension]); + else + tpl = set(tpl,'var','L_NAME_CALLED', ... + fullurl(backtomaster(mdirs{j}),... + mdirs{ind(k)}, ... + [names{ind(k)} options.extension])); + end + tpl = set(tpl,'var','SYNOP_CALLED', synopsis{ind(k)}); + tpl = set(tpl,'var','NAME_CALLED', names{ind(k)}); + tpl = set(tpl,'var','H1LINE_CALLED', h1line{ind(k)}); + tpl = parse(tpl,'crossrefcalleds','crossrefcalled',1); + end + + %- Set subfunction template field + tpl = set(tpl,'var',{'subf' 'onesubf'},{'' ''}); + if ~isempty(subroutine{j}) & options.source + for k=1:length(subroutine{j}) + tpl = set(tpl, 'var', 'L_SUB', ['#_sub' num2str(k)]); + tpl = set(tpl, 'var', 'SUB', subroutine{j}{k}); + tpl = parse(tpl, 'onesubf', 'onesubfunction',1); + end + tpl = parse(tpl,'subf','subfunction'); + end + subname = extractname(subroutine{j}); + + %- Link to M-file (for download) + tpl = set(tpl,'var','downloads',''); + if options.download + tpl = parse(tpl,'downloads','download',1); + end + + %- Display source code with cross-references + if options.source & ~strcmpi(names{j},'contents') + fseek(fid2,0,-1); + it = 1; + matlabsource = ''; + nbsubroutine = 1; + %- Get href function names of this file + indhrefnames = find(hrefs(j,:) == 1); + hrefnames = {names{indhrefnames}}; + %- Loop over lines + while 1 + tline = fgetl(fid2); + if ~ischar(tline), break, end + myline = ''; + splitc = splitcode(entity(tline)); + for k=1:length(splitc) + if isempty(splitc{k}) + elseif ~isempty(strmatch('function',splitc{k})) + %- Subfunctions definition + myline = [myline ... + sprintf(tpl_mfile_aname,... + ['_sub' num2str(nbsubroutine-1)],splitc{k})]; + nbsubroutine = nbsubroutine + 1; + elseif splitc{k}(1) == '''' + myline = [myline ... + sprintf(tpl_mfile_string,splitc{k})]; + elseif splitc{k}(1) == '%' + myline = [myline ... + sprintf(tpl_mfile_comment,deblank(splitc{k}))]; + elseif ~isempty(strmatch('...',splitc{k})) + myline = [myline sprintf(tpl_mfile_keyword,'...')]; + if ~isempty(splitc{k}(4:end)) + myline = [myline ... + sprintf(tpl_mfile_comment,splitc{k}(4:end))]; + end + else + %- Look for keywords + r = splitc{k}; + while 1 + [t,r,q] = strtok(r,strtok_delim); + myline = [myline q]; + if isempty(t), break, end; + %- Highlight Matlab keywords & + % cross-references on known functions + if options.syntaxHighlighting & ... + any(strcmp(matlabKeywords,t)) + if strcmp('end',t) + rr = fliplr(deblank(fliplr(r))); + icomma = strmatch(',',rr); + isemicolon = strmatch(';',rr); + if ~(isempty(rr) | ~isempty([icomma isemicolon])) + myline = [myline t]; + else + myline = [myline sprintf(tpl_mfile_keyword,t)]; + end + else + myline = [myline sprintf(tpl_mfile_keyword,t)]; + end + elseif any(strcmp(hrefnames,t)) + indt = indhrefnames(logical(strcmp(hrefnames,t))); + flink = [t options.extension]; + ii = ismember({mdirs{indt}},mdirs{j}); + if ~any(ii) + % take the first one... + flink = fullurl(backtomaster(mdirs{j}),... + mdirs{indt(1)}, flink); + else + indt = indt(logical(ii)); + end + myline = [myline sprintf(tpl_mfile_code,... + flink, synopsis{indt(1)}, t)]; + elseif any(strcmp(subname,t)) + ii = find(strcmp(subname,t)); + myline = [myline sprintf(tpl_mfile_code,... + ['#_sub' num2str(ii)],... + ['sub' subroutine{j}{ii}],t)]; + else + myline = [myline t]; + end + end + end + end + matlabsource = [matlabsource sprintf(tpl_mfile_line,it,myline)]; + it = it + 1; + end + nblinetot = nblinetot + it - 1; + tpl = set(tpl,'var','SOURCECODE',... + horztab(matlabsource,options.tabs)); + tpl = parse(tpl,'thesource','source'); + else + tpl = set(tpl,'var','thesource',''); + end + tpl = parse(tpl,'OUT','TPL_MFILE'); + fprintf(fid,'%s',get(tpl,'OUT')); + fclose(fid2); + fclose(fid); + end + end +end + +%------------------------------------------------------------------------------- +%- Display Statistics +%------------------------------------------------------------------------------- +if options.verbose + prnbline = ''; + if options.source + prnbline = sprintf('(%d lines) ', nblinetot); + end + fprintf('Stats: %d M-files %sin %d directories documented in %d s.\n', ... + length(mfiles), prnbline, length(mdir), round(etime(clock,t0))); +end + +%=============================================================================== +function mfiles = getmfiles(mdirs, mfiles, recursive) + %- Extract M-files from a list of directories and/or M-files + + for i=1:length(mdirs) + currentdir = fullfile(pwd, mdirs{i}); + if exist(currentdir) == 2 % M-file + mfiles{end+1} = mdirs{i}; + elseif exist(currentdir) == 7 % Directory + d = dir(fullfile(currentdir, '*.m')); + d = {d(~[d.isdir]).name}; + for j=1:length(d) + %- don't take care of files containing ',' + % probably a sccs file... + if isempty(findstr(',',d{j})) + mfiles{end+1} = fullfile(mdirs{i}, d{j}); + end + end + if recursive + d = dir(currentdir); + d = {d([d.isdir]).name}; + d = {d{~ismember(d,{'.' '..'})}}; + for j=1:length(d) + mfiles = getmfiles(cellstr(fullfile(mdirs{i},d{j})), ... + mfiles, recursive); + end + end + else + fprintf('Warning: Unprocessed file %s.\n',mdirs{i}); + if ~isempty(strmatch('/',mdirs{i})) | findstr(':',mdirs{i}) + fprintf(' Use relative paths in ''mfiles'' option\n'); + end + end + end + +%=============================================================================== +function calldot(dotexec, mdotfile, mapfile, pngfile, opt) + %- Draw a dependency graph in a PNG image using from GraphViz + + if nargin == 4, opt = ''; end + try + %- See + % must be in your system path, see M2HTML FAQ: + % + + eval(['!"' dotexec '" ' opt ' -Tcmap -Tpng "' mdotfile ... + '" -o "' mapfile ... + '" -o "' pngfile '"']); + % use '!' rather than 'system' for backward compability with Matlab 5.3 + catch % use of '!' prevents errors to be catched... + fprintf(' failed.'); + end + +%=============================================================================== +function s = backtomaster(mdir) + %- Provide filesystem path to go back to the root folder + + ldir = splitpath(mdir); + s = repmat('../',1,length(ldir)); + +%=============================================================================== +function ldir = splitpath(p) + %- Split a filesystem path into parts using filesep as separator + + ldir = {}; + p = deblank(p); + while 1 + [t,p] = strtok(p,filesep); + if isempty(t), break; end + if ~strcmp(t,'.') + ldir{end+1} = t; + end + end + if isempty(ldir) + ldir{1} = '.'; % should be removed + end + +%=============================================================================== +function name = extractname(synopsis) + %- Extract function name in a synopsis + + if ischar(synopsis), synopsis = {synopsis}; end + name = cell(size(synopsis)); + for i=1:length(synopsis) + ind = findstr(synopsis{i},'='); + if isempty(ind) + ind = findstr(synopsis{i},'function'); + s = synopsis{i}(ind(1)+8:end); + else + s = synopsis{i}(ind(1)+1:end); + end + name{i} = strtok(s,[9:13 32 40]); % white space characters and '(' + end + if length(name) == 1, name = name{1}; end + +%=============================================================================== +function f = fullurl(varargin) + %- Build full url from parts (using '/' and not filesep) + + f = strrep(fullfile(varargin{:}),'\','/'); + +%=============================================================================== +function str = escapeblank(str) + %- Escape white spaces using '\' + + str = deblank(fliplr(deblank(fliplr(str)))); + str = strrep(str,' ','\ '); + +%=============================================================================== +function str = entity(str) + %- Escape HTML special characters + %- See http://www.w3.org/TR/html4/charset.html#h-5.3.2 + + str = strrep(str,'&','&'); + str = strrep(str,'<','<'); + str = strrep(str,'>','>'); + str = strrep(str,'"','"'); + +%=============================================================================== +function str = horztab(str,n) + %- For browsers, the horizontal tab character is the smallest non-zero + %- number of spaces necessary to line characters up along tab stops that are + %- every 8 characters: behaviour obtained when n = 0. + + if n > 0 + str = strrep(str,sprintf('\t'),blanks(n)); + end diff --git a/external/m2html/mdot.m b/external/m2html/mdot.m new file mode 100644 index 00000000..5b6ac6f8 --- /dev/null +++ b/external/m2html/mdot.m @@ -0,0 +1,93 @@ +function mdot(mmat, dotfile,f) +%MDOT - Export a dependency graph into DOT language +% MDOT(MMAT, DOTFILE) loads a .mat file generated by M2HTML using option +% ('save','on') and writes an ascii file using the DOT language that can +% be drawn using or . +% MDOT(MMAT, DOTFILE,F) builds the graph containing M-file F and its +% neighbors only. +% See the following page for more details: +% +% +% Example: +% mdot('m2html.mat','m2html.dot'); +% !dot -Tps m2html.dot -o m2html.ps +% !neato -Tps m2html.dot -o m2html.ps +% +% See also M2HTML + +% Copyright (C) 2004 Guillaume Flandin +% $Revision: 1.1 $Date: 2004/05/05 17:14:09 $ + +error(nargchk(2,3,nargin)); + +if ischar(mmat) + load(mmat); +elseif iscell(mmat) + hrefs = mmat{1}; + names = mmat{2}; + options = mmat{3}; + if nargin == 3, mfiles = mmat{4}; end + mdirs = cell(size(names)); + [mdirs{:}] = deal(''); + if nargin == 2 & length(mmat) > 3, + mdirs = mmat{4}; + end; +else + error('[mdot] Invalid argument: mmat.'); +end + +fid = fopen(dotfile,'wt'); +if fid == -1, error(sprintf('[mdot] Cannot open %s.',dotfile)); end + +fprintf(fid,'/* Created by mdot for Matlab */\n'); +fprintf(fid,'digraph m2html {\n'); + +% if 'names' contains '.' then they should be surrounded by '"' + +if nargin == 2 + for i=1:size(hrefs,1) + n = find(hrefs(i,:) == 1); + m{i} = n; + for j=1:length(n) + fprintf(fid,[' ' names{i} ' -> ' names{n(j)} ';\n']); + end + end + %m = unique([m{:}]); + fprintf(fid,'\n'); + for i=1:size(hrefs,1) + fprintf(fid,[' ' names{i} ' [URL="' ... + fullurl(mdirs{i},[names{i} options.extension]) '"];\n']); + end +else + i = find(strcmp(f,mfiles)); + if length(i) ~= 1 + error(sprintf('[mdot] Cannot find %s.',f)); + end + n = find(hrefs(i,:) == 1); + for j=1:length(n) + fprintf(fid,[' ' names{i} ' -> ' names{n(j)} ';\n']); + end + m = find(hrefs(:,i) == 1); + for j=1:length(m) + if n(j) ~= i + fprintf(fid,[' ' names{m(j)} ' -> ' names{i} ';\n']); + end + end + n = unique([n(:)' m(:)']); + fprintf(fid,'\n'); + for i=1:length(n) + fprintf(fid,[' ' names{n(i)} ' [URL="' fullurl(mdirs{i}, ... + [names{n(i)} options.extension]) '"];\n']); + end +end + +fprintf(fid,'}'); + +fid = fclose(fid); +if fid == -1, error(sprintf('[mdot] Cannot close %s.',dotfile)); end + +%=========================================================================== +function f = fullurl(varargin) + %- Build full url from parts (using '/' and not filesep) + + f = strrep(fullfile(varargin{:}),'\','/'); diff --git a/external/m2html/mwizard.m b/external/m2html/mwizard.m new file mode 100644 index 00000000..8d5b0507 --- /dev/null +++ b/external/m2html/mwizard.m @@ -0,0 +1,968 @@ +function mwizard(file) +%MWIZARD - M2HTML Graphical User Interface +% MWIZARD launches a Matlab GUI front-end to edit parameters +% that are then used by M2HTML to generate HTML documentation. +% MWIZARD(FILE) allows to specify a mat-file FILE from which +% default parameters are extracted and can be updated. +% +% For more information, please read the M2HTML tutorial and FAQ at: +% +% +% See also M2HTML + +% Copyright (C) 2004 Guillaume Flandin +% $Revision: 0.5 $Date: 2004/05/24 20:12:17 $ + +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License +% as published by the Free Software Foundation; either version 2 +% of the License, or any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation Inc, 59 Temple Pl. - Suite 330, Boston, MA 02111-1307, USA. + +% Suggestions for improvement and fixes are always welcome, although no +% guarantee is made whether and when they will be implemented. +% Send requests to Guillaume@artefact.tk + +error(nargchk(0,1,nargin)); + +disp('This is a beta version of mwizard.'); +disp('Please use the online version m2html instead.'); + +h = initWindow; + +initOptions(h); + +buildWindow(h); + +setappdata(h, 'handles', guihandles(h)); +setappdata(h, 'pwd', pwd); + +if nargin == 0 + setappdata(h, 'file', ''); + setappdata(h, 'needsave', 1); +else + setappdata(h, 'file', file); + setappdata(h, 'needsave', 0); + opt = load(file, 'options'); + setappdata(h, 'options', opt.options); + refreshOptions(h); +end + +set(h, 'HandleVisibility', 'callback'); + +%=============================================================================== + +function h = initWindow + +h = figure('Resize', 'on',... + 'MenuBar', 'none',... + 'NumberTitle', 'off',... + 'Name', ':: M2HTML Wizard ::',... + 'Position', [200 200 500 650],... + 'Tag', mfilename); + +set(h, 'CloseRequestFcn', {@doClose,h}); + +%=============================================================================== + +function buildWindow(h) + +wincolor = struct('bg', [0.9 0.9 0.9], ... + 'fg', [0.8 0.8 0.8], ... + 'title', [0.8 0.8 0.9]); + +set(h, 'Color', wincolor.bg); + +%------------------------------------------------------------------------------- +%- Menu +%------------------------------------------------------------------------------- + +icons = load(fullfile(fileparts(which(mfilename)),'private', ... + 'm2htmltoolbarimages.mat')); + +uipushtool('CData',icons.newIcon,... + 'enable','on',... + 'Separator','off',... + 'ToolTipString','New File',... + 'ClickedCallback',{@doNewFile,h},... + 'Tag','NewTool'); + +uipushtool('CData',icons.openIcon,... + 'enable','on',... + 'Separator','off',... + 'ToolTipString','Open File',... + 'ClickedCallback',{@doOpenFile,h},... + 'Tag','OpenTool'); + +uipushtool('CData',icons.saveIcon,... + 'enable','on',... + 'Separator','off',... + 'ToolTipString','Save File',... + 'ClickedCallback',{@doSaveFile,h},... + 'Tag','SaveTool'); + +uipushtool('CData',icons.saveAsIcon,... + 'enable','on',... + 'Separator','off',... + 'ToolTipString','Save File As',... + 'ClickedCallback',{@doSaveAsFile,h},... + 'Tag','SaveAsTool'); + +uipushtool('CData',icons.wheelIcon,... + 'enable','on',... + 'Separator','on',... + 'ToolTipString','Save and Run M2HTML',... + 'ClickedCallback',{@doRunFile,h},... + 'Tag','RunTool'); + +uipushtool('CData',icons.webIcon,... + 'enable','on',... + 'Separator','on',... + 'ToolTipString','Online Tutorial',... + 'ClickedCallback',... + 'web(''http://www.artefact.tk/software/matlab/m2html/'')',... + 'Tag','WebTool'); + +uipushtool('CData',icons.helpIcon,... + 'enable','on',... + 'Separator','off',... + 'ToolTipString','Help',... + 'ClickedCallback',{@doHelp,h},... + 'Tag','HelpTool'); + +%------------------------------------------------------------------------------- +%- Title +%------------------------------------------------------------------------------- + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'Position',[0.02,0.92,0.96,0.06],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','M2HTML Wizard',... + 'FontSize',18,... + 'HorizontalAlignment','center',... + 'Position',[0.03,0.93,0.94,0.038],... + 'BackgroundColor',wincolor.title); + +%------------------------------------------------------------------------------- +%- Input +%------------------------------------------------------------------------------- + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'Position',[0.02,0.74,0.96,0.16],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'HorizontalAlignment','center',... + 'Position',[0.02,0.87,0.96,0.03],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','M-Files Input',... + 'HorizontalAlignment','left',... + 'Position',[0.03,0.875,0.94,0.02],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Root directory:',... + 'FontAngle','oblique',... + 'HorizontalAlignment','left',... + 'Position',[0.04,0.825,0.6,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.21,0.83,0.74,0.03],... + 'String',pwd,... + 'Enable','inactive',... + 'HorizontalAlignment','left',... + 'Callback','uigetfile;',...%uigetdir + 'BackgroundColor',wincolor.bg,... + 'Tag','rootdir'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Relative pathes:',... + 'HorizontalAlignment','left',... + 'Position',[0.04,0.785,0.6,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.21,0.79,0.74,0.03],... + 'String','',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetMfiles,h},... + 'CreateFcn',{@doInitMfiles,h},... + 'BackgroundColor',wincolor.bg,... + 'Tag','mfiles'); + +uicontrol('Style','CheckBox',... + 'Units','Normalized',... + 'Position',[0.04,0.749,0.42,0.032],... + 'String',' Recursive',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetRecursive,h},... + 'Value',0,... + 'BackgroundColor',wincolor.bg,... + 'Tag','recursive'); + +%------------------------------------------------------------------------------- +%- Output +%------------------------------------------------------------------------------- + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'Position',[0.02, 0.56,0.96,0.16],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'HorizontalAlignment','center',... + 'Position',[0.02,0.69,0.96,0.03],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','HTML Output',... + 'HorizontalAlignment','left',... + 'Position',[0.03,0.695,0.94,0.02],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Output Directory:',... + 'HorizontalAlignment','left',... + 'Position',[0.04,0.645,0.6,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.21,0.65,0.74,0.03],... + 'String','',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetOutputDir,h},... + 'CreateFcn',{@doInitHTMLDir,h},... + 'BackgroundColor',wincolor.bg,... + 'Tag','htmldir'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','HTML Index:',... + 'HorizontalAlignment','left',... + 'Position',[0.04,0.605,0.6,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.21,0.61,0.25,0.03],... + 'String','index',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetIndex,h},... + 'BackgroundColor',wincolor.bg,... + 'Tag','index'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Extension:',... + 'HorizontalAlignment','left',... + 'Position',[0.53,0.605,0.3,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.70,0.61,0.25,0.03],... + 'String','html',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetExtension,h},... + 'BackgroundColor',wincolor.bg,... + 'Tag','extension'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Template:',... + 'HorizontalAlignment','left',... + 'Position',[0.04,0.565,0.3,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','popupmenu',... + 'Units','Normalized',... + 'Position',[0.21,0.57,0.25,0.03],... + 'String','',... + 'HorizontalAlignment','center',... + 'Callback',{@doSetTemplate,h},... + 'CreateFcn',{@doInitTpl,h},... + 'BackgroundColor',wincolor.bg,... + 'Tag','template'); + +%------------------------------------------------------------------------------- +%- Other options +%------------------------------------------------------------------------------- + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'Position',[0.02,0.24,0.96,0.30],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'HorizontalAlignment','center',... + 'Position',[0.02,0.51,0.96,0.03],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Other Options',... + 'HorizontalAlignment','left',... + 'Position',[0.03,0.515,0.94,0.02],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.04,0.464,0.42,0.032],... + 'String',' Include Source Code',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetSource,h},... + 'Value',1,... + 'TooltipString','Include Source Code of each M-file',... + 'BackgroundColor',wincolor.bg,... + 'Tag','source'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.53,0.464,0.42,0.032],... + 'String',' Syntax Highlighting',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetHighlight,h},... + 'Value',1,... + 'TooltipString','Source Code Syntax Highlighting',... + 'BackgroundColor',wincolor.bg,... + 'Tag','highlight'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.04,0.42,0.42,0.032],... + 'String',' Create Dependency Graphs',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetGraph,h},... + 'CreateFcn',{@doInitGraphs,h},... + 'Value',0,... + 'TooltipString','Compute a Dependency Graph using GraphViz',... + 'BackgroundColor',wincolor.bg,... + 'Tag','graph'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.53,0.42,0.42,0.032],... + 'String',' PHP Search Engine',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetSearch,h},... + 'Value',0,... + 'TooltipString','Create an Index for a PHP Search Engine',... + 'BackgroundColor',wincolor.bg,... + 'Tag','search'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.04,0.378,0.42,0.032],... + 'String',' Global Hyperlinks',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetGlobal,1},... + 'Value',0,... + 'TooltipString','Hypertext links among separate Matlab Directories',... + 'BackgroundColor',wincolor.bg,... + 'Tag','globalhypertext'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.53,0.378,0.42,0.032],... + 'String',' Downloadable M-files',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetDownload,h},... + 'TooltipString','Add a link to download each M-file separately',... + 'Value',0,... + 'BackgroundColor',wincolor.bg,... + 'Tag','download'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.04,0.336,0.42,0.032],... + 'String',' To Do List',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetTodo,h},... + 'TooltipString',['Create a TODO list in each directory summarizing'... + ' all the ''% TODO %'' lines found in Matlab code'],... + 'Value',0,... + 'BackgroundColor',wincolor.bg,... + 'Tag','todo'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.53,0.336,0.42,0.032],... + 'String',' Verbose Mode',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetVerbose,h},... + 'TooltipString','Verbose mode',... + 'Value',1,... + 'BackgroundColor',wincolor.bg,... + 'Tag','verbose'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.04,0.294,0.42,0.032],... + 'String',' Save M-files Parsing',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetSaveAsMat,h},... + 'TooltipString',['Save current state after M-files parsing in '... + '''m2html.mat'' in the Output directory'],... + 'Value',0,... + 'BackgroundColor',wincolor.bg,... + 'Tag','save'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Load File:',... + 'HorizontalAlignment','left',... + 'Position',[0.53,0.289,0.3,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.70,0.294,0.25,0.03],... + 'String','',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetLoadMat,h},... + 'TooltipString',['Load a previously saved MAT file '... + 'to generate HTML files once again'],... + 'BackgroundColor',wincolor.bg,... + 'Tag','load'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Tabs Length:',... + 'HorizontalAlignment','left',... + 'Position',[0.04,0.247,0.3,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.21,0.252,0.25,0.03],... + 'String','4',... + 'HorizontalAlignment','right',... + 'Callback',{@doSetTabs,h},... + 'TooltipString',['Replace horizontal tabs in source code '... + 'by N white space characters'],... + 'BackgroundColor',wincolor.bg,... + 'Tag','tabs'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Nb Columns:',... + 'FontAngle','oblique',... + 'HorizontalAlignment','left',... + 'Position',[0.53,0.247,0.3,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.70,0.252,0.25,0.03],... + 'String','4',... + 'HorizontalAlignment','right',... + 'Callback',{@doSetNbColumns,h},... + 'TooltipString','Number of columns for M-files output - not available',... + 'Enable','inactive',... + 'BackgroundColor',wincolor.bg,... + 'Tag','column'); + + +%------------------------------------------------------------------------------- +%- Space available +%------------------------------------------------------------------------------- + +% uicontrol('Style','Frame',... +% 'Units','Normalized',... +% 'Position',[0.02,0.07,0.96,0.14],... +% 'BackgroundColor',wincolor.fg); + +% simulate a frame using an axes +% http://www.mathworks.com/support/solutions/data/1-15P9E.html +axes('Color',wincolor.fg,... + 'XTick',[],'YTick',[],... + 'Units','Normalized',... + 'Box','on',... + 'Position',[0.02,0.07,0.9585,0.14]); + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'HorizontalAlignment','center',... + 'Position',[0.02,0.19,0.96,0.03],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','M2HTML status',... + 'HorizontalAlignment','left',... + 'Position',[0.03,0.195,0.94,0.02],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Click on the wheel in the toolbar to launch M2HTML...',... + 'HorizontalAlignment','left',... % center + 'Position',[0.12,0.135,0.76,0.02],... + 'Visible','on',... + 'BackgroundColor',wincolor.fg,... + 'Tag','textmisc'); + +axes('XLim',[0 100],... + 'YLim',[0 1],... + 'Box','on', ... + 'Units','Normalized',... + 'Position',[0.07,0.09,0.86,0.03],... + 'XTickMode','manual',... + 'YTickMode','manual',... + 'layer','top',... + 'XTick',[],... + 'YTick',[],... + 'XTickLabelMode','manual',... + 'XTickLabel',[],... + 'YTickLabelMode','manual',... + 'Visible','on',... + 'YTickLabel',[],... + 'Color',wincolor.bg); + +x = 0; % between 0 and 100 +xpatch = [0 x x 0]; +ypatch = [0 0 1 1]; + +p = patch(xpatch,ypatch,'r',... + 'EdgeColor','r',... + 'Visible','on',... + 'EraseMode','none',... + 'Tag','waitbarmisc'); + +l = line([100 0 0 100 100], [0 0 1 1 0], ... + 'EraseMode','none', ... + 'Visible','on',... + 'Color',get(gca,'XColor')); + +% for i=10:5:100 +% set(p,'Xdata',[0 i i 0]); pause(0.02); +% end +% set(p,'EraseMode','normal'); +% set(p,'Xdata',[0 0 0 0]); +% set(p,'EraseMode','none'); + +%------------------------------------------------------------------------------- +%- Footnote +%------------------------------------------------------------------------------- + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'Position',[0.02,0.02,0.96,0.03],... + 'BackgroundColor',[0.8 0.8 0.9]); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String',['M2HTML © 2004 Guillaume Flandin '],... + 'HorizontalAlignment','right',... + 'Position',[0.03,0.025,0.94,0.02],... + 'BackgroundColor',[0.8 0.8 0.9]); + +%=============================================================================== + +function doClose(fig,evd,h) + status = doCheckSave(h); + if status + delete(h); + end + +function doNewFile(fig,evd,h) + status = doCheckSave(h); + if status + initOptions(h); + setappdata(h, 'needsave', 1); + % refresh options in GUI... + refreshOptions(h); + end + +function doOpenFile(fig,evd,h) + status = doCheckSave(h); + if status + [filename, pathname] = uigetfile('*.mat','Open File'); + if ~(isequal(filename,0)|isequal(pathname,0)) + opt = load(fullfile(pathname,filename),'options'); + setappdata(h,'options',opt.options); + setappdata(h,'file',fullfile(pathname,filename)); + end + end + % refresh options in GUI... + refreshOptions(h); + +function status = doSaveFile(fig,evd,h) + file = getappdata(h,'file'); + status = 1; + if isempty(file) + status = doSaveAsFile(fig,evd,h); + else + options = getappdata(h,'options'); + save(file, 'options'); + end + setappdata(h,'needsave',0); + +function status = doSaveAsFile(fig,evd,h) + [filename, pathname] = uiputfile('matlab.mat', 'Save File as'); + if ~(isequal(filename,0)|isequal(pathname,0)) + setappdata(h,'file',fullfile(pathname,filename)); + status = doSaveFile(fig,evd,h); + else + status = 0; + end + +function doRunFile(fig,evd,h) + status = doSaveFile(fig,evd,h); + if status + opt = getappdata(h,'options'); + file = getappdata(h,'file'); + r = {'off' 'on'}; + % opt could be directly given to m2html (no need for file saving) + % just need to convert on/off using opt.param = r{opt.param+1} + m2html('load',file,'recursive',r{opt.recursive+1}); + % 'recursive' is specified to force m2html to parse M-files + end + +function status = doCheckSave(h) + file = getappdata(h,'file'); + if isempty(file), file = 'Untitled'; end + needsave = getappdata(h,'needsave'); + status = 1; + if needsave + button = questdlg(sprintf('Save changes to %s?',file),... + 'Mwizard','Yes','No','Cancel','Yes'); + if strcmp(button,'Yes') + status = doSaveFile([],[],h); + elseif strcmp(button,'Cancel') + status = 0; + end + end + +function doHelp(fig,evd,h) + helpdlg(sprintf(['M2HTML by Guillaume Flandin\n'... + 'Copyright © 2003-2004\nGuillaume@artefact.tk\n'... + '']),'M2HTML Wizard'); + +%=============================================================================== + +%------------------------------------------------------------------------------- +%- Default parameters +%------------------------------------------------------------------------------- + +function varargout = initOptions(h) + options = struct('verbose', 1,... + 'mFiles', {{''}},... + 'htmlDir', 'doc',... + 'recursive', 0,... + 'source', 1,... + 'download',0,... + 'syntaxHighlighting', 1,... + 'tabs', 4,... + 'globalHypertextLinks', 0,... + 'graph', 0,... + 'todo', 0,... + 'load', 0,... + 'save', 0,... + 'search', 0,... + 'indexFile', 'index',... + 'extension', '.html',... + 'template', 'blue',... + 'rootdir', pwd,... + 'language','english'); + + if nargin == 1, + setappdata(h,'options',options); + else + varargout{1} = options; + end + +function refreshOptions(h) + opt = getappdata(h,'options'); + handles = getappdata(h,'handles'); + + doInitTpl(handles.template, 0, h); + doInitMfiles(handles.mfiles, 0, h); + doInitHTMLDir(handles.htmldir, 0, h) + + set(handles.recursive, 'Value', opt.recursive); + set(handles.graph, 'Value', opt.graph); %doInitGraphs(handles.graph,0,h); + set(handles.save, 'Value', opt.save); + set(handles.verbose, 'Value', opt.verbose); + set(handles.todo, 'Value', opt.todo); + set(handles.download, 'Value', opt.download); + set(handles.search, 'Value', opt.search); + set(handles.highlight, 'Value', opt.syntaxHighlighting); + set(handles.source, 'Value', opt.source); + set(handles.globalhypertext, 'Value', opt.globalHypertextLinks); + + set(handles.index, 'String', opt.indexFile); + set(handles.extension, 'String', opt.extension(2:end)); %remove the '.' + set(handles.tabs, 'String', num2str(opt.tabs)); + if ~strcmp(opt.rootdir, pwd) + warning('[M2HTML] You should ''cd %s'' before...',opt.rootdir); + end + set(handles.rootdir, 'String', opt.rootdir); % need to 'cd' if different... + set(handles.column, 'String', num2str(4)); %- not saved... default here + if ischar(opt.load) + set(handles.load, 'String', opt.load); + else + set(handles.load, 'String', ''); + end + + set(handles.textmisc, 'String', ... + 'Click on the wheel in the toolbar to launch M2HTML...'); %- not saved... default here + set(handles.waitbarmisc, 'EraseMode','normal'); + set(handles.waitbarmisc, 'Xdata',[0 0 0 0]); + set(handles.waitbarmisc, 'EraseMode','none'); + + +%------------------------------------------------------------------------------- +%- CreateFcn Callbacks +%------------------------------------------------------------------------------- + +function doInitHTMLDir(fig,evd,h) + %- problems when htmlDir is still a full path + opt = getappdata(h,'options'); + if isempty(strmatch(lower(pwd),lower(opt.htmlDir))) + opt.htmlDir = fullfile(pwd, opt.htmlDir); + end + set(fig,'String',opt.htmlDir); + setappdata(h,'options',opt); + +function doInitTpl(fig,evd,h) + %- problems when templates are still in full format + opt = getappdata(h,'options'); + d = dir(fullfile(fileparts(which(mfilename)),'templates')); + d = {d([d.isdir]).name}; + d = {d{~ismember(d,{'.' '..'})}}; + if ~isempty(d) + tpl = sprintf('%s|',d{:}); + set(fig,'String',tpl(1:end-1)); + i = strmatch(opt.template,d,'exact'); + if ~isempty(i) + set(fig,'Value',i(1)); + else + %- where is the default template ? + warning('[M2HTML] Default template ''%s'' not found.',opt.template); + set(fig,'Value',1); + opt.template = d{1}; + setappdata(h,'options',opt); + warning('[M2HTML] Using template ''%s'' instead.',opt.template); + end + else + error('[M2HTML] No template found.'); + end + + function doInitMfiles(fig,evd,h) + opt = getappdata(h,'options'); + if ~isempty(opt.mFiles{1}) + s = sprintf('''%s'', ',opt.mFiles{:}); s = s(1:end-2); + set(fig,'String',['{' s '}']); + return; + end + d = dir(pwd); d = {d([d.isdir]).name}; + d = {d{~ismember(d,{'.' '..'})}}; + if length(d) == 0 + warning('[M2HTML] No subsequent directory found. Check your cwd.'); + set(fig,'String',''); %- maybe open a uigetdir ? + opt.mFiles = {''}; + elseif length(d) == 1 + set(fig,'String',d{1}); + opt.mFiles = d; + else + s = sprintf('''%s'', ',d{:}); s = s(1:end-2); + set(fig,'String',['{' s '}']); + opt.mFiles = d; + end + setappdata(h,'options',opt); + +function doInitGraphs(fig,evd,h) + opt = getappdata(h,'options'); + [s, w] = system('dot -V'); + if s + disp('GraphViz not installed: Generation of dependency graphs desactivated.'); + disp('See http://www.graphviz.org/ to get ''dot'' tool.'); + set(fig,'FontAngle','Oblique','Enable','inactive'); + set(fig,'Value',0); + opt.graph = 0; + setappdata(h,'options',opt); + else + set(fig,'Value',opt.graph); + end + + +%=============================================================================== + +%------------------------------------------------------------------------------- +%- M-Files Input Callbacks +%------------------------------------------------------------------------------- + +function doSetMfiles(fig,evd,h) + opt = getappdata(h,'options'); + l = get(fig,'String'); + l = fliplr(deblank(fliplr(l))); + if isempty(l) | l(1) ~= '{' + opt.mFiles = {l}; + else + try, + d = eval(l); + catch, + disp('[M2HTML] The list of M-files is corrupted. Please check it.'); + return; + end + [i,v] = listdlg('ListString',d,... + 'PromptString','Select folder(s):',... + 'Name',':: M2HTML :: M-files',... + 'SelectionMode','multiple'); + if v == 1 + d = {d{i}}; + s = sprintf('''%s'', ',d{:}); s = s(1:end-2); + set(fig,'String',['{' s '}']); + end + opt.mFiles = d; + end + setappdata(h,'options',opt); + +function doSetRecursive(fig,evd,h) + opt = getappdata(h,'options'); + opt.recursive = get(fig,'Value'); + setappdata(h,'options',opt); + +%------------------------------------------------------------------------------- +%- HTML Output Callbacks +%------------------------------------------------------------------------------- + +function doSetOutputDir(fig,evd,h) + opt = getappdata(h,'options'); + opt.htmlDir = get(fig,'String'); + setappdata(h,'options',opt); + +function doSetIndex(fig,evd,h) + opt = getappdata(h,'options'); + opt.indexFile = get(fig,'String'); + setappdata(h,'options',opt); + +function doSetExtension(fig,evd,h) + opt = getappdata(h,'options'); + e = get(fig,'String'); + if ~isempty(e) & e(1) ~= '.' + e = ['.' e]; + end + opt.extension = e; + setappdata(h,'options',opt); + +function doSetTemplate(fig,evd,h) + opt = getappdata(h,'options'); + s = get(fig,'String'); + v = get(fig,'Value'); + opt.template = deblank(s(v,:)); + setappdata(h,'options',opt); + +%------------------------------------------------------------------------------- +%- Options Callbacks +%------------------------------------------------------------------------------- + +function doSetSource(fig,evd,h) + opt = getappdata(h,'options'); + opt.source = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetHighlight(fig,evd,h) + opt = getappdata(h,'options'); + opt.syntaxHighlighting = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetGraph(fig,evd,h) + opt = getappdata(h,'options'); + opt.graph = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetSearch(fig,evd,h) + opt = getappdata(h,'options'); + opt.search = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetGlobal(fig,evd,h) + opt = getappdata(h,'options'); + opt.globalHypertextLinks = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetDownload(fig,evd,h) + opt = getappdata(h,'options'); + opt.download = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetTodo(fig,evd,h) + opt = getappdata(h,'options'); + opt.todo = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetVerbose(fig,evd,h) + opt = getappdata(h,'options'); + opt.verbose = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetSaveAsMat(fig,evd,h) + opt = getappdata(h,'options'); + opt.save = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetLoadMat(fig,evd,h) + opt = getappdata(h,'options'); + [fname, pname, findex] = uigetfile('m2html.mat',... + 'Load a m2html MAT-file'); + if findex + opt.load = fullfile(pname,fname); + set(fig,'String',fullfile(pname,fname)); + end + setappdata(h,'options',opt); + +function doSetTabs(fig,evd,h) + opt = getappdata(h,'options'); + t = str2num(get(fig,'String')); + if t >= 0 & length(t) == 1 + opt.tabs = t; + else + set(fig,'String',num2str(opt.tabs)); + end + setappdata(h,'options',opt); + +function doSetNbColumns(fig,evd,h) + opt = getappdata(h,'options'); + disp 'Not available'; + setappdata(h,'options',opt); + +%=============================================================================== + +function text2 = shortenText(text, l) + + if nargin == 1, l = 64; end + m = length(text); + text2 = text; + if m > l + s = floor((l - 3) / 2); + text2 = [text(1:s) '...' text(end-(l-s-3)+1:end)]; + end diff --git a/external/m2html/mwizard2.m b/external/m2html/mwizard2.m new file mode 100644 index 00000000..fe03eb4d --- /dev/null +++ b/external/m2html/mwizard2.m @@ -0,0 +1,1041 @@ +function mwizard(file) +%MWIZARD - M2HTML Graphical User Interface +% MWIZARD launches a Matlab GUI front-end to edit parameters +% that are then used by M2HTML to generate HTML documentation. +% MWIZARD(FILE) allows to specify a mat-file FILE from which +% default parameters are extracted and can be updated. +% +% For more information, please read the M2HTML tutorial and FAQ at: +% +% +% See also M2HTML + +% Copyright (C) 2004 Guillaume Flandin +% $Revision: 0.5 $Date: 2004/05/24 20:12:17 $ + +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License +% as published by the Free Software Foundation; either version 2 +% of the License, or any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation Inc, 59 Temple Pl. - Suite 330, Boston, MA 02111-1307, USA. + +% Suggestions for improvement and fixes are always welcome, although no +% guarantee is made whether and when they will be implemented. +% Send requests to Guillaume@artefact.tk + +error(nargchk(0,1,nargin)); + +disp('This is a beta version of mwizard.'); +disp('Please use the online version m2html instead.'); + +h = initWindow; + +initOptions(h); + +buildWindow(h); + +setappdata(h, 'handles', guihandles(h)); +% M. Krauski +% setappdata(h, 'pwd', pwd); + +if nargin == 0 + setappdata(h, 'file', ''); + setappdata(h, 'needsave', 1); +else + setappdata(h, 'file', file); + setappdata(h, 'needsave', 0); + opt = load(file, 'options'); + setappdata(h, 'options', opt.options); + refreshOptions(h); +end + +set(h, 'HandleVisibility', 'callback'); + +%=============================================================================== + +function h = initWindow + +h = figure('Resize', 'on',... + 'MenuBar', 'none',... + 'NumberTitle', 'off',... + 'Name', ':: M2HTML Wizard ::',... + 'Position', [200 200 500 650],... + 'Tag', mfilename); + +set(h, 'CloseRequestFcn', {@doClose,h}); + +%=============================================================================== + +function buildWindow(h) + +wincolor = struct('bg', [0.9 0.9 0.9], ... + 'fg', [0.8 0.8 0.8], ... + 'title', [0.8 0.8 0.9]); + +set(h, 'Color', wincolor.bg); + +%------------------------------------------------------------------------------- +%- Menu +%------------------------------------------------------------------------------- + +icons = load(fullfile(fileparts(which(mfilename)),'private', ... + 'm2htmltoolbarimages.mat')); + +uipushtool('CData',icons.newIcon,... + 'enable','on',... + 'Separator','off',... + 'ToolTipString','New File',... + 'ClickedCallback',{@doNewFile,h},... + 'Tag','NewTool'); + +uipushtool('CData',icons.openIcon,... + 'enable','on',... + 'Separator','off',... + 'ToolTipString','Open File',... + 'ClickedCallback',{@doOpenFile,h},... + 'Tag','OpenTool'); + +uipushtool('CData',icons.saveIcon,... + 'enable','on',... + 'Separator','off',... + 'ToolTipString','Save File',... + 'ClickedCallback',{@doSaveFile,h},... + 'Tag','SaveTool'); + +uipushtool('CData',icons.saveAsIcon,... + 'enable','on',... + 'Separator','off',... + 'ToolTipString','Save File As',... + 'ClickedCallback',{@doSaveAsFile,h},... + 'Tag','SaveAsTool'); + +uipushtool('CData',icons.wheelIcon,... + 'enable','on',... + 'Separator','on',... + 'ToolTipString','Save and Run M2HTML',... + 'ClickedCallback',{@doRunFile,h},... + 'Tag','RunTool'); + +uipushtool('CData',icons.webIcon,... + 'enable','on',... + 'Separator','on',... + 'ToolTipString','Online Tutorial',... + 'ClickedCallback',... + 'web(''http://www.artefact.tk/software/matlab/m2html/'')',... + 'Tag','WebTool'); + +uipushtool('CData',icons.helpIcon,... + 'enable','on',... + 'Separator','off',... + 'ToolTipString','Help',... + 'ClickedCallback',{@doHelp,h},... + 'Tag','HelpTool'); + +%------------------------------------------------------------------------------- +%- Title +%------------------------------------------------------------------------------- + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'Position',[0.02,0.92,0.96,0.06],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','M2HTML Wizard',... + 'FontSize',18,... + 'HorizontalAlignment','center',... + 'Position',[0.03,0.93,0.94,0.038],... + 'BackgroundColor',wincolor.title); + +%------------------------------------------------------------------------------- +%- Input +%------------------------------------------------------------------------------- + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'Position',[0.02,0.74,0.96,0.16],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'HorizontalAlignment','center',... + 'Position',[0.02,0.87,0.96,0.03],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','M-Files Input',... + 'HorizontalAlignment','left',... + 'Position',[0.03,0.875,0.94,0.02],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Root directory:',... + 'FontAngle','oblique',... + 'HorizontalAlignment','left',... + 'Position',[0.04,0.825,0.6,0.03],... + 'BackgroundColor',wincolor.fg); + +% M. Krauski 7/20/04 +% changed and resized control to work with browse push button + +% uicontrol('Style','edit',... +% 'Units','Normalized',... +% 'Position',[0.21,0.83,0.74,0.03],... +% 'String',pwd,... +% 'Enable','inactive',... +% 'HorizontalAlignment','left',... +% 'Callback','uigetfile;',...%uigetdir +% 'BackgroundColor',wincolor.bg,... +% 'Tag','rootdir'); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.21,0.83,0.59,0.03],... + 'String',pwd,... %this will be over written in refreshOptions + 'Enable','inactive',... + 'HorizontalAlignment','left',... + 'BackgroundColor',wincolor.bg,... + 'Tag','rootdir'); + +% M. Krauski 7/20/04 +% added control +uicontrol('Style','pushbutton',... + 'Units','Normalized',... + 'Position',[0.81,0.83,0.14,0.03],... + 'String','Browse...',... + 'HorizontalAlignment','left',... + 'Callback',{@doBrowseButton,h},... + 'BackgroundColor',wincolor.bg,... + 'Tag','browsebutton'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Relative pathes:',... + 'HorizontalAlignment','left',... + 'Position',[0.04,0.785,0.6,0.03],... + 'BackgroundColor',wincolor.fg); + +% M. Krauski 7/20/04 +% changed and resized control to work with select push button + +% uicontrol('Style','edit',... +% 'Units','Normalized',... +% 'Position',[0.21,0.79,0.74,0.03],... +% 'String','',... +% 'HorizontalAlignment','left',... +% 'Callback',{@doSetMfiles,h},... +% 'CreateFcn',{@doInitMfiles,h},... +% 'BackgroundColor',wincolor.bg,... +% 'Tag','mfiles'); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.21,0.79,0.59,0.03],... + 'String','',... + 'Enable','inactive',... + 'HorizontalAlignment','left',... + 'CreateFcn',{@doInitMfiles,h},... + 'BackgroundColor',wincolor.bg,... + 'Tag','mfiles'); + +uicontrol('Style','pushbutton',... + 'Units','Normalized',... + 'Position',[0.81,0.79,0.14,0.03],... + 'String','Select...',... + 'HorizontalAlignment','left',... + 'Callback',{@doSelectMfiles,h},... + 'BackgroundColor',wincolor.bg,... + 'Tag','selectbutton'); + +uicontrol('Style','CheckBox',... + 'Units','Normalized',... + 'Position',[0.04,0.749,0.42,0.032],... + 'String',' Recursive',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetRecursive,h},... + 'Value',0,... + 'BackgroundColor',wincolor.bg,... + 'Tag','recursive'); + +%------------------------------------------------------------------------------- +%- Output +%------------------------------------------------------------------------------- + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'Position',[0.02, 0.56,0.96,0.16],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'HorizontalAlignment','center',... + 'Position',[0.02,0.69,0.96,0.03],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','HTML Output',... + 'HorizontalAlignment','left',... + 'Position',[0.03,0.695,0.94,0.02],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Output Directory:',... + 'HorizontalAlignment','left',... + 'Position',[0.04,0.645,0.6,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.21,0.65,0.74,0.03],... + 'String','',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetOutputDir,h},... + 'CreateFcn',{@doInitHTMLDir,h},... + 'BackgroundColor',wincolor.bg,... + 'Tag','htmldir'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','HTML Index:',... + 'HorizontalAlignment','left',... + 'Position',[0.04,0.605,0.6,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.21,0.61,0.25,0.03],... + 'String','index',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetIndex,h},... + 'BackgroundColor',wincolor.bg,... + 'Tag','index'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Extension:',... + 'HorizontalAlignment','left',... + 'Position',[0.53,0.605,0.3,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.70,0.61,0.25,0.03],... + 'String','html',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetExtension,h},... + 'BackgroundColor',wincolor.bg,... + 'Tag','extension'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Template:',... + 'HorizontalAlignment','left',... + 'Position',[0.04,0.565,0.3,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','popupmenu',... + 'Units','Normalized',... + 'Position',[0.21,0.57,0.25,0.03],... + 'String','',... + 'HorizontalAlignment','center',... + 'Callback',{@doSetTemplate,h},... + 'CreateFcn',{@doInitTpl,h},... + 'BackgroundColor',wincolor.bg,... + 'Tag','template'); + +%------------------------------------------------------------------------------- +%- Other options +%------------------------------------------------------------------------------- + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'Position',[0.02,0.24,0.96,0.30],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'HorizontalAlignment','center',... + 'Position',[0.02,0.51,0.96,0.03],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Other Options',... + 'HorizontalAlignment','left',... + 'Position',[0.03,0.515,0.94,0.02],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.04,0.464,0.42,0.032],... + 'String',' Include Source Code',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetSource,h},... + 'Value',1,... + 'TooltipString','Include Source Code of each M-file',... + 'BackgroundColor',wincolor.bg,... + 'Tag','source'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.53,0.464,0.42,0.032],... + 'String',' Syntax Highlighting',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetHighlight,h},... + 'Value',1,... + 'TooltipString','Source Code Syntax Highlighting',... + 'BackgroundColor',wincolor.bg,... + 'Tag','highlight'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.04,0.42,0.42,0.032],... + 'String',' Create Dependency Graphs',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetGraph,h},... + 'CreateFcn',{@doInitGraphs,h},... + 'Value',0,... + 'TooltipString','Compute a Dependency Graph using GraphViz',... + 'BackgroundColor',wincolor.bg,... + 'Tag','graph'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.53,0.42,0.42,0.032],... + 'String',' PHP Search Engine',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetSearch,h},... + 'Value',0,... + 'TooltipString','Create an Index for a PHP Search Engine',... + 'BackgroundColor',wincolor.bg,... + 'Tag','search'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.04,0.378,0.42,0.032],... + 'String',' Global Hyperlinks',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetGlobal,1},... + 'Value',0,... + 'TooltipString','Hypertext links among separate Matlab Directories',... + 'BackgroundColor',wincolor.bg,... + 'Tag','globalhypertext'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.53,0.378,0.42,0.032],... + 'String',' Downloadable M-files',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetDownload,h},... + 'TooltipString','Add a link to download each M-file separately',... + 'Value',0,... + 'BackgroundColor',wincolor.bg,... + 'Tag','download'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.04,0.336,0.42,0.032],... + 'String',' To Do List',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetTodo,h},... + 'TooltipString',['Create a TODO list in each directory summarizing'... + ' all the ''% TODO %'' lines found in Matlab code'],... + 'Value',0,... + 'BackgroundColor',wincolor.bg,... + 'Tag','todo'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.53,0.336,0.42,0.032],... + 'String',' Verbose Mode',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetVerbose,h},... + 'TooltipString','Verbose mode',... + 'Value',1,... + 'BackgroundColor',wincolor.bg,... + 'Tag','verbose'); + +uicontrol('Style','checkbox',... + 'Units','Normalized',... + 'Position',[0.04,0.294,0.42,0.032],... + 'String',' Save M-files Parsing',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetSaveAsMat,h},... + 'TooltipString',['Save current state after M-files parsing in '... + '''m2html.mat'' in the Output directory'],... + 'Value',0,... + 'BackgroundColor',wincolor.bg,... + 'Tag','save'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Load File:',... + 'HorizontalAlignment','left',... + 'Position',[0.53,0.289,0.3,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.70,0.294,0.25,0.03],... + 'String','',... + 'HorizontalAlignment','left',... + 'Callback',{@doSetLoadMat,h},... + 'TooltipString',['Load a previously saved MAT file '... + 'to generate HTML files once again'],... + 'BackgroundColor',wincolor.bg,... + 'Tag','load'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Tabs Length:',... + 'HorizontalAlignment','left',... + 'Position',[0.04,0.247,0.3,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.21,0.252,0.25,0.03],... + 'String','4',... + 'HorizontalAlignment','right',... + 'Callback',{@doSetTabs,h},... + 'TooltipString',['Replace horizontal tabs in source code '... + 'by N white space characters'],... + 'BackgroundColor',wincolor.bg,... + 'Tag','tabs'); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Nb Columns:',... + 'FontAngle','oblique',... + 'HorizontalAlignment','left',... + 'Position',[0.53,0.247,0.3,0.03],... + 'BackgroundColor',wincolor.fg); + +uicontrol('Style','edit',... + 'Units','Normalized',... + 'Position',[0.70,0.252,0.25,0.03],... + 'String','4',... + 'HorizontalAlignment','right',... + 'Callback',{@doSetNbColumns,h},... + 'TooltipString','Number of columns for M-files output - not available',... + 'Enable','inactive',... + 'BackgroundColor',wincolor.bg,... + 'Tag','column'); + + +%------------------------------------------------------------------------------- +%- Space available +%------------------------------------------------------------------------------- + +% uicontrol('Style','Frame',... +% 'Units','Normalized',... +% 'Position',[0.02,0.07,0.96,0.14],... +% 'BackgroundColor',wincolor.fg); + +% simulate a frame using an axes +% http://www.mathworks.com/support/solutions/data/1-15P9E.html +axes('Color',wincolor.fg,... + 'XTick',[],'YTick',[],... + 'Units','Normalized',... + 'Box','on',... + 'Position',[0.02,0.07,0.9585,0.14]); + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'HorizontalAlignment','center',... + 'Position',[0.02,0.19,0.96,0.03],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','M2HTML status',... + 'HorizontalAlignment','left',... + 'Position',[0.03,0.195,0.94,0.02],... + 'BackgroundColor',wincolor.title); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String','Click on the wheel in the toolbar to launch M2HTML...',... + 'HorizontalAlignment','left',... % center + 'Position',[0.12,0.135,0.76,0.02],... + 'Visible','on',... + 'BackgroundColor',wincolor.fg,... + 'Tag','textmisc'); + +axes('XLim',[0 100],... + 'YLim',[0 1],... + 'Box','on', ... + 'Units','Normalized',... + 'Position',[0.07,0.09,0.86,0.03],... + 'XTickMode','manual',... + 'YTickMode','manual',... + 'layer','top',... + 'XTick',[],... + 'YTick',[],... + 'XTickLabelMode','manual',... + 'XTickLabel',[],... + 'YTickLabelMode','manual',... + 'Visible','on',... + 'YTickLabel',[],... + 'Color',wincolor.bg); + +x = 0; % between 0 and 100 +xpatch = [0 x x 0]; +ypatch = [0 0 1 1]; + +p = patch(xpatch,ypatch,'r',... + 'EdgeColor','r',... + 'Visible','on',... + 'EraseMode','none',... + 'Tag','waitbarmisc'); + +l = line([100 0 0 100 100], [0 0 1 1 0], ... + 'EraseMode','none', ... + 'Visible','on',... + 'Color',get(gca,'XColor')); + +% for i=10:5:100 +% set(p,'Xdata',[0 i i 0]); pause(0.02); +% end +% set(p,'EraseMode','normal'); +% set(p,'Xdata',[0 0 0 0]); +% set(p,'EraseMode','none'); + +%------------------------------------------------------------------------------- +%- Footnote +%------------------------------------------------------------------------------- + +uicontrol('Style','Frame',... + 'Units','Normalized',... + 'Position',[0.02,0.02,0.96,0.03],... + 'BackgroundColor',[0.8 0.8 0.9]); + +uicontrol('Style','Text',... + 'Units','Normalized',... + 'String',['M2HTML © 2004 Guillaume Flandin '],... + 'HorizontalAlignment','right',... + 'Position',[0.03,0.025,0.94,0.02],... + 'BackgroundColor',[0.8 0.8 0.9]); + +%=============================================================================== + +function doClose(fig,evd,h) + status = doCheckSave(h); + if status + delete(h); + end + +function doNewFile(fig,evd,h) + status = doCheckSave(h); + if status + initOptions(h); + setappdata(h, 'needsave', 1); + % refresh options in GUI... + refreshOptions(h); + end + +function doOpenFile(fig,evd,h) + status = doCheckSave(h); + if status + [filename, pathname] = uigetfile('*.mat','Open File'); + if ~(isequal(filename,0)|isequal(pathname,0)) + opt = load(fullfile(pathname,filename),'options'); + setappdata(h,'options',opt.options); + setappdata(h,'file',fullfile(pathname,filename)); + end + end + % refresh options in GUI... + refreshOptions(h); + +function status = doSaveFile(fig,evd,h) + file = getappdata(h,'file'); + status = 1; + if isempty(file) + status = doSaveAsFile(fig,evd,h); + else + options = getappdata(h,'options'); + save(file, 'options'); + end + setappdata(h,'needsave',0); + +function status = doSaveAsFile(fig,evd,h) + opt = getappdata(h,'options'); + [filename, pathname] = uiputfile(strcat(opt.rootdir,filesep,'matlab.mat'),... + 'Save File as'); + if ~(isequal(filename,0)|isequal(pathname,0)) + setappdata(h,'file',fullfile(pathname,filename)); + status = doSaveFile(fig,evd,h); + else + status = 0; + end + +function doRunFile(fig,evd,h) + status = doSaveFile(fig,evd,h); + if status + opt = getappdata(h,'options'); + file = getappdata(h,'file'); + r = {'off' 'on'}; + % opt could be directly given to m2html (no need for file saving) + % just need to convert on/off using opt.param = r{opt.param+1} + m2html('load',file,'recursive',r{opt.recursive+1}); + % 'recursive' is specified to force m2html to parse M-files + end + +function status = doCheckSave(h) + file = getappdata(h,'file'); + if isempty(file), file = 'Untitled'; end + needsave = getappdata(h,'needsave'); + status = 1; + if needsave + button = questdlg(sprintf('Save changes to %s?',file),... + 'Mwizard','Yes','No','Cancel','Yes'); + if strcmp(button,'Yes') + status = doSaveFile([],[],h); + elseif strcmp(button,'Cancel') + status = 0; + end + end + +function doHelp(fig,evd,h) + helpdlg(sprintf(['M2HTML by Guillaume Flandin\n'... + 'Copyright © 2003-2004\nGuillaume@artefact.tk\n'... + '']),'M2HTML Wizard'); + +%=============================================================================== + +%------------------------------------------------------------------------------- +%- Default parameters +%------------------------------------------------------------------------------- + +function varargout = initOptions(h) + options = struct('verbose', 1,... + 'mFiles', {{''}},... + 'htmlDir', 'doc',... + 'recursive', 0,... + 'source', 1,... + 'download',0,... + 'syntaxHighlighting', 1,... + 'tabs', 4,... + 'globalHypertextLinks', 0,... + 'graph', 0,... + 'todo', 0,... + 'load', 0,... + 'save', 0,... + 'search', 0,... + 'indexFile', 'index',... + 'extension', '.html',... + 'template', 'blue',... + 'rootdir', pwd,... + 'language','english'); + + if nargin == 1, + setappdata(h,'options',options); + else + varargout{1} = options; + end + +function refreshOptions(h) + opt = getappdata(h,'options'); + handles = getappdata(h,'handles'); + + doInitTpl(handles.template, 0, h); + doInitMfiles(handles.mfiles, 0, h); + doInitHTMLDir(handles.htmldir, 0, h) + + set(handles.recursive, 'Value', opt.recursive); + set(handles.graph, 'Value', opt.graph); %doInitGraphs(handles.graph,0,h); + set(handles.save, 'Value', opt.save); + set(handles.verbose, 'Value', opt.verbose); + set(handles.todo, 'Value', opt.todo); + set(handles.download, 'Value', opt.download); + set(handles.search, 'Value', opt.search); + set(handles.highlight, 'Value', opt.syntaxHighlighting); + set(handles.source, 'Value', opt.source); + set(handles.globalhypertext, 'Value', opt.globalHypertextLinks); + + set(handles.index, 'String', opt.indexFile); + set(handles.extension, 'String', opt.extension(2:end)); %remove the '.' + set(handles.tabs, 'String', num2str(opt.tabs)); +% if ~strcmp(opt.rootdir, pwd) +% warning('[M2HTML] You should ''cd %s'' before...',opt.rootdir); +% end + set(handles.rootdir, 'String', opt.rootdir); % need to 'cd' if different... + set(handles.column, 'String', num2str(4)); %- not saved... default here + if ischar(opt.load) + set(handles.load, 'String', opt.load); + else + set(handles.load, 'String', ''); + end + + set(handles.textmisc, 'String', ... + 'Click on the wheel in the toolbar to launch M2HTML...'); %- not saved... default here + set(handles.waitbarmisc, 'EraseMode','normal'); + set(handles.waitbarmisc, 'Xdata',[0 0 0 0]); + set(handles.waitbarmisc, 'EraseMode','none'); + + +%------------------------------------------------------------------------------- +%- CreateFcn Callbacks +%------------------------------------------------------------------------------- + +function doInitHTMLDir(fig,evd,h) + opt = getappdata(h,'options'); + [path,name] = fileparts(opt.htmlDir); + if isempty(path) + opt.htmlDir = fullfile(opt.rootdir, opt.htmlDir); + end + set(fig,'String',opt.htmlDir); + setappdata(h,'options',opt); + +function doInitTpl(fig,evd,h) + %- problems when templates are still in full format + opt = getappdata(h,'options'); + d = dir(fullfile(fileparts(which(mfilename)),'templates')); + d = {d([d.isdir]).name}; + d = {d{~ismember(d,{'.' '..'})}}; + if ~isempty(d) + tpl = sprintf('%s|',d{:}); + set(fig,'String',tpl(1:end-1)); + i = strmatch(opt.template,d,'exact'); + if ~isempty(i) + set(fig,'Value',i(1)); + else + %- where is the default template ? + warning('[M2HTML] Default template ''%s'' not found.',opt.template); + set(fig,'Value',1); + opt.template = d{1}; + setappdata(h,'options',opt); + warning('[M2HTML] Using template ''%s'' instead.',opt.template); + end + else + error('[M2HTML] No template found.'); + end + + function doInitMfiles(fig,evd,h) + opt = getappdata(h,'options'); + if ~isempty(opt.mFiles{1}) + s = sprintf('''%s'', ',opt.mFiles{:}); s = s(1:end-2); + set(fig,'String',['{' s '}']); + return; + end + d = dir(opt.rootdir); d = {d([d.isdir]).name}; + d = {d{~ismember(d,{'.' '..'})}}; + if length(d) == 0 + warning('[M2HTML] No subsequent directory found. Check your cwd.'); + set(fig,'String',''); %- maybe open a uigetdir ? + opt.mFiles = {''}; + elseif length(d) == 1 + set(fig,'String',d{1}); + opt.mFiles = d; + else + s = sprintf('''%s'', ',d{:}); s = s(1:end-2); + set(fig,'String',['{' s '}']); + opt.mFiles = d; + end + setappdata(h,'options',opt); + +function doInitGraphs(fig,evd,h) + opt = getappdata(h,'options'); + [s, w] = system('dot -V'); + if s + disp('GraphViz not installed: Generation of dependency graphs desactivated.'); + disp('See http://www.graphviz.org/ to get ''dot'' tool.'); + set(fig,'FontAngle','Oblique','Enable','inactive'); + set(fig,'Value',0); + opt.graph = 0; + setappdata(h,'options',opt); + else + set(fig,'Value',opt.graph); + end + + +%=============================================================================== + +%------------------------------------------------------------------------------- +%- M-Files Input Callbacks +%------------------------------------------------------------------------------- + +function doBrowseButton(fig,evd,h) + opt = getappdata(h,'options'); + handles = getappdata(h,'handles'); + d = uigetdir(pwd,'Select the Root directory'); + if ~d, return; end; + opt.rootdir = d; + set(handles.rootdir,'String',d); + + % set mfiles + d = dir(opt.rootdir); d = {d([d.isdir]).name}; + d = {d{~ismember(d,{'.' '..'})}}; + if length(d) == 0 + warning('[M2HTML] No subsequent directory found. Check your cwd.'); + set(handles.mfiles,'String',''); + opt.mFiles = {''}; + elseif length(d) == 1 + set(handles.mfiles,'String',d{1}); + opt.mFiles = d; + else + s = sprintf('''%s'', ',d{:}); s = s(1:end-2); + set(handles.mfiles,'String',['{' s '}']); + opt.mFiles = d; + end + + % set htmldir + [path,name] = fileparts(opt.htmlDir); + opt.htmlDir = fullfile(opt.rootdir, name); + set(handles.htmldir,'String',opt.htmlDir); + + setappdata(h,'options',opt); + +function doSelectMfiles(fig,evd,h) + opt = getappdata(h,'options'); + handles = getappdata(h,'handles'); + + d = dir(opt.rootdir); d = {d([d.isdir]).name}; + d = {d{~ismember(d,{'.' '..'})}}; + + [i,v] = listdlg('ListString',d,... + 'PromptString','Select folder(s):',... + 'Name',':: M2HTML :: M-files',... + 'SelectionMode','multiple'); + if v == 1 + d = {d{i}}; + s = sprintf('''%s'', ',d{:}); s = s(1:end-2); + set(handles.mfiles,'String',['{' s '}']); + end + opt.mFiles = d; + + setappdata(h,'options',opt); + +function doSetRecursive(fig,evd,h) + opt = getappdata(h,'options'); + opt.recursive = get(fig,'Value'); + setappdata(h,'options',opt); + +%------------------------------------------------------------------------------- +%- HTML Output Callbacks +%------------------------------------------------------------------------------- + +function doSetOutputDir(fig,evd,h) + opt = getappdata(h,'options'); + opt.htmlDir = get(fig,'String'); + setappdata(h,'options',opt); + +function doSetIndex(fig,evd,h) + opt = getappdata(h,'options'); + opt.indexFile = get(fig,'String'); + setappdata(h,'options',opt); + +function doSetExtension(fig,evd,h) + opt = getappdata(h,'options'); + e = get(fig,'String'); + if ~isempty(e) & e(1) ~= '.' + e = ['.' e]; + end + opt.extension = e; + setappdata(h,'options',opt); + +function doSetTemplate(fig,evd,h) + opt = getappdata(h,'options'); + s = get(fig,'String'); + v = get(fig,'Value'); + opt.template = deblank(s(v,:)); + setappdata(h,'options',opt); + +%------------------------------------------------------------------------------- +%- Options Callbacks +%------------------------------------------------------------------------------- + +function doSetSource(fig,evd,h) + opt = getappdata(h,'options'); + opt.source = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetHighlight(fig,evd,h) + opt = getappdata(h,'options'); + opt.syntaxHighlighting = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetGraph(fig,evd,h) + opt = getappdata(h,'options'); + opt.graph = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetSearch(fig,evd,h) + opt = getappdata(h,'options'); + opt.search = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetGlobal(fig,evd,h) + opt = getappdata(h,'options'); + opt.globalHypertextLinks = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetDownload(fig,evd,h) + opt = getappdata(h,'options'); + opt.download = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetTodo(fig,evd,h) + opt = getappdata(h,'options'); + opt.todo = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetVerbose(fig,evd,h) + opt = getappdata(h,'options'); + opt.verbose = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetSaveAsMat(fig,evd,h) + opt = getappdata(h,'options'); + opt.save = get(fig,'Value'); + setappdata(h,'options',opt); + +function doSetLoadMat(fig,evd,h) + opt = getappdata(h,'options'); + [fname, pname, findex] = uigetfile('m2html.mat',... + 'Load a m2html MAT-file'); + if findex + opt.load = fullfile(pname,fname); + set(fig,'String',fullfile(pname,fname)); + end + setappdata(h,'options',opt); + +function doSetTabs(fig,evd,h) + opt = getappdata(h,'options'); + t = str2num(get(fig,'String')); + if t >= 0 & length(t) == 1 + opt.tabs = t; + else + set(fig,'String',num2str(opt.tabs)); + end + setappdata(h,'options',opt); + +function doSetNbColumns(fig,evd,h) + opt = getappdata(h,'options'); + disp 'Not available'; + setappdata(h,'options',opt); + +%=============================================================================== + +function text2 = shortenText(text, l) + + if nargin == 1, l = 64; end + m = length(text); + text2 = text; + if m > l + s = floor((l - 3) / 2); + text2 = [text(1:s) '...' text(end-(l-s-3)+1:end)]; + end diff --git a/external/m2html/private/doxyread.m b/external/m2html/private/doxyread.m new file mode 100644 index 00000000..e7aae95b --- /dev/null +++ b/external/m2html/private/doxyread.m @@ -0,0 +1,101 @@ +function [statlist, docinfo] = doxyread(filename) +%DOXYREAD Read a 'search.idx' file generated by DOXYGEN +% STATLIST = DOXYREAD(FILENAME) reads FILENAME (Doxygen search.idx +% format) and returns the list of keywords STATLIST as a cell array. +% [STATLIST, DOCINFO] = DOXYREAD(FILENAME) also returns a cell array +% containing details for each keyword (frequency in each file where it +% appears and the URL). +% +% See also DOXYSEARCH, DOXYWRITE + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/05/10 17:41:21 $ + +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License +% as published by the Free Software Foundation; either version 2 +% of the License, or any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation Inc, 59 Temple Pl. - Suite 330, Boston, MA 02111-1307, USA. + +% Suggestions for improvement and fixes are always welcome, although no +% guarantee is made whether and when they will be implemented. +% Send requests to + +% See for more details. + +error(nargchk(0,1,nargin)); +if nargin == 0, + filename = 'search.idx'; +end + +%- Open the search index file +[fid, errmsg] = fopen(filename,'r','ieee-be'); +if fid == -1, error(errmsg); end + +%- 4 byte header (DOXS) +header = char(fread(fid,4,'uchar'))'; + +%- 256*256*4 byte index +idx = fread(fid,256*256,'uint32'); +idx = reshape(idx,256,256); + +%- Extract list of words +i = find(idx); +statlist = cell(0,2); +for j=1:length(i) + fseek(fid, idx(i(j)), 'bof'); + statw = readString(fid); + while ~isempty(statw) + statidx = readInt(fid); + statlist{end+1,1} = statw; % word + statlist{end,2} = statidx; % index + statw = readString(fid); + end +end + +%- Extract occurence frequency of each word and docs info (name and url) +docinfo = cell(size(statlist,1),1); +for k=1:size(statlist,1) + fseek(fid, statlist{k,2}, 'bof'); + numdoc = readInt(fid); + docinfo{k} = cell(numdoc,4); + for m=1:numdoc + docinfo{k}{m,1} = readInt(fid); % idx + docinfo{k}{m,2} = readInt(fid); % freq + end + for m=1:numdoc + fseek(fid, docinfo{k}{m,1}, 'bof'); + docinfo{k}{m,3} = readString(fid); % name + docinfo{k}{m,4} = readString(fid); % url + end + docinfo{k} = reshape({docinfo{k}{:,2:4}},numdoc,[]); +end + +%- Close the search index file +fclose(fid); + +%- Remove indexes +statlist = {statlist{:,1}}'; + +%=========================================================================== +function s = readString(fid) + + s = ''; + while 1 + w = fread(fid,1,'uchar'); + if w == 0, break; end + s(end+1) = char(w); + end + +%=========================================================================== +function i = readInt(fid) + + i = fread(fid,1,'uint32'); diff --git a/external/m2html/private/doxysearch.m b/external/m2html/private/doxysearch.m new file mode 100644 index 00000000..5bd33909 --- /dev/null +++ b/external/m2html/private/doxysearch.m @@ -0,0 +1,256 @@ +function result = doxysearch(query,filename) +%DOXYSEARCH Search a query in a 'search.idx' file +% RESULT = DOXYSEARCH(QUERY,FILENAME) looks for request QUERY +% in FILENAME (Doxygen search.idx format) and returns a list of +% files responding to the request in RESULT. +% +% See also DOXYREAD, DOXYWRITE + +% Copyright (C) 2004 Guillaume Flandin +% $Revision: 1.1 $Date: 2004/05/05 14:33:55 $ + +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License +% as published by the Free Software Foundation; either version 2 +% of the License, or any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation Inc, 59 Temple Pl. - Suite 330, Boston, MA 02111-1307, USA. + +% Suggestions for improvement and fixes are always welcome, although no +% guarantee is made whether and when they will be implemented. +% Send requests to + +% See for more details. + +error(nargchk(1,2,nargin)); +if nargin == 1, + filename = 'search.idx'; +end + +%- Open the search index file +[fid, errmsg] = fopen(filename,'r','ieee-be'); +if fid == -1, error(errmsg); end + +%- 4 byte header (DOXS) +header = char(fread(fid,4,'uchar'))'; +if ~all(header == 'DOXS') + error('[doxysearch] Header of index file is invalid!'); +end + +%- many thanks to and +r = query; +requiredWords = {}; +forbiddenWords = {}; +foundWords = {}; +res = {}; +while 1 + % extract each word of the query + [t,r] = strtok(r); + if isempty(t), break, end; + if t(1) == '+' + t = t(2:end); requiredWords{end+1} = t; + elseif t(1) == '-' + t = t(2:end); forbiddenWords{end+1} = t; + end + if ~ismember(t,foundWords) + foundWords{end+1} = t; + res = searchAgain(fid,t,res); + end +end + +%- Filter and sort results +docs = combineResults(res); +filtdocs = filterResults(docs,requiredWords,forbiddenWords); +filtdocs = normalizeResults(filtdocs); +res = sortResults(filtdocs); + +%- +if nargout + result = res; +else + for i=1:size(res,1) + fprintf(' %d. %s - %s\n ',i,res{i,1},res{i,2}); + for j=1:size(res{i,4},1) + fprintf('%s ',res{i,4}{j,1}); + end + fprintf('\n'); + end +end + +%- Close the search index file +fclose(fid); + +%=========================================================================== +function res = searchAgain(fid, word,res) + + i = computeIndex(word); + if i > 0 + + fseek(fid,i*4+4,'bof'); % 4 bytes per entry, skip header + start = size(res,1); + idx = readInt(fid); + + if idx > 0 + + fseek(fid,idx,'bof'); + statw = readString(fid); + while ~isempty(statw) + statidx = readInt(fid); + if length(statw) >= length(word) & ... + strcmp(statw(1:length(word)),word) + res{end+1,1} = statw; % word + res{end,2} = word; % match + res{end,3} = statidx; % index + res{end,4} = (length(statw) == length(word)); % full + res{end,5} = {}; % doc + end + statw = readString(fid); + end + + totalfreq = 0; + for j=start+1:size(res,1) + fseek(fid,res{j,3},'bof'); + numdoc = readInt(fid); + docinfo = {}; + for m=1:numdoc + docinfo{m,1} = readInt(fid); % idx + docinfo{m,2} = readInt(fid); % freq + docinfo{m,3} = 0; % rank + totalfreq = totalfreq + docinfo{m,2}; + if res{j,2}, + totalfreq = totalfreq + docinfo{m,2}; + end; + end + for m=1:numdoc + fseek(fid, docinfo{m,1}, 'bof'); + docinfo{m,4} = readString(fid); % name + docinfo{m,5} = readString(fid); % url + end + res{j,5} = docinfo; + end + + for j=start+1:size(res,1) + for m=1:size(res{j,5},1) + res{j,5}{m,3} = res{j,5}{m,2} / totalfreq; + end + end + + end % if idx > 0 + + end % if i > 0 + +%=========================================================================== +function docs = combineResults(result) + + docs = {}; + for i=1:size(result,1) + for j=1:size(result{i,5},1) + key = result{i,5}{j,5}; + rank = result{i,5}{j,3}; + if ~isempty(docs) & ismember(key,{docs{:,1}}) + l = find(ismember({docs{:,1}},key)); + docs{l,3} = docs{l,3} + rank; + docs{l,3} = 2 * docs{l,3}; + else + l = size(docs,1)+1; + docs{l,1} = key; % key + docs{l,2} = result{i,5}{j,4}; % name + docs{l,3} = rank; % rank + docs{l,4} = {}; %words + end + n = size(docs{l,4},1); + docs{l,4}{n+1,1} = result{i,1}; % word + docs{l,4}{n+1,2} = result{i,2}; % match + docs{l,4}{n+1,3} = result{i,5}{j,2}; % freq + end + end + +%=========================================================================== +function filtdocs = filterResults(docs,requiredWords,forbiddenWords) + + filtdocs = {}; + for i=1:size(docs,1) + words = docs{i,4}; + c = 1; + j = size(words,1); + % check required + if ~isempty(requiredWords) + found = 0; + for k=1:j + if ismember(words{k,1},requiredWords) + found = 1; + break; + end + end + if ~found, c = 0; end + end + % check forbidden + if ~isempty(forbiddenWords) + for k=1:j + if ismember(words{k,1},forbiddenWords) + c = 0; + break; + end + end + end + % keep it or not + if c, + l = size(filtdocs,1)+1; + filtdocs{l,1} = docs{i,1}; + filtdocs{l,2} = docs{i,2}; + filtdocs{l,3} = docs{i,3}; + filtdocs{l,4} = docs{i,4}; + end; + end + +%=========================================================================== +function docs = normalizeResults(docs); + + m = max([docs{:,3}]); + for i=1:size(docs,1) + docs{i,3} = 100 * docs{i,3} / m; + end + +%=========================================================================== +function result = sortResults(docs); + + [y, ind] = sort([docs{:,3}]); + result = {}; + ind = fliplr(ind); + for i=1:size(docs,1) + result{i,1} = docs{ind(i),1}; + result{i,2} = docs{ind(i),2}; + result{i,3} = docs{ind(i),3}; + result{i,4} = docs{ind(i),4}; + end + +%=========================================================================== +function i = computeIndex(word) + + if length(word) < 2, + i = -1; + else + i = double(word(1)) * 256 + double(word(2)); + end + +%=========================================================================== +function s = readString(fid) + + s = ''; + while 1 + w = fread(fid,1,'uchar'); + if w == 0, break; end + s(end+1) = char(w); + end + +%=========================================================================== +function i = readInt(fid) + + i = fread(fid,1,'uint32'); \ No newline at end of file diff --git a/external/m2html/private/doxywrite.m b/external/m2html/private/doxywrite.m new file mode 100644 index 00000000..fe1d9bdf --- /dev/null +++ b/external/m2html/private/doxywrite.m @@ -0,0 +1,128 @@ +function doxywrite(filename, kw, statinfo, docinfo) +%DOXYWRITE Write a 'search.idx' file compatible with DOXYGEN +% DOXYWRITE(FILENAME, KW, STATINFO, DOCINFO) writes file FILENAME +% (Doxygen search.idx. format) using the cell array KW containing the +% word list, the sparse matrix (nbword x nbfile) with non-null values +% in (i,j) indicating the frequency of occurence of word i in file j +% and the cell array (nbfile x 2) containing the list of urls and names +% of each file. +% +% See also DOXYREAD + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/23/10 15:52:56 $ + +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License +% as published by the Free Software Foundation; either version 2 +% of the License, or any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation Inc, 59 Temple Pl. - Suite 330, Boston, MA 02111-1307, USA. + +% Suggestions for improvement and fixes are always welcome, although no +% guarantee is made whether and when they will be implemented. +% Send requests to + +% See for more details. + +error(nargchk(4,4,nargin)); + +%- Open the search index file +[fid, errmsg] = fopen(filename,'w','ieee-be'); +if fid == -1, error(errmsg); end + +%- Write 4 byte header (DOXS) +fwrite(fid,'DOXS','uchar'); +pos = ftell(fid); + +%- Write 256 * 256 header +idx = zeros(256); +writeInt(fid, idx); + +%- Write word lists +i = 1; +idx2 = zeros(1,length(kw)); +while 1 + s = kw{i}(1:2); + idx(double(s(2)+1), double(s(1)+1)) = ftell(fid); + while i <= length(kw) & strmatch(s, kw{i}) + writeString(fid,kw{i}); + idx2(i) = ftell(fid); + writeInt(fid,0); + i = i + 1; + end + fwrite(fid, 0, 'int8'); + if i > length(kw), break; end +end + +%- Write extra padding bytes +pad = mod(4 - mod(ftell(fid),4), 4); +for i=1:pad, fwrite(fid,0,'int8'); end +pos2 = ftell(fid); + +%- Write 256*256 header again + fseek(fid, pos, 'bof'); + writeInt(fid, idx); + +% Write word statistics +fseek(fid,pos2,'bof'); +idx3 = zeros(1,length(kw)); +for i=1:length(kw) + idx3(i) = ftell(fid); + [ia, ib, v] = find(statinfo(i,:)); + counter = length(ia); % counter + writeInt(fid,counter); + for j=1:counter + writeInt(fid,ib(j)); % index + writeInt(fid,v(j)); % freq + end +end +pos3 = ftell(fid); + +%- Set correct handles to keywords + for i=1:length(kw) + fseek(fid,idx2(i),'bof'); + writeInt(fid,idx3(i)); + end + +% Write urls +fseek(fid,pos3,'bof'); +idx4 = zeros(1,length(docinfo)); +for i=1:length(docinfo) + idx4(i) = ftell(fid); + writeString(fid, docinfo{i,1}); % name + writeString(fid, docinfo{i,2}); % url +end + +%- Set corrext handles to word statistics +fseek(fid,pos2,'bof'); +for i=1:length(kw) + [ia, ib, v] = find(statinfo(i,:)); + counter = length(ia); + fseek(fid,4,'cof'); % counter + for m=1:counter + writeInt(fid,idx4(ib(m)));% index + fseek(fid,4,'cof'); % freq + end +end + +%- Close the search index file +fclose(fid); + +%=========================================================================== +function writeString(fid, s) + + fwrite(fid,s,'uchar'); + fwrite(fid,0,'int8'); + +%=========================================================================== +function writeInt(fid, i) + + fwrite(fid,i,'uint32'); diff --git a/external/m2html/private/m2htmltoolbarimages.mat b/external/m2html/private/m2htmltoolbarimages.mat new file mode 100644 index 0000000000000000000000000000000000000000..2fd358ee60e9bd336c1efa7116b0579070fc4723 GIT binary patch literal 53792 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 +% $Revision: 1.0 $Date: 2003/29/04 17:33:43 $ + +ext = {'.mexsol' '.mexhpux' '.mexhp7' '.mexrs6' '.mexsg' '.mexaxp' '.mexglx' ... + '.mexlx' '.dll'}; + +platform = {'SunOS' 'HP' 'HP700' 'IBM' 'SGI' 'Alpha' 'Linux x86' 'Linux' 'Windows'}; diff --git a/external/m2html/private/mfileparse.m b/external/m2html/private/mfileparse.m new file mode 100644 index 00000000..d4c37be5 --- /dev/null +++ b/external/m2html/private/mfileparse.m @@ -0,0 +1,150 @@ +function s = mfileparse(mfile, mdirs, names, options) +%MFILEPARSE Parsing of an M-file to obtain synopsis, help and references +% S = MFILEPARSE(MFILE, MDIRS, NAMES, OPTIONS) parses the M-file MFILE looking +% for synopsis (function), H1 line, subroutines and todo tags (if any). +% It also fills in a boolean array indicating whether MFILE calls M-files +% defined by MDIRS (M-files directories) AND NAMES (M-file names). +% The input OPTIONS comes from M2HTML: fields used are 'verbose', 'global' +% and 'todo'. +% Output S is a structure whose fields are: +% o synopsis: char array (empty if MFILE is a script) +% o h1line: short one-line description into the first help line +% o subroutine: cell array of char containing subroutines synopsis +% o hrefs: boolean array with hrefs(i) = 1 if MFILE calls mdirs{i}/names{i} +% o todo: structure containing information about potential todo tags +% +% See also M2HTML + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/29/04 17:33:43 $ + +error(nargchk(3,4,nargin)); +if nargin == 3, + options = struct('verbose',1, 'globalHypertextLinks',0, 'todo',0); +end + +%- Delimiters used in strtok: some of them may be useless (% " .), removed '.' +strtok_delim = sprintf(' \t\n\r(){}[]<>+-*~!|\\@&/,:;="''%%'); + +%- Open for reading the M-file +fid = openfile(mfile,'r'); +it = 0; % line number + +%- Initialize Output +s = struct('synopsis', '', ... + 'h1line', '', ... + 'subroutine', {{}}, ... + 'hrefs', sparse(1,length(names)), ... + 'todo', struct('line',[],'comment',{{}}), ... + 'ismex', zeros(size(mexexts))); + +%- Initialize flag for synopsis cont ('...') +flagsynopcont = 0; +%- Look for synopsis and H1 line +% Help is the first set of contiguous comment lines in an m-file +% The H1 line is a short one-line description into the first help line +while 1 + tline = fgetl(fid); + if ~ischar(tline), break, end + it = it + 1; + tline = deblank(fliplr(deblank(fliplr(tline)))); + %- Synopsis line + if ~isempty(strmatch('function',tline)) + s.synopsis = tline; + if ~isempty(strmatch('...',fliplr(tline))) + flagsynopcont = 1; + s.synopsis = deblank(s.synopsis(1:end-3)); + end + %- H1 Line + elseif ~isempty(strmatch('%',tline)) + % allow for the help lines to be before the synopsis + if isempty(s.h1line) + s.h1line = fliplr(deblank(tline(end:-1:2))); + end + if ~isempty(s.synopsis), break, end + %- Go through empty lines + elseif isempty(tline) + + %- Code found. Stop. + else + if flagsynopcont + if isempty(strmatch('...',fliplr(tline))) + s.synopsis = [s.synopsis tline]; + flagsynopcont = 0; + else + s.synopsis = [s.synopsis deblank(tline(1:end-3))]; + end + else + break; + end + end +end + +%- Global Hypertext Links option +% If false, hypertext links are done only among functions in the same +% directory. +if options.globalHypertextLinks + hrefnames = names; +else + indhref = find(strcmp(fileparts(mfile),mdirs)); + hrefnames = {names{indhref}}; +end + +%- Compute cross-references and extract subroutines +% hrefs(i) is 1 if mfile calls mfiles{i} and 0 otherwise +while ischar(tline) + % Remove blanks at both ends + tline = deblank(fliplr(deblank(fliplr(tline)))); + + % Split code into meaningful chunks + splitc = splitcode(tline); + for j=1:length(splitc) + if isempty(splitc{j}) | ... + splitc{j}(1) == '''' | ... + ~isempty(strmatch('...',splitc{j})) + % Forget about empty lines, char strings or conts + elseif splitc{j}(1) == '%' + % Cross-references are not taken into account in comments + % Just look for potential TODO line + if options.todo + if ~isempty(strmatch('% TODO %',splitc{j})) + s.todo.line = [s.todo.line it]; + s.todo.comment{end+1} = splitc{j}(9:end); + end + end + else + % detect if this line is a declaration of a subroutine + if ~isempty(strmatch('function',splitc{j})) + s.subroutine{end+1} = splitc{j}; + else + % get list of variables and functions + symbol = {}; + while 1 + [t,splitc{j}] = strtok(splitc{j},strtok_delim); + if isempty(t), break, end; + symbol{end+1} = t; + end + if options.globalHypertextLinks + s.hrefs = s.hrefs + ismember(hrefnames,symbol); + else + s.hrefs(indhref) = s.hrefs(1,indhref) + ... + ismember(hrefnames,symbol); + end + end + end + end + tline = fgetl(fid); + it = it + 1; +end + +fclose(fid); + +%- Look for Mex files +[pathstr,name] = fileparts(mfile); +samename = dir(fullfile(pathstr,[name '.*'])); +samename = {samename.name}; +ext = {}; +for i=1:length(samename) + [dummy, dummy, ext{i}] = fileparts(samename{i}); +end +s.ismex = ismember(mexexts,ext); diff --git a/external/m2html/private/openfile.m b/external/m2html/private/openfile.m new file mode 100644 index 00000000..5828729f --- /dev/null +++ b/external/m2html/private/openfile.m @@ -0,0 +1,20 @@ +function fid = openfile(filename,permission) +%OPENFILE Open a file in read/write mode, catching errors +% FID = OPENFILE(FILENAME,PERMISSION) opens file FILENAME +% in PERMISSION mode ('r' or 'w') and return a file identifier FID. +% File is opened in text mode: no effect on Unix but useful on Windows. + +% Copyright (C) 2004 Guillaume Flandin +% $Revision: 1.1 $Date: 2004/05/05 17:14:09 $ + +[fid, errmsg] = fopen(filename,[permission 't']); +if ~isempty(errmsg) + switch permission + case 'r' + error(sprintf('Cannot open %s in read mode.',filename)); + case 'w' + error(sprintf('Cannot open %s in write mode.',filename)); + otherwise + error(errmsg); + end +end diff --git a/external/m2html/private/searchindex.m b/external/m2html/private/searchindex.m new file mode 100644 index 00000000..3b97c0a1 --- /dev/null +++ b/external/m2html/private/searchindex.m @@ -0,0 +1,57 @@ +function [s, freq] = searchindex(mfile, szmin) +%SEARCHINDEX Compute keywords statistics of an M-file +% S = SEARCHINDEX(MFILE) returns a cell array of char S containing +% all the keywords (variables, function names, words in comments or +% char arrays) found in M-file MFILE, of more than 2 characters. +% S = SEARCHINDEX(MFILE, SZMIN) allows to specify the minimum size +% SZMIN of the keywords. +% [S, FREQ] = SEARCHINDEX(...) also returns the occurency frequence +% of each keyword in the M-file. +% +% See also M2HTML + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/04/10 18:32:48 $ + +error(nargchk(1,2,nargin)); +if nargin == 1, szmin = 2; end + +%- Delimiters used in strtok +strtok_delim = sprintf(' \t\n\r(){}[]<>+-*^$~#!|\\@&/.,:;="''%%'); + +%- Open for reading the M-file +fid = openfile(mfile,'r'); + +%- Initialize keywords list +s = {}; + +%- Loop over lines +while 1 + tline = fgetl(fid); + if ~ischar(tline), break, end + + %- Extract keywords in each line + while 1 + [w, tline] = strtok(tline,strtok_delim); + if isempty(w), break, end; + %- Check the length of the keyword + if length(w) > szmin + s{end+1} = w; + end + end +end + +%- Close the M-file +fclose(fid); + +%- Remove repeted keywords +[s, i, j] = unique(s); + +%- Compute occurency frenquency if required +if nargout == 2, + if ~isempty(s) + freq = histc(j,1:length(i)); + else + freq = []; + end +end diff --git a/external/m2html/private/splitcode.m b/external/m2html/private/splitcode.m new file mode 100644 index 00000000..f2f6fbc2 --- /dev/null +++ b/external/m2html/private/splitcode.m @@ -0,0 +1,87 @@ +function splitc = splitcode(code) +%SPLITCODE Split a line of Matlab code in string, comment and other +% SPLITC = SPLITCODE(CODE) splits line of Matlab code CODE into a cell +% array SPLITC where each element is either a character array ('...'), +% a comment (%...), a continuation (...) or something else. +% Note that CODE = [SPLITC{:}] +% +% See also M2HTML, HIGHLIGHT + +% Copyright (C) 2003 Guillaume Flandin +% $Revision: 1.0 $Date: 2003/29/04 17:33:43 $ + +%- Label quotes in {'transpose', 'beginstring', 'midstring', 'endstring'} +iquote = findstr(code,''''); +quotetransp = [double('_''.)}]') ... + double('A'):double('Z') ... + double('0'):double('9') ... + double('a'):double('z')]; +flagstring = 0; +flagdoublequote = 0; +jquote = []; +for i=1:length(iquote) + if ~flagstring + if iquote(i) > 1 & any(quotetransp == double(code(iquote(i)-1))) + % => 'transpose'; + else + % => 'beginstring'; + jquote(size(jquote,1)+1,:) = [iquote(i) length(code)]; + flagstring = 1; + end + else % if flagstring + if flagdoublequote | ... + (iquote(i) < length(code) & strcmp(code(iquote(i)+1),'''')) + % => 'midstring'; + flagdoublequote = ~flagdoublequote; + else + % => 'endstring'; + jquote(size(jquote,1),2) = iquote(i); + flagstring = 0; + end + end +end + +%- Find if a portion of code is a comment +ipercent = findstr(code,'%'); +jpercent = []; +for i=1:length(ipercent) + if isempty(jquote) | ... + ~any((ipercent(i) > jquote(:,1)) & (ipercent(i) < jquote(:,2))) + jpercent = [ipercent(i) length(code)]; + break; + end +end + +%- Find continuation punctuation '...' +icont = findstr(code,'...'); +for i=1:length(icont) + if (isempty(jquote) | ... + ~any((icont(i) > jquote(:,1)) & (icont(i) < jquote(:,2)))) & ... + (isempty(jpercent) | ... + icont(i) < jpercent(1)) + jpercent = [icont(i) length(code)]; + break; + end +end + +%- Remove strings inside comments +if ~isempty(jpercent) & ~isempty(jquote) + jquote(find(jquote(:,1) > jpercent(1)),:) = []; +end + +%- Split code in a cell array of strings +icode = [jquote ; jpercent]; +splitc = {}; +if isempty(icode) + splitc{1} = code; +elseif icode(1,1) > 1 + splitc{1} = code(1:icode(1,1)-1); +end +for i=1:size(icode,1) + splitc{end+1} = code(icode(i,1):icode(i,2)); + if i < size(icode,1) & icode(i+1,1) > icode(i,2) + 1 + splitc{end+1} = code((icode(i,2)+1):(icode(i+1,1)-1)); + elseif i == size(icode,1) & icode(i,2) < length(code) + splitc{end+1} = code(icode(i,2)+1:end); + end +end diff --git a/external/m2html/private/strtok.m b/external/m2html/private/strtok.m new file mode 100644 index 00000000..cf5e1467 --- /dev/null +++ b/external/m2html/private/strtok.m @@ -0,0 +1,52 @@ +function [token, remainder, quotient] = strtok(string, delimiters) +%Modified version of STRTOK to also return the quotient +% string = [quotient token remainder] +%STRTOK Find token in string. +% STRTOK(S) returns the first token in the string S delimited +% by "white space". Any leading white space characters are ignored. +% +% STRTOK(S,D) returns the first token delimited by one of the +% characters in D. Any leading delimiter characters are ignored. +% +% [T,R] = STRTOK(...) also returns the remainder of the original +% string. +% If the token is not found in S then R is an empty string and T +% is same as S. +% +% Copyright 1984-2002 The MathWorks, Inc. +% $Revision: 5.14 $ $Date: 2002/04/09 00:33:38 $ + +token = []; remainder = []; quotient = string; + +len = length(string); +if len == 0 + return +end + +if (nargin == 1) + delimiters = [9:13 32]; % White space characters +end + +i = 1; +while (any(string(i) == delimiters)) + i = i + 1; + if (i > len), return, end +end +start = i; +while (~any(string(i) == delimiters)) + i = i + 1; + if (i > len), break, end +end +sfinish = i - 1; + +token = string(start:sfinish); + +if (nargout >= 2) + remainder = string(sfinish + 1:length(string)); +end + +if (nargout == 3 & start > 1) + quotient = string(1:start-1); +else + quotient = []; +end diff --git a/external/m2html/templates/blue/Thumbs.db b/external/m2html/templates/blue/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..45fbabd7af4d709edbb3a3965f29961f08e4c576 GIT binary patch literal 27648 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 XpQ?QQ=I-(g00000NkvXXu0mjf#?^X; literal 0 HcmV?d00001 diff --git a/external/m2html/templates/blue/c++.png b/external/m2html/templates/blue/c++.png new file mode 100644 index 0000000000000000000000000000000000000000..24f56e6293df813f7699555d0fdd0224a33bdac9 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0YJ>p!2~4#tiFE(NUrMq>1fP(BLp1!W^mpLQ_Wwp7rPrm~SUGa2r45^s&cKTi3W&@s7VZD}9S!LiPTl|j(*)-gYW;;XAZ?5N!pnK5hG z+s}VG5+xWO6mIF=yOWvujML^HlXZ+Yu?Qyj=7(iWd!%tXIGN|}`LH!?g3;OMg0piY zXCLcLf98Km#%@Dm=Gw_oB65#C&Ig=Xv$e7}bMZ3wpl2`Gw(%Wrdp_NvM0oStJBj<- zw>I9sUd+GU{%T3g&-nYj{hnNcohMx1C8q6LzjX6wt1Wi%t17>Iemh??{C9K})9DTU VtbG#CZUOzr;OXk;vd$@?2>_TKh~WSL literal 0 HcmV?d00001 diff --git a/external/m2html/templates/blue/c.png b/external/m2html/templates/blue/c.png new file mode 100644 index 0000000000000000000000000000000000000000..c39fbf0e25ee296c5da082458363c45d945e55ac GIT binary patch literal 252 zcmVqm`?`neZy@-MWWPW6I1ran`JUPt^Pp2nEy;5sZWf01@dO#z`=%5EER@AM$q-T7II}~u7He5MzB*^2($9;r8$^sTRx!mG z*Y={Rp11gKlvQkAY5N${nZR6`uQXd6Q{e@Bh2dQhbZ(t1?070Ye8{5GRQ*|k);Is- zyZYFOBO(zQWDhg*y_Wu+*U+*r-a`3&yE1OHzojSttaK8#KYM}z0000F(pUKia5*{N xtO-?WJ(Rf1$C7KR)AZ0H0j(>SR=H$6kJ)6-DZGJ)<+b45x|97Z4cdwf)&TUlSJMCh literal 0 HcmV?d00001 diff --git a/external/m2html/templates/blue/down.png b/external/m2html/templates/blue/down.png new file mode 100644 index 0000000000000000000000000000000000000000..d41104a26f3d09deda6ab54281affd82c981abb1 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^{2gTe~DWM4fiX0)Z literal 0 HcmV?d00001 diff --git a/external/m2html/templates/blue/doxysearch.php b/external/m2html/templates/blue/doxysearch.php new file mode 100644 index 00000000..36112a42 --- /dev/null +++ b/external/m2html/templates/blue/doxysearch.php @@ -0,0 +1,329 @@ +$word, + "match"=>$w, + "index"=>$statIdx, + "full"=>strlen($w)==strlen($word), + "docs"=>array() + ); + } + $w = readString($file); + } + $totalFreq=0; + for ($count=$start;$count$idx,"freq"=>$freq,"rank"=>0.0); + $totalFreq+=$freq; + if ($statInfo["full"]) $totalfreq+=$freq; + } + // read name an url info for the doc + for ($i=0;$i<$numDocs;$i++) + { + fseek($file,$docInfo[$i]["idx"]); + $docInfo[$i]["name"]=readString($file); + $docInfo[$i]["url"]=readString($file); + } + $statInfo["docs"]=$docInfo; + } + for ($count=$start;$count$key, + "name"=>$di["name"], + "rank"=>$rank + ); + } + $docs[$key]["words"][] = array( + "word"=>$wordInfo["word"], + "match"=>$wordInfo["match"], + "freq"=>$di["freq"] + ); + } + } + return $docs; +} + +function normalize_ranking(&$docs) +{ + $maxRank = 0.0000001; + // compute maximal rank + foreach ($docs as $doc) + { + if ($doc["rank"]>$maxRank) + { + $maxRank=$doc["rank"]; + } + } + reset($docs); + // normalize rankings + while (list ($key, $val) = each ($docs)) + { + $docs[$key]["rank"]*=100/$maxRank; + } +} + +function filter_results($docs,&$requiredWords,&$forbiddenWords) +{ + $filteredDocs=array(); + while (list ($key, $val) = each ($docs)) + { + $words = &$docs[$key]["words"]; + $copy=1; // copy entry by default + if (sizeof($requiredWords)>0) + { + foreach ($requiredWords as $reqWord) + { + $found=0; + foreach ($words as $wordInfo) + { + $found = $wordInfo["word"]==$reqWord; + if ($found) break; + } + if (!$found) + { + $copy=0; // document contains none of the required words + break; + } + } + } + if (sizeof($forbiddenWords)>0) + { + foreach ($words as $wordInfo) + { + if (in_array($wordInfo["word"],$forbiddenWords)) + { + $copy=0; // document contains a forbidden word + break; + } + } + } + if ($copy) $filteredDocs[$key]=$docs[$key]; + } + return $filteredDocs; +} + +function compare_rank($a,$b) +{ + return ($a["rank"]>$b["rank"]) ? -1 : 1; +} + +function sort_results($docs,&$sorted) +{ + $sorted = $docs; + usort($sorted,"compare_rank"); + return $sorted; +} + +function report_results(&$docs) +{ + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + $numDocs = sizeof($docs); + if ($numDocs==0) + { + echo " \n"; + echo " \n"; + echo " \n"; + } + else + { + echo " \n"; + echo " \n"; + echo " \n"; + $num=1; + foreach ($docs as $doc) + { + echo " \n"; + echo " "; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + $num++; + } + } + echo "

Search Results

".matches_text(0)."
".matches_text($numDocs); + echo "\n"; + echo "
$num.".$doc["name"]."
Matches: "; + foreach ($doc["words"] as $wordInfo) + { + $word = $wordInfo["word"]; + $matchRight = substr($wordInfo["match"],strlen($word)); + echo "$word$matchRight(".$wordInfo["freq"].") "; + } + echo "
\n"; +} + +function matches_text($num) +{ + if ($num==0) + { + return 'Sorry, no documents matching your query.'; + } + else if ($num==1) + { + return 'Found 1 document matching your query.'; + } + else // $num>1 + { + return 'Found '.$num.' documents matching your query. Showing best matches first.'; + } +} + +function main($idxfile) +{ + if(strcmp('4.1.0', phpversion()) > 0) + { + die("Error: PHP version 4.1.0 or above required!"); + } + if (!($file=fopen($idxfile,"rb"))) + { + die("Error: Search index file could NOT be opened!"); + } + if (readHeader($file)!="DOXS") + { + die("Error: Header of index file is invalid!"); + } + $query=""; + if (array_key_exists("query", $_GET)) + { + $query=$_GET["query"]; + } + $results = array(); + $requiredWords = array(); + $forbiddenWords = array(); + $foundWords = array(); + $word=strtolower(strtok($query," ")); + while ($word) // for each word in the search query + { + if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; } + if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; } + if (!in_array($word,$foundWords)) + { + $foundWords[]=$word; + search($file,$word,$results); + } + $word=strtolower(strtok(" ")); + } + $docs = array(); + combine_results($results,$docs); + // filter out documents with forbidden word or that do not contain + // required words + $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords); + // normalize rankings so they are in the range [0-100] + normalize_ranking($filteredDocs); + // sort the results based on rank + $sorted = array(); + sort_results($filteredDocs,$sorted); + // report results to the user + report_results($sorted); + fclose($file); +} + +?> diff --git a/external/m2html/templates/blue/fortran.png b/external/m2html/templates/blue/fortran.png new file mode 100644 index 0000000000000000000000000000000000000000..350c572ee38fc5aa8cef025284caa41a46921cbf GIT binary patch literal 265 zcmV+k0rvihP)z zQ4Yf(2!?U#(c~&{CVCaUn|okwjJWCAv@Y{YACUYt5I|c;L@*Nz0Eo!wFm8gG7quL( z=eJ8jF~;-zT!i-?03M^mxSQz{PD1(=o)3a5h-huxIH1YJR@TpAUHLpGAzkjqF33Gq z5HW;M#1ulv?Ojv&dqVG&6;xWfSwIyu&pDe3Y?b*+^Nvd@T*dL)Y-z<7!R9u;!a16o zt!IDE1;u=7(6;lN@7iT2j)+8Ll6#n$r@xl|p4XvuY#=TA`S#1W+5VQEsg98Zwj;#Z P00000NkvXXu0mjf06Tac literal 0 HcmV?d00001 diff --git a/external/m2html/templates/blue/graph.tpl b/external/m2html/templates/blue/graph.tpl new file mode 100644 index 00000000..715e4b31 --- /dev/null +++ b/external/m2html/templates/blue/graph.tpl @@ -0,0 +1,28 @@ + + + + Dependency Graph for {MDIR} + + + + + + + + + + +
< Master indexIndex for {MDIR} >
+

Dependency Graph for {MDIR}

+ +
+Dependency Graph for {MDIR} + +{GRAPH_MAP} + +
+ +
Generated on {DATE} by m2html © 2005
+ + diff --git a/external/m2html/templates/blue/hp.png b/external/m2html/templates/blue/hp.png new file mode 100644 index 0000000000000000000000000000000000000000..d09f988fb289d659869dbb1b2f199fd967a93958 GIT binary patch literal 255 zcmVz z%MHUI3_wlAXs`;N$*f{_qX$Rw9FO zez{B`r8K|JmvGJjz-@IJXS2Omg-^gRJ-6O z&=syLR&U^^a}=eRZLpT@KTChlV@n^^it_t*Wz253r911aWh5p(A;kay002ovPDHLk FV1l-WYkL3y literal 0 HcmV?d00001 diff --git a/external/m2html/templates/blue/left.png b/external/m2html/templates/blue/left.png new file mode 100644 index 0000000000000000000000000000000000000000..404df045f40970496c71ca6b8c1f1357af271e27 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^{2}w1qqB3TN5VEvJYV8 a;bDlI$G>{!EB$9cJq(_%elF{r5}E)JMz zQ4WJ342H|%(dbp$Gu5lqySaxtLO>W(rpx%_LnVK(UrGTT5y42B06;|UPU9jm^JJ0Z z`TTUN(6TJ&=lPPn_WX zId~2>0yJfGb3Up-MDlH7S}Vx-I*N`iO3-5Ff$K-Ed9Nepzm`zojRl WMtq7>mNL`;0000 + + + Matlab Index + + + + + + + + + +

Matlab Index

+

Matlab Directories

+ +

Matlab Files found in these Directories

+ + + + + + + + +
{IDNAME}
+ + +

Search Engine

+ + + + +

Dependency Graph

+ + +
Generated on {DATE} by m2html © 2005
+ + diff --git a/external/m2html/templates/blue/matlabicon.gif b/external/m2html/templates/blue/matlabicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c2b5e6e2225ede10ed4a95138d8c8df0a0fcfa2 GIT binary patch literal 574 zcmZ?wbhEHb6krfwc*Xz%|NsAYmy|MAPz?4D)YH*5(Km9k^EZu6QcKQIFtf07b<0@1 zT)&{uy`(f{{sI|ySG|y6y`Vtr!~~nlvVh)B-slDkd7sMUhm~nn@(#}qULHtXTzoc}*_9Non9cn|mMot$6xao(HD{Btemfo7KftJ(gq<~Y~G z@qZoHkA=+tS8)7W&Uw9q`Tr8me+#(&&u0HSm+S9Tw*NEO-*s^O@8dn4!TPz8qu!P4 zK_1Jw46grGoai}Etj@tK_}C@RCk z%#`S6Zs-xzlqxAD$1kf8AM0wN?c%>SMNC?Phc6~Pz{yO{A+R?kRa_)AA;iir?(CQ-4ncIv-nB)Nx{hL?F`wWg|rwizO*(ixxOASOWm3r><21 literal 0 HcmV?d00001 diff --git a/external/m2html/templates/blue/mdir.tpl b/external/m2html/templates/blue/mdir.tpl new file mode 100644 index 00000000..01b7e537 --- /dev/null +++ b/external/m2html/templates/blue/mdir.tpl @@ -0,0 +1,60 @@ + + + + Index for Directory {MDIR} + + + + + + + + + + +
< Master indexIndex for {MDIR} >
+ +

Index for {MDIR}

+ +

Matlab files in this directory:

+ + + + +
 {NAME}{H1LINE} MEX
+ + +

Other Matlab-specific files in this directory:

+
    + +
  • {OTHERFILE}
  • + +
+ + + +

Subsequent directories:

+
    + +
  • {SUBDIRECTORY}
  • + +
+ + + +

Dependency Graph

+ + + + +

TODO List

+ + +
Generated on {DATE} by m2html © 2005
+ + diff --git a/external/m2html/templates/blue/mex.png b/external/m2html/templates/blue/mex.png new file mode 100644 index 0000000000000000000000000000000000000000..396f1bc943e311539c64aa839ba14242c3b1493c GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^GC<7D!VDzmefZDNn{1``2&1H zT>k^XH6VupNCU}&+~7Mvim@cfFPOpM*^M+1C&}C0g`tC0)&t1lEbxdd1{y2`!i<;h z*8KqrvX^-Jy0Ty9km3|#4DWEh2o&=1ba4!+m=oK_$albigXt^#BmNKn`(>_}oOavV zHb=Afht|Vg%9B``@)jwvpOrK#Ny(Hf&TUq{A5ne4dvCr*%)z?JLGp XX&kFA6^pR}&1LX(^>bP0l+XkK#Yar! literal 0 HcmV?d00001 diff --git a/external/m2html/templates/blue/mfile.tpl b/external/m2html/templates/blue/mfile.tpl new file mode 100644 index 00000000..114cdb65 --- /dev/null +++ b/external/m2html/templates/blue/mfile.tpl @@ -0,0 +1,70 @@ + + + + Description of {NAME} + + + + + + + + + +
Home > {PATHDIR} > {NAME}.m
+ + + +

{NAME} +   {PLATFORMS} +

+ +

PURPOSE ^

+
{H1LINE}
+ +

SYNOPSIS ^

+
{SYNOPSIS} This is a script file.
+ +

DESCRIPTION ^

+
{DESCRIPTION}
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: + + + + +

SUBFUNCTIONS ^

+ + + + +

DOWNLOAD ^

+

{NAME}.m

+ + + +

SOURCE CODE ^

+
{SOURCECODE}
+ + +
Generated on {DATE} by m2html © 2005
+ + diff --git a/external/m2html/templates/blue/pcode.png b/external/m2html/templates/blue/pcode.png new file mode 100644 index 0000000000000000000000000000000000000000..6801bd9a259131e6de7d7957789598a451c04334 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5ej!3-qBCsR(zDBw1As!D z1s;*bKxKj;%vhfiKM^R%lJ4m1$iT3%pZiZDD@aj*Pl)S(AYk|pNdQueB|(0{ z3=Yq3qyagOo-U3d6}OTT4lqj`WYF%P$jKq`kl`G&cO%P#Bm=oF5vkS`g + + + Matlab Search Engine + + + + + + + + + +

Search Engine

+ + + + + +
Generated on {DATE} by m2html © 2005
+ + diff --git a/external/m2html/templates/blue/sgi.png b/external/m2html/templates/blue/sgi.png new file mode 100644 index 0000000000000000000000000000000000000000..20052bc569a92dff7ffb2845009b7b0a5edde83b GIT binary patch literal 263 zcmV+i0r>ujP)z zZ3@F642I+A(ex_uOz|q|-Q16CA~DKXHy!h#6nPc#A=(dzh_Dj}01(mYWlSQ*cu32| zbbY!^c%J9=dA@}A9sq8umob~|g)?E>&V+Ie#O(HQu@+QR?< N002ovPDHLkV1hx>d=3Br literal 0 HcmV?d00001 diff --git a/external/m2html/templates/blue/simulinkicon.gif b/external/m2html/templates/blue/simulinkicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..1386ddd4ce654071015610e81fdea82461d8e28b GIT binary patch literal 977 zcmbu8u}_m>5XK)83^3Uu8;SX77?CI^3B-XItA?P13elB7PXr>Q5E~tEP-6{~F%D-K z)WpFqI=OT~2IKIO5C(b~XFmOKi{R_TBlgr&b_q*r5UY@)(Ha=TG0e=CHm)y-= z-NhXdrR2#xsVDJ-NLq3;H+2&?M6D)Qb5&PyMYKwCF&A|a7f{KO9Oh7mI2cfy($r!z zs}XbJSxTCcq=XpD$Sj#AlVk`ACe@N^Qb~${Vy##bO(ID^Mz$tcf+k1;r;?gtgeE1i znB!n-Q<_?AMl2LDpPGpoVn2>$q-rXrh;>Q9q^OCQfZG#_wFWhaf$Px^VzQfdaDPH@ zLsCc`!iKu|Sa$Qm|sSpKyq|-EjTr8*2+?H0- z4`Q;Lc94k+b3;;7jL_^P7CAVW+LT6|D5{xe%m-eKMsh!nWh97?BYe&89m)KJVRL?! zsLhQI*K_ZpHMb*1{#n2u&8oRKvdcS(-_QHDh{>=FJST?;-$*#_> zFWg+IF0Bn^lXvHav-8W#Szfc2RV!b=VRFa{1fJ1Bvn_=*1$x~u5G{^07%?ML0m zHxB3bGCb|+8kyh!`1T@vWbw!Thc`P>6y|3Oo@O9$!+|lO2pBq=~ z?6HkkzgKp4CuH{I*7l2^yRRR1_MTc?@7vp&8a;gcZ2H%?cU{-M_dgh2`cl7D{M1<} G;M_lk-mF{z literal 0 HcmV?d00001 diff --git a/external/m2html/templates/blue/solaris.png b/external/m2html/templates/blue/solaris.png new file mode 100644 index 0000000000000000000000000000000000000000..e31e8a2a48078233e65bf10502de055609469206 GIT binary patch literal 286 zcmV+(0pb3MP)LJX0GRn|87F~=qO=0d z$LTWTx~|80zJzI-0N{4DjI%Mk;moMpnNcohj7EB(iPVo~iqGKm_8{s|W(+hpPU=N2 zz2$E5rj(XtF(bOm8L*eKNAeVg;o46LO1s$e-HK3o_b;p)l_XJ5>4v`(0TG#bkaL)bhCi169@`rB kx1WB<=i4tMjP|#52ZwT~UP>&M!~g&Q07*qoM6N<$g3~#GJpcdz literal 0 HcmV?d00001 diff --git a/external/m2html/templates/blue/todo.tpl b/external/m2html/templates/blue/todo.tpl new file mode 100644 index 00000000..26623eaf --- /dev/null +++ b/external/m2html/templates/blue/todo.tpl @@ -0,0 +1,28 @@ + + + + To Do List for {MDIR} + + + + + + + + + + +
< Master indexIndex for {MDIR} >
+

To Do List for {MDIR}

+ +

{MFILE}:

+ + +
Generated on {DATE} by m2html © 2005
+ + diff --git a/external/m2html/templates/blue/up.png b/external/m2html/templates/blue/up.png new file mode 100644 index 0000000000000000000000000000000000000000..b348b9a1b19bd5030efd3df293d84a18b41ef6a4 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^{2x4R4De4J#NJjgjrM8h9Te~(8G kcWyrh{e1gnl+pf{?#tSrFr=&ZY5)KL07*qoM6N<$f*5RoFaQ7m literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/alpha.png b/external/m2html/templates/brain/alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..c73de7b05000443a0842f2e915d30dc5efec0dd1 GIT binary patch literal 273 zcmV+s0q*{ZP)z zQ4WJJ2!`q6(c~&{CcFyX%{{O*3+<>*r)K@)L#;sgtx%hY2zp`w01>%5jgw&J!A6Ov z{oxj&d7k&j`4Qtd0>I2H(i=Rwz9Tqxf(W|?ki|=ctL(aA|es#WFKbc?zg4C=hd_}m12PXzTKJB+iB?u XpQ?QQ=I-(g00000NkvXXu0mjf#?^X; literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/brain.png b/external/m2html/templates/brain/brain.png new file mode 100644 index 0000000000000000000000000000000000000000..823cd5b0c46f8a4a992b34165252140326927541 GIT binary patch literal 24107 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

D#(+$ZK9E#*>zjC&33nXv;(UY&4=H*K$7FcLI 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 VcGgx@4S3!RP*v1?U!!0Z{y%9%{?-5h literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/c++.png b/external/m2html/templates/brain/c++.png new file mode 100644 index 0000000000000000000000000000000000000000..24f56e6293df813f7699555d0fdd0224a33bdac9 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0YJ>p!2~4#tiFE(NUrMq>1fP(BLp1!W^mpLQ_Wwp7rPrm~SUGa2r45^s&cKTi3W&@s7VZD}9S!LiPTl|j(*)-gYW;;XAZ?5N!pnK5hG z+s}VG5+xWO6mIF=yOWvujML^HlXZ+Yu?Qyj=7(iWd!%tXIGN|}`LH!?g3;OMg0piY zXCLcLf98Km#%@Dm=Gw_oB65#C&Ig=Xv$e7}bMZ3wpl2`Gw(%Wrdp_NvM0oStJBj<- zw>I9sUd+GU{%T3g&-nYj{hnNcohMx1C8q6LzjX6wt1Wi%t17>Iemh??{C9K})9DTU VtbG#CZUOzr;OXk;vd$@?2>_TKh~WSL literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/c.png b/external/m2html/templates/brain/c.png new file mode 100644 index 0000000000000000000000000000000000000000..c39fbf0e25ee296c5da082458363c45d945e55ac GIT binary patch literal 252 zcmVqm`?`neZy@-MWWPW6I1ran`JUPt^Pp2nEy;5sZWf01@dO#z`=%5EER@AM$q-T7II}~u7He5MzB*^2($9;r8$^sTRx!mG z*Y={Rp11gKlvQkAY5N${nZR6`uQXd6Q{e@Bh2dQhbZ(t1?070Ye8{5GRQ*|k);Is- zyZYFOBO(zQWDhg*y_Wu+*U+*r-a`3&yE1OHzojSttaK8#KYM}z0000F(pUKia5*{N xtO-?WJ(Rf1$C7KR)AZ0H0j(>SR=H$6kJ)6-DZGJ)<+b45x|97Z4cdwf)&TUlSJMCh literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/down.png b/external/m2html/templates/brain/down.png new file mode 100644 index 0000000000000000000000000000000000000000..d41104a26f3d09deda6ab54281affd82c981abb1 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^{2gTe~DWM4fiX0)Z literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/doxysearch.php b/external/m2html/templates/brain/doxysearch.php new file mode 100644 index 00000000..36112a42 --- /dev/null +++ b/external/m2html/templates/brain/doxysearch.php @@ -0,0 +1,329 @@ +$word, + "match"=>$w, + "index"=>$statIdx, + "full"=>strlen($w)==strlen($word), + "docs"=>array() + ); + } + $w = readString($file); + } + $totalFreq=0; + for ($count=$start;$count$idx,"freq"=>$freq,"rank"=>0.0); + $totalFreq+=$freq; + if ($statInfo["full"]) $totalfreq+=$freq; + } + // read name an url info for the doc + for ($i=0;$i<$numDocs;$i++) + { + fseek($file,$docInfo[$i]["idx"]); + $docInfo[$i]["name"]=readString($file); + $docInfo[$i]["url"]=readString($file); + } + $statInfo["docs"]=$docInfo; + } + for ($count=$start;$count$key, + "name"=>$di["name"], + "rank"=>$rank + ); + } + $docs[$key]["words"][] = array( + "word"=>$wordInfo["word"], + "match"=>$wordInfo["match"], + "freq"=>$di["freq"] + ); + } + } + return $docs; +} + +function normalize_ranking(&$docs) +{ + $maxRank = 0.0000001; + // compute maximal rank + foreach ($docs as $doc) + { + if ($doc["rank"]>$maxRank) + { + $maxRank=$doc["rank"]; + } + } + reset($docs); + // normalize rankings + while (list ($key, $val) = each ($docs)) + { + $docs[$key]["rank"]*=100/$maxRank; + } +} + +function filter_results($docs,&$requiredWords,&$forbiddenWords) +{ + $filteredDocs=array(); + while (list ($key, $val) = each ($docs)) + { + $words = &$docs[$key]["words"]; + $copy=1; // copy entry by default + if (sizeof($requiredWords)>0) + { + foreach ($requiredWords as $reqWord) + { + $found=0; + foreach ($words as $wordInfo) + { + $found = $wordInfo["word"]==$reqWord; + if ($found) break; + } + if (!$found) + { + $copy=0; // document contains none of the required words + break; + } + } + } + if (sizeof($forbiddenWords)>0) + { + foreach ($words as $wordInfo) + { + if (in_array($wordInfo["word"],$forbiddenWords)) + { + $copy=0; // document contains a forbidden word + break; + } + } + } + if ($copy) $filteredDocs[$key]=$docs[$key]; + } + return $filteredDocs; +} + +function compare_rank($a,$b) +{ + return ($a["rank"]>$b["rank"]) ? -1 : 1; +} + +function sort_results($docs,&$sorted) +{ + $sorted = $docs; + usort($sorted,"compare_rank"); + return $sorted; +} + +function report_results(&$docs) +{ + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + $numDocs = sizeof($docs); + if ($numDocs==0) + { + echo " \n"; + echo " \n"; + echo " \n"; + } + else + { + echo " \n"; + echo " \n"; + echo " \n"; + $num=1; + foreach ($docs as $doc) + { + echo " \n"; + echo " "; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + $num++; + } + } + echo "

Search Results

".matches_text(0)."
".matches_text($numDocs); + echo "\n"; + echo "
$num.".$doc["name"]."
Matches: "; + foreach ($doc["words"] as $wordInfo) + { + $word = $wordInfo["word"]; + $matchRight = substr($wordInfo["match"],strlen($word)); + echo "$word$matchRight(".$wordInfo["freq"].") "; + } + echo "
\n"; +} + +function matches_text($num) +{ + if ($num==0) + { + return 'Sorry, no documents matching your query.'; + } + else if ($num==1) + { + return 'Found 1 document matching your query.'; + } + else // $num>1 + { + return 'Found '.$num.' documents matching your query. Showing best matches first.'; + } +} + +function main($idxfile) +{ + if(strcmp('4.1.0', phpversion()) > 0) + { + die("Error: PHP version 4.1.0 or above required!"); + } + if (!($file=fopen($idxfile,"rb"))) + { + die("Error: Search index file could NOT be opened!"); + } + if (readHeader($file)!="DOXS") + { + die("Error: Header of index file is invalid!"); + } + $query=""; + if (array_key_exists("query", $_GET)) + { + $query=$_GET["query"]; + } + $results = array(); + $requiredWords = array(); + $forbiddenWords = array(); + $foundWords = array(); + $word=strtolower(strtok($query," ")); + while ($word) // for each word in the search query + { + if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; } + if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; } + if (!in_array($word,$foundWords)) + { + $foundWords[]=$word; + search($file,$word,$results); + } + $word=strtolower(strtok(" ")); + } + $docs = array(); + combine_results($results,$docs); + // filter out documents with forbidden word or that do not contain + // required words + $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords); + // normalize rankings so they are in the range [0-100] + normalize_ranking($filteredDocs); + // sort the results based on rank + $sorted = array(); + sort_results($filteredDocs,$sorted); + // report results to the user + report_results($sorted); + fclose($file); +} + +?> diff --git a/external/m2html/templates/brain/fortran.png b/external/m2html/templates/brain/fortran.png new file mode 100644 index 0000000000000000000000000000000000000000..350c572ee38fc5aa8cef025284caa41a46921cbf GIT binary patch literal 265 zcmV+k0rvihP)z zQ4Yf(2!?U#(c~&{CVCaUn|okwjJWCAv@Y{YACUYt5I|c;L@*Nz0Eo!wFm8gG7quL( z=eJ8jF~;-zT!i-?03M^mxSQz{PD1(=o)3a5h-huxIH1YJR@TpAUHLpGAzkjqF33Gq z5HW;M#1ulv?Ojv&dqVG&6;xWfSwIyu&pDe3Y?b*+^Nvd@T*dL)Y-z<7!R9u;!a16o zt!IDE1;u=7(6;lN@7iT2j)+8Ll6#n$r@xl|p4XvuY#=TA`S#1W+5VQEsg98Zwj;#Z P00000NkvXXu0mjf06Tac literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/graph.tpl b/external/m2html/templates/brain/graph.tpl new file mode 100644 index 00000000..989dbcb2 --- /dev/null +++ b/external/m2html/templates/brain/graph.tpl @@ -0,0 +1,26 @@ + + + + Dependency Graph for {MDIR} + + + + + + + + + +

Dependency Graph for {MDIR}

+ +
+Dependency Graph for {MDIR} + +{GRAPH_MAP} + +
+ +
Generated by m2html © 2005
+ + diff --git a/external/m2html/templates/brain/hp.png b/external/m2html/templates/brain/hp.png new file mode 100644 index 0000000000000000000000000000000000000000..d09f988fb289d659869dbb1b2f199fd967a93958 GIT binary patch literal 255 zcmVz z%MHUI3_wlAXs`;N$*f{_qX$Rw9FO zez{B`r8K|JmvGJjz-@IJXS2Omg-^gRJ-6O z&=syLR&U^^a}=eRZLpT@KTChlV@n^^it_t*Wz253r911aWh5p(A;kay002ovPDHLk FV1l-WYkL3y literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/index.html b/external/m2html/templates/brain/index.html new file mode 100644 index 00000000..01d6dbc1 --- /dev/null +++ b/external/m2html/templates/brain/index.html @@ -0,0 +1,22 @@ + + + + Matlab Documentation by M2HTML + + + + + + + + + + + + +This is a Matlab Documentation by M2HTML.
+Go to menu.html for the documentation of all +the Matlab functions. +
+ diff --git a/external/m2html/templates/brain/left.png b/external/m2html/templates/brain/left.png new file mode 100644 index 0000000000000000000000000000000000000000..404df045f40970496c71ca6b8c1f1357af271e27 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^{2}w1qqB3TN5VEvJYV8 a;bDlI$G>{!EB$9cJq(_%elF{r5}E)JMz zQ4WJ342H|%(dbp$Gu5lqySaxtLO>W(rpx%_LnVK(UrGTT5y42B06;|UPU9jm^JJ0Z z`TTUN(6TJ&=lPPn_WX zId~2>0yJfGb3Up-MDlH7S}Vx-I*N`iO3-5Ff$K-Ed9Nepzm`zojRl WMtq7>mNL`;0000 + + + Matlab Index + + + + + + + + + +

Matlab Index

+

Matlab Directories

+ + + + + + + + +

Search Engine

+ + + + +

Dependency Graph

+ + +
Generated by m2html © 2005
+ + diff --git a/external/m2html/templates/brain/matlabicon.gif b/external/m2html/templates/brain/matlabicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c2b5e6e2225ede10ed4a95138d8c8df0a0fcfa2 GIT binary patch literal 574 zcmZ?wbhEHb6krfwc*Xz%|NsAYmy|MAPz?4D)YH*5(Km9k^EZu6QcKQIFtf07b<0@1 zT)&{uy`(f{{sI|ySG|y6y`Vtr!~~nlvVh)B-slDkd7sMUhm~nn@(#}qULHtXTzoc}*_9Non9cn|mMot$6xao(HD{Btemfo7KftJ(gq<~Y~G z@qZoHkA=+tS8)7W&Uw9q`Tr8me+#(&&u0HSm+S9Tw*NEO-*s^O@8dn4!TPz8qu!P4 zK_1Jw46grGoai}Etj@tK_}C@RCk z%#`S6Zs-xzlqxAD$1kf8AM0wN?c%>SMNC?Phc6~Pz{yO{A+R?kRa_)AA;iir?(CQ-4ncIv-nB)Nx{hL?F`wWg|rwizO*(ixxOASOWm3r><21 literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/mdir.tpl b/external/m2html/templates/brain/mdir.tpl new file mode 100644 index 00000000..475fbce0 --- /dev/null +++ b/external/m2html/templates/brain/mdir.tpl @@ -0,0 +1,60 @@ + + + + Index for Directory {MDIR} + + + + + + + + + +
^ Master index ^
+ +

Index for {MDIR}

+ +

Matlab files in this directory:

+ + + +

Other Matlab-specific files in this directory:

+
    + +
  • {OTHERFILE}
  • + +
+ + + +

Subsequent directories:

+
    + +
  • {SUBDIRECTORY}
  • + +
+ + + +

Dependency Graph

+ + + + +

TODO List

+ + + +
Generated by m2html © 2005
+ + diff --git a/external/m2html/templates/brain/menu.css b/external/m2html/templates/brain/menu.css new file mode 100644 index 00000000..4306c5b6 --- /dev/null +++ b/external/m2html/templates/brain/menu.css @@ -0,0 +1,93 @@ +body { + background: #006699; + color: white; + font-family: arial,sans-serif; + margin: 0; + padding: 1ex; +} + +:link { color: white } /* for unvisited links */ +:visited { color: white } /* for visited links */ + +div.fragment { + width: 98%; + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + padding-left: 4px; + margin: 4px; +} + +div.box { + width: 98%; + background-color: #f5f5f5; + border: 1px solid #CCCCCC; + color: black; + padding: 4px; +} + +.comment { + color: #228B22; +} +.string { + color: #B20000; +} +.keyword { + color: #0000FF; +} + +.keywordtype { color: #604020; } +.keywordflow { color: #e08000; } +.preprocessor { color: #806020; } +.stringliteral { color: #002080; } +.charliteral { color: #008080; } + +a { + text-decoration: none; +} + +a:hover { + background-color: #006699; + color:#66CCFF; +} + +a.code { + font-weight: normal; + color: #A020F0; +} + +a.code:hover { + background-color: #FF0000; + color: #FFFFFF; +} + +h1 { + background: transparent; + color: white; + font-size: x-large; + text-align: center; +} + +h2 { + background: transparent; + color: white; + font-size: large; +} + +address { + font-size:small; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #eeeeff; +} + +li { + padding-left:5px; +} diff --git a/external/m2html/templates/brain/mex.png b/external/m2html/templates/brain/mex.png new file mode 100644 index 0000000000000000000000000000000000000000..396f1bc943e311539c64aa839ba14242c3b1493c GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^GC<7D!VDzmefZDNn{1``2&1H zT>k^XH6VupNCU}&+~7Mvim@cfFPOpM*^M+1C&}C0g`tC0)&t1lEbxdd1{y2`!i<;h z*8KqrvX^-Jy0Ty9km3|#4DWEh2o&=1ba4!+m=oK_$albigXt^#BmNKn`(>_}oOavV zHb=Afht|Vg%9B``@)jwvpOrK#Ny(Hf&TUq{A5ne4dvCr*%)z?JLGp XX&kFA6^pR}&1LX(^>bP0l+XkK#Yar! literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/mfile.tpl b/external/m2html/templates/brain/mfile.tpl new file mode 100644 index 00000000..232b515c --- /dev/null +++ b/external/m2html/templates/brain/mfile.tpl @@ -0,0 +1,75 @@ + + + + Description of {NAME} + + + + + + + + + + + + + +

{NAME} +   {PLATFORMS} +

+ +

PURPOSE ^

+
{H1LINE}
+ +

SYNOPSIS ^

+
{SYNOPSIS} This is a script file.
+ +

DESCRIPTION ^

+
{DESCRIPTION}
+ + +

CROSS-REFERENCE INFORMATION ^

+
+This function calls: + +This function is called by: + +
+ + + +

SUBFUNCTIONS ^

+
+ +
+ + + +

DOWNLOAD ^

+

{NAME}.m

+ + + +

SOURCE CODE ^

+
{SOURCECODE}
+ + +
Generated on {DATE} by m2html © 2005
+ + diff --git a/external/m2html/templates/brain/pcode.png b/external/m2html/templates/brain/pcode.png new file mode 100644 index 0000000000000000000000000000000000000000..6801bd9a259131e6de7d7957789598a451c04334 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5ej!3-qBCsR(zDBw1As!D z1s;*bKxKj;%vhfiKM^R%lJ4m1$iT3%pZiZDD@aj*Pl)S(AYk|pNdQueB|(0{ z3=Yq3qyagOo-U3d6}OTT4lqj`WYF%P$jKq`kl`G&cO%P#Bm=oF5vkS`g + + + Matlab Search Engine + + + + + + + + + +

Search Engine

+ + + + + +
Generated on {DATE} by m2html © 2005
+ + diff --git a/external/m2html/templates/brain/sgi.png b/external/m2html/templates/brain/sgi.png new file mode 100644 index 0000000000000000000000000000000000000000..20052bc569a92dff7ffb2845009b7b0a5edde83b GIT binary patch literal 263 zcmV+i0r>ujP)z zZ3@F642I+A(ex_uOz|q|-Q16CA~DKXHy!h#6nPc#A=(dzh_Dj}01(mYWlSQ*cu32| zbbY!^c%J9=dA@}A9sq8umob~|g)?E>&V+Ie#O(HQu@+QR?< N002ovPDHLkV1hx>d=3Br literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/simulinkicon.gif b/external/m2html/templates/brain/simulinkicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..1386ddd4ce654071015610e81fdea82461d8e28b GIT binary patch literal 977 zcmbu8u}_m>5XK)83^3Uu8;SX77?CI^3B-XItA?P13elB7PXr>Q5E~tEP-6{~F%D-K z)WpFqI=OT~2IKIO5C(b~XFmOKi{R_TBlgr&b_q*r5UY@)(Ha=TG0e=CHm)y-= z-NhXdrR2#xsVDJ-NLq3;H+2&?M6D)Qb5&PyMYKwCF&A|a7f{KO9Oh7mI2cfy($r!z zs}XbJSxTCcq=XpD$Sj#AlVk`ACe@N^Qb~${Vy##bO(ID^Mz$tcf+k1;r;?gtgeE1i znB!n-Q<_?AMl2LDpPGpoVn2>$q-rXrh;>Q9q^OCQfZG#_wFWhaf$Px^VzQfdaDPH@ zLsCc`!iKu|Sa$Qm|sSpKyq|-EjTr8*2+?H0- z4`Q;Lc94k+b3;;7jL_^P7CAVW+LT6|D5{xe%m-eKMsh!nWh97?BYe&89m)KJVRL?! zsLhQI*K_ZpHMb*1{#n2u&8oRKvdcS(-_QHDh{>=FJST?;-$*#_> zFWg+IF0Bn^lXvHav-8W#Szfc2RV!b=VRFa{1fJ1Bvn_=*1$x~u5G{^07%?ML0m zHxB3bGCb|+8kyh!`1T@vWbw!Thc`P>6y|3Oo@O9$!+|lO2pBq=~ z?6HkkzgKp4CuH{I*7l2^yRRR1_MTc?@7vp&8a;gcZ2H%?cU{-M_dgh2`cl7D{M1<} G;M_lk-mF{z literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/solaris.png b/external/m2html/templates/brain/solaris.png new file mode 100644 index 0000000000000000000000000000000000000000..e31e8a2a48078233e65bf10502de055609469206 GIT binary patch literal 286 zcmV+(0pb3MP)LJX0GRn|87F~=qO=0d z$LTWTx~|80zJzI-0N{4DjI%Mk;moMpnNcohj7EB(iPVo~iqGKm_8{s|W(+hpPU=N2 zz2$E5rj(XtF(bOm8L*eKNAeVg;o46LO1s$e-HK3o_b;p)l_XJ5>4v`(0TG#bkaL)bhCi169@`rB kx1WB<=i4tMjP|#52ZwT~UP>&M!~g&Q07*qoM6N<$g3~#GJpcdz literal 0 HcmV?d00001 diff --git a/external/m2html/templates/brain/todo.tpl b/external/m2html/templates/brain/todo.tpl new file mode 100644 index 00000000..34b9b4f6 --- /dev/null +++ b/external/m2html/templates/brain/todo.tpl @@ -0,0 +1,27 @@ + + + + To Do List for {MDIR} + + + + + + + + + +
^ Master index ^
+

TODO list for {MDIR}

+ +

{MFILE}:

+ + +
Generated by m2html © 2005
+ + diff --git a/external/m2html/templates/brain/up.png b/external/m2html/templates/brain/up.png new file mode 100644 index 0000000000000000000000000000000000000000..b348b9a1b19bd5030efd3df293d84a18b41ef6a4 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^{2x4R4De4J#NJjgjrM8h9Te~(8G kcWyrh{e1gnl+pf{?#tSrFr=&ZY5)KL07*qoM6N<$f*5RoFaQ7m literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame-piotr/alpha.png b/external/m2html/templates/frame-piotr/alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..c73de7b05000443a0842f2e915d30dc5efec0dd1 GIT binary patch literal 273 zcmV+s0q*{ZP)z zQ4WJJ2!`q6(c~&{CcFyX%{{O*3+<>*r)K@)L#;sgtx%hY2zp`w01>%5jgw&J!A6Ov z{oxj&d7k&j`4Qtd0>I2H(i=Rwz9Tqxf(W|?ki|=ctL(aA|es#WFKbc?zg4C=hd_}m12PXzTKJB+iB?u XpQ?QQ=I-(g00000NkvXXu0mjf#?^X; literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame-piotr/c++.png b/external/m2html/templates/frame-piotr/c++.png new file mode 100644 index 0000000000000000000000000000000000000000..24f56e6293df813f7699555d0fdd0224a33bdac9 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0YJ>p!2~4#tiFE(NUrMq>1fP(BLp1!W^mpLQ_Wwp7rPrm~SUGa2r45^s&cKTi3W&@s7VZD}9S!LiPTl|j(*)-gYW;;XAZ?5N!pnK5hG z+s}VG5+xWO6mIF=yOWvujML^HlXZ+Yu?Qyj=7(iWd!%tXIGN|}`LH!?g3;OMg0piY zXCLcLf98Km#%@Dm=Gw_oB65#C&Ig=Xv$e7}bMZ3wpl2`Gw(%Wrdp_NvM0oStJBj<- zw>I9sUd+GU{%T3g&-nYj{hnNcohMx1C8q6LzjX6wt1Wi%t17>Iemh??{C9K})9DTU VtbG#CZUOzr;OXk;vd$@?2>_TKh~WSL literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame-piotr/c.png b/external/m2html/templates/frame-piotr/c.png new file mode 100644 index 0000000000000000000000000000000000000000..c39fbf0e25ee296c5da082458363c45d945e55ac GIT binary patch literal 252 zcmVqm`?`neZy@-MWWPW6I1ran`JUPt^Pp2nEy;5sZWf01@dO#z`=%5EER@AM$q-T7II}~u7He5MzB*^2($9;r8$^sTRx!mG z*Y={Rp11gKlvQkAY5N${nZR6`uQXd6Q{e@Bh2dQhbZ(t1?070Ye8{5GRQ*|k);Is- zyZYFOBO(zQWDhg*y_Wu+*U+*r-a`3&yE1OHzojSttaK8#KYM}z0000F(pUKia5*{N xtO-?WJ(Rf1$C7KR)AZ0H0j(>SR=H$6kJ)6-DZGJ)<+b45x|97Z4cdwf)&TUlSJMCh literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame-piotr/down.png b/external/m2html/templates/frame-piotr/down.png new file mode 100644 index 0000000000000000000000000000000000000000..d41104a26f3d09deda6ab54281affd82c981abb1 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^{2gTe~DWM4fiX0)Z literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame-piotr/fortran.png b/external/m2html/templates/frame-piotr/fortran.png new file mode 100644 index 0000000000000000000000000000000000000000..350c572ee38fc5aa8cef025284caa41a46921cbf GIT binary patch literal 265 zcmV+k0rvihP)z zQ4Yf(2!?U#(c~&{CVCaUn|okwjJWCAv@Y{YACUYt5I|c;L@*Nz0Eo!wFm8gG7quL( z=eJ8jF~;-zT!i-?03M^mxSQz{PD1(=o)3a5h-huxIH1YJR@TpAUHLpGAzkjqF33Gq z5HW;M#1ulv?Ojv&dqVG&6;xWfSwIyu&pDe3Y?b*+^Nvd@T*dL)Y-z<7!R9u;!a16o zt!IDE1;u=7(6;lN@7iT2j)+8Ll6#n$r@xl|p4XvuY#=TA`S#1W+5VQEsg98Zwj;#Z P00000NkvXXu0mjf06Tac literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame-piotr/graph.tpl b/external/m2html/templates/frame-piotr/graph.tpl new file mode 100644 index 00000000..8a860580 --- /dev/null +++ b/external/m2html/templates/frame-piotr/graph.tpl @@ -0,0 +1,26 @@ + + + + Dependency Graph for {MDIR} + + + + + + + + + +

Dependency Graph for {MDIR}

+ +
+Dependency Graph for {MDIR} + +{GRAPH_MAP} + +
+ +
Generated by m2html © 2003
+ + diff --git a/external/m2html/templates/frame-piotr/hp.png b/external/m2html/templates/frame-piotr/hp.png new file mode 100644 index 0000000000000000000000000000000000000000..d09f988fb289d659869dbb1b2f199fd967a93958 GIT binary patch literal 255 zcmVz z%MHUI3_wlAXs`;N$*f{_qX$Rw9FO zez{B`r8K|JmvGJjz-@IJXS2Omg-^gRJ-6O z&=syLR&U^^a}=eRZLpT@KTChlV@n^^it_t*Wz253r911aWh5p(A;kay002ovPDHLk FV1l-WYkL3y literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame-piotr/index.html b/external/m2html/templates/frame-piotr/index.html new file mode 100644 index 00000000..50efd894 --- /dev/null +++ b/external/m2html/templates/frame-piotr/index.html @@ -0,0 +1,22 @@ + + + + Piotr's Matlab Toolbox + + + + + + + + + + + + +Sorry, your browser doesn't support frames. +Go to menu.html for the documentation of all +the Matlab functions. + + diff --git a/external/m2html/templates/frame-piotr/left.png b/external/m2html/templates/frame-piotr/left.png new file mode 100644 index 0000000000000000000000000000000000000000..404df045f40970496c71ca6b8c1f1357af271e27 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^{2}w1qqB3TN5VEvJYV8 a;bDlI$G>{!EB$9cJq(_%elF{r5}E)JMz zQ4WJ342H|%(dbp$Gu5lqySaxtLO>W(rpx%_LnVK(UrGTT5y42B06;|UPU9jm^JJ0Z z`TTUN(6TJ&=lPPn_WX zId~2>0yJfGb3Up-MDlH7S}Vx-I*N`iO3-5Ff$K-Ed9Nepzm`zojRl WMtq7>mNL`;0000 + + + Piotr's Image & Video Toolbox for Matlab + + + + + + + + + +

Piotr's Image & Video Toolbox for Matlab

+

Download & Description

+

Matlab Directories

+ + + + + + +
Generated by m2html © 2003
+ + diff --git a/external/m2html/templates/frame-piotr/matlabicon.gif b/external/m2html/templates/frame-piotr/matlabicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c2b5e6e2225ede10ed4a95138d8c8df0a0fcfa2 GIT binary patch literal 574 zcmZ?wbhEHb6krfwc*Xz%|NsAYmy|MAPz?4D)YH*5(Km9k^EZu6QcKQIFtf07b<0@1 zT)&{uy`(f{{sI|ySG|y6y`Vtr!~~nlvVh)B-slDkd7sMUhm~nn@(#}qULHtXTzoc}*_9Non9cn|mMot$6xao(HD{Btemfo7KftJ(gq<~Y~G z@qZoHkA=+tS8)7W&Uw9q`Tr8me+#(&&u0HSm+S9Tw*NEO-*s^O@8dn4!TPz8qu!P4 zK_1Jw46grGoai}Etj@tK_}C@RCk z%#`S6Zs-xzlqxAD$1kf8AM0wN?c%>SMNC?Phc6~Pz{yO{A+R?kRa_)AA;iir?(CQ-4ncIv-nB)Nx{hL?F`wWg|rwizO*(ixxOASOWm3r><21 literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame-piotr/mdir.tpl b/external/m2html/templates/frame-piotr/mdir.tpl new file mode 100644 index 00000000..a5d68f20 --- /dev/null +++ b/external/m2html/templates/frame-piotr/mdir.tpl @@ -0,0 +1,61 @@ + + + + Index for Directory {MDIR} + + + + + + + + + +
^ Master index ^
+ +

Index for {MDIR}

+
Contents
+ +

Matlab files in this directory:

+ + + +

Other Matlab-specific files in this directory:

+
    + +
  • {OTHERFILE}
  • + +
+ + + +

Subsequent directories:

+
    + +
  • {SUBDIRECTORY}
  • + +
+ + + +

Dependency Graph

+ + + + +

TODO List

+ + + +
Generated by m2html © 2003
+ + diff --git a/external/m2html/templates/frame-piotr/mex.png b/external/m2html/templates/frame-piotr/mex.png new file mode 100644 index 0000000000000000000000000000000000000000..396f1bc943e311539c64aa839ba14242c3b1493c GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^GC<7D!VDzmefZDNn{1``2&1H zT>k^XH6VupNCU}&+~7Mvim@cfFPOpM*^M+1C&}C0g`tC0)&t1lEbxdd1{y2`!i<;h z*8KqrvX^-Jy0Ty9km3|#4DWEh2o&=1ba4!+m=oK_$albigXt^#BmNKn`(>_}oOavV zHb=Afht|Vg%9B``@)jwvpOrK#Ny(Hf&TUq{A5ne4dvCr*%)z?JLGp XX&kFA6^pR}&1LX(^>bP0l+XkK#Yar! literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame-piotr/mfile.tpl b/external/m2html/templates/frame-piotr/mfile.tpl new file mode 100644 index 00000000..5a0051ce --- /dev/null +++ b/external/m2html/templates/frame-piotr/mfile.tpl @@ -0,0 +1,63 @@ + + + + Description of {NAME} + + + + + + + + + + + + +

{NAME} +   {PLATFORMS} +

+ +

PURPOSE ^

+
{H1LINE}
+ +

SYNOPSIS ^

+
{SYNOPSIS} This is a script file.
+ +

DESCRIPTION ^

+
{DESCRIPTION}
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: + + + + +

SUBFUNCTIONS ^

+ + + + +

SOURCE CODE ^

+
{SOURCECODE}
+ + +
Generated on {DATE} by m2html © 2003
+ + diff --git a/external/m2html/templates/frame-piotr/overview.html b/external/m2html/templates/frame-piotr/overview.html new file mode 100644 index 00000000..3eb0b1c7 --- /dev/null +++ b/external/m2html/templates/frame-piotr/overview.html @@ -0,0 +1,66 @@ + + + + + Piotr's Image & Video Toolbox for Matlab + + + + + + + + + + +

Overview

+

DESCRIPTION^

+
+

This toolbox is meant to facilitate the manipulation of images and +video in Matlab. Its purpose is to complement, not replace, Matlab's Image +Processing Toolbox, and in fact it requires that the Matlab Image Toolbox +be installed.   Emphasis has been placed on code efficiency and +code reuse.

+

Thanks to everyone who has given me feedback and suggestions -- +you've helped make this toolbox more useful and easier to +use.

+

CONTENTS^

The toolbox is divided into 4 parts, arranged by +directory: +
    +
  • classify Classification algorithms + with a unified interface and fast clustering. +
  • filters Routines for filtering + images. +
  • images Routines for manipulating and + displaying images and videos. +
  • matlab General Matlab functions that + should have been a part of Matlab.
+

DOWNLOAD^

+
+

To download the current version of the toolbox, click here.

+

Simply unzip, then add all directories to the Matlab path:
  +>> addpath(genpath('c:\toolbox')); savepath;

+

Finally, run the compile script for the mex +files:
  >> cd('c:\toolbox'); +
toolbox_compile;

+

Version 1.03; May. 3, 2006 (history)

+

CONTACT^

+
If you have a question or a suggestion, or if you find a bug, +please email me at +pdollar-at-cs.ucsd.edu
+ + diff --git a/external/m2html/templates/frame-piotr/right.png b/external/m2html/templates/frame-piotr/right.png new file mode 100644 index 0000000000000000000000000000000000000000..067c5baf250318b85ede9047ea56e394244a8712 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^{2ujP)z zZ3@F642I+A(ex_uOz|q|-Q16CA~DKXHy!h#6nPc#A=(dzh_Dj}01(mYWlSQ*cu32| zbbY!^c%J9=dA@}A9sq8umob~|g)?E>&V+Ie#O(HQu@+QR?< N002ovPDHLkV1hx>d=3Br literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame-piotr/simulinkicon.gif b/external/m2html/templates/frame-piotr/simulinkicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..1386ddd4ce654071015610e81fdea82461d8e28b GIT binary patch literal 977 zcmbu8u}_m>5XK)83^3Uu8;SX77?CI^3B-XItA?P13elB7PXr>Q5E~tEP-6{~F%D-K z)WpFqI=OT~2IKIO5C(b~XFmOKi{R_TBlgr&b_q*r5UY@)(Ha=TG0e=CHm)y-= z-NhXdrR2#xsVDJ-NLq3;H+2&?M6D)Qb5&PyMYKwCF&A|a7f{KO9Oh7mI2cfy($r!z zs}XbJSxTCcq=XpD$Sj#AlVk`ACe@N^Qb~${Vy##bO(ID^Mz$tcf+k1;r;?gtgeE1i znB!n-Q<_?AMl2LDpPGpoVn2>$q-rXrh;>Q9q^OCQfZG#_wFWhaf$Px^VzQfdaDPH@ zLsCc`!iKu|Sa$Qm|sSpKyq|-EjTr8*2+?H0- z4`Q;Lc94k+b3;;7jL_^P7CAVW+LT6|D5{xe%m-eKMsh!nWh97?BYe&89m)KJVRL?! zsLhQI*K_ZpHMb*1{#n2u&8oRKvdcS(-_QHDh{>=FJST?;-$*#_> zFWg+IF0Bn^lXvHav-8W#Szfc2RV!b=VRFa{1fJ1Bvn_=*1$x~u5G{^07%?ML0m zHxB3bGCb|+8kyh!`1T@vWbw!Thc`P>6y|3Oo@O9$!+|lO2pBq=~ z?6HkkzgKp4CuH{I*7l2^yRRR1_MTc?@7vp&8a;gcZ2H%?cU{-M_dgh2`cl7D{M1<} G;M_lk-mF{z literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame-piotr/solaris.png b/external/m2html/templates/frame-piotr/solaris.png new file mode 100644 index 0000000000000000000000000000000000000000..e31e8a2a48078233e65bf10502de055609469206 GIT binary patch literal 286 zcmV+(0pb3MP)LJX0GRn|87F~=qO=0d z$LTWTx~|80zJzI-0N{4DjI%Mk;moMpnNcohj7EB(iPVo~iqGKm_8{s|W(+hpPU=N2 zz2$E5rj(XtF(bOm8L*eKNAeVg;o46LO1s$e-HK3o_b;p)l_XJ5>4v`(0TG#bkaL)bhCi169@`rB kx1WB<=i4tMjP|#52ZwT~UP>&M!~g&Q07*qoM6N<$g3~#GJpcdz literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame-piotr/todo.tpl b/external/m2html/templates/frame-piotr/todo.tpl new file mode 100644 index 00000000..f1660a94 --- /dev/null +++ b/external/m2html/templates/frame-piotr/todo.tpl @@ -0,0 +1,27 @@ + + + + To Do List for {MDIR} + + + + + + + + + +
^ Master index ^
+

TODO list for {MDIR}

+ +

{MFILE}:

+ + +
Generated by m2html © 2003
+ + diff --git a/external/m2html/templates/frame-piotr/up.png b/external/m2html/templates/frame-piotr/up.png new file mode 100644 index 0000000000000000000000000000000000000000..b348b9a1b19bd5030efd3df293d84a18b41ef6a4 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^{2x4R4De4J#NJjgjrM8h9Te~(8G kcWyrh{e1gnl+pf{?#tSrFr=&ZY5)KL07*qoM6N<$f*5RoFaQ7m literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame/alpha.png b/external/m2html/templates/frame/alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..c73de7b05000443a0842f2e915d30dc5efec0dd1 GIT binary patch literal 273 zcmV+s0q*{ZP)z zQ4WJJ2!`q6(c~&{CcFyX%{{O*3+<>*r)K@)L#;sgtx%hY2zp`w01>%5jgw&J!A6Ov z{oxj&d7k&j`4Qtd0>I2H(i=Rwz9Tqxf(W|?ki|=ctL(aA|es#WFKbc?zg4C=hd_}m12PXzTKJB+iB?u XpQ?QQ=I-(g00000NkvXXu0mjf#?^X; literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame/c++.png b/external/m2html/templates/frame/c++.png new file mode 100644 index 0000000000000000000000000000000000000000..24f56e6293df813f7699555d0fdd0224a33bdac9 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0YJ>p!2~4#tiFE(NUrMq>1fP(BLp1!W^mpLQ_Wwp7rPrm~SUGa2r45^s&cKTi3W&@s7VZD}9S!LiPTl|j(*)-gYW;;XAZ?5N!pnK5hG z+s}VG5+xWO6mIF=yOWvujML^HlXZ+Yu?Qyj=7(iWd!%tXIGN|}`LH!?g3;OMg0piY zXCLcLf98Km#%@Dm=Gw_oB65#C&Ig=Xv$e7}bMZ3wpl2`Gw(%Wrdp_NvM0oStJBj<- zw>I9sUd+GU{%T3g&-nYj{hnNcohMx1C8q6LzjX6wt1Wi%t17>Iemh??{C9K})9DTU VtbG#CZUOzr;OXk;vd$@?2>_TKh~WSL literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame/c.png b/external/m2html/templates/frame/c.png new file mode 100644 index 0000000000000000000000000000000000000000..c39fbf0e25ee296c5da082458363c45d945e55ac GIT binary patch literal 252 zcmVqm`?`neZy@-MWWPW6I1ran`JUPt^Pp2nEy;5sZWf01@dO#z`=%5EER@AM$q-T7II}~u7He5MzB*^2($9;r8$^sTRx!mG z*Y={Rp11gKlvQkAY5N${nZR6`uQXd6Q{e@Bh2dQhbZ(t1?070Ye8{5GRQ*|k);Is- zyZYFOBO(zQWDhg*y_Wu+*U+*r-a`3&yE1OHzojSttaK8#KYM}z0000F(pUKia5*{N xtO-?WJ(Rf1$C7KR)AZ0H0j(>SR=H$6kJ)6-DZGJ)<+b45x|97Z4cdwf)&TUlSJMCh literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame/down.png b/external/m2html/templates/frame/down.png new file mode 100644 index 0000000000000000000000000000000000000000..d41104a26f3d09deda6ab54281affd82c981abb1 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^{2gTe~DWM4fiX0)Z literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame/doxysearch.php b/external/m2html/templates/frame/doxysearch.php new file mode 100644 index 00000000..36112a42 --- /dev/null +++ b/external/m2html/templates/frame/doxysearch.php @@ -0,0 +1,329 @@ +$word, + "match"=>$w, + "index"=>$statIdx, + "full"=>strlen($w)==strlen($word), + "docs"=>array() + ); + } + $w = readString($file); + } + $totalFreq=0; + for ($count=$start;$count$idx,"freq"=>$freq,"rank"=>0.0); + $totalFreq+=$freq; + if ($statInfo["full"]) $totalfreq+=$freq; + } + // read name an url info for the doc + for ($i=0;$i<$numDocs;$i++) + { + fseek($file,$docInfo[$i]["idx"]); + $docInfo[$i]["name"]=readString($file); + $docInfo[$i]["url"]=readString($file); + } + $statInfo["docs"]=$docInfo; + } + for ($count=$start;$count$key, + "name"=>$di["name"], + "rank"=>$rank + ); + } + $docs[$key]["words"][] = array( + "word"=>$wordInfo["word"], + "match"=>$wordInfo["match"], + "freq"=>$di["freq"] + ); + } + } + return $docs; +} + +function normalize_ranking(&$docs) +{ + $maxRank = 0.0000001; + // compute maximal rank + foreach ($docs as $doc) + { + if ($doc["rank"]>$maxRank) + { + $maxRank=$doc["rank"]; + } + } + reset($docs); + // normalize rankings + while (list ($key, $val) = each ($docs)) + { + $docs[$key]["rank"]*=100/$maxRank; + } +} + +function filter_results($docs,&$requiredWords,&$forbiddenWords) +{ + $filteredDocs=array(); + while (list ($key, $val) = each ($docs)) + { + $words = &$docs[$key]["words"]; + $copy=1; // copy entry by default + if (sizeof($requiredWords)>0) + { + foreach ($requiredWords as $reqWord) + { + $found=0; + foreach ($words as $wordInfo) + { + $found = $wordInfo["word"]==$reqWord; + if ($found) break; + } + if (!$found) + { + $copy=0; // document contains none of the required words + break; + } + } + } + if (sizeof($forbiddenWords)>0) + { + foreach ($words as $wordInfo) + { + if (in_array($wordInfo["word"],$forbiddenWords)) + { + $copy=0; // document contains a forbidden word + break; + } + } + } + if ($copy) $filteredDocs[$key]=$docs[$key]; + } + return $filteredDocs; +} + +function compare_rank($a,$b) +{ + return ($a["rank"]>$b["rank"]) ? -1 : 1; +} + +function sort_results($docs,&$sorted) +{ + $sorted = $docs; + usort($sorted,"compare_rank"); + return $sorted; +} + +function report_results(&$docs) +{ + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + $numDocs = sizeof($docs); + if ($numDocs==0) + { + echo " \n"; + echo " \n"; + echo " \n"; + } + else + { + echo " \n"; + echo " \n"; + echo " \n"; + $num=1; + foreach ($docs as $doc) + { + echo " \n"; + echo " "; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + $num++; + } + } + echo "

Search Results

".matches_text(0)."
".matches_text($numDocs); + echo "\n"; + echo "
$num.".$doc["name"]."
Matches: "; + foreach ($doc["words"] as $wordInfo) + { + $word = $wordInfo["word"]; + $matchRight = substr($wordInfo["match"],strlen($word)); + echo "$word$matchRight(".$wordInfo["freq"].") "; + } + echo "
\n"; +} + +function matches_text($num) +{ + if ($num==0) + { + return 'Sorry, no documents matching your query.'; + } + else if ($num==1) + { + return 'Found 1 document matching your query.'; + } + else // $num>1 + { + return 'Found '.$num.' documents matching your query. Showing best matches first.'; + } +} + +function main($idxfile) +{ + if(strcmp('4.1.0', phpversion()) > 0) + { + die("Error: PHP version 4.1.0 or above required!"); + } + if (!($file=fopen($idxfile,"rb"))) + { + die("Error: Search index file could NOT be opened!"); + } + if (readHeader($file)!="DOXS") + { + die("Error: Header of index file is invalid!"); + } + $query=""; + if (array_key_exists("query", $_GET)) + { + $query=$_GET["query"]; + } + $results = array(); + $requiredWords = array(); + $forbiddenWords = array(); + $foundWords = array(); + $word=strtolower(strtok($query," ")); + while ($word) // for each word in the search query + { + if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; } + if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; } + if (!in_array($word,$foundWords)) + { + $foundWords[]=$word; + search($file,$word,$results); + } + $word=strtolower(strtok(" ")); + } + $docs = array(); + combine_results($results,$docs); + // filter out documents with forbidden word or that do not contain + // required words + $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords); + // normalize rankings so they are in the range [0-100] + normalize_ranking($filteredDocs); + // sort the results based on rank + $sorted = array(); + sort_results($filteredDocs,$sorted); + // report results to the user + report_results($sorted); + fclose($file); +} + +?> diff --git a/external/m2html/templates/frame/fortran.png b/external/m2html/templates/frame/fortran.png new file mode 100644 index 0000000000000000000000000000000000000000..350c572ee38fc5aa8cef025284caa41a46921cbf GIT binary patch literal 265 zcmV+k0rvihP)z zQ4Yf(2!?U#(c~&{CVCaUn|okwjJWCAv@Y{YACUYt5I|c;L@*Nz0Eo!wFm8gG7quL( z=eJ8jF~;-zT!i-?03M^mxSQz{PD1(=o)3a5h-huxIH1YJR@TpAUHLpGAzkjqF33Gq z5HW;M#1ulv?Ojv&dqVG&6;xWfSwIyu&pDe3Y?b*+^Nvd@T*dL)Y-z<7!R9u;!a16o zt!IDE1;u=7(6;lN@7iT2j)+8Ll6#n$r@xl|p4XvuY#=TA`S#1W+5VQEsg98Zwj;#Z P00000NkvXXu0mjf06Tac literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame/graph.tpl b/external/m2html/templates/frame/graph.tpl new file mode 100644 index 00000000..989dbcb2 --- /dev/null +++ b/external/m2html/templates/frame/graph.tpl @@ -0,0 +1,26 @@ + + + + Dependency Graph for {MDIR} + + + + + + + + + +

Dependency Graph for {MDIR}

+ +
+Dependency Graph for {MDIR} + +{GRAPH_MAP} + +
+ +
Generated by m2html © 2005
+ + diff --git a/external/m2html/templates/frame/hp.png b/external/m2html/templates/frame/hp.png new file mode 100644 index 0000000000000000000000000000000000000000..d09f988fb289d659869dbb1b2f199fd967a93958 GIT binary patch literal 255 zcmVz z%MHUI3_wlAXs`;N$*f{_qX$Rw9FO zez{B`r8K|JmvGJjz-@IJXS2Omg-^gRJ-6O z&=syLR&U^^a}=eRZLpT@KTChlV@n^^it_t*Wz253r911aWh5p(A;kay002ovPDHLk FV1l-WYkL3y literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame/index.html b/external/m2html/templates/frame/index.html new file mode 100644 index 00000000..01d6dbc1 --- /dev/null +++ b/external/m2html/templates/frame/index.html @@ -0,0 +1,22 @@ + + + + Matlab Documentation by M2HTML + + + + + + + + + + + + +This is a Matlab Documentation by M2HTML.
+Go to menu.html for the documentation of all +the Matlab functions. +
+ diff --git a/external/m2html/templates/frame/left.png b/external/m2html/templates/frame/left.png new file mode 100644 index 0000000000000000000000000000000000000000..404df045f40970496c71ca6b8c1f1357af271e27 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^{2}w1qqB3TN5VEvJYV8 a;bDlI$G>{!EB$9cJq(_%elF{r5}E)JMz zQ4WJ342H|%(dbp$Gu5lqySaxtLO>W(rpx%_LnVK(UrGTT5y42B06;|UPU9jm^JJ0Z z`TTUN(6TJ&=lPPn_WX zId~2>0yJfGb3Up-MDlH7S}Vx-I*N`iO3-5Ff$K-Ed9Nepzm`zojRl WMtq7>mNL`;0000 + + + Matlab Index + + + + + + + + + +

Matlab Index

+

Matlab Directories

+ + + + + + + + +

Search Engine

+ + + + +

Dependency Graph

+ + +
Generated by m2html © 2005
+ + diff --git a/external/m2html/templates/frame/matlabicon.gif b/external/m2html/templates/frame/matlabicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c2b5e6e2225ede10ed4a95138d8c8df0a0fcfa2 GIT binary patch literal 574 zcmZ?wbhEHb6krfwc*Xz%|NsAYmy|MAPz?4D)YH*5(Km9k^EZu6QcKQIFtf07b<0@1 zT)&{uy`(f{{sI|ySG|y6y`Vtr!~~nlvVh)B-slDkd7sMUhm~nn@(#}qULHtXTzoc}*_9Non9cn|mMot$6xao(HD{Btemfo7KftJ(gq<~Y~G z@qZoHkA=+tS8)7W&Uw9q`Tr8me+#(&&u0HSm+S9Tw*NEO-*s^O@8dn4!TPz8qu!P4 zK_1Jw46grGoai}Etj@tK_}C@RCk z%#`S6Zs-xzlqxAD$1kf8AM0wN?c%>SMNC?Phc6~Pz{yO{A+R?kRa_)AA;iir?(CQ-4ncIv-nB)Nx{hL?F`wWg|rwizO*(ixxOASOWm3r><21 literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame/mdir.tpl b/external/m2html/templates/frame/mdir.tpl new file mode 100644 index 00000000..f8617b94 --- /dev/null +++ b/external/m2html/templates/frame/mdir.tpl @@ -0,0 +1,60 @@ + + + + Index for Directory {MDIR} + + + + + + + + + +
^ Master index ^
+ +

Index for {MDIR}

+ +

Matlab files in this directory:

+ + + +

Other Matlab-specific files in this directory:

+
    + +
  • {OTHERFILE}
  • + +
+ + + +

Subsequent directories:

+
    + +
  • {SUBDIRECTORY}
  • + +
+ + + +

Dependency Graph

+ + + + +

TODO List

+ + + +
Generated by m2html © 2005
+ + diff --git a/external/m2html/templates/frame/mex.png b/external/m2html/templates/frame/mex.png new file mode 100644 index 0000000000000000000000000000000000000000..396f1bc943e311539c64aa839ba14242c3b1493c GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^GC<7D!VDzmefZDNn{1``2&1H zT>k^XH6VupNCU}&+~7Mvim@cfFPOpM*^M+1C&}C0g`tC0)&t1lEbxdd1{y2`!i<;h z*8KqrvX^-Jy0Ty9km3|#4DWEh2o&=1ba4!+m=oK_$albigXt^#BmNKn`(>_}oOavV zHb=Afht|Vg%9B``@)jwvpOrK#Ny(Hf&TUq{A5ne4dvCr*%)z?JLGp XX&kFA6^pR}&1LX(^>bP0l+XkK#Yar! literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame/mfile.tpl b/external/m2html/templates/frame/mfile.tpl new file mode 100644 index 00000000..d47022f8 --- /dev/null +++ b/external/m2html/templates/frame/mfile.tpl @@ -0,0 +1,71 @@ + + + + Description of {NAME} + + + + + + + + + + + + + +

{NAME} +   {PLATFORMS} +

+ +

PURPOSE ^

+
{H1LINE}
+ +

SYNOPSIS ^

+
{SYNOPSIS} This is a script file.
+ +

DESCRIPTION ^

+
{DESCRIPTION}
+ + +

CROSS-REFERENCE INFORMATION ^

+This function calls: + +This function is called by: + + + + +

SUBFUNCTIONS ^

+ + + + +

DOWNLOAD ^

+

{NAME}.m

+ + + +

SOURCE CODE ^

+
{SOURCECODE}
+ + +
Generated on {DATE} by m2html © 2005
+ + diff --git a/external/m2html/templates/frame/pcode.png b/external/m2html/templates/frame/pcode.png new file mode 100644 index 0000000000000000000000000000000000000000..6801bd9a259131e6de7d7957789598a451c04334 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5ej!3-qBCsR(zDBw1As!D z1s;*bKxKj;%vhfiKM^R%lJ4m1$iT3%pZiZDD@aj*Pl)S(AYk|pNdQueB|(0{ z3=Yq3qyagOo-U3d6}OTT4lqj`WYF%P$jKq`kl`G&cO%P#Bm=oF5vkS`g + + + Matlab Search Engine + + + + + + + + + +

Search Engine

+ + + + + +
Generated on {DATE} by m2html © 2005
+ + diff --git a/external/m2html/templates/frame/sgi.png b/external/m2html/templates/frame/sgi.png new file mode 100644 index 0000000000000000000000000000000000000000..20052bc569a92dff7ffb2845009b7b0a5edde83b GIT binary patch literal 263 zcmV+i0r>ujP)z zZ3@F642I+A(ex_uOz|q|-Q16CA~DKXHy!h#6nPc#A=(dzh_Dj}01(mYWlSQ*cu32| zbbY!^c%J9=dA@}A9sq8umob~|g)?E>&V+Ie#O(HQu@+QR?< N002ovPDHLkV1hx>d=3Br literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame/simulinkicon.gif b/external/m2html/templates/frame/simulinkicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..1386ddd4ce654071015610e81fdea82461d8e28b GIT binary patch literal 977 zcmbu8u}_m>5XK)83^3Uu8;SX77?CI^3B-XItA?P13elB7PXr>Q5E~tEP-6{~F%D-K z)WpFqI=OT~2IKIO5C(b~XFmOKi{R_TBlgr&b_q*r5UY@)(Ha=TG0e=CHm)y-= z-NhXdrR2#xsVDJ-NLq3;H+2&?M6D)Qb5&PyMYKwCF&A|a7f{KO9Oh7mI2cfy($r!z zs}XbJSxTCcq=XpD$Sj#AlVk`ACe@N^Qb~${Vy##bO(ID^Mz$tcf+k1;r;?gtgeE1i znB!n-Q<_?AMl2LDpPGpoVn2>$q-rXrh;>Q9q^OCQfZG#_wFWhaf$Px^VzQfdaDPH@ zLsCc`!iKu|Sa$Qm|sSpKyq|-EjTr8*2+?H0- z4`Q;Lc94k+b3;;7jL_^P7CAVW+LT6|D5{xe%m-eKMsh!nWh97?BYe&89m)KJVRL?! zsLhQI*K_ZpHMb*1{#n2u&8oRKvdcS(-_QHDh{>=FJST?;-$*#_> zFWg+IF0Bn^lXvHav-8W#Szfc2RV!b=VRFa{1fJ1Bvn_=*1$x~u5G{^07%?ML0m zHxB3bGCb|+8kyh!`1T@vWbw!Thc`P>6y|3Oo@O9$!+|lO2pBq=~ z?6HkkzgKp4CuH{I*7l2^yRRR1_MTc?@7vp&8a;gcZ2H%?cU{-M_dgh2`cl7D{M1<} G;M_lk-mF{z literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame/solaris.png b/external/m2html/templates/frame/solaris.png new file mode 100644 index 0000000000000000000000000000000000000000..e31e8a2a48078233e65bf10502de055609469206 GIT binary patch literal 286 zcmV+(0pb3MP)LJX0GRn|87F~=qO=0d z$LTWTx~|80zJzI-0N{4DjI%Mk;moMpnNcohj7EB(iPVo~iqGKm_8{s|W(+hpPU=N2 zz2$E5rj(XtF(bOm8L*eKNAeVg;o46LO1s$e-HK3o_b;p)l_XJ5>4v`(0TG#bkaL)bhCi169@`rB kx1WB<=i4tMjP|#52ZwT~UP>&M!~g&Q07*qoM6N<$g3~#GJpcdz literal 0 HcmV?d00001 diff --git a/external/m2html/templates/frame/todo.tpl b/external/m2html/templates/frame/todo.tpl new file mode 100644 index 00000000..f13a1ebc --- /dev/null +++ b/external/m2html/templates/frame/todo.tpl @@ -0,0 +1,27 @@ + + + + To Do List for {MDIR} + + + + + + + + + +
^ Master index ^
+

TODO list for {MDIR}

+ +

{MFILE}:

+ + +
Generated by m2html © 2005
+ + diff --git a/external/m2html/templates/frame/up.png b/external/m2html/templates/frame/up.png new file mode 100644 index 0000000000000000000000000000000000000000..b348b9a1b19bd5030efd3df293d84a18b41ef6a4 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^{2x4R4De4J#NJjgjrM8h9Te~(8G kcWyrh{e1gnl+pf{?#tSrFr=&ZY5)KL07*qoM6N<$f*5RoFaQ7m literal 0 HcmV?d00001 diff --git a/external/m2html/templates/menu-for-frame-piotr.html b/external/m2html/templates/menu-for-frame-piotr.html new file mode 100644 index 00000000..bdef5c66 --- /dev/null +++ b/external/m2html/templates/menu-for-frame-piotr.html @@ -0,0 +1,33 @@ + + + + Piotr's Image & Video Toolbox for Matlab + + + + + + + + + +

Piotr's Image & Video Toolbox for Matlab

+

Download & Description

+

Matlab Directories

+ + + +
Generated by m2html © 2003
+ + \ No newline at end of file diff --git a/external/matrix2latex.m b/external/matrix2latex.m new file mode 100644 index 00000000..ba736fbd --- /dev/null +++ b/external/matrix2latex.m @@ -0,0 +1,156 @@ +function matrix2latex(matrix, filename, varargin) + +% function: matrix2latex(...) +% Author: M. Koehler +% Contact: koehler@in.tum.de +% Version: 1.1 +% Date: May 09, 2004 + +% This software is published under the GNU GPL, by the free software +% foundation. For further reading see: http://www.gnu.org/licenses/licenses.html#GPL + +% Usage: +% matrix2late(matrix, filename, varargs) +% where +% - matrix is a 2 dimensional numerical or cell array +% - filename is a valid filename, in which the resulting latex code will +% be stored +% - varargs is one ore more of the following (denominator, value) combinations +% + 'rowLabels', array -> Can be used to label the rows of the +% resulting latex table +% + 'columnLabels', array -> Can be used to label the columns of the +% resulting latex table +% + 'alignment', 'value' -> Can be used to specify the alginment of +% the table within the latex document. Valid arguments are: 'l', 'c', +% and 'r' for left, center, and right, respectively +% + 'format', 'value' -> Can be used to format the input data. 'value' +% has to be a valid format string, similar to the ones used in +% fprintf('format', value); +% + 'size', 'value' -> One of latex' recognized font-sizes, e.g. tiny, +% HUGE, Large, large, LARGE, etc. +% +% Example input: +% matrix = [1.5 1.764; 3.523 0.2]; +% rowLabels = {'row 1', 'row 2'}; +% columnLabels = {'col 1', 'col 2'}; +% matrix2latex(matrix, 'out.tex', 'rowLabels', rowLabels, 'columnLabels', columnLabels, 'alignment', 'c', 'format', '%-6.2f', 'size', 'tiny'); +% +% The resulting latex file can be included into any latex document by: +% /input{out.tex} +% +% Enjoy life!!! + + rowLabels = []; + colLabels = []; + alignment = 'l'; + format = []; + textsize = []; + if (rem(nargin,2) == 1 || nargin < 2) + error('matrix2latex: ', 'Incorrect number of arguments to %s.', mfilename); + end + + okargs = {'rowlabels','columnlabels', 'alignment', 'format', 'size'}; + for j=1:2:(nargin-2) + pname = varargin{j}; + pval = varargin{j+1}; + k = strmatch(lower(pname), okargs); + if isempty(k) + error('matrix2latex: ', 'Unknown parameter name: %s.', pname); + elseif length(k)>1 + error('matrix2latex: ', 'Ambiguous parameter name: %s.', pname); + else + switch(k) + case 1 % rowlabels + rowLabels = pval; + if isnumeric(rowLabels) + rowLabels = cellstr(num2str(rowLabels(:))); + end + case 2 % column labels + colLabels = pval; + if isnumeric(colLabels) + colLabels = cellstr(num2str(colLabels(:))); + end + case 3 % alignment + alignment = lower(pval); + if alignment == 'right' + alignment = 'r'; + end + if alignment == 'left' + alignment = 'l'; + end + if alignment == 'center' + alignment = 'c'; + end + if alignment ~= 'l' && alignment ~= 'c' && alignment ~= 'r' + alignment = 'l'; + warning('matrix2latex: ', 'Unkown alignment. (Set it to \''left\''.)'); + end + case 4 % format + format = lower(pval); + case 5 % format + textsize = pval; + end + end + end + + fid = fopen(filename, 'w'); + + width = size(matrix, 2); + height = size(matrix, 1); + + if isnumeric(matrix) + matrix = num2cell(matrix); + for h=1:height + for w=1:width + if(~isempty(format)) + matrix{h, w} = num2str(matrix{h, w}, format); + else + matrix{h, w} = num2str(matrix{h, w}); + end + end + end + end + + if(~isempty(textsize)) + fprintf(fid, '\\begin{%s}', textsize); + end + + fprintf(fid, '\\begin{tabular}{|'); + + if(~isempty(rowLabels)) + fprintf(fid, 'l|'); + end + for i=1:width + fprintf(fid, '%c|', alignment); + end + fprintf(fid, '}\r\n'); + + fprintf(fid, '\\hline\r\n'); + + if(~isempty(colLabels)) + if(~isempty(rowLabels)) + fprintf(fid, '&'); + end + for w=1:width-1 + fprintf(fid, '\\textbf{%s}&', colLabels{w}); + end + fprintf(fid, '\\textbf{%s}\\\\\\hline\r\n', colLabels{width}); + end + + for h=1:height + if(~isempty(rowLabels)) + fprintf(fid, '\\textbf{%s}&', rowLabels{h}); + end + for w=1:width-1 + fprintf(fid, '%s&', matrix{h, w}); + end + fprintf(fid, '%s\\\\\\hline\r\n', matrix{h, width}); + end + + fprintf(fid, '\\end{tabular}\r\n'); + + if(~isempty(textsize)) + fprintf(fid, '\\end{%s}', textsize); + end + + fclose(fid); \ No newline at end of file diff --git a/external/svm/Contents.m b/external/svm/Contents.m new file mode 100644 index 00000000..52963c33 --- /dev/null +++ b/external/svm/Contents.m @@ -0,0 +1,55 @@ +% Support Vector Machine toolbox +% Version 2.51, January 2002 +% +% SVM functions: +% svm - create a support vector machine classifier +% svmfwd - forward propagation through svm +% svmkernel - compute svm kernel function +% svmtrain - train a svm using decomposition algorithm +% svmstat - svm statistics +% svmcv - simple parameter selection via cross validation +% +% Extension to multi class case via error correcting output codes (ECOC) +% ecoc - create a ECOC wrapper +% ecocload - load code matrix from archive ecoc-codes.tar.gz +% ecoctrain - train ECOC classifier +% ecocfwd - forward propagation through ECOC classifier +% +% Data files: +% ecoc-codes.tar.gz - Tom Dietterich's collection of code matrices +% +% Files for PRLOQO code: +% loqo.c (C) by Steve Gunn +% pr_loqo.c (C) by Alex Smola +% pr_loqo.h (C) by Alex Smola +% +% Demo programs: +% demsvm1 - demonstrate basic support vector machine classification +% demsvm2 - demonstrate advanced support vector machine features +% demsvm3 - sample code for parameter selection via cross validation +% demecoc1 - solving a simple multi-class problem with SVMs +% +% Copyright (c) Anton Schwaighofer (2002) +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +% +% $Revision: 1.10 $ $Date: 2002/01/09 12:12:23 $ +% +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License +% as published by the Free Software Foundation; either version 2 +% of the License, or (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +% + diff --git a/external/svm/License.txt b/external/svm/License.txt new file mode 100644 index 00000000..45645b4b --- /dev/null +++ b/external/svm/License.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/external/svm/Readme.txt b/external/svm/Readme.txt new file mode 100644 index 00000000..1a3a5ae9 --- /dev/null +++ b/external/svm/Readme.txt @@ -0,0 +1,80 @@ + +Support Vector Machine toolbox for Matlab +Version 2.51, January 2002 + + +Contents.m contains a brief description of all parts of this toolbox. + +Main features are: + +- Except for the QP solver, all parts are written in plain Matlab. This + guarantees for easy modification. Special kinds of kernels that require + much computation (such as the Fisher kernel, which is based on a model of + the data) can easily be incorporated. + +- Extension to multi-class problems via error correcting output codes is + included. + +- Unless many other SVM toolboxes, this one can handle SVMs with 1norm + or 2norm of the slack variables. + +- For both cases, a decomposition algorithm is implemented for the training + routine, together with efficient working set selection strategies. + The training algorithm uses many of the ideas proposed by Thorsten + Joachims for his SVMlight. It thus should exhibit a scaling behaviour that + is comparable to SVMlight. + + + +This toolbox optionally makes use of a Matlab wrapper for an interior point +code in LOQO style (Matlab wrapper by Steve Gunn, LOQO code by Alex Smola). +To compile the wrapper, run + mex loqo.c pr_loqo.c +Make sure you have turned on the compiler optimizations in mexopts.sh +The LOQO code can be retrieved from + http://www.kernel-machines.org/code/prloqo.tar.gz +The wrapper comes directly from Steve Gunn. + + +Copyright (c) Anton Schwaighofer (2001) +mailto:anton.schwaighofer@gmx.net + +This program is released unter the GNU General Public License. +See License.txt for details. + +Changes in version 2.51: +- fixed bug in SVMTRAIN that prevented correct initialisation with + NET.recompute==Inf + +Changes in version 2.5: +- Handling of multi-class problems with ECOC +- NET.recompute is set to Inf by default, thus all training is done + incrementally by default. +- Handling the case of all training examples being -1 or +1 correctly + +Changes in version 2.4: +- Better selection of the initial working set +- Added workaround for a (rare) Matlab quadprog bug with badly conditioned + matrices +- There is now a new kernel function 'rbffull' where a full matrix + ("covariance matrix") C may be put into an RBF kernel: + K(X1,X2) = exp(-(X1-X2)'*C*(X1-X2)) + +Changes in version 2.3: +- slightly more compact debug output + +Changes in version 2.2: +- New default values for parameter qpsize that make the whole toolbox + *much* faster +- Workaround for a Matlab bug with sparse matrices +- Changed the definition of the RBF-Kernel: from |x-y|^2/(2*nin*param^2) + to |x-y|^2/(nin*param). This means that all parameter settings for old + versions need to be updated! +- A few minor things I can't remember + +Changes in version 2.1: +Fixed a nasty bug at the KKT check + +Changes in version 2.0: +All relevant routines have been updated to allow the use of a SVM with +2norm of the slack variables (NET.use2norm==1). diff --git a/external/svm/code14-11 b/external/svm/code14-11 new file mode 100644 index 00000000..9a558bc7 --- /dev/null +++ b/external/svm/code14-11 @@ -0,0 +1,11 @@ +0 0 0 0 1 1 1 0 1 1 0 0 1 0 +1 1 1 0 0 0 1 0 0 1 1 0 1 0 +0 1 1 1 1 0 0 0 1 0 0 1 1 0 +1 0 0 1 0 1 0 0 0 0 1 1 1 0 +1 0 1 1 0 0 1 0 1 0 0 0 0 1 +0 1 0 1 1 1 1 0 0 0 1 0 0 1 +1 1 0 0 0 1 0 0 1 1 0 1 0 1 +0 0 1 0 1 0 0 0 0 1 1 1 0 1 +0 1 1 0 0 1 0 1 0 0 0 0 1 1 +1 0 0 0 1 0 0 1 1 0 1 0 1 1 +0 0 0 1 0 0 1 1 0 1 0 1 1 1 diff --git a/external/svm/consist.m b/external/svm/consist.m new file mode 100644 index 00000000..5c7f3809 --- /dev/null +++ b/external/svm/consist.m @@ -0,0 +1,87 @@ +function errstring = consist(model, type, inputs, outputs) +%CONSIST Check that arguments are consistent. +% +% Description +% +% ERRSTRING = CONSIST(NET, TYPE, INPUTS) takes a network data structure +% NET together with a string TYPE containing the correct network type, +% a matrix INPUTS of input vectors and checks that the data structure +% is consistent with the other arguments. An empty string is returned +% if there is no error, otherwise the string contains the relevant +% error message. If the TYPE string is empty, then any type of network +% is allowed. +% +% ERRSTRING = CONSIST(NET, TYPE) takes a network data structure NET +% together with a string TYPE containing the correct network type, and +% checks that the two types match. +% +% ERRSTRING = CONSIST(NET, TYPE, INPUTS, OUTPUTS) also checks that the +% network has the correct number of outputs, and that the number of +% patterns in the INPUTS and OUTPUTS is the same. The fields in NET +% that are used are +% type +% nin +% nout +% +% See also +% MLPFWD +% + +% Copyright (c) Ian T Nabney (1996-9) + +% Assume that all is OK as default +errstring = ''; + +% If type string is not empty +if ~isempty(type) + % First check that model has type field + if ~isfield(model, 'type') + errstring = 'Data structure does not contain type field'; + return + end + % Check that model has the correct type + s = model.type; + if ~strcmp(s, type) + errstring = ['Model type ''', s, ''' does not match expected type ''',... + type, '''']; + return + end +end + +% If inputs are present, check that they have correct dimension +if nargin > 2 + if ~isfield(model, 'nin') + errstring = 'Data structure does not contain nin field'; + return + end + + data_nin = size(inputs, 2); + if model.nin ~= data_nin + errstring = ['Dimension of inputs ', num2str(data_nin), ... + ' does not match number of model inputs ', num2str(model.nin)]; + return + end +end + +% If outputs are present, check that they have correct dimension +if nargin > 3 + if ~isfield(model, 'nout') + errstring = 'Data structure does not conatin nout field'; + return + end + data_nout = size(outputs, 2); + if model.nout ~= data_nout + errstring = ['Dimension of outputs ', num2str(data_nout), ... + ' does not match number of model outputs ', num2str(model.nout)]; + return + end + +% Also check that number of data points in inputs and outputs is the same + num_in = size(inputs, 1); + num_out = size(outputs, 1); + if num_in ~= num_out + errstring = ['Number of input patterns ', num2str(num_in), ... + ' does not match number of output patterns ', num2str(num_out)]; + return + end +end diff --git a/external/svm/demecoc1.m b/external/svm/demecoc1.m new file mode 100644 index 00000000..4da58fc5 --- /dev/null +++ b/external/svm/demecoc1.m @@ -0,0 +1,46 @@ +function demecoc1() +% DEMECOC1 - Demo program for error correcting output codes +% +% DEMECOC1 +% Show a simple multi class problem (VOWEL-CONTEXT from UCI archive) +% with ECOC and Support Vector Machine as the base learner. +% +% See also ECOC, ECOCLOAD, ECOCTRAIN, ECOCFWD +% + +% +% Copyright (c) by Anton Schwaighofer (2001) +% $Revision: 1.2 $ $Date: 2002/01/07 20:52:34 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +load('demecoc1.mat', 'Xtrain', 'Ytrain', 'Xtest', 'Ytest'); +[N, d] = size(Xtrain); + +% 11 class problem, solve with 14 bit code +net = ecoc(11,14); +net.verbosity = 2; +% Load code matrix from given file +net = ecocload(net, 'code14-11'); + +% For a 12 class problem with 15 bit code, Dietterichs archive provides a +% code. This code can be loaded by +% net = ecoc(12, 15); +% net.codepath = '/some/path/to/' where ecoc-codes.tar.gz resides +% net = ecocload(net); + +% Initialise an instance of the base learning algorithm +learner = svm(d, 'rbf', 0.5, 1); +learner.recompute = Inf; +% Train the individual bit learners, all starting out from the parameter +% setting in the SVM structure LEARNER +warning off; +fprintf('Starting the training.\n'); +fprintf('This may take a while, since we need to train one SVM per bit ...\n'); +net = ecoctrain(net, learner, Xtrain, Ytrain+1); +pred = ecocfwd(net, Xtest); +fprintf('Classification result on the test set: %i out of %i correct\n', ... + length(find((Ytest+1)==pred)), length(Ytest)); + diff --git a/external/svm/demecoc1.mat b/external/svm/demecoc1.mat new file mode 100644 index 0000000000000000000000000000000000000000..1976e93332e197dcb156d99346ef6c8888e7db89 GIT binary patch literal 89198 zcmeFad61>)Ro;1XxtTZjn^irsWHGqy84oxxi!?(pBge$~BtRD0Xt0718V?~Hf&m6C zh(^d`A%u+t0tDKur4d3BLc8Q{_1^04^L1BMS65Yc*S>GL@5{ZpZJT6j_y(`Q7(>-?KdDIm`QoSH9`>uYA>=KmH>>cIO*j`KBNK)nEV3U-_4J-u0Wm zeD|-u^WATM#hw4=XJ7yFe|hImzWY~x`R-qN+nw)x$1Co9!#m$`=WBoY9e3XO6L-Gs zCtmTty!;g}d-DsScXU>|`nqrb`Sw2igJqzQzXu;_$kYFq{Pi^c zy(xnoZ{C-`u2Sj24>Z1a`@h>eaC--C@4)RHxV;0nci{F8{DXGDYVqT@zuw-5<__GJ zgWGa&TMlmP!EHNm+YbD<*nzyS`}@9CdD;Io-T1>_efNj^f1y1utv>x1|Mmyh^48Zq z^VP+_`flF->;wPXo2&mW?>II7)>nS`C-R=F|E%$+SLFkL^h2$^Kl51LKm4!1bI1QP z+<3r`{^P%X@;%4$O5>+q_srKC-)R2c8_wok#V@`-Z)yBk<7e~McYOLIKYR0EEWRRrag5{`Kw2-~7|YgSD3C^JhPp_dfZa=2qsFU;1%- z-~7k&)>w02ci!6k;L6ML&YyX#@o&GER~idwd`jL^9L>MatIbdN=`ZEI&HX&H)Oa+X z*?zdWRU3IPKhUK||3>q(Pv@3 z9^Y#0F_DlIdL$JQO`1yQrFa+U1^D&>jC$BUQ zzp|?)qI0m-q}#G#vA5? z=t}8Vi~oG5*stI9J%p~@6s4d1RNmS=jvs2xD-!epw60pb_q)EFALM8&C{eX3K?mNc zE%dGCi+%bdc`1%G?`W#j_GI2RUC2@rjRD@g`lrn^{^$9@!V3IwUMYmP>dSFNUgzsh z$gFRp7HtiEYrJ~iq&pk`(simj0%leD;C77quV! zy{3Ad$lJqU_*!G58b9LoLJ5D!R|>QFAAB9*ZQ(`z78bW1DeUX!(0b9ILH^#(rulN{ z$#3}@0=M3jumAi9z7gA=x3c{RV&2xYpYPvlm>kZnhp&U2XM3Tk|H3yozs=aJ^wK4r zS3AGhhH>lCTG8>oZnmQrS#QHQY;bIA&o%#h-fuMp=^uX~FNHD6+cAc1O%?siujE}A z^j0kTpybVe2LM(dG-LAsa z{6JpC7`CCix58NY`u|+~=R19 zlrZ=0>_{u-yAz%1)dRcYu<}7p6-mxZDECGPlJ8=!N~}ocvK1HBfzAmFbcLkm2mZT4 zD)J7ts#5r|19=5M)E?f~H(6*$)1TG9k+&6I`>lB|FFX($kXP>t%#o~IXMr_dlXu~4 zyRbUtID6m3fpp;J+c>Kp&T^pe%|De_UsIU5yoy!q1Yz`G61tGFvK&;?`u4sy@6=AC zM|lrtSpBKyR&C@}-dKjc!jAV~uPX?72M%geW{~G}aHPG!lPWJ#{l#Jh`CzD7-iea* zb@Pk+Xe+FYZ#Gd_)79{V3a`}HjfJktmsJ0-KuP)FPI2sc2cNNTP7?0GPj5@W_>8{p z^l%_dHAFVAzA+rv0hF(dP3`MO1p7IGa(LFf4N>Wo%$CFYPFLJyt-kL5Yhwk zPzmcHJwjq-SwRlBQ--67w%)hUcoOibiZ2|%0vzD`&9rjkzs3*pQN4UZC;!k6!WD*; zJa_5zc**`S3Hbr!T~M%>fA7ILSJ z%p32P_apW_`aW;mfd%SpLV};YnV0!F>2a0M@8`V^A^@E@<9<%J2X*TtcBmvs+lg!H z)Cwfez>a=o?BJioIp>{{#x7K}y%{6C?Japrcyr%HliI>#<*j)6GSDrF^8i5pAjqQ~ zyWWF;D5Ih!c`Dq00FK|!TXFYg7BcvMHs9rU^XiWTthfV=CyDK4vpNyb)^PW}*Nmf9 z59RH6$~Gjt1L+z>d8%&@YIXut?qH_}KOSl@kc<l;9g2QVmu zL(Q{4njiRbVG;5>P}1tR3mco?@qaf#*jz62KS*?;=k{Vyt4+yy_q}=bRiQHn`np5= z59r04q{AyeoDar^*p;xDb~6x(&Bf8$PPh--i<2_~zpOoQZPtnsWTo&PwiB{q+oAP# zF=WNAhMBR2fTy+-P9$rIH_u8Tgjs9+e%2@_YW`z_FwC|Yu0!uGE1+c78vB>E6!A$%))u;ID?w%0t>)ua57`Ev zQvktFf5bl@?!d0IPn+yRTWFfCuxTVP!FNZDq)cu zYmO&m9jv`Q@Nn9Vlc7)k$APl!0#dvYrtXjR;XBg1ZHH9*_d*Tr zUajmZ;=U1^lXbCK8-d!g&hRN&Z$PWY%Hy1~O5j%8iu3gI0hR38@X}Vi=@(DfM*Mr$ z6>z|If~v~8Sn&X-0D0K>02F2`j?qtr=G#z&Yc?GUY&&5pr4Y6kHacqy#b`W8@3rey;K0aK*OEv9^UB zx7D!UelDz|UBPNhht;u-ICg_hur2;h44+l_x!u5ES!-Y!TMvQvGgzZ@=;Aomihnm2 zXd7sb%zaltd_!)tmH@uC5&q9FBP3@+nkgB3Y&*cGP2zs0 zW5fMACw2;}H_!X&eOrSBk(IM;^l&w>oUMlb*&N}KlfW)Rlc5NGTxz2*%iL8eCT@ABuwLnI;gm%rKb)ykk z*b{-#Y!ZLGu7f}Vm-zh&{Ps%3k2V|F(Uy?V`G`P#l=uG%0y&A{Tf_fvpo`N8$`~8D z#DPu(=Cn0*m-YJ!2X=vfzZ!yV^WkRXMr{*!*Ba)ip&9s>as)P62Md^wjr1kV&rKwI z2;H9tKa{i~`2Dt!^lShl(h&>K$^kuXK0-uaU}H|lLD~=+FpWoOVFTB~AZG;L*+78s ztUWwJ){2Ly#oxVn-0TPKK}?69i>b(3@VBdI224pd5TR+-E`SB`YkKe~8*mN}QNx|i zg-T{67P5r*?CWL+NJ?a7KCu$vht&dW`bZ!r8%0z(GFyl^E7K0wLiZX+hD+(|4uhSw zhY)6jt}xeUId;)%&bVJr9?TkbA;yG_PYx97V zDfVJjo7WPXA~>57uxFL9{8?LwZ{w5jW*Z^Dei%KRz|hVj$7@*flytJ~c*(2`lwgfn z3l6mhptc^H;7?&uMgpy9`wdn)Yh&%U0g^3)HTt^4DP*NkjmDy}&TH`v{}AY87z{p- zOs|LE%i1`H6;8B67yudF!F%*00V`nDC$yv?lyHiFSVw!?F#mNxNg0pb*Ud|=@#F!7 zb_Gn}qd}ti;~|7L9_Ns?U>`a{nzPQ3dcpX{yT_4dt%!XGJeRG6-1|^ibbl1fJ;wR8 z$RMB}oosU(pU{g?wh*YahoMLS>r#B6{|%coj?lJ*#mzd{gLXC@+M==Ihyb#dKX}W*Dr>=VxUW zT#~ZInKc$1>YBBn=P*XLM`(8$r(0Ow`H$IYJve+!Ru0|CN`y-70kg7RgrS8KXh+v} z(5)6=*%m%+2H(1@BgZ7~g~`t_WZ8j_7bqvI{)Zyjmkn~_fQ3xHrUe&J2V^WG#jW7Z zy#OOw7m{+|)rHf~3e58Lo$SD$6-S+sZq8cJ=v$~=9b2*-zCUZl0_@@9D!7aTA)#3{ zTtRj)LglQ)dP;IVfWjp})3QR(KwGv=kkJ|Ho(*1V{@_wp1r{H~C*K0zlDf1tp1Z>S z*TcqTtx_eSKC%VbVAzkWS}WA|x3W7x4Lf*yV4jgAwI%E^urO=EcWr|PI(d`9fkG#; zYDiReFt};E6_J9EV}N`jESD2)JFv=U@igd+Uq#kEj?x!!7;Ai8iY@oi5J`D!-$G|L zLPWfVJD7~4@C&$uoZnyO_t!#qofq~oEV4WxN8}s$T8`3Z2q-QCvmWE~m%>h_6y_2~ z;uC>Cy&l%Z(HV~@|5d&exYg&v*!VS!$|3A*deCP0Twe+E=hK0sd`XshJA!8i!TJ(g zvdAZoiler#2V_Zk+wCCHd^t|jXM$t$B{m(nI*ouK}F^!(I!V;tPDv8ZPB|n2JmM`#3J< zd>9OS1`GZt5gOY$49+ZvP-D-v-qi>iT)f4Vu=GAeaPlM^*d;~M_ak<16{NVy(X*002G+Mn}eh`YQkyjEV~$?FJu z4V5|(R@Mozox^tt!+5x5A63Yx*fDPldz!=V`zB8cYxu4&`!NLmayS70CaQ8YxHlh; zOo-0eXGj2mVe%5zVM{ugo_r{d!>?*l52t-8HnNe<2lV-KXwiIt!yH)PdtqW!2$GcM zX_Razgx~d1r?4PHfouFocx7J*ZF{QL9Epv{zt_h?Y5X+ryAW{3x5C>wUfFAb4jd&;f!aMN zEvDIcUppF3%wGs8um>Ulby>Tm*cYEiGe!t3uY^fA)@iKA7DD1J6!o?KY^=xRTDC*p zy&e>a*U-QrVxUPh_$;nY)Jw7frjx@y+fkmhiI@`0JDi3qM4jcyX9B00!if1m^>!Uj zLuONAzrju~Apr{!D0*1kip@sIY!@)MGkl#REWE_0t*@hzOPJr9oS}@& zbi7c?IZTF~HJqSbVr#`fp9&*mr`XC%kTKYGKN|kU&q~`yaUAu4?nd0{av0LRr$WK) zY}jX;2^qFi=*k&n^$M~*&d(E4+ac`w^C8fIB42BW(R5Za~TeSMS#%;PVMY0Y_)$LaIXu^dI0n*8Be*3Q zhqIW_Yh+u#46AdPuM+N2j5x;4CK07^Jn;~o_^EJnej$|4&#=)?gb3NQcz6YGwFo&p ze*7&dXnd9+PsVIMLJc1eqw2F*^a-4goQaUf63?AMB_{Cr@TD%F;xo8s=7&Vo0V7x}*;n2Rn_j;%UrNaiH%x<~0FE%=b(LUH-X%?tTNaGlnR_ zq5Bl(b2y-U+L3FR*+oQBJ2V%{YeKjqe9lNv2R;okImONmA#t-H_)9211gDSVj%LAv zUk{P@kwEA^iLrygaS^pQ*@tTpeEJ0Mr~O%AT{A(XI!Oti;klS~C+znZBx!MwHi0|+ z9=>0}@eQ6UcY6^VGcJ%ULEt>(ZWYPsV6UMW$58QMe*Y5g`$Awvze&VG2Ej)OrOpsx zoDs;D&6vYT9*4`B;YDC%`~^h)9LQ}vynv5^H_ox4r$bfj1ekQ0gEdCF8>PBS2K3k%@dC(b+uCJ4;EHFrQ02 z7!2U`U@m+brMLzLIveKLR$(TFSh)NK*#xgAG>K<%m_CO(^!e~q4iD<1c)}HY_%(Kq zkjp_g`>`LVIEI++29xMhu_7M_%@JtZGA?`=^A+aqfG_f|kHEIHO z!ZsMT$TlISCP@mz9+7H)ALB%Jzy*3^L0qNHD0xq1G82INCBz?*u+8wUHVG)d z3Ld%?NYl@=lNZA~*?r)Z2Qg0YKvF+DAC|>n0{nz_B%ruBW4{2-dJMIY_dYM;>Qy{^SP;UP=hUy${PcQTwVX|yGkUWJ7JjXE6soseG4};LNHIVXpyohbWDQ%!j z1X-z`YK<61A;G!WK%3VKEWz-s!>X?mb8LqtwGHwXR9VL+{URow{36P^5I(||;E;&eZ9P_`IuJeA_6TNZaj{jlOiDiz z(9UoTM$3&#UraglTbM)m9NR{DH!upz_&UJ6i5XbN{H%}_yT$LV!EwQ5CG)rmR9z*0 zULhHF5@<%0XaR_-elnuYl#9F{PHu+xx6;}F%%YN72 z3*IDxGwWhy-vmRcv`p(8Qj~fct1Sqr zaQHF@ev$)Ok6_7mp#n$Qpb<7e^*^IP0XEdm1~xZEo97`mF5nNTl`=qz$!m-PN~8)C zV0Da)oen5zM2~insQ4yd*Hl!ADhgN{;kaob8vufJ956)!en{YEI8?%kw(KNm{}ATy zTmVNaKIlb%LJTtbSn`Y#}tij<46*$lSrD_zOga za1e=D{3z-Pi);&UFIxm^dV%YK9SoOjUkEzQ?}5{q!_1K3u?b-6A}(;MbbBSNzq*!f2}(ND$$T_LSpBB8O3gqkHDvW7j{ zVc}9&Hr5XTGsP4uEfeUs-AEQDmQE3$)dk$Qv8=^TH;Q9H_>L~vbwI#z1#0j}wgmD$ zic4EW^Op!xRc*Y2g&HP^RvFevL#!x1PeJl|o__^X z4Q%pdDAfsML_!VgU`v>C;Fdv}+bM!(WuiP1zi$*!^;%c~pOmF~Dr~kFLio>4C$&={ z+X_y$2w`6NVZRtLwE-**I>8q}w$rTqG)edG#jD#2F#`drsbG(sn#&ocHWUxrNV!l=~F_aa?HYIrT;NC9VrXy|L!y4(Wztu}eASkz_;ii1 zvUs8VKbaVuCqgUic?lOgK%IflVd<4l&GGlPi#BXaTL3Kj0q3ynY&c+_0gNkyA@)FR zxrVeQD0&O9n||O~)}m8^fc8ZwooS92deP^?>RV2(Vi$2+M_i~3w#%>$3cQQ}#>Yu} z&B3#(U^0yQ>#ac9pS{OO``8MHwwgTlII-f>?9M0*ry>u9EKZ4`i{kTVi9V0OQ^}R1 z{V7>2LSqx1-QyE)X$?M3FmSJ+nh0(Pe?NtHoFG0_PxmHq+SUV23-v}<3+`^brjL;T z_zJ%_AHE?i9VW{uUh+j=UZrmoNc(pDUasP&si31%je_W1Z3*n5EBiSI{8^%a1LDAU zu=KtOmQ;lAA+x>!HTO(daHSP}h&1Xff(66iOKilg5b3oMeb1?}K z8&rHIz_w2jf35)Xw*w>RE%4j&(%RrU!OJ4gzX5}Q-F4aRIyCEPhyrCs>d1z8Hy^e~) znmNwgV7a_Fu=SI!aOp{Qm^xS|r=`kaU*g19VdAHuHpnoTV9W!-HTff`2pXR`zbj-Izy^Lp*db29luT4umNG2l_>>EigitW-$~-7qg0XO-7AL#v7bIa2|B_ru zj%d*h*z6_3&SZ}$BzB3=7@{f>o<*gWvAH!wm=-19giD%DW=I7zb6|3LvT-O}=s(A4 z`||#8hWk!c3fu77H4=4GnCBVbhK%bt1l?6KwEAS#G|?{RHB9XmeAF^OKL&6TK01Tl z1H3zZc&UUFvL>TMXG;kAC3ZxfnV!*y*%6$Z%wiNV&uVBKU5qvhFs2by3gKgOD6D<)BY-q)H+w+Yd$Q%Mf`N!03~l%>5ia*?ZG-FA#Y@gXj!Jpz089 zE+0oLh2(3gvevSSy7D-gHmV@a#dg|gNX*_^NW8~$gZn=K}A}sldU15N?0l+5mSeGwsAroC`pG|+pk(xT3&fWSqpIvS1F{s z9PrAhW=%3EJa`RRu0yn`j6o%z(hY%!7l?JPanfXDZG;m(j}B1}={hJxRP~k)S>y`z zFX9Jo2HrLNfr*N|B4dP)6#3$uu<)0!fd(X-CgF$IGSNZOY6awqG9|Ox0e$j1B7>Dl z2@?t}jOI+M2Y@tXmY&8#u7czfUZYpURaJX75U5?jMc)t2zNyH&j!;v^CB8h3_nE+# zuK~a?C&_RtM7s;ZP3g>7;7{3Ea#QrFrt)H1xqUs%j30&=6W=s~P=5$Bu>)^k4?AlD zT&k?t0{1BP0azuP8oJqrh*4yIZt?#02qmnrVhw)(D(j+k-iHI4yAs<*JZLl6%L^=2 z3*HQ(!6+j$u}6YeTcW?dNH9=GJw>b&9LP-ge`H5aLHbOR5rM-^E0(#DM?&rW7>RCa z6Q0H>vT@a(oPmoz&dFm&97fU=L<~bBJ;m2Cw4Mx%i6o+^$in0I?z{RFeM}>aE``1k zw%V>?($%(i1h)2y0?J9e;ShW>cqL^-RqsrI<^-6j6Lg43^&mN%?@tQKn|u2I&$i zb!{pzw9SUCOQRGNz--Z##_%dzgD6q#Zo49!HnIK`!&wc@r%l9ED>6b*yb&RrZIX{! zfvwmg6k~vxDHE!40fKj%VI@xl_BAYnZ6p8cHeQoLZSetnVx-r3XX^1ygz_+ZC~FRp zt8O)0L$%l82DcDP1|!-!Sq|b7qX)=HFc}RpMm3gg21qt$0oqDvjQXY3bY|;ls&;}X zzzRdrXp5bSsw^80S+s2c!v?h1vR+)wx7g7s)Z|mxDkwq2c*~KR5D5swsL8VVV8m^O z8kbdaff{EZ{ZzWD2*%%V)@fjnd$VDZ8CoCww5gejq_r(T6l#2e00MkS%0-Gd(I5z= z>zAYiq^mX%NeZ%3&QYdJPUu;(L`6(}_;UtdZFSObN^L0nqxu5PNH~WxQ%h~mz6Wr8 zse_qK$y`_qTOv!P48<0rKSRK%N)@6idx~)Et1@4HFUnX$6eODPE?El}bq}+lWQ|($ zWm!%6WRsy2m{PVyIf&Iz!>knty+`6IwEI;FbP-$|Zo>WxLAdhOA7$mKes3w5j;uA{ zukEt*4ZgyT+Ih4Pb~7OZG4x5u!oWCHTPHz27vX@Nh9Z(3dx#jkurAL% zZ<@4mCZLrO396~q=&-a+v=i3D&XQ=Kz|TUJSvo|k5tt;nxfkK#n~Iz*R;0G6v`{TL{}^8v*VNnjzKp%j7;xwEkW6iO9yD!9a$3z1mhHD7O9f zwoNR=3RMO&Sqjpm8G6#kc_YPIV_F#+DfhQUc)k)2+yLJGEyC{mDAeJwoH|8=*hp?& zwQZDK8Dmon-q6%D3CMAU-Be85eF%+e;;DQ#PRyoQ_jd4gDXk=nsfHebx(BcvTEEsk z7j%U|CnTq+ksB*=e)>Rh@`9z{kW`wk7pUXgR!OMM2A^S@cw0KfQl)`VA_wH6lCK7S zRxZGx?Cl1wMx&gzq9n{%m!qAjvO&SA7$_)k)$`~;>@wvdq+`-h6ve1l!gVB~Nj_Nh zLMISRfl!kVkZ&R=HB}%GMEbD6sw#Yx<`tC;rKJWoqj=rmS4Dx@2IRgHOEVBD`uS_Y z?U@QaKL@^kjHviBcxnRsb3YNx1`!V3tF9XK8z}2#R6~P(L|e#d>A7<-&BU6fg4t#4 zqL8FiifTs_#r`dTlG(K)myJ4Vx%0Vy;fnwljhksRUINs{OSB}Ak)hKU+s z-*MKq0J47){5u)hJsZRCY+>Am*uNSafn8*u3fAd$M{OFEC=;RhO#2{~c>*Y~&VG=z zw{HeJZP(aeffZ%_)HAByJgs+x^@*jCAI3TCk2M0ki1`%lCApKP7q8tIvUN%U#sV;# zRE9kT8Ge(ExCByAx5fnybO_VJw77(YWV1hieA=iS71kG--P z>3+?MAoS_Ku*bvK7_D_;Mm0&qDeJfA3GAu5@Mi!Xln9u(8mL}71W?fc0QHxtPK`!5 z6V_9`wOSQ*@S0PV(hMg2sDVi;3`S&}iESqDd>sx$$?(+iJb|Ovk`)!-fc<99nGfOq z6djA#l95&Y*(kEDkpi+2*d#w6fk*0y&`bk6j1kpdVuX!fuo}vT&?Ps*5HhD~QQgF% z-R%NpQ{)9L;o_?ls8Q=+va$j$dZ3EVA#*)hb>i$NK&9jOu_;)c1%z2bcei*k_$M(M zqws1u%0SE4{zBD|3NLShpPCLPGofCpt0b$`8Z07W3ZjCN98*!c>Ppp!s$lvkVYxQq z670G%tV-wzRx5RNf{j(7PU_YkiZ^ttjLd#QG}q3YjJQd{zS5yoS_Z>}zLLpNPiFpfdp^CosujHnFsC4v^R1g5cUyqT*X zq`p^(BfFrkpe#w9JhNm4R(xN1;< zghL&!g7?XDf%Z~?%3-Vps93H~v;ACo2%VXV#_5q!9lv^kQr?6%FejWy1Qa6qn1MIDDlcJegUnsu*}A7Ub#^ zP>H;nyw`){aPd{>gu2>om{gkRpcj6j@VH6xG~eLMC|?a-p?}b?26N`{U@35=8rhUT z7sn#q6UnS_YZ?9v&cqcE2Ps9<5BQ}+y@1+MrD1f;Fp_FQK_GXvQgELn%SAg<6|H+itCI)Ge*&!$xA4o zMmUl_@Nx*4sxnjayM|4RR8uFC;w}hLQ%+g9L=+PW;P_8hC5u{dsfseSQx1o5Hx$GK z1U2n|0uZ}FWet|ZH9b|P6@gE4B4q(7A28vTW06fs!>_NwA54=m6R^~JpCf$I#FQKF zDQv$nL&$_|&r#zfJfL=*S_rVKW(j<#Su>{KMFKxXS_s@_;)m4;D^eb+Ee#q{e2PU* z9Th0Hi7yu3Q&BxVKBnht3p-!{ zHW|p(Wy(cl3`OkZSUN*+O}>*FY14vlKwMzSjWM<~=3v(%YU2bx-8iM&;3k)&U_ z1J`sHC7ugyYz&-~`I7zLe_PF`!LpkytZL^Y@;u-&oWNIqE09KG%S0SrgkPaZ#%YI6 z0f?Xouj)mT?Kl5aM4XGL!_c@o8x(ts&~a&M4pE~ADzaNDJpFHY%5ACHQq8TJA*cFu z`7SX%nrnh-acR~9w1-#-O$${M3G+mfBrAlJ<_QGKm(#iAGNxZ6*iVX#%QwT+tb_ zKq?8LU&srHuzA&lA!#h}MZhr>cfyLe7So^}yAUQLRW~rm-_J(vpP%4CDl8cyQ6|c8 z94=ZYTC=1?h-t*qB4BkM_D02w;`WCDK}x`>O%c^dk*F$xHGf4^r$`%hfbExQ$jFO* zrlu}UMxzQcHLHqs7uh*a+QQVeCYF_wVp9%Jb)Uze-=WLZ=wzC*FRMzCpNZ|PaTH=} zanGjuPWApPz|q!ThW1xUv1vSnQijTk!o#E&p@}2Oz()b>m*K~CDT#2AI^Aa@q%jpA zdq~r(##sp0NVXNss~}hW3^>9xOiF>){bcT_jdC?rY1jgj@a!<_;Gmq!rPQds zNOBos(C?*En|xL3cAN4njh!rfEBL7?U*?28t_FOfOU+R@>8q)ok^{>L4InD^o7Q(VS`fYmjK4r!ta@G z1z3P`mT{*t-BQOOf!7fGqI}8{>r@q8N`=-boKQ8%Dv|H9zJ?>W{h<`3s{B(>YzwG_ z`ZqVUWI=aSNEbaU@$>3}rcuJ=9~2`pfXL`3GVbd%6*`G5q0`pXzOMNlt7K+mD_k*^ z3K~`^Z`mTZrCc5t6Bwn`sV#gH7M>22bivOD*lV5f@_IpJncBitZz$PRE^IV_V!G!g zSzncz&W1xu{p2g*;cYIWWm7*B#w-;WD_J>C(aWSNe{7K&4J~bgbm}Upl^L>Inr|Og z=}o2qlC!)T9ZLzNt9etkO`}NFD*i!fU@(da+h|Uc%=7o4pVdb|p>FaE(ABnrjHwV| zB-AQp^B5>)U=0fqe5s9-uAK{B!lnR$D&XYKrG3nxF+@0|bbA-ga|!flP?N#~hT)m| zX0J!3gu~bSbL8I@FDl>c!Q$Eq#ax?IS}4(B)9mOJahWJQ!B^FA(?g@`9uq3uK!((D zF+}`B;B6Bj0bV5a8gnhw0waU+O^AMIWidg2XYPf-1oM210mR0znAEPVRE@|`ab7BQ zz8}l8iVK8eGZpGj(Lt{jYH*P*Wn;F2u^*UDnh?O>R%k8VlyIa)BK{lFh4Va%Y7x3 zR`*nSB891oX5^`9g2Fl0Nu+O^*v)tGT#}8>*rGHz>iNPKzTH)QrCBhiq0XQ>OeJ?) zoR{L6S=tg7DJmkL>}qn-G!0QuDImL{0x~Lg)j|AG7EA%Ft5*J4fJP@obzuNRIED1$ z*2V~!Rzk(>J5UQ65UHs|;`Ag~;-utr!8#5Gu}PAi_+o{)HW8_QXIQxr5+`z6H7-mg zNY&%IP;LfeC`_O%vL=tImIE%!l}kK?W7ZH~%FJ|KoN3sdx+GMq0)|u(6BfWGaOX z$=IcGJ+(1w?s=X4xq>a0g245<&WS2}hu~4R#Wf6BHBxC^I9qj0h2Gv}a!RVY6DhCB z2?~BvahY26RTnu2d8rvGYJVit=gL|<2kA;mQ-u>Y92P9i#!DQ^BAO;QFOr87Nt}uz zVl_S=4HY+yu+(P{iAa;9n$mp%+p9ipB|&7M}htvrS( zVt~Dkgk@9Ll`geR19mMcmb za|Z4jPTZyO=K&j<0W6aQ>BmmM33-JQ7!AhVKFt{!bA)VpsE)`!xg4Y!I)WgU7k?(I382`jXaw=a#k%Vsq z#z;QSL)FrBOz{%a@CS=nt}lRb09&4hRR@pd>YCM^5Q6h+_mz)Q2fQ>r50?0^Cn zQG?7;5X0x|VY7TJXb7kB$PW=wVI%wnm>5x+)XbT(F=Ad+sBM8mEES^NOonpbUmx)A)I?lQz(BRsk8FK%6{Q6 zd{N`})b0p#pB6Op{z6F7Z8Dm3py5RKMOd7oB+VzFGeP6=G(f@?WliAGmSD=|@tEi3 zIp0?lIn~HV9RAC%>`&Prf#ZV#N;hn%WFQUJ!9HltakAK^N!mmUs-V<}?lhl9b5QHl>MAw=bZ-&osIk;j`CphF z{|q$hvB;q~VU(|h0d=Mqy9Q?IZW##bR28S%4ScOe#hQHjm++-DuKETjR)fSe(G6nC zuSCG=Wb162xLFg`v~DnnlaO_8KKAwSu#Qhp!&V}UeT@sfsti)*lxRTrH2Fy|33RiQ zV@j&2gtju~Du57yM?0Ud;DOgLHWyi+ZalaQcF|-JO??0eA;}|L4M3J9%NJ*T+@Egqw3n^R&(teqUpiRQ0KQ1f>tU369d3bioS= z9H$G<=UB%Yh-|HZCTpoMc#No9b4pZWF3hR1W*X$DdkvStuygFYu3%R*DwBR1J;rc3 z(V)u`(kttlYqAl7?bDI_auKA`XL{sPo<9{*1oiE}4;SW@zOPbKrQ$=e7n)L{fs;Z3 zigpzvXkHe)m)FAH_{xi$fB5}mZ`A)HItBt*JqkWS;fQ8(jG{jqr2BoI7uSXa{OMQQ zq$%u_)7G5{*MZtn92tmp6hSxIXgIbE_TvbM1d1p#(H}}ODi&~66RO-6K<5Cp)UiWW z-KlzXveK@4;-RYYK|WA+$m24mpGd$g<~1ph|jFt*ID@?nkFQRURRYqEy3@%A`+3!cZPGNto`O z5W%PGJdXzclt=JMz!Vpi?@vS5MR9DfDJavGd6YMJfkhf^hlIt+1nW*Hm1UAUc2UEa zlvI|g!ERLdIaf=k0($lTsN>2tKl&bg=Y>E`hOILtRa6-#^d?xEK#nLqwQLQ+smj@& zB`ZZ?aLOX7?u<}k9|%(^k$^Dlyy8-O2z;k-O#{Ew??DN=3uURGP8^j+_$wPB@1WU7 z_o`!317Jn_>kai_n#s}!K|wfmUaq@U#r?Qu>2m>=x*Y5xxIunFQ*EThs%3p&m=P;> zxG^iC2!IaxTmv9-EfSF3T zXz=xs2!lyKZRm0)6tGtz|v|V?JKgX_X%nNZ%U$-+s)6|od9<8~p)O6azsh&Vb zrfyR~Y)vjuj!>@i29r+pL~Xe|lJs0xAL!CP8usmYxF`b>*;U%Axzx|#Ctc6g)dw=v z>K`HXqISMS5HG_>86CpRr?ic`DP=bZ{mVgY(inE6ECU|APxTJ z=bgGsp8{v922GK>YAu-lkmlu`il!4&Hc9wS-gTBH846Vu4;zeO`0`T8)Z<7^m($c^ zFoe1pDGg>8-qyrfF_g;MP*84SI>n{ai)kvHP{FMjMGZo)6K{hyQaKS$JeeA}b(i56 zE*C|jY>cMo)rgPa%G0H1nt371BO6H8MRz=?joP09-!4QN$;rE_;KG2Lc7ISsru^)M zpDqe=UAQ|H1cz>CW9rNj9P)-;{uM;1h3%}*8&$ozc7QiwTT06XkX`Z8z)=QP<3LJGs zJ#?g}dC{wpo$y*=Cx18P7v+hCmMEP`_?U_{p9IIArkRBMi(OM7>hY@1iKQ%sxOE_i zW3^JTk*?Ad_npikS7>>iQVx}5=$;_es|lzJ&T0IDGvC6+jtSIAm#9M(_mTRQg&FSV zY-BU`y{1?c-Kwdaxa{6@SY~O1TK_bYx1f3(+NH38#&#RtrRTAdUeC3tC+3Ea3^$6P}E$IYnx{aZ#- z*=DI>ysmV{5<9LdVbtr6|1xCD6ede8Bf<0*(-b0&7`X)4SOXHmADLz*{&`T>DP5xM zw?YwR2UM)D%PhHqC5-HYByz^l-^L*Su#QULBk{WmrAXb#@CL< z|Mj);$5J`|-tt1@YYYD`|Ki=h^4oVe{?hobwejs2N-eEz?d6WnN>^X^?LYtjXdjvq z(2$(Jmc;05^ZS2Sa(WtnZ%R-3&HIwmRVsa+kqFHnzy06s9k{&%w|C(74&2^>+dFW3 z2maf3z-sYxx4+)rhvp94mV?`Ja9a*;>%o7`4mdr{d3z+p^7fQn*@G`<<sEkhilfU6J0& ztN*mw_4CfW`oZGE^8@UEUw4rEd1ugtc@O!I-8cZ>FcO80 z2eYCI6mjD_A!NQwL;4|le-Xj>OAUyWL>yc$c&55BQ@WaB~c@_9wV6DgOxL~Yg{ zfA2&MJCUI-q`3O(qE{`i)(TekxAKD@ZoW+|?~kh3yc$LIc_(U8jxyoAE%Y-l^TBPA zB}=DL{q^D-c|Vrsz;6{&nD^=wP@f9IS`KzQZwq^pcZ8VaZHP?;A+P=)&Cc>yB{e({ z_0o-oncV&0n}}PGnT>V>n;pZQ}DE8_M(F`Xv37Xv*cv0^Ulbr<^xen znpfY{G`nBQ5B{&kk2W5OIq&O6VkFcRgtv{=wnvsRFGpHEub}Exgj*VZFv@-#Pi8;b zqWK{2L~l#79nm_Kw~IU`+JZo~ z^Sm~;Rgyoz8(04%JVjo`zV>zVO4`m&4y-jw;PV!gtIRL7VK2K7?SW9zyegx|0qft} z*t$+u+R6^KNSQHI?Ib=Ld#KGt393I(d{jP&HuiPL45_>gVeAZb&RfG9<}Hy+NnW&! z9Q1W_D%B`X%B#5D!Lx-S$a}C+ZP=zxj=$}W!t3NE9#oDrVBR4+p6s{QTIGBOqv@sb zQW)|cq_qd}?%-<)Guet`#^L7WNTB6C2+V*UTokeF|+H@>+1$3^mVf_<AK#0*wY-(ZwzCg9k{;f>pS2F+x01Q&KrVYCb)0vwaU~2*n;;$X+=&MEpbrC4 zZImBCryECz5pL(GdZOha??9(Z>}L{7eKJez;gbjSt_Rrf_ zLnpe}$$?Z5hQ4kd-Pg_8Ci#UF>-O`!e!P1%vj2H6&pA*u zf&6wpfS^~!zLSHxLUw)<^)7XQNZfE6{$VTTK z>_jC!ASTV^$x5@N9$aKUTG7|dllr=ORGCexp!=Pyy~5YNZepMTViF<89zu`5<7N2? zxr8#mS&3jJ??l%tSd(Nd2e7~LEz+P~uzIf!PH-!RfaDc?OJ|hN<&~nu@=!yCIne=x ztoq3?>ZdFA0eO9l@L}GHsk{ssw%qN*Uee<3OGk6NZzA>1ngFk zYu9dJ`TB*BD-L372oT0!5fgEOpl_9f_v-oGN%>lw4L0$uZigY&c@LtP-1UJG_zZ+EDYrOuVth z;l4z_XN=g(+5+y{TF8%v#x`~$%%AOs9N83q--#K_J{6Ec73`+5{ahlFwNOXB7BT3$~nN^U5#@=wqx58o=a~G{18e>$0 z*=GD)R^}60L#nc_kpB#)*LWb`=n3t$-PmON+pq(vn1_pdZ6h3T2A<1W*i@7{tA-8vM!RaOf8ZW`{g9dOW8 z@xC6`Icw)lTjC9~PHn~Mrnmh0tUug$W5EG7vX;QirrT^)>|KvHvt3RNteka*4as`r zY_k4P)T}G4SJoMklWm3@w+mr%)2(q!5iS_KL)H=Un02HTiLq&{F`kw6Mu?DA!XFsZ z2huRyiLi*a6l<_OVw7oE;S!aA+)*ARMD~A#_78*a8 zwZ;Rot{4!e8*Fvwjh$fMS3-mhGAb*FA<9aKa!bV7Sy%YltQ>&6@j+}N0^rBOuN$R} zwiJ%exa7`m1#Yv=z{^=DI~0NE?`43bbVKH?&=hqq*;E)VQ~j*1Gq>gz&SNvMPS%-L z7%@X*sR0o+AH}$NS-pL!y+Z?XH{#uGH^jg;1H)#W@tnp3!@y*{SZlhqjXNIwT#$@5 z8bHPB2>Vt99kz!R*bH2kbq1VhJQ(-Y8@pnwIM^Mkyw#ARZX8YT+KLa%2qA2f(??u0 zFhJIW7H{AcZZSwub*7rVq$=voSZG$l`*3G`R$;HjvSby0Kvx59!1wBE15KS!yJXf9 zp>pGu5ip==)*BWq>*DmPSi-Kryt=*CDa1^L^s7PhWGx|gSx>;Ctc^pHA?m`C_H~EL z&J+)1?ePt#72GsnYK;}NB&!feENcs+o%QgMecj>Svo5SaM{IZ29=ejQ7Sm+TjR*{~ z)(Gw!n}LUF3$L5??E5n)R>9a8J~3kNT4+`V$p0c>_FBU=re2O5Zkcw3>wW~@2wu* z#@4X%9lWT#N)PH+jkqOiWrthPk@k=$TgAbZv@u~`Y!gSa)>36O}l_Y*a4%lCo8cB*vhPgt?WVz8|A=2 z6Ov@f{da`k^Ra_V2cWJ)(Kim7>0i@>%l=eW-Vaqv!RQ&fuGrw z)|OB*ynEKkISD-XqMYrRS<-u%R;)2YE1*N7nG6nU-*j~#xKK%rbBtgxYsU(f1Nvm_ ziD~|49m&{;B#P}JS(SiaSvl}W)`?^4>&E6`cQT1)$cv?G#MHyKBdiqxSJoLZW>$_5 z%qqZvUhP?1#N_)3CrqL5#pZkL`Dmi9C=tzfOEBarkeZ~g zX;9s>c#(zB0F74lGl4>UGBnMf0Bz_wqeSOt36s)@Yi5$B`*SXb4{(BAXZEOi`|LCE zBBnk?je4TT!gRAG^V*%^;JSpxxw<>eQW%Y$wlv~WovaICJJjT5nrgein`+R}QeZ-# z4&n0kkao2|<)yGSz7%lB)jX(9SBAQ{I!pD!x})2zCzJ@9C#W?evJde|E<{GP`*@A0)@Uy%T?IymA(5f9~EliPX zG}LbBuQOrZHzO$Dzax7+%(fS@^Wsl9L&<$Ppss74i01N0JGKMzcs*R4Z-oPKO&f)G zaQeu7CQP6&Bdnu1c`rLSUX)4g~aa==|l`vWKV zOjn~gm+rVOhSe+|rt>+M1UM5<(=0m8Mm`d7*e?ZsPBVS3a`w{!5nQu_rqPl*-@h*) zz8x0`;joNLVw}r~{d!nH*L1CwAR`RZ&}itPFv$+ zG@D~Jly@&A5SK8oq8N8I8H}{#9UqfpU1E3tfi=GKxbmT&k=lt!R)n9MzrD&MbMv~ zyCl=hlul3gX~LyBqrlTerD_>u=%g3?#HT-^`yu_l2{2Ja#*9xR9&>)uku|3St zw$ma1uE~UthR&zn^W_LX(!2q6@T!aT5~O3{%o^8r%@BVbl?_9$96#(2;ceC;`1DIb zl(|L($vvi9s4zAf5u{O!YHGYc5J(!Xw#MFH3tq&R@k$eTE3xR>xsd?qJ`$Ku&FC^T zy3Ea2f)&%C2490dk-J`rfISUTxzRvggXIpeKX>@G!pqN0&ykc23w1KUwW=)Y))c-Rw77q zhQRxFu!pX3ue!=EjfNsSvJ8S`@`i>dIK%aQ73ZvxM%xJ9My$t&aYniu<&+|>6eVh? zH&;HTq1UTHOFCCRIpm&iBBCRK;$6MvX)I|y@QZ0kQX%SJJmKU^d^tk>-LRVyJaMBapn~#E{ z)IqQN2oB>Rbq|nCz*-O-z64-i3mfUWj{(z@<_@_okR#f%8*nOT5d?kzDI#mN#Ba!- zT#7eLY%~)ZP4mZR38giwSjKS_<8+2Y!WbJV9@kyyy0uj-gk2;7w;C#7g)w~LvPQf( z!;VcOQqC#G7$R-DXaI<6#I?rQaN7aAa212edR`_Cb1kfKy7!0LRKq{oBy8Fq*5@RI z{uVh8-8TAsuy^SSilGRyY!nu47Y5*=;69AutywGVpXQ#e2|nTn?On*smod}hu;iM! z&viX%pgW^Hver;nJ4I>&TFo|C$QUm^Os3)l+3bg90h0B4nln{%KG%Ec&ITiGXB!dv zr-5f0L{*$rb9xtwt$7qVTXYob$WW4W1>i83bMEWZ~575r&{ zJ_E_yMu0(EMa^xDGZ^Dc^}-sQCN>`wr>k^L+M^Nc8ywLZd=;qBbe*G8z|X)6>3*GW z1QIuHW-=xpr_0v20*jfRt1F*%6|+JQq1o$LQjkr$U+HFeSVbhZg$NYX&FUf3*rUfm z7`lXl%Vb@%u?n)YarbMgYrtqQ=-lw+whrUW0qO2_*SJkhp&5l4(XeVgX9hQ=F>QNc zzikaR7I!BG#)VlYvG2MB;(RbLb||c%6;Z~E{>T_&C??%j5J(NnJ__Q)4Y-CiYV=m& z9bR|T|19>)hOw$eaZLRiSu3A6kBVvXH2deep3|qp82P10FS#ULE=_~!?0f{&Sqq%2 zt})S|pnc`l9jY2`FPYFJ4P8&E92g;(5%Jh^&}}K4^@{nUQWf&g9k5y zXYN7!#4=CdtZTxBx^)M_TfCW_k3^brE0X5pXvU|>VsBv%AOMW%V+KAk0Z@Mc`=Lu& zj>Hza7y$Vs-G{pqu)(GxQZWsoU*L@t973C!aH%eBcFn_j3IQF$S8U5NG7CK`VT#uy zr(@zWP6Qm#9oasF0M{VK3L%>PpklRD?4TQxxirGIkY{dIOBd}bmSc{;GaAn4@cxR6 zKTg6&vk^DLqS!jILM<$Y29oX?V)Aw9=nsc3y$y;l%8aX;!q3}o??2?Nz{7f9xB%IO-Y+Lj~rAii7!TMhi9xr9Crj=3*>UW2;q3h5t4EE_FJ zwt`K?Nu~+FX}D6Huror~gd88H{O)puAhsPbk8!n{tr7JyAlC#WRoesl_ZI*Ox;Awe zJTwEyph`g{A;u_YgOpB}geZd|n|uSOu50YG5)Wo_uLDx?Uq*W_hVZU(C@lKFbr zTnmKTk(E$q<(@a<>}@}E+5~#RM(NCweu{pU0pS|BtOYI86|OtNg1SR?8>7riCy)zi zldfib4s{X*NgI<*leXNIX(OUl&7)}=rJ&XRJBhN*gB~@FsEPpNRfa~TE8I3BR59Ul zVl0=$>v9!YVe(eapk~8@*j23kcCZcUdR*PZIZqPf624nwFsV&)-T8e8iZEGUsp>5f zu$2BN{cP}0i6*7yP@KG`n57FvYbbzb5AMKUZAA*%ws3n>&{a=D3Em&#mY&PhHNOiK zI}fNJ(z079`g)i!+a@BL3hK}wL-7G6o~Fg|^BQ7CxNguZCPjo!vkgqFcyBI;G2E~p z!%#r8Sy;rk*fj1u4FMJkmCXl*I=0ot*-nDCM6hp1PTlLFe?A5urz%8U2&M8MCcwJ* zD{c*Tjos6MZoyw^SfeJ$jt6SCGw>F=OXj(V4xHqM>tZO~iZMmPV1u6%&`Cs-?gyqEMV0Q|w5P*PxkLken=%ngFht-ISL&5Cl!3@R$n%#vgNc0^enz6a z5US(4)<6kL4Q*#IpkEC}QE9EjWouYFr98eEvA9$Doze^IP}iDoO?h%+NR``$n@BVr zD8R)u&V$z^iCf{*(nVE^qy;q{TGaNZVE2_iT!G1+C%vhm^!o#GxA+MuqXy1W9$>no zMzh98Scy=@LL}^5W9P}n`zF>_M5Qj;e2&QYxk#Xf_bx=Moks{H~n^=Jr{MzoqphGhR0jNgk7^t7uc zG^m?@=CMFB)ygD@uwaJ0F{3&00$2_WElrt#CECMPz!>WMWaEx?U zx{Pov+`BF+b7lH;Z3#ZwZ-k3U{Q^t~*Idgq&K7x0nDQKSB-OF$8WHS*E6#oNMNPqd ztx&Dw(~T&=gxa|*(lt4MgXgc12G=z#T;^bkgM>n^g!I}tAtw==E1P!(yQs?$uVLrX z#b>0^OgGKFz{aFY#33K?jXpw&$5rzG7?_kalaKydu_Ie{4ZMXRH{A~`!>9$58q#f_ zPO8LDpgx+JEdyM**jIj7;e?T3uvt8r~ks0?9@dxP^&JxdK3>m45$+3!2{YHn#9KI!f4l3gqn+*l9~k0$z00tE4-T^ zYLX;sZ2u$G=Fxt`b(68o?P2J3-EgE5pBp4epU1R~A#s<&aRp>*Ol!fRxG1%gP?SZK z`Pq9Mv!8DC(giht-!zJY(M?TE$8y|5n%FM3iglQ75=$2}nD{Hw!)S=TD4Qd`|s=fRh71tv~l1g=E4r_VEBa727NWId$V;9lF~|=w0w#@mHw^^3Tw!9U73}TvxZKBU*EteNg|6awfT&1a zVB;`!iS;DiBR-g)b9|((y_G_W_eobM2;+daOk1q0QFJkq7%=(x999JG(HT0Pj_zri zNK_dsZ4u2p7xmHpV34f3EY9A-*qFldNy=xP^xPaD3Ef@Q2e(X#g<0# zqb-X>27Txj4_m~>>*|#g1RV>ayOh`2XP;L1jGd5Et7ABLggs6MhRc}K_;305T4=lx zkEpZNc98-YI1@Xy9}~>7JwPOW(>bA2CtHsI4--e^+4|iH=dQy6#f25qLJgl zhnR}&(yd4Yhen5Xx)qq}TVvu_R*EpzYNR(beO_UdUPM>Wijbuu+X$;|68FaK7pb3Y z76wd1WHd0gPXVbhK5kgd?YFcCb4aXDRz!F7QH=_cC)2@waHE}oLl zT8yyER-+73+H50~!6?j9{?u?9SqU4tLwu)8rAV6CVoI|>gy?24B^gZ-9VDfR__zhd zw8WEDTcCCZwO^nRI5HNK`3(wMst^l>4UK3sq^!!e~)Cy3@Lcs*CJza2xKOZtDTpq zfb49S-=}gdD{_Ad0kY7sPxLDyX;w~Wp!JEZz0-Rrdh?g5V_*@uad))bCX zAO%&M>gxD8Qq78865av~tn(h<2+!}-&NvajQ5|SkBYl#*oNTB(y0|rJI#XWtsenPQ zq9joxQdpHkNx-IP6_cO8L3)RPRUwosXAehi^evd)M+&a$SY3K{1!h$E@G;(7ZBL(p zY7$3C&y6YjILbb(V_V_eOx;AO#M6`^(`CAeA>|38URBPetimc~S~Sy`$feKWWkB=} zh3ijX%5qF#V&hhEKXMaw0LoH8ep5*BQP?DrI^2)s&l1vHK-ETZ$J){qRng*Qw9A<8 zx71DY$Y^3=V!D~B#-N53 zlH`Kc6XXtMtj=OB0Uj>O;VMv2H#dnct3__mQmG8WB*!dXR7x!+Mfp(xLGbMR?gm~33rqq)di~I3!DzQW&d^m*ev!pN1P&s^~b}w#ut7(jK6;hHJ4SGH3}w z$XuvU%|DId!-4qas6}$_C^xE3oiPI>+-I<`F+)FLkOhHzCd}<#iDhI23266mRIw zbg8z9a)CZf?T>%L&dXszM%#NavtLbNhs=ja6s9-J_DPNoSvOVde<>;qbg!k|k0^|TezY$#B2-+P!V?j>>K;(dhp>u1SLuPN zmo-z5yGEq0MAqNA=U4%dx~MQu$^`jg$Pbw(%$(s5)GBOX6XTM|6pLfNO;(^dxc3}0 z`HzBnXtWe*NDejDCK5%xOy6ba6ky6xs){B;?p{M8Ts82zlu@sSo0=RyjE>b*)$p!1yV0BYzfCYxv zXpKymLZO~Q1kpLNKbmHz&`~9FDlkqYek$x&@I-5y3ep|$Z^xn9RDeE=I1h#JxDx6g z3UiPOXOs@rh3(oj%`Wh#!j_w)PO}fsh5kD%q)Unx0)RRY-R1QEzErZ1M3c?qdOXUFpZ;SZE>qQD~Pr zViV2lz@?~*$92W1^0BIvfYLTm*Z912!6%LM>IiVL1ZY>f*jUx8&qOHW>{}|b*FlPF zUnaq&UQ=n)a}k53eq;4asx#pPv=MZVYVSS}uU~RSMDj}%$tb5O4B)D;5Jov3QL3tr z{eF5t#k&Uvy2~{oVk$hMN5t0eP`Xa%jsGzoQ*!yP@K;`t6O9(4hXJdf1iYz3WrjX& z`572pS7cViE1$h5u@r&=@+)MGQtS$$=(7h3u;q`lztd5S>DTx>J*}xdE+r^I`A?CA z5olBozu1019VIPJM$lgX1fGS{mLpU~RgOFHSLY(|NL7!Mpf56tPGFQqWXMFw9*d_? z%2cUZ)tpJwl#e6Z;PWi}a!6#FW}w#mN0C&SXLTmd1rOzvle$V|BEo&6&jt(OM*`%f z@hs0oz~(8x7w9+Dh0pWzITAy4X9`PzJbXt*?3`Tt%=K1IRuHSgkIGj zM%9juK+C{E8vWnu8BJDO)kDHcA|;rqWa@mL2vluDyoXM32AW5GcA!$5f~3%0=5_W< z<95#r8%-h1!Vdz0khsdAxteZqYc>vs67>h0t^;(G)0FX}MBBh6b}i^174#;eO}!Ul z?IGd>`^9ynbS!mjrklT+Ok|YEr0m2D?)(xPD1jp2l6y(4KjDVe*dM8gQBIT!1BE^> z((R(F&E<#q0GlL(H%9!VtiSv?A!%yRP_+j5$|k6M#9t^%urXL>Sz$6^X|#&Um+<$> zh@}D<$RQK@mIPgc{t^qXn)j1I>nD7e{31M_vKVv`rj|AJi74Gfb|a;Wl!vE>MmMEv z_>M71$wVZoqZPkx%C2i3%FfR<9qG^80@gF7bTu?1zW?*K2#KxmNKJu~T%}T_DeB6= z-K8mEO8bbYTzEtAr!)yz9XJR;>H?7_?IA!+J+YhoU8TRLDd?Lo9{YAXM><7}@G$O7 zv5DF=_X2=e4Z&0Ffjc&Zp}N{$0ql6hM0O6~B)4~+)bJ{Rg@Qu65dnbFkY|$=cSwL$ zhOKZ?CD3%RswLO7ZVj-r>jl60k`%E|1W)Rem>P&aF(FUz^8!RFRbygKB8IQ?f=XzL z@Kqcx-|`tuhU#-v(=8@ol<5^j5T-&v6WN6&^1ngAp&w;Q()0_%>l=Kr$&@HCrx+o%WQxC32qwg-wl@_}$!G99 zhiXv)mOUOO#zCkqno*iby2x};YJR7ALX3V2VH5%qZM#ZwLCE&xj~6PU@iL~OA(%J5W_zo3v78J*xmLnqT1O%*?W4*)m9 zS!xvGAg{YA6CfK&3ZQnz*rR5 z;1;qx?h#H%Inq=uAyM#!t3z9vM#Z7xTQJW)PTZ+D@-nieSxWRLi z?&sM9RyOg@z3+R@*=w)0_BxkA0xs6ue1IPa4VleuUz{4uc3X+!7;PABn9hFDl{orQ zF{FenieStTVn+Sh@C_LYWh%Crq+Kn#X{iNJ?GbNIpPUfSHx2_WbKr1()b~YlN~}&6 zY#@uVLds*IwdofkkLy+dk>nSc29H-#r^?i9Ck#MRBD;VXCl6J~ta{@cm02Rgq97G( z2bD-h%-=_LNnkkQOd!3Ne6XrZJ>+;()z>i3@mlo36RT=}>T&4GM`%?gnrK~PSIyax z0g=C*lmv4YrCK<9>MmwBLs=eRtR#YOGOI*7MEYCL#xQIXIiVtNuA7Ep;gmyo3zS=q z=@0@{+r0o|o6YA%$_J=l0tQ&;;;5(vlDK8!0ajBNo|NXpZmx`_C@E02d+VexeuG|3 z>#V@=zIgLOti3nUM)JYhcXnmmZw+KNR|;eWsdoO&KMb8)dO@ZUv(-Il>@7vUhLi$&X4p=$L67GT09kuHM9~=3xYL&SkbylbTsDjYN)IAYeF?wxb~`U-x2GUAr4sPDt~ zM6au@Ikbv#Oq^CTcL0UwpjvfEdT+UYjdO(~r3mh=Z-69Jig41$$%|lK3VB+=e;%~m znE=p>iAOZQbF`pVh2}oEuX4hX$x)tzo_R1*cDhFH`g84;BmvAFmo{Th7xgHmF8)e zB@M+NudZLJ@N^;%xO#08yl>-L5=I(5W`a1v0trf#~KGTYikcCchB{3l^gR3?$>AWVFdswrFCyf4NtyI39f7n}w zX^0-Q)EL05knCV8#tdCvy3OM6)?M}#*t^pLcKkd$OWa%|G}AWZ`d90<_4V`v&>5Fm zuK0iVP>Ri7!0j}t{Z=t&7sS;bPWRiUy#VE=u%SY zQyL%Kf!%9X7Ej*m1`OE2&=Im>GadjHG(T|B;_rmxn;R@3Qi;<{O8v{;8ae*ys6;;G zxbs*RU>bs|Ni=Y?Il`g%m`C+fbE}!cX-}lk#6;4lvCmo$$zf}B!IPb*yo+NY^{1<@ z_ey%K=lOULn`kTK_uV5Sm_ZaTLg2cPxzl31d(?2lPBwA4!Ocw!uR0jWXR@}j3dZqS z^GUpWu z`x}m3!xknGPxPu9bhXb9((YiLFrbB@Iz`aHz6Zr|X0PwD=Fx}Z_`BjS7gkQL@H94a}0y1J-_Ho|o+U9uKn4 zfs9z&r=Z?tuYy&BnjFYZ-)MPh)e)qnI?EZLUaYF8({5i@hbdg6Uvq!eYrXqxanVIF z7+y|6m=cL!F6-Xx;@{)@3#qmfG`Oyk7pe1$$p!|Gy#X(qtHq zhMqz{$r4)W-WTgLD@*W-byA!FBRcW^;uE*%4XviRA=+;qd#;Z#5KTnk6V!r(*evfc zma6L}yR1*~%nUqpdL@}50(d0hrxFB!%is+8Qb zQ;jiG!;vj)6ftANHQ|kN16o})+n&!)>G5}Gbr^st{i@AJmc>1mrY969OD7+)zX$Vp`-&LGZ6$CP*b3z3 z+x7Kg(Fi5Wkhv(C=-0x*X>?C4r8N0**SXk`{lcBrF`>q5cCccMLqSDi2{v=A&TQpcej|SY~zL8IAp{jMmj1>T%h`{WQQ<0MbzuemFvH?B`EdQk1W=g$yw|Y0{6pxNW|WM9&W2>SOMWo0 zMW=y!u!c5_d}X|;Mm-IA9(S-kak>t+NwT26gEyaf76*{HX(oE`rL#curkn-h+Vt#9 z^2KMpXNsj>Y>6^V37({mVSt?jgsC62=&9#zTU}bOlw#X447WBfhbP#ZMJ#!FdzSHt zp36+@$?TSvLpX)Pu2x%~xg zsAzU(1j6s|<;0UpKYvt+dV5?J>BsZ4(XAV^sBh>L__Tvz9=$du8)4GSO g&EBhZ*i2o~WKS^AJ_Dbe)6+sND12B1YT3{3KZfzW4FCWD literal 0 HcmV?d00001 diff --git a/external/svm/demsvm1.m b/external/svm/demsvm1.m new file mode 100644 index 00000000..bf2e096c --- /dev/null +++ b/external/svm/demsvm1.m @@ -0,0 +1,247 @@ +function demsvm1() +% DEMSVM1 - Demonstrate basic Support Vector Machine classification +% +% DEMSVM1 demonstrates the classification of a simple artificial data +% set by a Support Vector Machine classifier, using different kernel +% functions. +% +% See also +% SVM, SVMTRAIN, SVMFWD, SVMKERNEL, DEMSVM2 +% + +% +% Copyright (c) Anton Schwaighofer (2001) +% This program is released unter the GNU General Public License. +% + +X = [2 7; 3 6; 2 2; 8 1; 6 4; 4 8; 9 5; 9 9; 9 4; 6 9; 7 4]; +Y = [ +1; +1; +1; +1; +1; -1; -1; -1; -1; -1; -1]; +% define a simple artificial data set + +x1ran = [0 10]; +x2ran = [0 10]; +% range for plotting the data set and the decision boundary + +disp(' '); +disp('This demonstration illustrates the use of a Support Vector Machine'); +disp('(SVM) for classification. The data is a set of 2D points, together'); +disp('with target values (class labels) +1 or -1.'); +disp(' '); +disp('The data set consists of the points'); + +ind = [1:length(Y)]'; +fprintf('X%2i = (%2i, %2i) with label Y%2i = %2i\n', [ind, X, ind, Y]'); +disp(' ') +disp('Press any key to plot the data set'); +pause + +f1 = figure; +plotdata(X, Y, x1ran, x2ran); +title('Data from class +1 (squares) and class -1 (crosses)'); + +fprintf('\n\n\n\n'); +fprintf('The data is plotted in figure %i, where\n', f1); +disp(' squares stand for points with label Yi = +1'); +disp(' crosses stand for points with label Yi = -1'); +disp(' ') +disp(' '); +disp('Now we train a Support Vector Machine classifier on this data set.'); +disp('We use the most simple kernel function, namely the inner product'); +disp('of points Xi, Xj (linear kernel K(Xi,Xj) = Xi''*Xj )'); +disp(' '); +disp('Press any key to start training') +pause + +net = svm(size(X, 2), 'linear', [], 10); +net = svmtrain(net, X, Y); + +f2 = figure; +plotboundary(net, x1ran, x2ran); +plotdata(X, Y, x1ran, x2ran); +plotsv(net, X, Y); +title(['SVM with linear kernel: decision boundary (black) plus Support' ... + ' Vectors (red)']); + +fprintf('\n\n\n\n'); +fprintf('The resulting decision boundary is plotted in figure %i.\n', f2); +disp('The contour plotted in black separates class +1 from class -1'); +disp('(this is the actual decision boundary)'); +disp('The contour plotted in red are the points at distance +1 from the'); +disp('decision boundary, the blue contour are the points at distance -1.'); +disp(' '); +disp('All examples plotted in red are found to be Support Vectors.'); +disp('Support Vectors are the examples at distance +1 or -1 from the '); +disp('decision boundary and all the examples that cannot be classified'); +disp('correctly.'); +disp(' '); +disp('The data set shown can be correctly classified using a linear'); +disp('kernel. This can be seen from the coefficients alpha associated'); +disp('with each example: The coefficients are'); +ind = [1:length(Y)]'; +fprintf(' Example %2i: alpha%2i = %5.2f\n', [ind, ind, net.alpha]'); +disp('The upper bound C for the coefficients has been set to'); +fprintf('C = %5.2f. None of the coefficients are at the bound,\n', ... + net.c(1)); +disp('this means that all examples in the training set can be correctly'); +disp('classified by the SVM.') +disp(' '); +disp('Press any key to continue') +pause + +X = [X; [4 4]]; +Y = [Y; -1]; +net = svm(size(X, 2), 'linear', [], 10); +net = svmtrain(net, X, Y); + +f3 = figure; +plotboundary(net, x1ran, x2ran); +plotdata(X, Y, x1ran, x2ran); +plotsv(net, X, Y); +title(['SVM with linear kernel: decision boundary (black) plus Support' ... + ' Vectors (red)']); + +fprintf('\n\n\n\n'); +disp('Adding an additional point X12 with label -1 gives a data set'); +disp('that can not be linearly separated. The SVM handles this case by'); +disp('allowing training points to be misclassified.'); +disp(' '); +disp('Training the SVM on this modified data set we see that the points'); +disp('X5, X11 and X12 can not be correctly classified. The decision'); +fprintf('boundary is shown in figure %i.\n', f3); +disp('The coefficients alpha associated with each example are'); +ind = [1:length(Y)]'; +fprintf(' Example %2i: alpha%2i = %5.2f\n', [ind, ind, net.alpha]'); +disp('The coefficients of the misclassified points are at the upper'); +disp('bound C.'); +disp(' ') +disp('Press any key to continue') +pause + + +fprintf('\n\n\n\n'); +disp('Adding the new point X12 has lead to a more difficult data set'); +disp('that can no longer be separated by a simple linear kernel.'); +disp('We can now switch to a more powerful kernel function, namely'); +disp('the Radial Basis Function (RBF) kernel.'); +disp(' ') +disp('The RBF kernel has an associated parameter, the kernel width.'); +disp('We will now show the decision boundary obtained from a SVM with'); +disp('RBF kernel for 3 different values of the kernel width.'); +disp(' '); +disp('Press any key to continue') +pause + +net = svm(size(X, 2), 'rbf', [8], 100); +net = svmtrain(net, X, Y); + +f4 = figure; +plotboundary(net, x1ran, x2ran); +plotdata(X, Y, x1ran, x2ran); +plotsv(net, X, Y); +title(['SVM with RBF kernel, width 8: decision boundary (black)' ... + ' plus Support Vectors (red)']); + +fprintf('\n\n\n\n'); +fprintf('Figure %i shows the decision boundary obtained from a SVM\n', ... + f4); +disp('with Radial Basis Function kernel, the kernel width has been'); +disp('set to 8.'); +disp('The SVM now interprets the new point X12 as evidence for a'); +disp('cluster of points from class -1, the SVM builds a small ''island'''); +disp('around X12.'); +disp(' ') +disp('Press any key to continue') +pause + + +net = svm(size(X, 2), 'rbf', [1], 100); +net = svmtrain(net, X, Y); + +f5 = figure; +plotboundary(net, x1ran, x2ran); +plotdata(X, Y, x1ran, x2ran); +plotsv(net, X, Y); +title(['SVM with RBF kernel, width 1: decision boundary (black)' ... + ' plus Support Vectors (red)']); + +fprintf('\n\n\n\n'); +fprintf('Figure %i shows the decision boundary obtained from a SVM\n', ... + f5); +disp('with radial basis function kernel, kernel width 1.'); +disp('The decision boundary is now highly shattered, since a smaller'); +disp('kernel width allows the decision boundary to be more curved.'); +disp(' ') +disp('Press any key to continue') +pause + + +net = svm(size(X, 2), 'rbf', [36], 100); +net = svmtrain(net, X, Y); + +f6 = figure; +plotboundary(net, x1ran, x2ran); +plotdata(X, Y, x1ran, x2ran); +plotsv(net, X, Y); +title(['SVM with RBF kernel, width 36: decision boundary (black)' ... + ' plus Support Vectors (red)']); + +fprintf('\n\n\n\n'); +fprintf('Figure %i shows the decision boundary obtained from a SVM\n', ... + f6); +disp('with radial basis function kernel, kernel width 36.'); +disp('This gives a decision boundary similar to the one shown in'); +fprintf('Figure %i for the SVM with linear kernel.\n', f2); + + +fprintf('\n\n\n\n'); +disp('Press any key to end the demo') +pause + +delete(f1); +delete(f2); +delete(f3); +delete(f4); +delete(f5); +delete(f6); + + +function plotdata(X, Y, x1ran, x2ran) +% PLOTDATA - Plot 2D data set +% + +hold on; +ind = find(Y>0); +plot(X(ind,1), X(ind,2), 'ks'); +ind = find(Y<0); +plot(X(ind,1), X(ind,2), 'kx'); +text(X(:,1)+.2,X(:,2), int2str([1:length(Y)]')); +axis([x1ran x2ran]); +axis xy; + + +function plotsv(net, X, Y) +% PLOTSV - Plot Support Vectors +% + +hold on; +ind = find(Y(net.svind)>0); +plot(X(net.svind(ind),1),X(net.svind(ind),2),'rs'); +ind = find(Y(net.svind)<0); +plot(X(net.svind(ind),1),X(net.svind(ind),2),'rx'); + + +function [x11, x22, x1x2out] = plotboundary(net, x1ran, x2ran) +% PLOTBOUNDARY - Plot SVM decision boundary on range X1RAN and X2RAN +% + +hold on; +nbpoints = 100; +x1 = x1ran(1):(x1ran(2)-x1ran(1))/nbpoints:x1ran(2); +x2 = x2ran(1):(x2ran(2)-x2ran(1))/nbpoints:x2ran(2); +[x11, x22] = meshgrid(x1, x2); +[dummy, x1x2out] = svmfwd(net, [x11(:),x22(:)]); +x1x2out = reshape(x1x2out, [length(x1) length(x2)]); +contour(x11, x22, x1x2out, [-0.99 -0.99], 'b-'); +contour(x11, x22, x1x2out, [0 0], 'k-'); +contour(x11, x22, x1x2out, [0.99 0.99], 'g-'); + diff --git a/external/svm/demsvm2.m b/external/svm/demsvm2.m new file mode 100644 index 00000000..3798197f --- /dev/null +++ b/external/svm/demsvm2.m @@ -0,0 +1,308 @@ +function demsvm2() +% DEMSVM2 - Demonstrate advanced Support Vector Machine features +% +% DEMSVM2 demonstrates the classification of a simple artificial data +% set by a Support Vector Machine classifier. The features of the SVM +% routines that make it useful for large data sets are shown. +% +% See also +% SVM, SVMTRAIN, SVMFWD, SVMKERNEL, DEMSVM2 +% + +% +% Copyright (c) Anton Schwaighofer (2001) +% $Revision: 1.4 $ $Date: 2001/04/19 23:29:48 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +rand('seed', 1); +randn('seed', 1); + +X = [2 7; 3 6; 2 2; 8 1; 6 4; 4 8; 9 5; 9 9; 9 4; 6 9; 7 4; 4 4]; +Y = [ +1; +1; +1; +1; +1; -1; -1; -1; -1; -1; -1; -1]; +% define a simple artificial data set + +x1ran = [0 10]; +x2ran = [0 10]; +% range for plotting the data set and the decision boundary + +disp(' '); +disp('This demonstration illustrates the use of a Support Vector Machine'); +disp('(SVM) for classification.'); +disp(' '); +disp('This Matlab implementation has a few special features that make'); +disp('its use on large data sets particularly efficient. We will in turn'); +disp('demonstrate a few of theses features on small artifial data sets.'); +disp(' '); +disp('Press any key to plot the data set'); +pause + +f1 = figure; +plotdata(X, Y, x1ran, x2ran); +title('Data from class +1 (squares) and class -1 (crosses)'); + +fprintf('\n\n\n\n'); +fprintf('The data is plotted in figure %i, where\n', f1); +disp(' squares stand for points with label Yi = +1'); +disp(' crosses stand for points with label Yi = -1'); +disp(' ') +disp('Now we train a Support Vector Machine classifier on this data set,'); +disp('we use the simple linear kernel.'); +disp('Training the SVM involves solving a quadratic programming (QP)'); +disp('problem that has as many variables as we have training points.'); +disp('This may result in huge time and memory consumption during'); +disp('training.'); +disp('This SVM toolbox uses a special decomposition algorithm proposed'); +disp('by Osuna, Freund and Girosi'); +disp('(ftp://ftp.ai.mit.edu/pub/cbcl/nnsp97-svm.ps)'); +disp('The QP problem is decomposed into smaller ones, the size of these'); +disp('small QP problems is controlled by the parameter net.qpsize'); +disp(' '); +disp('We demonstrate the decomposition algorithm by setting net.qpsize'); +disp('to 6. In the SVM framework this means that we consider a set of'); +disp('6 examples (the ''working set'') at once and try to find the '); +disp('separating hyperplane for this set of examples.'); +disp(' '); +disp(' '); +disp('Press any key to start training') +pause +disp(' '); +disp('************'); +disp(' '); + +net = svm(size(X, 2), 'linear', [], 100); +net.qpsize = 6; +net = svmtrain(net, X, Y, [], 2); + +disp(' '); +disp('************'); +disp(' '); + +f2 = figure; +plotboundary(net, x1ran, x2ran); +plotdata(X, Y, x1ran, x2ran); +plotsv(net, X, Y); +title(['SVM with linear kernel: decision boundary (black) plus Support' ... + ' Vectors (red)']); + +disp(' '); +fprintf('The resulting decision boundary is plotted in figure %i.\n', f2); +disp('The contour plotted in black separates class +1 from class -1'); +disp('(this is the actual decision boundary)'); +disp('The SVM has successfully found the set of Support Vectors without'); +disp('ever having to work with the whole set of examples.'); +disp(' '); +disp('The decomposition algorithm works in such a way that the size of'); +disp('the small QP subproblems is independent of the number of Support'); +disp('Vectors. Thus complex data sets with a few thousand Support'); +disp('Vectors can be handled easily and efficiently by solving a series'); +disp('of small QP problems of size net.qpsize.'); +disp(' '); +disp('Furthermore, a linear approximation of the objective function is'); +disp('used for selecting which examples to put into the working set for'); +disp('the next QP subproblem. This is based on the approximation'); +disp('proposed by Joachims, see'); +disp('http://www-ai.cs.uni-dortmund.de/DOKUMENTE/joachims_99a.ps.gz'); +disp('This approximation gives an excellent convergence behaviour.'); +disp(' '); +disp('Usually it is not necessary to modify the default value'); +disp('for net.qpsize'); +disp(' '); +disp('Press any key to continue') +pause + + +fprintf('\n\n\n\n'); +disp('We have just now trained a SVM with linear kernel. If the'); +disp('resulting classifier makes too many errors on the training'); +disp('set we might switch to a more powerful kernel function.'); +disp('We will now switch to a RBF kernel.'); +disp(' '); +disp('Training a SVM means finding the Support Vectors - the examples'); +disp('that are on the boundary between the classes +1 and -1.'); +disp('If we change the kernel function and start the training again'); +disp('from scratch, we loose the previously obtained information on'); +disp('the Support Vectors. If a set of examples are Support Vectors'); +disp('when using a linear kernel, we may assume that at least a few'); +disp('of theses examples will again be Support Vectors when using '); +disp('the RBF kernel.'); +disp(' '); +disp('SVMTRAIN provides a way of incorporating this information since'); +disp('it is possible to set a start value for the coefficients alpha.'); +disp(' '); +disp('We will now start the training again, using the RBF kernel. We'); +disp('will use the previously obtained alpha''s as the start values.'); +disp(' '); +disp(' '); +disp('Press any key to start training') +pause +disp(' '); +disp('************'); +disp(' '); + +alpha0 = net.alpha; +net = svm(size(X, 2), 'rbf', [36], 100); +net.qpsize = 6; +net = svmtrain(net, X, Y, alpha0, 2); + +disp(' '); +disp('************'); +disp(' '); + +f3 = figure; +plotboundary(net, x1ran, x2ran); +plotdata(X, Y, x1ran, x2ran); +plotsv(net, X, Y); +title(['SVM with RBF kernel, width 36: decision boundary (black) plus Support' ... + ' Vectors (red)']); + +fprintf('\n\n\n\n'); +disp('It can be seen that the whole training is finished after fewer'); +disp('iterations than before. It turned out that the set of Support'); +disp('Vectors has indeed stayed the same when changing the kernel'); +disp('function.'); +disp(' '); +disp('This features is particularly useful for testing the results of '); +disp('different kernel functions on large data sets, for example'); +disp(' net1 = svm(nin, ''RBF'', 0.5);'); +disp(' net1 = svmtrain(net1, X, Y);'); +disp(' net2 = svm(nin, ''RBF'', 0.4);'); +disp(' net2 = svmtrain(net2, X, Y, net1.alpha);'); +disp(' net3 = svm(nin, ''RBF'', 0.3);'); +disp(' net3 = svmtrain(net3, X, Y, net2.alpha);'); +disp(' '); +disp('Press any key continue'); +pause + + +fprintf('\n\n\n\n'); +disp('Another feature that is useful for use with imbalanced data sets'); +disp('is to set different values for the upper bound C of the'); +disp('coefficients alpha. In a mechanical analogy, these coefficients'); +disp('can be viewed as forces ''pulling'' on the decision boundary. The'); +disp('larger a coefficient alpha is, the larger is the force the'); +disp('corresponding examples exerts on the decision surface. Thus the'); +disp('upper bound C for the coefficients alpha is equivalent to an'); +disp('upper bound for the force.'); +disp(' '); +disp('If we now have an imbalanced data set with, say, 100 negative'); +disp('examples and 5 positive examples, we may allow the positive'); +disp('examples to exert a higher force on the decision boundary to'); +disp('compensate for their under-representation.'); +disp('We do this by setting different upper bounds C for the positive'); +disp('and the negative examples. Such a technique has been proposed by'); +disp('Veropoulos et.al. in the context of medical diagnosis, see'); +disp('http://lara.enm.bris.ac.uk/cig/gzipped/ijcai_ss.ps.gz'); +disp(' '); +disp('We will now show the effect of different bounds for positive and'); +disp('negative examples on a simple data set. First we use an equal'); +disp('upper bound C for the positive and negative examples.'); +disp(' '); +disp('Press any key to show decision boundary') +pause + +X = [2 7; 3 6; 6 3; 8 1; 6 4; 4 8; 9 5; 9 9; 9 4; 6 9; 7 4; 4 4; 4 6; ... + 3 3]; +Y = [ +1; +1; -1; +1; +1; -1; -1; -1; -1; -1; -1; -1; -1; ... + +1]; + +net = svm(size(X, 2), 'rbf', [128]); +net.c = 100; +net = svmtrain(net, X, Y); + +f6 = figure; +plotboundary(net, x1ran, x2ran); +plotdata(X, Y, x1ran, x2ran); +plotsv(net, X, Y); +title(['Decision boundary from SVM with upper bound C=100 for' ... + ' positive and negative examples']); + +fprintf('\n\n\n\n'); +disp('Now we use an upper bound of C=10 for the positive examples and'); +disp('C=100 for the negative examples.'); + +disp(' '); +disp('Press any key to show decision boundary') +pause + +net = svm(size(X, 2), 'rbf', [128]); +net.c = [50 100]; +net = svmtrain(net, X, Y); + +f7 = figure; +plotboundary(net, x1ran, x2ran); +plotdata(X, Y, x1ran, x2ran); +plotsv(net, X, Y); +title(['Decision boundary from SVM with upper bound C=10 for' ... + ' positive examples (squares) and C=100 for negatives' ... + ' (crosses)']); + + +fprintf('\n\n\n\n'); +disp('It can be seen clearly that the SVM now makes fewer errors on the'); +disp('negative examples, since errors on negative examples have a'); +disp('''penalty'' of C=100 associated with it, whereas errors on'); +disp('positive examples only have a penalty of C=10. The decision'); +disp('boundary has moved such that example 12 is the only one that is'); +disp('not correctly classified.'); +disp('(Recall that the actual decision boundary that separates the'); +disp('positive from the negative examples is plotted in black, the'); +disp('contour lines plotted in blue and green are the lines of'); +disp('distance +1 and -1 from the decision boundary. All examples that'); +disp('are in the margin (between the +1 and -1 lines) are seen as'); +disp('misclassifications.)'); + +fprintf('\n\n\n\n'); +disp('Press any key to end the demo') +pause + +delete(f1); +delete(f2); +delete(f3); +delete(f6); +delete(f7); + + + +function plotdata(X, Y, x1ran, x2ran) +% PLOTDATA - Plot 2D data set +% + +hold on; +ind = find(Y>0); +plot(X(ind,1), X(ind,2), 'ks'); +ind = find(Y<0); +plot(X(ind,1), X(ind,2), 'kx'); +text(X(:,1)+.2,X(:,2), int2str([1:length(Y)]')); +axis([x1ran x2ran]); +axis xy; + + +function plotsv(net, X, Y) +% PLOTSV - Plot Support Vectors +% + +hold on; +ind = find(Y(net.svind)>0); +plot(X(net.svind(ind),1),X(net.svind(ind),2),'rs'); +ind = find(Y(net.svind)<0); +plot(X(net.svind(ind),1),X(net.svind(ind),2),'rx'); + + +function [x11, x22, x1x2out] = plotboundary(net, x1ran, x2ran) +% PLOTBOUNDARY - Plot SVM decision boundary on range X1RAN and X2RAN +% + +hold on; +nbpoints = 100; +x1 = x1ran(1):(x1ran(2)-x1ran(1))/nbpoints:x1ran(2); +x2 = x2ran(1):(x2ran(2)-x2ran(1))/nbpoints:x2ran(2); +[x11, x22] = meshgrid(x1, x2); +[dummy, x1x2out] = svmfwd(net, [x11(:),x22(:)]); +x1x2out = reshape(x1x2out, [length(x1) length(x2)]); +contour(x11, x22, x1x2out, [-0.99 -0.99], 'b-'); +contour(x11, x22, x1x2out, [0 0], 'k-'); +contour(x11, x22, x1x2out, [0.99 0.99], 'g-'); + diff --git a/external/svm/demsvm3.m b/external/svm/demsvm3.m new file mode 100644 index 00000000..48b1efd6 --- /dev/null +++ b/external/svm/demsvm3.m @@ -0,0 +1,36 @@ +function demsvm3() +% DEMSVM3 - Sample code for the use of SVMCV (parameter selection) +% +% This function is not meant to be executed! +% +% Given a data set with examples X and labels Y. +% First, create the SVM structure: Use RBF kernel with initial +% parameter value 1. +% NET = SVM(size(X, 2), 'rbf', [1], 1); +% Select best RBF parameter in the range [0.1 10]: +% NET = SVMCV(NET, X, Y, [0.1 10]); +% Make a more accurate search in the parameter space: +% NET = SVMCV(NET, X, Y, [0.4 0.8], 1.1); +% If you want to test only a few points: +% NET = SVMCV(NET, X, Y, [0.1 0.5 1 5 10]); +% The default setting is to use 10fold cross validation. You might want +% to use 7fold CV, by running +% NET = SVMCV(NET, X, Y, [0.1 0.5 1 5 10], 0, 7); +% If you are lucky and have some extra validation data XVAL, YVAL +% available and want to set the parameter based on the validation set +% error: +% NET = SVMCV(NET, X, Y, [0.1 0.5 1 5 10], 0, 1, XVAL, YVAL); +% +% See also SVM, SVMTRAIN +% + +% +% Copyright (c) by Anton Schwaighofer (2001) +% $Revision: 1.1 $ $Date: 2001/08/30 13:23:41 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +fprintf(['This function is not meant to be executed!\n' ... + 'Have a look at the help text instead...\n']); diff --git a/external/svm/ecoc-codes.tar.gz b/external/svm/ecoc-codes.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9d46b560f8797991725c5c543f99af8a1404fc1b GIT binary patch literal 315933 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%0Dv1}kGcIbAT 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
Kw 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�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

h4!6TfzW`ti(yk5-X7k54 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%0DLb)$Im8;d}iX~?= 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

hUP2w$77ica04+LDM*7@5yGL9v6Wd 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%0AR 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

5LWm^PJGQmnzAo{Dk}tnBnxFZg`?Qkg0 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 -> flow is right, Vy>0 -> flow is down] +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also OPTFLOW_CORR, OPTFLOW_LUCASKANADE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [Vx,Vy] = optflow_horn( I1, I2, sigma, show ) + if (nargin < 3) sigma=1; end; + if (nargin < 4) show=0; end; + + if( ndims(I1)~=2 || ndims(I2)~=2 ) error('Only works for 2d input images.'); end + if( any(size(I1)~=size(I2)) ) error('Input images must have same dimensions.'); end + I1 = gauss_smooth(I1,sigma,'smooth'); + I2 = gauss_smooth(I2,sigma,'smooth'); + + %%% ALGORITHM: + [N1,N2]=size(I1); + + PI1=zeros(N1+2,N2+2); PI1(2:end-1,2:end-1)=I1; + [PI11,PI12,PI13,PI14,PI15]=shifted(I1); + + PI2=zeros(N1+2,N2+2); PI2(2:end-1,2:end-1)=I2; + [PI21,PI22,PI23,PI24,PI25]=shifted(I2); + + Ex=clamp(0.25*((PI13+PI23+PI15+PI25)-(PI1+PI2+PI12+PI22))); + Ey=clamp(0.25*((PI12+PI22+PI15+PI25)-(PI1+PI2+PI13+PI23))); + Et=clamp(0.25*((PI2+PI22+PI23+PI25)-(PI1+PI12+PI13+PI15))); + + % initialize the values of U and V; + lambda=10; + den=lambda./(1+lambda*(Ex.*Ex+Ey.*Ey)); + U=zeros(N1,N2); V = U; + niter=1000; + for i = 1:niter + [U1,U2,U3,U4,U5]=shifted(U); + [V1,V2,V3,V4,V5]=shifted(V); + + Ub=(U1+U2+U3+U4)/4; + Vb=(V1+V2+V3+V4)/4; + + nen=(Ex.*Ub+Ey.*Vb+Et).*den; + Un=Ub-Ex.*nen; + Vn=Vb-Ey.*nen; + U=Un(2:end-1,2:end-1); + V=Vn(2:end-1,2:end-1); + end + Vx = V; Vy = U; + + %%% show quiver plot on top of reliab + if( show ) + figure(show); show=show+1; clf; im( I1 ); + hold('on'); quiver( Vx, Vy, 0,'-b' ); hold('off'); + %figure(show); show=show+1; clf; im( I2 ); + end + + +function I=clamp(I); + I(1,:)=0; + I(end,:)=0; + I(:,1)=0; + I(:,end)=0; + + +function [s1,s2,s3,s4,s5]=shifted(I); + [N1,N2]=size(I); + + s1 = zeros(N1+2,N2+2); + s1(3:end,2:end-1)=I; %i-1 + + s2 = zeros(N1+2,N2+2); + s2(2:end-1,1:end-2)=I; %j+1 + + s3 = zeros(N1+2,N2+2); + s3(1:end-2,2:end-1)=I; %i+1 + + s4 = zeros(N1+2,N2+2); + s4(2:end-1,3:end)=I; %j-1 + + s5 = zeros(N1+2,N2+2); + s5(1:end-2,1:end-2)=I; % i+1,j+1 + diff --git a/images/optflow_lucaskanade.m b/images/optflow_lucaskanade.m new file mode 100644 index 00000000..cd164a6e --- /dev/null +++ b/images/optflow_lucaskanade.m @@ -0,0 +1,165 @@ +% Calculate optical flow using Lucas & Kanade. Fast, parallel code. +% +% Note that the window of integration can either be a hard square window of radius win_n +% or it can be a soft 'gaussian' window with sigma win_sig. In general the soft window +% should be more accurate. +% +% INPUTS +% I1, I2 - input images to calculate flow between +% win_n - window radius for hard window (should be [] if win_sig is provided) +% win_sig - [optional] sigma for soft 'gauss' window (should be [] if win_n is provided) +% sigma - [optional] amount to smooth by (may be 0) +% thr - [optional] ABSOLUTE reliability threshold (min eigenvalue), [default: 3e-6] +% show - [optional] figure to use for display (no display if == 0) +% +% OUTPUTS +% Vx, Vy - x,y components of optical flow [Vx>0 -> flow is right, Vy>0 -> flow is down] +% reliab - reliability of optical flow in given window (cornerness of window) +% +% EXAMPLE +% % create square + translated square (B) + rotated square (C) +% A=zeros(50,50); A(16:35,16:35)=1; +% B=zeros(50,50); B(17:36,17:36)=1; +% C=imrotate(A,5,'bil','crop'); +% optflow_lucaskanade( A, B, [], 2, 2, 3e-6, 1 ); +% optflow_lucaskanade( A, C, [], 2, 2, 3e-6, 4 ); +% % compare on stored real images (of mice) +% load optflow_data; +% [Vx,Vy,reliab] = optflow_lucaskanade( I5A, I5B, [], 4, 1.2, 3e-6, 1 ); +% [Vx,Vy,reliab] = optflow_corr( I5A, I5B, 3, 5, 1.2, .01, 2 ); +% [Vx,Vy] = optflow_horn( I5A, I5B, 2, 3 ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also OPTFLOW_HORN, OPTFLOW_CORR + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [Vx,Vy,reliab]=optflow_lucaskanade( I1, I2, win_n, win_sig, sigma, thr, show ) + if( nargin<4 || isempty(win_sig)) win_sig=[]; end; + if( nargin<5 || isempty(sigma)) sigma=1; end; + if( nargin<6 || isempty(thr)) thr=3e-6; end; + if( nargin<7 || isempty(show)) show=0; end; + + %%% error check inputs + if( ~isempty(win_n) && ~isempty(win_sig)) + error('Either win_n or win_sig should be empty!'); end; + if( isempty(win_n) && isempty(win_sig)) + error('Either win_n or win_sig must be non-empty!'); end; + if( ndims(I1)~=2 || ndims(I2)~=2 ) error('Only works for 2d input images.'); end + if( any(size(I1)~=size(I2)) ) error('Input images must have same dimensions.'); end + + %%% convert to double in range [0,1] + if( isa(I1,'uint8') ) + I1=double(I1)/255; I2=double(I2)/255; + else + if( ~isa(I1,'double')) + I1=double(I1); I2=double(I2); + end; + if( abs(max([I1(:); I2(:)]))>1 ) + minval = min([I1(:); I2(:)]); I1=I1-minval; I2=I2-minval; + maxval = max([I1(:); I2(:)]); I1=I1/maxval; I2=I2/maxval; + end; + end; + + %%% smooth images (using the 'smooth' flag causes this to be slow) + I1 = gauss_smooth(I1,sigma,'same'); + I2 = gauss_smooth(I2,sigma,'same'); + + %%% Compute components of outer product of gradient of frame 1 + [Gx,Gy]=gradient(I1); + Gxx=Gx.^2; Gxy=Gx.*Gy; Gyy=Gy.^2; + if( isempty(win_sig) ) + win_mask = ones(2*win_n+1); + win_mask = win_mask / sum(win_mask(:)); + Axx=conv2(Gxx,win_mask,'same'); + Axy=conv2(Gxy,win_mask,'same'); + Ayy=conv2(Gyy,win_mask,'same'); + else + win_n = ceil(win_sig); + Axx=gauss_smooth(Gxx,win_sig,'same',2); + Axy=gauss_smooth(Gxy,win_sig,'same',2); + Ayy=gauss_smooth(Gyy,win_sig,'same',2); + end; + + %%% Find determinant, trace, and eigenvalues of A'A + detA=Axx.*Ayy-Axy.^2; + trA=Axx+Ayy; + V1=0.5*sqrt(trA.^2-4*detA); + lambda0=0.5*trA+V1; lambda1=0.5*trA-V1; + + %%% Compute inner product of gradient with time derivative + It=I2-I1; IxIt=-Gx.*It; IyIt=-Gy.*It; + if( isempty(win_sig) ) + ATbx=conv2(IxIt,win_mask,'same'); + ATby=conv2(IyIt,win_mask,'same'); + else + ATbx=gauss_smooth(IxIt,win_sig,'same',2); + ATby=gauss_smooth(IyIt,win_sig,'same',2); + end; + + %%% Compute components of velocity vectors + Vx=(1./(detA+eps)).*(Ayy.*ATbx-Axy.*ATby); + Vy=(1./(detA+eps)).*(-Axy.*ATbx+Axx.*ATby); + + %%% Check for ill conditioned second moment matrices + reliab = lambda1; + reliab([1:win_n end-win_n+1:end],:)=0; + reliab(:,[1:win_n end-win_n+1:end])=0; + Vx(reliabthr ) = thr; + %figure(show); show=show+1; clf; im( log(reliab2+eps) ); + %figure(show); show=show+1; clf; im( reliab ); + end + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% OLD LOOP VERSION OF ABOVE +% % % %%% gradient of E wrt x,y, +% % % [gEy,gEx] = gradient( I1 ); +% % % Et = (I2 - I1); +% % % reliab = zeros( size(I1)-2*n ); +% % % Vx = reliab; Vy = reliab; +% % % +% % % %%% loop over each window +% % % for r= 1:size(I1,1)-2*n +% % % for c=1:size(I1,2)-2*n +% % % gEx_rc = gEx(r:r+2*n, c:c+2*n); +% % % gEy_rc = gEy(r:r+2*n, c:c+2*n); +% % % Et_rc = Et(r:r+2*n, c:c+2*n); +% % % +% % % A = [ gEx_rc(:), gEy_rc(:) ]; +% % % b = -Et_rc(:); +% % % +% % % AtA = A'*A; detAtA = AtA(1)*AtA(4)-AtA(2)*AtA(3); +% % % if( detAtA < eps ) +% % % v = [0 0]; +% % % reliab(r,c)=0; +% % % else +% % % invA = ([AtA(4) -AtA(2); -AtA(3) AtA(1)] / detAtA) * A'; +% % % v = invA * b; +% % % lambdas = eig(A'*A); +% % % reliab(r,c) = min(lambdas); %abs(min(lambdas)/max(lambdas)); +% % % end +% % % +% % % % record results +% % % Vx(r,c) = v(2); +% % % Vy(r,c) = v(1); +% % % end; +% % % end; +% % % reliab = reliab / max([reliab(:); eps]); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/images/playmovie.m b/images/playmovie.m new file mode 100644 index 00000000..fe89ed5b --- /dev/null +++ b/images/playmovie.m @@ -0,0 +1,53 @@ +% [3D] shows the image sequence I as a movie. +% +% To play a matlab movie file, as an alternative to movie, use: +% playmovie(movie2images(M)); +% +% INPUTS +% I - MxNxT or MxNx1xT or MxNx3xT array (of images) +% fps - [optional] maximum number of frames to display per second +% use fps==0 to introduce no pause and have the movie play as fast as possible +% loop - [optional] number of time to loop video (may be inf), +% if neg plays video forward then backward then forward etc. +% +% EXAMPLE +% load( 'images.mat' ); +% playmovie( videos(:,:,:,1) ); +% playmovie( video(:,:,1:3), [], -50 ); +% +% DATESTAMP +% 5-May-2006 11:10pm +% +% See also MONTAGE2, PLAYMOVIES, MAKEMOVIE, MOVIE2IMAGES, MOVIE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function playmovie( I, fps, loop ) + if( nargin<2 || isempty(fps)) fps = 100; end; + if( nargin<3 || isempty(loop)) loop = 1; end; + + nd=ndims(I); siz=size(I); nframes=siz(end); + if( iscell(I) ) error('cell arrays not supported.'); end; + if( ~(nd==3 || (nd==4 && any(size(I,3)==[1 3]))) ) + error('unsupported dimension of I'); end; + inds={':'}; inds=inds(:,ones(1,nd-1)); + clim = [min(I(:)),max(I(:))]; + + h=gcf; colormap gray; figure(h); % bring to focus + nplayed=0; + while( nplayed < abs(loop) ) + if( loop<0 && mod(nplayed,2)==1 ) + order = nframes:-1:1; + else + order = 1:nframes; + end; + for i=order + geth=get(h); %figure was closed, cannot continue display + imagesc(I(inds{:},i),clim); axis('image'); + title(sprintf('frame %d of %d',i,nframes)); + if(fps>0) pause(1/fps); else pause(eps); end; + end; + nplayed=nplayed+1; + end; diff --git a/images/playmovies.m b/images/playmovies.m new file mode 100644 index 00000000..d3fd2ae8 --- /dev/null +++ b/images/playmovies.m @@ -0,0 +1,50 @@ +% [4D] shows R videos simultaneously as a movie. +% +% INPUTS +% I - MxNxTxR or MxNx1xTxR or MxNx3xTxR array (if MxNxT calls playmovie) +% fps - [optional] maximum number of frames to display per second +% use fps==0 to introduce no pause and have the movie play as fast as possible +% loop - [optional] number of time to loop video (may be inf) +% if neg plays video forward then backward then forward etc. +% +% EXAMPLE +% load( 'images.mat' ); +% playmovies( videos ); +% +% DATESTAMP +% 22-May-2006 5:00pm +% +% See also MONTAGES, PLAYMOVIE, MAKEMOVIES + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function playmovies( I, fps, loop ) + if( nargin<2 || isempty(fps)) fps = 100; end; + if( nargin<3 || isempty(loop)) loop = 1; end; + + nd=ndims(I); siz=size(I); nframes=siz(end-1); + if( nd==3 ) playmovie( I, fps, loop ); return; end; + if( iscell(I) ) error('cell arrays not supported.'); end; + if( ~(nd==4 || (nd==5 && any(size(I,3)==[1 3]))) ) + error('unsupported dimension of I'); end; + inds={':'}; inds=inds(:,ones(1,nd-2)); + clim = [min(I(:)),max(I(:))]; + + h=gcf; colormap gray; figure(h); % bring to focus + nplayed=0; + while( nplayed < abs(loop) ) + if( loop<0 && mod(nplayed,2)==1 ) + order = nframes:-1:1; + else + order = 1:nframes; + end; + for i=order + geth=get(h); %figure was closed, cannot continue display + montage2(squeeze(I(inds{:},i,:)),1,[],clim); + title(sprintf('frame %d of %d',i,nframes)); + if(fps>0) pause(1/fps); else pause(eps); end; + end; + nplayed=nplayed+1; + end; diff --git a/images/private/assign2binsc.c b/images/private/assign2binsc.c new file mode 100644 index 00000000..46307177 --- /dev/null +++ b/images/private/assign2binsc.c @@ -0,0 +1,85 @@ +/********************************************************************* +* DATESTAMP 29-Sep-2005 2:00pm +* Piotr's Image&Video Toolbox Version 1.0 +* Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +* Please email me if you find bugs, or have suggestions or questions! +*********************************************************************/ + +#include "mex.h" + + +/* + * Return index of bin for x. The edges are determined by the (nbins+1) + * element vector edges. Returns an integer value k in [0,nbins-1] + * representing the bin x falls into, or k==nbins if x does not fall + * into any bin. if edges[k] <= x < edges[k+1], then x falls + * into bin k (k= edges[0] && x < edges[nbins]) { + k = (k0+k1)/2; + while (k0 < k1-1) { + if (x >= edges[k]) k0 = k; + else k1 = k; + k = (k0+k1)/2; + } + k = k0; + } + + /* check for special case */ + if (x == edges[nbins]) + k = nbins-1; + + return k; +} + + + +/* + * Please see accompanying m file for usage. + */ + +/* find out what bin each element in A falls into */ +void assign2bins( double *B, double* A, double* edges, int nelements, int nbins ) +{ + int j; + for( j=0; j < nelements; j++) + B[j] = (double) findBin( A[j], edges, nbins ); +} + + + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, + const mxArray *prhs[]) +{ + /* Declare variables. */ + int nelements, nbins; + double *A, *B, *edges; + + /* Error checking on arguments */ + if (nrhs != 2) + mexErrMsgTxt("Two input arguments required."); + if (nlhs > 1) + mexErrMsgTxt("Too many output arguments."); + + /* extract arguments */ + A = (double *) mxGetData(prhs[0]); + nelements = mxGetNumberOfElements(prhs[0]); + edges = (double *) mxGetData(prhs[1]); + nbins = (int) mxGetNumberOfElements(prhs[1]) -1; + + /* create output array */ + /* Note extra bin, this is for values outsider range of edges */ + plhs[0] = mxCreateDoubleMatrix(1, nelements, mxREAL ); + B = (double *) mxGetData(plhs[0]); + + /* calculate the histograms */ + assign2bins( B, A, edges, nelements, nbins ); +} diff --git a/images/private/assign2binsc.dll b/images/private/assign2binsc.dll new file mode 100644 index 0000000000000000000000000000000000000000..9bfc77cfb7f8e9652287ab1aee4bdf81f11a981d GIT binary patch literal 6144 zcmeHLe{36f6@N}|#aS=GV*xr8%5_So3Lz`L#S-mOcp4WnSD0r zyCf4aitv!IZXub3wlX2KQUw2O`-5&$hQt)%h%951h6GHZ3mZRmk|S1_w|L0P@%esj zw-;>#2{CO#`AYA;?|r`Sz3+SPd+*NY6X)h>2N4M%$01t4%tnY`|NUhK%dMaJX)8U| z{NmmPPw$I+!|_B`%IN7aJ(`k6qMDXAq+wOkO-)K@QqReLDV2_?{+5bW;+(6&`iB5Lxh zHGjO8Fy!+m-k}%Tifl_CmI^Ge1}X*?LsoBxuyI&mEoXex>gn)W;SOJ+X@NCSv48M1 zAYb43W_%}FFXjYU{ISA5Hep4w&UmeinBQ~^=^mq_!}!!}*Mucrg;TF}T+B~j707(q z319V=eifTzw>;&S#GwmcDGn6=0_OwcG*0nLaP630+eRNmuvl1+6su6kuX~w}6%j4P zyAk3snyG?Pu@qlHsm>~u!jY<#6|Jv%Sp>tg;zWLWP9Wpp;K1yCJ|{dUL@vO(dC}NE z6@XU1{Y}Sl@=F3%2m9?kT=2ro66UNUA`HCHVsh79>G8l~=?>;+-08R9*kpF%_%8bq z1PKp~IBR+2bE3z*#lDl}mlFx>6JQ+^X^F_}GCI@eyoA(Nel8NvOgxR$-?Cfa4GDpN z)5e1jd=-4zeiP*{DCPJbW@uLIRmfMo5aR6|soKj75pE)7`)MHgrOqoNKI}OdI(vAtuzYN`{hqo4nZL1erpi_%^3 zAa`ypMyev z$(vUyf;CW`ZNL3SEI+UYD$ByhnHC$ok=V%=Sv|NEX&mxyv`?-Ln=dOBrptx$n&MrH z*jCQBCh)ypiP*2c_Wj9G%WPW{Hfqwu8N^bk>`=--*)gx%f9I{=#;O7xXI~{m zzWI5u;Hxg44&TH@7r)!Zx4U@B#edGlce?m47yo$|-|gZifZ>uY17DmxC{FtFg(R*!G)azhNl_5;KB@GczXTMMi{=5pedKn zc^Cf}_$NWnxv*b@|2^nB=${|~F}1Q-K@#Y*pvHJV{l7%1sUx}?HPoK8Ih<5aL=8PL zMbz#|O&wE>9`->Os_|bkQ^Tr$a#TsGyo2ZfrPL`!*H2`}!t4VvNy=2h=+o09YBo!M zBG@b1L_$w%OurwFwXrO6{j2AcksQz_6IzT68XAqIGpa^=JVR_AN@qvoQ7x8K=~>U{ zNHU#O@z(OBqDlUZcQ*}!`bg$}#FQ9L zP5EQVB>Q^yHHe{V9c}}DpQ>wW@@~1NxF1M^j+_ej^!EBeMBTvu6E)6kdwzc^Al2RS z*$07rzq21g-JtF9|6Ku`H`_G59z3{e*jl|K-H)oen8epgb>sN4_L~Pku~>%J%qxE717wb^pcM|EV6t!>AW>A1Dk; zq@rVL_B>t>6L_zkKOfCz6Jwe@oY1l(wI@7Ls*UIjblDifyWps)jTnivRztS0AI1v& E3&&DpO#lD@ literal 0 HcmV?d00001 diff --git a/images/private/findBin.c b/images/private/findBin.c new file mode 100644 index 00000000..8363ae72 --- /dev/null +++ b/images/private/findBin.c @@ -0,0 +1,43 @@ +/********************************************************************* +* DATESTAMP 29-Sep-2005 2:00pm +* Piotr's Image&Video Toolbox Version 1.0 +* Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +* Please email me if you find bugs, or have suggestions or questions! +*********************************************************************/ + +int findBin( double x, double *edges, int nbins ); + +/* + * Return index of bin for x. The edges are determined by the (nbins+1) + * element vector edges. Returns an integer value k in [0,nbins-1] + * representing the bin x falls into, or k==nbins if x does not fall + * into any bin. if edges[k] <= x < edges[k+1], then x falls + * into bin k (k= edges[0] && x < edges[nbins]) { + k = (k0+k1)/2; + while (k0 < k1-1) { + if (x >= edges[k]) k0 = k; + else k1 = k; + k = (k0+k1)/2; + } + k = k0; + } + + /* check for special case */ + if (x == edges[nbins]) + k = nbins-1; + + return k; +} + + + diff --git a/images/private/histc_nD_c.c b/images/private/histc_nD_c.c new file mode 100644 index 00000000..22689ffc --- /dev/null +++ b/images/private/histc_nD_c.c @@ -0,0 +1,154 @@ +/********************************************************************* +* DATESTAMP 29-Sep-2005 2:00pm +* Piotr's Image&Video Toolbox Version 1.0 +* Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +* Please email me if you find bugs, or have suggestions or questions! +*********************************************************************/ + +/* + * Please see accompanying m file for usage. + */ + +#include "mex.h" + + + +/* + * Return index of bin for x. The edges are determined by the (nbins+1) + * element vector edges. Returns an integer value k in [0,nbins-1] + * representing the bin x falls into, or k==nbins if x does not fall + * into any bin. if edges[k] <= x < edges[k+1], then x falls + * into bin k (k= edges[0] && x < edges[nbins]) { + k = (k0+k1)/2; + while (k0 < k1-1) { + if (x >= edges[k]) k0 = k; + else k1 = k; + k = (k0+k1)/2; + } + k = k0; + } + + /* check for special case */ + if (x == edges[nbins]) + k = nbins-1; + + return k; +} + + + + + +/** + * Fast indexing into multidimensional arrays. + * + * Call once and store the result: + * subMul = sub2ind_init( siz, nd ); + * Where siz is an nd length int array of sizes. + * + * Then, to index into an array A of size siz, given a subscript sub + * (where sub is an nd int array of subscripts), you can get the index + * into the array using: + * sub2ind(ind,sub,subMul,nd) + * This macro initializes ind. Note that a looping variable "int k" + * must be previously defined. + */ +#define sub2ind(ind,sub,subMul,nd) ind=sub[0]; for(k=1;k 1) + mexErrMsgTxt("Too many output arguments."); + n = mxGetM( prhs[0] ); nd = mxGetN( prhs[0] ); + if( (mxGetM(prhs[1])!=1 && mxGetN(prhs[1])!=1) || + (mxGetM( prhs[1] )!=n && mxGetN( prhs[1] )!=n) ) + mexErrMsgTxt("weightmask must be a vector of length n (A is nxnd)."); + if( nrhs-2!=nd ) + mexErrMsgTxt("Number of edge vectors must equal nd (A is nxnd)."); + for( i=0; i < nd; i++) + if( mxGetM( prhs[i+2] )!=1 ) + mexErrMsgTxt("edges1 and edges2 must be row vectors."); + + /* extract arguments */ + A = mxGetPr(prhs[0]); + weightmask = mxGetPr(prhs[1]); + + nbins = (int *) mxMalloc( nd * sizeof(int) ); + for( i=0; i < nd; i++) nbins[i] = mxGetN( prhs[i+2] ) -1; + + edges = (double **) mxCalloc( nd, sizeof(double*) ); + for( i=0; i < nd; i++) + edges[i] = mxGetPr(prhs[i+2]); + + plhs[0] = mxCreateNumericArray(nd, nbins, mxDOUBLE_CLASS, mxREAL); + h = mxGetPr( plhs[0] ); + + /* call main function */ + histcND( h, A, weightmask, n, nd, edges, nbins ); + mxFree( nbins ); mxFree( edges ); +} diff --git a/images/private/histc_nD_c.dll b/images/private/histc_nD_c.dll new file mode 100644 index 0000000000000000000000000000000000000000..eafbd08d28d0cd834a447322f87ba1f52ddc46d4 GIT binary patch literal 7168 zcmeHMe{2)i9e++-aKHh#b*B_%^gy9vQfI~200x4Tj9fue=rZE)qs0VcUt$OU$j)~m z9k~kC>ZaQ@1yxhW_+t|wv2N->8f;3}E=`+kDJzwz)NN!}wq$G6dW}0-xqaR{ z8!l?uv}u}9mnVJwzVGwCzuylh&pRGDPRa=(PLOF5GJu}82KM>SKaOI0*?m7DK4Jkn!eP^CDT#SS6R8Frf9lFAf(x` zi2UW*y-g)=*T}L}OC1g;Spvjuq1*37?*Y}av4`_@mky+F^#%_qgCkWi0@-O7 zmC-|PU2x4duo#u3CggR&qX~t6A+K#M=oz|aow@0=lw%d_fk7uW~=eR z9MyAoEj2n3BrKHTwDQQRZijM*v6|+mx(V1Hf;APSsu@x+zC{t|O(bVL2_!pGd&Uh= z-$JJ(l@dzSqzchS`%?-(mTZ|xP_MW2NP&tg7*q9k) z<2pJXCM=PW+?YDop$l_IFS|RiC}YXO+o9Z8a!wa=mx?meUM%CNkb@&)jA9pP!&+!& zYSq#D&r)cMTy6?E?Op%SNB3TO|J>|Yf8(4sx~;!@b5VdOztYv*w*LB`QE^S3HkE1P zMcCPk(w*@j&a9dziW3Xgqr-6UW41K4aKl-xsT2&AYU@f~bFv*>F{G4DZEDrkyjiz} zIx$W_AUop93VEmAR_L$3`$jCM^|t(|^ByWi8#_pJWrt}!*eFz5$R z{BjFD{i<72-Ca)XW8)OA1eAoHKNS^VvC~^*R4CAHiUX`Gg;%bZW&i5bLj~QtLEqt8 ze%|ZXyx+}22*x(5g}$r0kY@#B2cepIse0v)WxI{9GY?L9FqJA(;S9w(p_(u`D$KwK z`O{VAaJuN1LR0%$RXDS5kTKOI#=HFdtTtP&&ghC8CBtnpQC(w1*h%&vP(6g@zrb|z zG~6~$uRgi4dQhnt6{eYGw-t32jrwF(ohC9}7QLROuBit0G|PMis*KH~*AMDSP7h5k zKVN^rp&D6C>ngN!eedY1p)0Qb`nlqw>&lEC@{Bt_n5bsfvce2xy&Kh;3YkKIn zW9f0#n98KF#bR%kjYHY8s;6A7j7{JG7<(*%tm<++UKx9pLV^XsYH3rKTZkr1+rYmg z1$bf0>NO8LjR_0L<{k1qR1VOui!!5G)1lm71b=LSn}ul^OV8xa-GnM*{WORn3&C#B zzE`$c&C8XsM=AcCg=6oqO0Q+h;5Fqzml3k2sQ=1X9Th%OMA#n6)77|QOF*z@H34Ue zMNwA*Cb3#-B=8&FERDf-XoHj}iLj476>6x>)=>E?eraHTIYl^it^V`A8T?&8&hLs43uKFfqATw}sBkjG7jRIVA93-n8< z8k5H7Em2dMvA%RhoYoaY%r&k?;yHdC^Wfb!-ecpvHonTnSKD~b#y?==12(?i#y8mb zW*gsP=TT=7YtN z80{1@elDDfa*XA{1z(N7=ddc=sFmNGu_u#!9|N?f{wNtJL*R{V+*PH-@=wvoe= zL8>iCOUbA6m zf#LQi<2Gyv7;gLjT9aYxDCh*}H0XKIPe4PUQoC&9$HD&@ zA)74jVM4Z9T#H1`g4%TGInkCn98X1wOxio5>25JaRyx{g-=5BN#BkITA{lgaL=x!?Vlo}c zqR$6Odqjj6Jk*tS!=T(j$em?UI1aI@vWzGnRDj%HmXW1MH}Xov4<>tk(L{p2ym@X# zR7xz0c_DX5lu}~iLEcha3#3F_cLtl9n|&Zc>Vf|&Dy{cIf3pHyk!3x7Go;AX>zw>|Szl&eZ^ZYOQ*VnzXF0%f}`sddF zcEj}z?{Apfuq5!A!0Lc6uqp6RU}s=|pexW5cp~t0;AG%z;75VM0Np?A>7MSR25UQg zm4BRng8v%-4gP8V8U8eXkssh+;xF@8__z40{5XG&pX3dGn*Vec{PxSP^xMnY1J>^; z4unW)JI2kR7EnAH#vgtAaK-oFyK3J){Lmvu+EY#K5$jHV5f5QO$kEo0yZa#}6_MlV Ml!YvO-mVq+2l}Ak%K!iX literal 0 HcmV?d00001 diff --git a/images/private/mask_ellipse1.c b/images/private/mask_ellipse1.c new file mode 100644 index 00000000..95d3717e --- /dev/null +++ b/images/private/mask_ellipse1.c @@ -0,0 +1,119 @@ +/********************************************************************* +* DATESTAMP 29-Sep-2005 2:00pm +* Piotr's Image&Video Toolbox Version 1.0 +* Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +* Adapted from code by: Kristin Branson || kbranson-at-cs.ucsd.edu +* Please email me if you find bugs, or have suggestions or questions! +*********************************************************************/ + +#include "mex.h" +#include + +#define max(a,b) a>b ? a : b + +unsigned int get_ellipse_interior_inds(int* interior_pnts, int mrows, int ncols, + double crow, double ccol, double theta, double a, double b) { + + /* Stuff for finding the leftmost and rightmost ellipse interior points */ + double denom, sint, cost, coladd; + int colsmall, colbig; + + /* Stuff for finding the upper and lower ellipse interior points */ + double A, B, C; + double rowsmall, rowbig, temp; + + /* other variables */ + int row, col; /* looping */ + double costheta, sintheta, tantheta; /* angle */ + int max_interior_pts = mrows * ncols; /* max # of possible points */ + int ninterior_pnts; /*actual # of points found */ + + + /* angles */ + theta = 3.14159265 - theta; + costheta = cos(theta); sintheta = sin(theta); tantheta = sintheta/costheta; + + + /* Find the leftmost and rightmost points of the ellipse */ + denom = sqrt(pow(a,2)*pow(costheta,2) + pow(b,2)*pow(sintheta,2)); + sint = b*sintheta/denom; cost = a*costheta/denom; + coladd = a*costheta*cost + b*sintheta*sint; + if(coladd < 0) coladd = -coladd; + colsmall = ceil( ccol - coladd ); colbig = floor( ccol + coladd ); + if(colsmall < 1) colsmall = 1; if(colbig > ncols) colbig = ncols; + + /* Find the top and bottom points for each c */ + ninterior_pnts = 0; + for(col = colsmall; col <= colbig; col++) { + + /* get A,B,C */ + A = (col-ccol)/(a*costheta); + B = b/a*tantheta; + C = pow(B,2)-pow(A,2)+1; + if(C < 0){ mexErrMsgTxt("inside of sqrt less than 0!"); return 0; } + + /* calculate start and end of row */ + rowsmall = crow - a * sintheta * (A-B*sqrt(C))/(B*B+1) + b * costheta * (A*B+sqrt(C))/(B*B+1); + rowbig = crow - a * sintheta * (A+B*sqrt(C))/(B*B+1) + b * costheta * (A*B-sqrt(C))/(B*B+1); + if (rowsmall>rowbig) {temp=rowsmall; rowsmall=rowbig; rowbig=temp; } + rowsmall = ceil(rowsmall-.0001); rowbig = floor(rowbig+.0001); + if(rowsmall < 1) rowsmall = 1; if(rowbig > mrows) rowbig = mrows; + + /* Add points in between top and bottom for this c */ + for(row = (int) rowsmall; row <= (int) rowbig; row++){ + interior_pnts[ninterior_pnts] = row; + interior_pnts[ninterior_pnts+max_interior_pts] = col; + ninterior_pnts++; + } + } + + return ninterior_pnts; +} + + + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + int i; + + /* ellipse parameters */ + double crow, ccol, theta, a, b; + + /* image size */ + int mrows, ncols; + + /* will contain ouput */ + int *interior_pnts; + unsigned int ninterior_pnts; + + + /* Error checking on arguments */ + if (nrhs != 7) + mexErrMsgTxt("7 input arguments required."); + if (nlhs > 2) + mexErrMsgTxt("Too many output arguments."); + for( i=0; i<7; i++ ) { + if (mxIsComplex(prhs[i]) || !(mxGetM(prhs[i])==1 && mxGetN(prhs[i])==1)) + mexErrMsgTxt("Input must be a noncomplex scalar."); + } + + + /* extract arguments (ellipse paramters) */ + crow = mxGetScalar( prhs[0] ); + ccol = mxGetScalar( prhs[1] ); + a = mxGetScalar( prhs[2] ); + b = mxGetScalar( prhs[3] ); + theta = mxGetScalar( prhs[4] ); + + /* extract arguments (image size) */ + mrows = mxGetScalar( prhs[5] ); + ncols = mxGetScalar( prhs[6] ); + + /* create output array */ + plhs[1] = mxCreateNumericMatrix( mrows * ncols, 2, mxINT32_CLASS, mxREAL ); + interior_pnts = (int*) mxGetData(plhs[1]); + + /* get actual points inside of ellipse */ + ninterior_pnts = get_ellipse_interior_inds( interior_pnts, mrows, ncols, crow, ccol, theta, a, b); + plhs[0] = mxCreateDoubleScalar( ninterior_pnts ); +} diff --git a/images/private/mask_ellipse1.dll b/images/private/mask_ellipse1.dll new file mode 100644 index 0000000000000000000000000000000000000000..4805ff4e13c2e1b707626e800067ac126ff48c53 GIT binary patch literal 7680 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 literal 0 HcmV?d00001 diff --git a/images/private/nlfilt_sep.m b/images/private/nlfilt_sep.m new file mode 100644 index 00000000..05656727 --- /dev/null +++ b/images/private/nlfilt_sep.m @@ -0,0 +1,76 @@ +% Efficient multidimensional nonlinear but seperable filtering operation. +% +% The concept of a nonlinear seperable filter is not very common, but nevertheless can +% prove very useful since computation time can be reduced greatly. Consider a funciton +% like max that is applied to a 2 dimensional window. max could also be applied to each +% row of the window, then to the resulting column, insead of being applied to the entire +% window simultaneously. This is what is meant here by a seperable nonlinear filter. +% +% The function fun must be able to take an input of the form +% C=fun(I,radius,param1,...paramk). The return C must have the same size as I, and each +% element of C must be the result of applying the nlfilt operation to the local column (of +% size 2r+1) of A. +% +% For example: +% % COMPUTES LOCAL SUMS: +% C = nlfilt_sep( I, dims, shape, @rnlfilt_sum ); +% +% % COMPUTES LOCAL MAXES: +% C = nlfilt_sep( I, dims, shape, @rnlfilt_max ); +% +% INPUTS +% I - matrix to compute fun over +% dims - size of volume to compute fun over +% shape - 'valid', 'full', or 'same', see conv2 help +% fun - nonlinear filter +% params - optional parameters for nonlinear filter +% +% OUTPUTS +% I - resulting image +% +% DATESTAMP +% 26-Jan-2006 2:00pm +% +% See also NLFILTBLOCK_SEP, RNLFILT_SUM, RNLFILT_MAX + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + + +function I = nlfilt_sep( I, dims, shape, fun, varargin ) + params = varargin; nd = ndims(I); siz = size(I); + [dims,er] = checknumericargs( dims, size(siz), 0, 1 ); error(er); + rs1 = max(0,floor( (dims-1)/2 )); rs2 = ceil( (dims-1)/2 ); + + % pad I to 'full' dimensions, note must pad pre with rs2! + if(strcmp(shape,'valid') && any(dims>size(I)) ) I=[]; return; end; + if(strcmp(shape,'full')) + I = padarray(I,rs2,0,'pre'); + I = padarray(I,rs1,0,'post'); + end + + % Apply filter along each dimension of I. Actually filter + % is always applied along first dimension of I and then I is shifted. + for d=1:nd + if( dims(d)>0 ) + siz = size(I); + I = feval( fun, I, rs1(d), rs2(d), params{:} ); + I = reshape( I, siz ); + end + I = shiftdim( I, 1 ); + end + + % crop to appropriate size + if(strcmp(shape,'valid')) + I = arraycrop_full( I, rs1+1, size(I)-rs2 ); + elseif(~strcmp(shape,'full') && ~strcmp(shape,'same')) + error('unknown shape'); + end; + + + + + + + diff --git a/images/private/nlfiltblock_sep.m b/images/private/nlfiltblock_sep.m new file mode 100644 index 00000000..267eff1b --- /dev/null +++ b/images/private/nlfiltblock_sep.m @@ -0,0 +1,54 @@ +% Efficient multidimensional nonlinear but seperable filtering operation. +% +% See nlfilt_sep for a basic discussion of the he concept of a nonlinear +% seperable filters. This is similar, instead applies operations to +% nonoveralpping blocks (versus a sliding window approach in which all +% overlapping blocks are considered). Also, as opposed to nlfilt_sep, the +% output returned by this function is smaller then the input I. +% +% The function fun must be able to take an input of the form +% C=fun(I,radius,param1,...paramk). The return C must be the result of +% applying the nlfilt operation to the local column (of size 2r+1) of A. +% +% For example: +% % COMPUTES LOCAL BLOCK SUMS (see localsum_block): +% I = nlfiltblock_sep( I, dims, @rnlfiltblock_sum ); +% +% INPUTS +% I - matrix to compute fun over +% dims - size of volume to compute fun over +% fun - nonlinear filter +% params - optional parameters for nonlinear filter +% +% OUTPUTS +% I - resulting image +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also NLFILT_SEP, RNLFILTBLOCK_SUM + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function I = nlfiltblock_sep( I, dims, fun, varargin ) + nd = ndims(I); siz = size(I); + [dims,er] = checknumericargs( dims, size(siz), 0, 1 ); error(er); + params = varargin; + + % trim I to have integer number of blocks + dims = min(dims,siz); siz = siz - mod( siz, dims ); + if (~all( siz==size(I))) I = arraycrop_full( I, ones(1,nd), siz ); end; + + % Apply rnlfiltblock filter along each dimension of I. Actually filter + % is always aplied along first dimension of I and then I is shifted. + for d=1:nd + if( dims(d)>1 ) + siz = size(I); siz(1) = siz(1)/dims(d); + I = feval( fun, I, dims(d), params{:} ); + I = reshape( I, siz ); + end + I = shiftdim( I, 1 ); + end + diff --git a/images/private/rnlfilt_max.c b/images/private/rnlfilt_max.c new file mode 100644 index 00000000..7266c28d --- /dev/null +++ b/images/private/rnlfilt_max.c @@ -0,0 +1,113 @@ +/********************************************************************* +* DATESTAMP 29-Sep-2005 2:00pm +* Piotr's Image&Video Toolbox Version 1.0 +* Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +* Please email me if you find bugs, or have suggestions or questions! +*********************************************************************/ + + +#include "mex.h" + +/* + Please see accompanying m file for usage. + + Row non-linear seperable filter - max (see nlfilt_sep) + + Given an mxn array A and a radius r, replaces each element A[i] with + the maximum value in A within r elements of i along the FIRST dimension - + ie along each ROW. + + Example: + >> rnlfilt_max( [ 1 9; 5 9; 0 0; 4 8; 7 3; 2 6], 1 ) + ans = + 5 9 + 5 9 + 5 9 + 7 8 + 7 8 + 7 6 + + Note that A must have type double. Works for multidimensional + arrays but will need to reshape output. +*/ + + +#define max(A,B) ( (A) > (B) ? (A):(B)) +#define min(A,B) ( (A) < (B) ? (A):(B)) +#define arraymax(A,m,s,e,i) m=A[s]; for(i=s+1; i<=e; i++) { m=((A[i])>(m)?(A[i]):(m)); }; + +/** + * B(i,j) is the max of A(i-r1:i+r2,j). It has the same dimensions as A. + * For efficiency, the leading and ending border calculations are done separately + * (these require an if statement every iteration). Works even if r1 or r2 is as big + * as A, except in this case no 'main calculations' are done and there is some + * duplication of effort. + */ +void rnlfilt_max( const double *A, double *B, const int r1, const int r2, + const int mrows, const int ncols ) +{ + int i; + double m; + int rowstart, e, s; + int rowi, coli; + + for( coli=0; coli 1) + mexErrMsgTxt("Too many output arguments."); + mrows = mxGetM( prhs[0] ); ncols = mxGetN( prhs[0] ); + if (mxIsComplex(prhs[1]) || !(mxGetM(prhs[1])==1 && mxGetN(prhs[1])==1)) + mexErrMsgTxt("2nd input must be a noncomplex scalar."); + if (mxIsDouble(prhs[0])==0) + mexErrMsgTxt("Input array must be of type double."); + + /* extract arguments */ + A = (double *) mxGetData(prhs[0]); + r1 = (int) mxGetScalar(prhs[1]); + r2 = (int) mxGetScalar(prhs[2]); + + /* create output array */ + plhs[0] = mxCreateDoubleMatrix(mrows, ncols, mxREAL ); + B = (double *) mxGetData(plhs[0]); + + /* Apply filter */ + rnlfilt_max( A, B, r1, r2, mrows, ncols ); +} diff --git a/images/private/rnlfilt_max.dll b/images/private/rnlfilt_max.dll new file mode 100644 index 0000000000000000000000000000000000000000..3ae7dcc12cd172b179847955f215a78c5151beee GIT binary patch literal 6656 zcmeHLeQXow8GoIaV2TsW$fgu!?5F}lV)EkS;}!~&X>x;hVT&4vuVE4=zF?>JIXmA$ z=s3pYee`sRg1Ty;Z9=0=npClm3N+EKt0EGS(vOM#v97d9n{6Gs&Jjh_19y12{oXqt z9BS#bZmOy+uk_seJiq7TeV*su_f33Tb{-~`gb**tGzmF_nU1ja{NTqSsB1p+bPYK@ z@1><@JgqM+jU3omJOMF25HoAEs<^ZVCk^>fBL5RmzTlrgTKc2K03|g1vME$6P zHJ7I@LgEw-6Y_V&x#MUf5+zjR&j^{ihJrr*HP> z4xI85O~q$SBZ(-K+H`cZ1cThP zkJ{)_zs~!vhpilyw8j^8KA`cXA-#SaWOXSN&f z%uqjn-+beTND>j8JncGis^6o`G47%DseS_XXJAbQW%*Irah%M6c>$%JKkFw}W&Uj_ z{hF~5(NGZhzZr8Zz68Etyo+9Gd?B%fIx0nD67mTjghaiCl#CZB;=P3wjHiI)#u`uf z0qPs5YMv?2?<3occPx!h-#}FW0~CDS292G_wDbJvaZ5KM&uudvfo8{Xx*9qMdBBpb zfR>z~@+h$i87o{=XL@yh=Fp4&Uc8ix>C$V_!o~EA&KJ&?ZKiAS8prtp79z$CTz1;1 z7QK>RdT9NpDYQYZH2H$|Mrh>SyU$-b%y17`Rsg#T-skg2aHLta!=Zz>8`E~8O zS~OR0pohd zHK41tnp&%?b(&hItM!^%Kh953_qVF>M+o?WU#JtPY@9bN^t*WKs!<6ar7m~b({x?E z3$k{jGFqFj(xY{`yhn?^sjJhv;+yo&Oh&JO&y9OfY5sG%TB0z2WukuOjj3bVnleD` zF667Az&y!cfLD$$dEi;8zS*Rf4xY2tL`*-msh`R52DEj#w>?d2K%JvU1J2@2QDed2 zP8=YsJ|i!~bEO)nye%P$=*sla0q#TQMH_&SG_}$9Pi>`I+oT!?zKJZsBGH^l4p!Te zb^~3?&-pd&s1`Ne((R@qDQaZ*b0tc0ET(jI>h=Pr{-f+^-#$2dq`qJcnbl zRYbqx=dwCxBe>bhp`WyY$>`K1KXt@-;)ZD+!7;G3KI40i_LWKgl_SQWtu^{^vli(o zZnpG(Y}fKR)>XgLf>q8^S8QWbF>q~|3dDl3yF{<^I{VlXbD3`=2^>BQ5Ac2$A8_%t zF22si*SmPe#edetf8NEfcky8t-|FJqTztgEZ+G##Tzr>{kGuGUi%;F;X`Qp<|GNW` zMb59H+xxIAOUOPV-42$e`^A1mW@3^Q+s~wxto0Kw)62;F`voSRQMyw?kg#GLKl!Mg zV-aJ-jM$S&_osvbCfgHB#iSsKWHL-TChli4ifjknqof5<&O()t1fd)wCY51E627J+ zB_SSs-^^ygf42ii!?!#hzK;;xfaDn$_G4hU!N_wi?3ciBlaUD*_B=4$T>rHpBi113 zDClv}Nzl`v=RnSQ*~MQ1UjWr04`(a}-vC+*3WFX1ML@ejy`X-OGd{}oE|By2w7)yUnb;BHrH;Q9TJ0df412^P^8zA?0AGU zk+d+tOVXC?o(TQSkRtp*Qf`wnJwi51{!Fk6FYZlB8Ic~gb}TRM$)bCgJP*pL4sl;n zj1!r3_Qo^)f=HHlI_cb*$@V5x0UPWMDAhk zJKUq(G42WOSKL|dx7@4TCGIMRfY?9QXG*${!uEFh7W)W0$R1`NV~?^wVo$QqvS-> rnlfilt_sum( [ 1 9; 5 9; 0 0; 4 8; 7 3; 2 6], 1 ) + ans = + 6 18 + 6 18 + 9 17 + 11 11 + 13 17 + 9 9 + + Note that A must have type double. Works for multidimensional + arrays but will need to reshape output. +*/ + + +#define max(A,B) ( (A) > (B) ? (A):(B)) +#define min(A,B) ( (A) < (B) ? (A):(B)) +#define arraysum(A,m,s,e,i) m=0; for(i=s; i<=e; i++) { m+=A[i]; }; + +/** + * B(i,j) is the sum of A(i-r1:i+r2,j). It has the same dimensions as A. + * This can be implemented effiicently because: + * B[i] = B[i-1] + A[i+r2] - A[i-r1-1]; + * Of course this trick does not work on the initial initial (r1+1) values + * or the last (r2) values in each row. Works even if r1 or r2 is as big + * as A, except in this case no 'main calculations' are done and there is + * some duplication of effort. + */ +void rnlfilt_sum( const double *A, double *B, const int r1, const int r2, + const int mrows, const int ncols ) +{ + int i; + double m; + int rowstart, e, s; + int rowi, coli; + + for( coli=0; coli 1) + mexErrMsgTxt("Too many output arguments."); + mrows = mxGetM( prhs[0] ); ncols = mxGetN( prhs[0] ); + if (mxIsComplex(prhs[1]) || !(mxGetM(prhs[1])==1 && mxGetN(prhs[1])==1)) + mexErrMsgTxt("2nd input must be a noncomplex scalar."); + if (mxIsDouble(prhs[0])==0) + mexErrMsgTxt("Input array must be of type double."); + + /* extract arguments */ + A = (double *) mxGetData(prhs[0]); + r1 = (int) mxGetScalar(prhs[1]); + r2 = (int) mxGetScalar(prhs[2]); + + /* create output array */ + plhs[0] = mxCreateDoubleMatrix(mrows, ncols, mxREAL ); + B = (double *) mxGetData(plhs[0]); + + /* Apply filter */ + rnlfilt_sum( A, B, r1, r2, mrows, ncols ); +} diff --git a/images/private/rnlfilt_sum.dll b/images/private/rnlfilt_sum.dll new file mode 100644 index 0000000000000000000000000000000000000000..ac38a76b1da55cdbdec351be41e799ed348769cb GIT binary patch literal 6656 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 rnlfiltblock_sum( [ 1 9; 5 9; 0 0; 4 8; 7 3; 2 6], 3 ) + + ans = + 6 18 + 13 17 + + Note that A must have type double. Works for multidimensional + arrays but will need to reshape output. +*/ + + +#define max(A,B) ( (A) > (B) ? (A):(B)) +#define arraysum(A,m,s,e,i) m=0; for(i=s; i<=e; i++) { m+=A[i]; }; + +void rnlfiltblock_sum( const double *A, double *B, const int d, const int mrows, const int ncols ) +{ + int i; + double m; + + int Aoffset, Boffset; + int coli, blocki; + int nblocks; + + /* get dimensions of blocks */ + nblocks = mrows / d; + + /* scan over all columns */ + for( coli=0; coli 1) + mexErrMsgTxt("Too many output arguments."); + mrows = mxGetM( prhs[0] ); ncols = mxGetN( prhs[0] ); + if (mxIsComplex(prhs[1]) || !(mxGetM(prhs[1])==1 && mxGetN(prhs[1])==1)) + mexErrMsgTxt("2nd input must be a noncomplex scalar."); + if (mxIsDouble(prhs[0])==0) + mexErrMsgTxt("Input array must be of type double."); + + /* extract arguments */ + A = (double *) mxGetData(prhs[0]); + d = (int) mxGetScalar(prhs[1]); + + /* create output array */ + plhs[0] = mxCreateDoubleMatrix(mrows/d, ncols, mxREAL ); + B = (double *) mxGetData(plhs[0]); + + /* Apply filter */ + rnlfiltblock_sum( A, B, d, mrows, ncols ); +} diff --git a/images/private/rnlfiltblock_sum.dll b/images/private/rnlfiltblock_sum.dll new file mode 100644 index 0000000000000000000000000000000000000000..9715428f297d78c4b00370dbb05d390af0925fba GIT binary patch literal 6656 zcmeHLe{3699sk;Oi%Tz=M+0P4R<2W86@*NDi^JNc!(DQ;g9O6jv}uX!IPp1lYM;IH zU7A9#R22c65;epXB0Rsnzy#j*e{VogefKL7pWICj^5;!-VK zSo`v(i=K{`H$~H#B3qF1LsBBg4kkn~FS7#zD=8wI5!v=HceA;CQV7=6e7Mmu-NgfR zc-Fx6r}wv4XPbxGP3t@!ANY}BYmCBFe>BlJ!|lRe$m?TyK0pM=nqQCgq#3~5)uho zJ2@c~DJ(`2wAJkOYjW1HmUb^cA^;P?jIBsxMuOH(UaE@yL{Ad3`9UZ4Y7RbD)v#+8 zz#9~7do-6gkk<8g=tXX4R$3pF3|u4!XfiYrF*+K3w|4o+c9ici+8g~wv@xK2FOowv z*}ZokQh~1FrSuv+dPyrx{7>qeNrgSE(d#z~jJ9OS><+oHQQk1tJYq2C(Wu|p!)Qm( z`#|}f6+Q1?_*HUzH5sK%G4X?6o$S&7jK+J0VHnb<(6pua&4*AShMoFiY_ft1+M=K6 z7%|4+{kJ02MunXI$QWPu6AuQ)m=W#hxDVv*dwa$X1+3_}FLn?| zubq&$j)qXH+kC>ZEN#k%y?eXOjkMv%VTNzqXk&1IAGJukd3@nqXky_$VrSUuHvhIn z#xcX|%)j7aMGI9w?Km`*@hGd!2S|J>0|Cyei1rev;0Mw@Cn%OGj& zBwcGQdEGGVGe1Xr{Kihwg=Bz`pR!5w0D2mqnLJJVCgcxwnZLoc-+!9ShMB|m6m3(3 zw0(iJCxHesRhm_oQUoU zENnX7dOx9d%Bw8Cq`wiGc>BJYx1PNdpqxPfaa@;==_SG0<@I4qLifS)Q!PQYz*1v&!*6V7$!Pgm`f$!aVTj#G%^Yg^U!sDoL&rj5OT`e2xRU0i%^Cs=wGkbk5b_0FG zC>GYw@dzu1;=kfsLR#Z19_(7B2DHC=wyBk4Zy4&Lp)ja6*RX`Md(^VVFM2fIM7^uq zRP*R_8b6P?ew#Xf^vU?a8FCi2MHbgcQv+VPCjEWPsQDyb5V+4Z)$ci0ll}&wWSc@? zt6AD&Gq~<9^8PA`vD8_IeP*LWOdkIyC|ewI0b?Wf%N}LDLtR~_(1~6$qxX&(9UYz8 zs!2B!tt<98mkZyt8J*;cy6|0_n2XKN@$=7^kGx}9&**At7|$r)CKaQzgbUJTK1|gZ z%%8I{43(+I8m!vH?N`Ps_|q=@kPElEaKwc>T)4}Hqb}U*!hJ5>@4`tJPP=e+8Iw3y%1Q=SGVs5Zf#~|` zzoOgy-dqGY4ASkS(|S}aC^DOnq{I<6rxfX5ynKq4j}!zpnO6p~LJ&AHiGTTsUR5K( zig|G`pDSdAQMNdk$R?y9MDuwzmk^Jzc}2F34kcC=`qEC%{>FaU>(ae8s6h}pa5c}&jsh=(&`5@d*{ zlKFxl!bVS=)bV^Vl}?DstN_n@QiIuiQNZ6eo?IeJzZ5(O@j(G+!A~~c0veQ40QY*O zL|W;Ey~hh;RyPa8OV(WlUe*?5Wzd>E<&^fN39NZ4hfPdWFO@0fm@NO zO50=6_KuDq3P3CJ|4FJVzf!YK3TREf1(EMJO(?A>E9L(?1GwJ37-6XCM3Wf$QRqVG zr=iQCUxZ!@{ULNS^bzg>j^ke98k#@Te7bqM`9L@omcqxv-w8h*J`;X6d?|c6{Oj=R z;WxuK!`_zKmJKaiTDX>nThJixABJR(?4yWXeT(}xcY-^~J;j~ke!!jMp66cRE_1JP zzvo`({>WY9-sG-xZ*ey{GHj*1e;KHLd*9k`e^2+|)I_?l9YyIy$>b74La`4o_7Qw< w_4P?&HkHZB19+RV!HgO-7R0n*~58UO$Q literal 0 HcmV?d00001 diff --git a/images/texture_map.m b/images/texture_map.m new file mode 100644 index 00000000..0872ee5c --- /dev/null +++ b/images/texture_map.m @@ -0,0 +1,61 @@ +% Maps texture in I according to row_dest and col_dest. +% +% I has (nrows*ncols) coordinates. Each coordinate has an associated intensity value. A +% transformation on I can be defined by giving the destination (r',c') of the intensity +% associated with coordinate (r,c) in I -- ie I(r,c). Applying the transformation, we ask +% what intensity is associated with a coordinate (r0',c0') by interpolating between the +% intensities at the closest coordinates (r',c'). In the function below specify the +% destination of (r,c) by (row_dest(r,c), col_dest(r,c)). +% +% If the inverse mapping is also available -- ie if we can go from the coordinates in the +% destination to the coordinates in the source, then a much more efficient procedure can +% be used to texture_map that involves interp2 instead of griddata. See apply_homography +% for example usage in this case. +% +% The bounding box of the image is set by the BBOX argument, a string that can be 'loose' +% (default) or 'crop'. When BBOX is 'loose', IR includes the whole transformed image, +% which generally is larger than I. When BBOX is 'crop' IR is cropped to include only the +% central portion of the transformed image and is the same size as I. +% +% INPUTS +% I - 2D input image +% row_dest - row_dest(i,j) is row loc where I(i,j) gets mapped to +% col_dest - col_dest(i,j) is col loc where I(i,j) gets mapped to +% bbox - [optional] see above for meaning of bbox ({'loose'},'crop') +% +% OUTPUTS +% IR - result of texture mapping +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also APPLY_HOMOGRAPHY + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function IR = texture_map( I, row_dest, col_dest, bbox ) + if( isa( I, 'uint8' ) ) I = double(I); end; + if( nargin<4 || isempty(bbox)) bbox='loose'; end; + + siz = size(I); + if ( all(size(row_dest)~=siz) || all(size(col_dest)~=siz)) + error( 'incorrect size for row_dest or col_dest' ); + end; + + + % find sampling points + if (strcmp('loose',bbox)) + minr = floor(min(row_dest(:))); minc = floor(min(col_dest(:))); + maxr = ceil(max(row_dest(:))); maxc = ceil(max(col_dest(:))); + [col_grid,row_grid] = meshgrid( minc:maxc, minr:maxr ); + elseif (strcmp('crop',bbox)) + [col_grid,row_grid] = meshgrid( 1:size(I,2), 1:size(I,1) ); + else + error('illegal value for bbox'); + end; + + % Get values at col_samples and row_samples + IR = griddata( col_dest, row_dest, I, col_grid, row_grid ); + IR(isnan(IR)) = 0; diff --git a/images/xcorrn.m b/images/xcorrn.m new file mode 100644 index 00000000..efc832d6 --- /dev/null +++ b/images/xcorrn.m @@ -0,0 +1,39 @@ +% n-dimensional cross-correlation. Generalized version of xcorr2. +% +% For 2 dimensional inputs this function is exactly the same as xcorr2, but also works in +% higher dimensions. It can also be more efficient because it performs convolution in +% either the spatial or frequency domain. +% +% The order of parameters is reversed from normxcorrn. This is to be compatible with the +% matlab functions normxcorr2 anc xcorr2 which take parameters in different orders. +% +% For more information see help on xcorr2.m. +% For example usage see normxcorrn. +% +% INPUTS +% A - first d-dimensional matrix +% T - second d-dimensional matrix +% shape - [optional] 'valid', 'full', or 'same', see convn_fast help +% +% OUTPUTS +% C - correlation matrix +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also XCORR2, NORMXCORRN, XEUCN + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function C = xcorrn( A, T, shape ) + if( nargin < 3 || isempty(shape)) shape='full'; end; + nd = ndims(A); + if( nd~=ndims(T) ) error('A and T must have same number of dimensions'); end; + + % flip for conv purposes [accelerated for 2D] + if( nd==2 ) T = rot90( T,2 ); else for d=1:nd T = flipdim(T,d); end; end; + + % convolve [in frequency or spatial domain] + C = convn_fast( A, T, shape ); diff --git a/images/xeucn.asv b/images/xeucn.asv new file mode 100644 index 00000000..c513a85d --- /dev/null +++ b/images/xeucn.asv @@ -0,0 +1,48 @@ +% n-dimensional euclidean distance between each window in A and template T. +% +% Similar to normxcorrn, except at each point (i,j) calculates the euclidean distance +% between the T and the window in A surrounding the point, storing the result in C(i,j). +% +% The order of parameters is reversed from normxcorrn. This is to be compatible with the +% matlab functions normxcorr2 anc xcorr2 which take parameters in different orders. Also, +% note that normxcorrn gives a similarity matrix, whereas xeucn gives a dissimilarity +% (distance) matrix. +% +% For example usage see normxcorrn. +% +% INPUTS +% A - first d-dimensional matrix +% T - second d-dimensional matrix +% shape - [optional] 'valid', 'full', or 'same', see convn_fast help +% +% OUTPUTS +% C - correlation matrix +% +% DATESTAMP +% 29-May-2005 2:00pm +% +% See also NORMXCORRN, XEUCN, XCORRN + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function C = xeucn( A, T, shape ) + if( nargin < 3 || isempty(shape)) shape='full'; end; + nd = ndims(T); + if( nd~=ndims(A) ) error('T and A must have same number of dimensions'); end; + %if( any(size(T)>size(A)) ) error('T must be smaller than A.'); end; + + % flip for conv purposes [accelerated for 2D] + if( nd==2 ) T = rot90( T,2 ); else for d=1:nd T = flipdim(T,d); end; end; + + % The expression for euclidean distance can be rewritten as: + % D(k,l) = sumj( (Akj - Tlj).^2 ) + % = sumj( Akj.^2 ) + sumj( Tlj.^2 ) - 2*sumj(Akj.*Tlj); + % Tut T is now a constant vector. Hence simply need square of A in each window, as + % well as each dot product between A and T. + A_mag = localsum( A.*A, size(T), shape ); % sum of squares of A per window + T_mag = T.^2; T_mag = sum( T_mag(:) ); % constant (sum of squares of T) + C = A_mag + T_mag - 2 * convn_fast(A,T,shape); % Distance squared + % C( A_mag<.01 ) = T_mag; % prevent numerical errors + C = real(sqrt( C )); diff --git a/images/xeucn.m b/images/xeucn.m new file mode 100644 index 00000000..d378c5c4 --- /dev/null +++ b/images/xeucn.m @@ -0,0 +1,49 @@ +% n-dimensional euclidean distance between each window in A and template T. +% +% Similar to normxcorrn, except at each point (i,j) calculates the euclidean +% distance between the T and the window in A surrounding the point, storing the +% result in C(i,j). +% +% The order of parameters is reversed from normxcorrn. This is to be compatible with the +% matlab functions normxcorr2 anc xcorr2 which take parameters in different orders. Also, +% note that normxcorrn gives a similarity matrix, whereas xeucn gives a dissimilarity +% (distance) matrix. +% +% For example usage see normxcorrn. +% +% INPUTS +% A - first d-dimensional matrix +% T - second d-dimensional matrix +% shape - [optional] 'valid', 'full', or 'same', see convn_fast help +% +% OUTPUTS +% C - correlation matrix +% +% DATESTAMP +% 23-May-2006 2:00pm +% +% See also NORMXCORRN, XCORRN + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function C = xeucn( A, T, shape ) + if( nargin < 3 || isempty(shape)) shape='full'; end; + nd = ndims(T); + if( nd~=ndims(A) ) error('T and A must have same number of dimensions'); end; + %if( any(size(T)>size(A)) ) error('T must be smaller than A.'); end; + + % flip for conv purposes [accelerated for 2D] + if( nd==2 ) T = rot90( T,2 ); else for d=1:nd T = flipdim(T,d); end; end; + + % The expression for euclidean distance can be rewritten as: + % D(k,l) = sumj( (Akj - Tlj).^2 ) + % = sumj( Akj.^2 ) + sumj( Tlj.^2 ) - 2*sumj(Akj.*Tlj); + % T is constant. Hence simply need square of A in each window, as + % well as each dot product between A and T. + A_mag = localsum( A.*A, size(T), shape ); % sum of squares of A per window + T_mag = T.^2; T_mag = sum( T_mag(:) ); % constant (sum of squares of T) + C = A_mag + T_mag - 2 * convn_fast(A,T,shape); % Distance squared + % C( A_mag<.01 ) = T_mag; % prevent numerical errors + C = sqrt(real(C)); diff --git a/matlab/Contents.m b/matlab/Contents.m new file mode 100644 index 00000000..bfa31f5b --- /dev/null +++ b/matlab/Contents.m @@ -0,0 +1,55 @@ +% MATLAB +% See also +% +% Quick clear: +% c - clc +% cc - close all, clc +% ccc - clear, close all, clc, clear global +% +% Convenient [but no faster] replacement of "for loops": +% feval_arrays - Used to apply the same operation to a stack of array elements. +% feval_images - Used to apply the same operation to all images in given directory. +% feval_mats - Used to apply the same operation to all .mat files in given directory. +% +% Timing: +% ticstatus - Used to display the progress of a long process. +% tocstatus - Used to display the progress of a long process. +% +% Array manipulation: +% arraycrop2dims - Pads or crops I appropriately so that size(IC)==dims. +% arraycrop_full - Used to crop a rectangular region from an n dimensional array. +% cell2array - Converts a cell array into a regular array. +% mat2cell2 - Break matrix up into a cell array of same sized matrices. +% +% Display: +% imlabel - Improved method for labeling figure axes. +% plot_ellipse - Adds an ellipse to the current plot. +% plot_gaussellipses - Plots 2D ellipses derived from 2D Gaussians specified by mus & Cs. +% text2 - Wrapper for text.m that ensures displayed text fits in figure. +% figureresized - Creates a figures that takes up certain area of screen. +% +% Miscellaneous: +% checknumericargs - Helper utility for checking numeric vector arguments. +% gauss2ellipse - Creates an ellipse representing the 2D Gaussian distribution. +% getargs - Utility to process parameter name/value pairs. +% ind2sub2 - Improved version of ind2sub. +% int2str2 - Convert integer to string of given length; improved version of int2str. +% isfield2 - More comprehensive version of isfield. +% mode - Returns the mode of a vector. +% normpdf2 - Normal prob. density function (pdf) with arbitrary covariance matrix. +% num2strs - Applies num2str to each element of an array X. +% randint2 - Faster but restricted version of randint. +% randomsample - Samples elements of X so result uses at most maxmegs megabytes of memory. +% randperm2 - Returns a random permutation of integers. +% recover_rotation3D - Takes a rotation matrix and extracts the rotation angle and axis. +% rotation_matrix2D - Returns the matrix: R=[cos(t) -sin(t); sin(t) cos(t)]. +% rotation_matrix3D - Uses Rodrigues's formula to create a 3x3 rotation matrix R. +% simplecache - A very simply cache that can be used to store results of computations. +% sub2ind2 - Improved version of sub2ind. +% +% Thin plate splines: +% tps_getwarp - Given two sets of corresponding points, calculates warp between them. +% tps_interpolate - Apply warp (obtained by tps_getwarp) to a set of new points. +% tps_interpolateimage - Interpolate I_source according to the warp from I_source->I_dest. +% tps_random - Obtain a random warp with the same bending energy as the original. +% diff --git a/matlab/arraycrop2dims.m b/matlab/arraycrop2dims.m new file mode 100644 index 00000000..0d547bd6 --- /dev/null +++ b/matlab/arraycrop2dims.m @@ -0,0 +1,58 @@ +% Pads or crops I appropriately so that size(IC)==dims. +% +% For each dimension d, if size(I,d) is larger then dims(d) then symmetrically crops along +% d (if cropping amount is odd crops one more unit from the start of the dimension). If +% size(I,d) is smaller then dims(d) then symmetrically pads along d with padelement (if +% padding amount is even then pads one more unit along the start of the dimension). +% +% INPUTS +% I - n dimensional array to crop window from +% does not support cell arrays (except for cropping) +% dims - dimensions to make I +% padelement - [optional] element with which to pad (0 by default) +% +% OUTPUTS +% IC - cropped array +% +% EXAMPLE +% I = randn(10); +% delta=1; IC = arraycrop2dims( I, size(I)-2*delta ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also ARRAYCROP_FULL, PADARRAY + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function IC = arraycrop2dims( I, dims, padelement ) + if( nargin<3 || isempty(padelement)) padelement=0; end; + nd = ndims(I); siz = size(I); + [dims,er] = checknumericargs( dims, size(siz), 0, 1 ); error(er); + if(any(dims==0)) IC=[]; return; end; + + % get start and end locations for cropping + start_locs = ones( 1, nd ); end_locs = siz; + for d=1:nd + delta = siz(d) - dims(d); + if ( delta~=0 ) + deltahalf = floor( delta / 2 ); deltarem = delta - 2*deltahalf; + start_locs(d) = 1 + (deltahalf + deltarem); + end_locs(d) = siz(d) - deltahalf; + end + end + + % call arraycrop_full + IC = arraycrop_full( I, start_locs, end_locs, padelement ); + + + + + + + + + + diff --git a/matlab/arraycrop_full.m b/matlab/arraycrop_full.m new file mode 100644 index 00000000..3e63a6ec --- /dev/null +++ b/matlab/arraycrop_full.m @@ -0,0 +1,70 @@ +% Used to crop a rectangular region from an n dimensional array. +% +% Guarantees that the resulting array will have dimensions as specified by rect by filling +% in locations with padelement if the locations are outside of the image. +% +% INPUTS +% I - n dimensional array to crop window from +% start_locs - locations at which to start cropping along each dim +% end_locs - locations at which to end cropping along each dim +% padelement - [optional] element with which to pad (0 by default) +% +% OUTPUTS +% I - cropped array +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also PADARRAY + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function I = arraycrop_full( I, start_locs, end_locs, padelement ) + if( nargin<4 || isempty(padelement)) padelement=0; end; + nd = ndims(I); siz = size(I); + [start_locs,er] = checknumericargs( start_locs, size(siz), 0, 0 ); error(er); + [end_locs,er] = checknumericargs( end_locs, size(siz), 0, 0 ); error(er); + if( any(start_locs>end_locs)) error('start_locs must be <= end_locs'); end; + padelement = feval( class(I), padelement ); + + % crop a real rect [accelerate implementation if nd==2 or nd==3] + start_locsr = max(start_locs,1); end_locsr = min(end_locs, siz); + if( nd==2 ) + I = I( start_locsr(1):end_locsr(1), start_locsr(2):end_locsr(2) ); + elseif( nd==3 ) + I = I( start_locsr(1):end_locsr(1), start_locsr(2):end_locsr(2), start_locsr(3):end_locsr(3) ); + else + extract = cell( nd, 1 ); + for d=1:nd extract{d} = start_locsr(d):end_locsr(d); end + I = I( extract{:} ); + end + + % then pad as appropriate (essentially inlined padarray) + padpre = 1 - min( start_locs, 1 ); + padpost = max( end_locs, siz ) - siz; + if (any(padpre~=0) || any(padpost~=0)) + idx = cell(1,nd); size_padded = zeros(1,nd); siz = size(I); + for d=1:nd + idx{d} = (1:siz(d)) + padpre(d); + size_padded(d) = siz(d) + padpre(d) + padpost(d); + end + Ib = repmat( padelement, size_padded ); + Ib(idx{:}) = I; I = Ib; + end + + +% %%% Alternate method not based on padarray (slower) +% for d=1:nd +% if (start_locs(d) <= 0 ) +% dims = size(I); dims(d) = 1-start_locs(d); +% A = repmat( padelement, dims ); %; A = A( ones(dims) ); +% I = cat(d,A,I); +% end +% if (end_locs(d) - siz(d) > 0) +% dims = size(I); dims(d) = end_locs(d) - siz(d); +% A = repmat( padelement, dims ); % +% I = cat(d,I,A); +% end +% end diff --git a/matlab/c.m b/matlab/c.m new file mode 100644 index 00000000..1f311c91 --- /dev/null +++ b/matlab/c.m @@ -0,0 +1,10 @@ +% clc +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +clc diff --git a/matlab/cc.m b/matlab/cc.m new file mode 100644 index 00000000..40202870 --- /dev/null +++ b/matlab/cc.m @@ -0,0 +1,10 @@ +% close all, clc +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +close all, clc diff --git a/matlab/ccc.m b/matlab/ccc.m new file mode 100644 index 00000000..d3846e44 --- /dev/null +++ b/matlab/ccc.m @@ -0,0 +1,11 @@ +% clear, close all, clc, clear global +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + + +clear, close all, clc, clear global diff --git a/matlab/cell2array.m b/matlab/cell2array.m new file mode 100644 index 00000000..15a4d299 --- /dev/null +++ b/matlab/cell2array.m @@ -0,0 +1,51 @@ +% Converts a cell array into a regular array. +% +% Each element of X must be a regular array, and must have the same number of dimensions +% k. Converts X to an array Y of dimension k+1 where Y(:,:...,:,i) is X{i} padded to be +% as big as the biggest element in X (along each dimension). +% +% Specifically, let di1..dik be the k dimensions of element X{i}. Let dj=max(dij) for +% each j. Then each element of X{i} is padded to have size [d1 ... dk], and then the +% elements of X are stacked into a vector. +% +% Treats the cell array X as a vector (so ignores the layout of X). +% +% INPUTS +% X - cell array where each element is a regular array with dimension k +% padelement - [optional] element with which to pad (0 by default) +% +% OUTPUTS +% Y - resulting array of dimension k+1 +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also MAT2CELL2 + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function Y = cell2array( X, padelement ) + if(~iscell(X)); error('X must be a cell array'); end; + if(iscell(X{1})); error('X must contain regular arrays'); end; + n = numel(X); nd = ndims(X{1}); + for i=2:n if(ndims(X{i})~=nd) error('all elements of X must have same dims'); end; end; + if(nargin<2) padelement=0; end; + + %%% get maximum and minimum size of any element of X + maxsiz = size(X{1}); minsiz = size(X{1}); + for i=1:n + siz = size(X{i}); + maxsiz = max( maxsiz, siz ); + minsiz = min( minsiz, siz ); + end + + %%% construct Y + for d=1:nd inds{d} = 1:maxsiz(d); end; + Y = X{i}(1); Y = repmat( Y, ( [ maxsiz, n ] ) ); + if( all(maxsiz==minsiz) ) + for i=1:n Y( inds{:}, i ) = X{i}; end; + else + for i=1:n Y( inds{:}, i ) = arraycrop2dims( X{i}, maxsiz, padelement); end; + end diff --git a/matlab/checknumericargs.m b/matlab/checknumericargs.m new file mode 100644 index 00000000..daf0b92e --- /dev/null +++ b/matlab/checknumericargs.m @@ -0,0 +1,103 @@ +% Helper utility for checking numeric vector arguments. +% +% Runs a number of tests on the numeric array x. Tests to see if x has all integer +% values, all positive values, and so on, depending on the values for integerflag and +% signflag. Also tests to see if the size of x matches siz (unless siz==[]). If x is a +% scalar, x is converted to a array simply by creating a matrix of size siz with x in each +% entry. This is why the function returns x. siz=M is equivalent to siz=[M M]. +% +% If x does not satisfy some criteria, an error message is returned in er. If x satisfied +% all the criteria er=''. Note that error('') has no effect, so can always use: "[x,er] = +% checknumericargs( x, ... ); error(er);", which will throw an error only if something was +% wrong with x. +% +% INPUTS +% x - numeric array +% siz - [if []]: does not test size of x +% - [if not []]: intended size for x +% integerflag - [if -1]: no need for integer x +% [if 0]: error if non integer x +% [if 1]: error if non odd integers +% [if 2]: error if non even integers +% signflag - [if -2]: entires of x must be strictly negative +% [if -1]: entires of x must be negative +% [if 0]: no contstraints on sign of entries in x +% [if 1]: entires of x must be positive +% [if 2]: entires of x must be strictly positive +% +% OUTPUTS +% x - if x was a scalar it may have been replicated into a matrix +% er - contains error msg if anything was wrong with x +% +% EXAMPLE +% a=1; [a,er] = checknumericargs( a, [1 3], 2, 0 ); a, error(er) +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [x,er] = checknumericargs( x, siz, integerflag, signflag ) + xname = inputname(1); er=''; + if( isempty(siz) ) siz = size(x); end; + if( length(siz)==1 ) siz=[siz siz]; end; + + % first check that x is numeric + if( ~isnumeric(x) ) er = [xname ' not numeric']; return; end; + + % if x is a scalar, simply replicate it. + xorig = x; if( length(x)==1) x = x(ones(siz)); end; + + % regardless, must have same number of x as n + if( length(siz)~=ndims(x) || ~all(size(x)==siz) ) + msg = ['has size = [' num2str(size(x)) '], ']; + msg = [msg 'which is not the required size of [' num2str(siz) ']']; + er = create_errormsg( xname, xorig, msg ); return; + end + + % check that x are [integers] or [odd integers] or [even integers] + switch integerflag + case -1 + ; + case 0 + if( ~all(mod(x,1)==0)) + er=create_errormsg( xname, xorig,'must have integer entries'); return; end; + case 1 + if( ~all(mod(x,2)==1)) + er=create_errormsg( xname, xorig,'must have odd integer entries'); return; end; + case 2 + if( ~all(mod(x,2)==0)) + er=create_errormsg( xname, xorig,'must have even integer entries'); return; end; + end; + + % check sign of entries in x + switch signflag + case -2 + if( ~all(x<0)) + er=create_errormsg( xname, xorig, 'must have strictly negative entries'); return; end; + case -1 + if( ~all(x<=0)) + er=create_errormsg( xname, xorig, 'must have negative entries'); return; end; + case 0 + ; + case 1 + if( ~all(x>=0)) + er=create_errormsg( xname, xorig, 'must have positive entries'); return; end; + case 2 + if( ~all(x>0)) + er=create_errormsg( xname, xorig, 'must have strictly positive entries'); return; end; + end; + + + + +function er = create_errormsg( xname, x, er ) + if(numel(x)<10) + er = ['Numeric input argument ' xname '=[' num2str(x) '] ' er '.']; + else + er = ['Numeric input argument ' xname ' ' er '.']; + end; + + diff --git a/matlab/feval_arrays.m b/matlab/feval_arrays.m new file mode 100644 index 00000000..be3047d6 --- /dev/null +++ b/matlab/feval_arrays.m @@ -0,0 +1,78 @@ +% Used to apply the same operation to a stack of array elements. +% +% The only constraint on the function specified in fhandle is that given two differrent +% input arrays a1 and a2, if a1 and a2 have the same dimensions then the outputs b1 and b2 +% must have the same dimensions. For long operations shows progress information. +% +% A can have arbitrary dimension. Suppose A has size d1 x d2 ... x dn. Then for the +% purpose of this function A has dn elements, where A(:,:,...,i) is the ith element. This +% function then applies the operation in fhandle, with paramters given in varargin, to +% each element in A. The results are returned in the array B, of size f1 x f2 x ... x fk x +% dn. Each of the n element of B of the form B(:,:,...,i) is the the result of applying +% fhandle to A(:,:,...,i). A may also be a cell array, see the last example. +% +% This can be extremely useful. Suppose A is an MxNxR collection of R MxN images. Then +% "B = feval_arrays( A, @imresize, .5 )" resizes each of the R images in A by 1/2. B has +% size M/2 x N/2 X R. As another motivating example, suppose A is an MxNx3xR array of R +% MxN rgb images. Then "B = feval_arrays( A, @rgb2gray )" converts each of the R color +% images to a grayscale image. B has size M x N x R. +% +% A limitation of feval_arrays is that it does not pass state information to fhandle. For +% example, fhandle may want to know how many times it's been called. This can be overcome +% by saving state information inside fhandle using 'persistent' variables. For an example +% see imwrite2. +% +% INPUTS +% A - input array +% fhandle - operation to apply to each 'element' of A +% params - [varargin] parameters for each operation specified by fhandle +% +% OUTPUTS +% B - output array +% +% EXAMPLE +% B = feval_arrays( A, @rgb2gray ); % where A is MxNx3xR +% B = feval_arrays( A, @imresize, .5 ); % where A is MxNxR +% B = feval_arrays( A, @imnormalize ); % where A has arbitrary dims +% B = feval_arrays( A, @(x) {imresize(x{1},.5)} ); % resize each element in cell array +% +% DATESTAMP +% 25-Jan-2005 2:00pm +% +% See also FEVAL_IMAGES, IMWRITE2, PERSISTENT, TICSTATUS + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function B = feval_arrays( A, fhandle, varargin ) + nd = ndims(A); siz = size(A); n = siz(end); + indsA = {':'}; indsA = indsA(ones(nd-1,1)); + + ticstatusid = ticstatus('feval_arrays',[],60); + for i=1:n + % apply fhandle to each element of A + b = feval( fhandle, A(indsA{:},i), varargin{:} ); + if (i==1) + ndb = ndims(b); + if(ndb==2 && size(b,2)==1) ndb=1; end; + ones_ndb = ones(1,ndb); + B = repmat( b, [ones_ndb,n] ); + indsB = {':'}; indsB = indsB(ones_ndb); + else + B(indsB{:},i) = b; + end; + tocstatus( ticstatusid, i/n ); + end + + + + + + + + + + + + diff --git a/matlab/feval_images.m b/matlab/feval_images.m new file mode 100644 index 00000000..fda64a5a --- /dev/null +++ b/matlab/feval_images.m @@ -0,0 +1,128 @@ +% Used to apply the same operation to all images in given directory. +% +% For each image in srcdir, loads the image, applies the function in fhandle and stores +% the result. The result x=fhandle(I,params{:}) on the ith image is stored in +% X(:,...:,i). If the size of x depends on the size of I, then all images in the +% directory must have the same size. Also I may have a different format depending on how +% it is stored on disk - example: MxN for grayscale, MxNx3 for RGB, MxNx4 for CMYK. This +% function is very similar to feval_arrays, except instead of operating on images in +% memory it operates on images on disk. For long operations shows progress information. +% +% The srcdir must contain nothing but images. Either the images follow no naming +% convention, or they follow a very rigid naming convention that consists of a string +% followed by ndigits-number specifying the image number, followed by an extension. The +% advantage of the more rigid naming convention is that it allows a certain range of +% images to be operated on, specified by [nstart,nend]. For example, to operate on images +% "rats0003.tif ... rats0113.tif" in directory '../rats/' use: +% feval_images( fhandle, params, '../rats/', 'rats' , 'tif', 3, 113, 4 ); +% If the parameter name is specified ('rats' in the example above), the rigid naming +% convention is assumed. All further input arguments are optional. +% +% imwrite2 writes images in the format described above. +% +% If the function in fhandle is identity (f=@(x) x), the result is to read in all images +% in the directory. +% +% A limitation of feval_images is that it does not pass state information to fhandle. For +% example, fhandle may want to know how many times it's been called. This can be overcome +% by saving state information inside fhandle using 'persistent' variables. For an example +% see imwrite2 (which uses persistent variables with feval_arrays). +% +% INPUTS +% fhandle - function to apply to each image [see above] +% params - cell array of additional parameters to fhandle (may be {} ) +% srcdir - directory containing images +% name - [optional] base name of images +% ext - [optional] extension of image +% nstart - [optional] image number on which to start +% nend - [optional] image number on which to end +% ndigits - [optional] number of digits for filename index +% +% OUTPUTS +% X - output array [see above] +% +% EXAMPLE +% % reads in all images in directory (note that fhandle is identity!): +% X = feval_images( @(x) x, {}, srcdir ); +% % reads in all images converting to grayscale: +% X = feval_images( @(x) rgb2gray(x), {}, srcdir ); +% +% DATESTAMP +% 30-Apr-2006 12:00pm +% +% See also FEVAL_ARRAYS, IMWRITE2, PERSISTENT, TICSTATUS + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function X = feval_images( fhandle, params, srcdir, name, ext, nstart, nend, ndigits ) + error(nargchk( 3, 8, nargin )); + + %%% Check if srcdir is valid and add '/' at end if needed + if( ~isempty(srcdir) ) + if(~exist(srcdir,'dir')) + error( ['feval_images: directory ' srcdir ' not found' ] ); end; + if( srcdir(end)~='\' && srcdir(end)~='/' ) srcdir(end+1) = '/'; end; + end + + %%% get appropriate filenames + if( nargin<=3 ) % no convention followed + dircontent = dir(srcdir); dircontent = dircontent(3:end); + filenames = {dircontent.name}; n = length(dircontent); + else % strict convention followed + if( nargin<8 || isempty(ndigits) ) + dircontent = dir([srcdir name '*.' ext]); + else + dircontent = dir([srcdir name repmat('?',[1 ndigits]) '.' ext '*' ]); + end; + filenames = {dircontent.name}; + n = length(dircontent); + if( n==0 ) error( ['No images found in ' srcdir] ); end; + if( nargin<5 || isempty(ext)) ext = dircontent(1).name; ext = ext(end-2:end); end; + if( nargin<6 || isempty(nstart)) nstart = 0; end; + if( nargin<7 || isempty(nend)) nend = n-1+nstart; end; + if( nargin<8 || isempty(ndigits)) + ndigits = length(dircontent(1).name)-length(ext)-1-length(name); end; + n = nend-nstart+1; + end; + if( n==0 ) X=[]; return; end; + + %%% load each image and apply func + ticstatusid = ticstatus('feval_images',[],40); + for i=1:n + % load image + if( nargin==3 ) + I = imread( [srcdir filenames{i}] ); + else + nstr = int2str2( i+nstart-1, ndigits ); + try + I = imread([srcdir name nstr '.' ext ] ); + catch + error( ['Unable to read image: ' srcdir name nstr '.' ext] ); + end; + end + + % apply fhandle to I + x = feval( fhandle, I, params{:} ); + if (i==1) + ndx = ndims(x); + if(ndx==2 && size(x,2)==1) ndx=1; end; + ones_ndx = ones(1,ndx); + X = repmat( x, [ones_ndx,n] ); + indsX = {':'}; indsX = indsX(ones_ndx); + else + X(indsX{:},i) = x; + end; + tocstatus( ticstatusid, i/n ); + end; + + + + +% %%% GET directory content, discarding all non-image files -- TOO SLOW +% % should do by looking at just extension. +% count = 1; for i=1:n +% [info,msg] = imfinfo([srcdir dircontent(i).name]); +% if(isempty(msg)) imdircontent(count) = dircontent(i); count = count+1; end; +% end; n = count - 1; imdircontent = dircontent; diff --git a/matlab/feval_mats.m b/matlab/feval_mats.m new file mode 100644 index 00000000..9f34487e --- /dev/null +++ b/matlab/feval_mats.m @@ -0,0 +1,83 @@ +% Used to apply the same operation to all .mat files in given directory. +% +% For each mat in srcdir, loads the mat file, extracts the variables denoted by +% matcontents, applies the function fhandle and stores the result. matcontents must be a +% cell array of strings, where each string denotes the variable stored in the mat files. +% For example, if each mat file contains two variables y and z, then matcontents should be +% {'y','z'}. For long operations shows progress information. +% +% fhandle must point to a function that takes two inputs: vals and params. +% vals is a cell array that contains the values for the variables denoted by matcontents +% and contained in the mat file, and params are the additional static parameters passed to +% feval_arrays. Continuing the example above vals would be {y,z} - (use deal to extract): +% x=feval(fhandle,{y,z},params) +% Each returned x must have the same dimensions, X is a concatentation of the returned x's +% along the (d+1) dimension. +% +% INPUTS +% fhandle - function to apply to contents of each mat file [see above] +% matcontents - cell array of strings that denote expected contents of each mat file +% params - cell array of additional parameters to fhandle (may be {}) +% srcdir - directory containg mat files +% prefix - [optional] only consider mat files in srcdir of the form prefix_*.mat +% +% OUTPUTS +% X - output array [see above] +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also FEVAL_IMAGES, FEVAL_ARRAYS + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function X = feval_mats( fhandle, matcontents, params, srcdir, prefix ) + error(nargchk( 4, 5, nargin )); + + %%% Check if srcdir is valid and add '/' at end if needed + if( ~isempty(srcdir) ) + if(~exist(srcdir,'dir')) error( ['feval_mats: dir ' srcdir ' not found' ] ); end; + if( srcdir(end)~='\' && srcdir(end)~='/' ) srcdir(end+1) = '/'; end; + end + + + %%% get appropriate filenames + if( nargin<=4 || isempty(prefix) ) + dircontent = dir( [srcdir '*.mat'] ); + else + dircontent = dir( [srcdir prefix '_*.mat'] ); + end + filenames = {dircontent.name}; n = length(dircontent); + if( n==0 ) error( ['No appropriate mat files found in ' srcdir] ); end; + + + %%% load each mat file and apply fhandle + ticstatusid = ticstatus('feval_mats',[],40); + ncontents = length( matcontents ); + for i=1:n + % load mat file and get contents + S = load( [srcdir filenames{i}] ); + errmsg = ['Unexpected contents for mat file: ' filenames{i}]; + if( length(fieldnames(S))1 ) error('screenratio must be <= 1'); end; + + % call figure + h = figure( varargin{:} ); + if( nargout ) varargout = {h}; end; + + % get dimensions of screen and what want figure to be + units = get(0,'Units'); + ss = get(0,'ScreenSize'); + st = (1 - screenratio)/2; + pos = [st*ss(3), st*ss(4), screenratio*ss(3), screenratio*ss(4)]; + + % set dimensions of figure + set( h, 'Units', units ); + set( h, 'Position', pos ); + diff --git a/matlab/gauss2ellipse.m b/matlab/gauss2ellipse.m new file mode 100644 index 00000000..e475ec54 --- /dev/null +++ b/matlab/gauss2ellipse.m @@ -0,0 +1,51 @@ +% Creates an ellipse representing the 2D Gaussian distribution. +% +% Creates an ellipse representing the 2D Gaussian distribution with mean mu and covariance +% matrix C. Returns 5 parameters that specify the ellipse: a semimajor axis of ra, a +% semiminor axis of radius rb, angle phi, centered at (crow,ccol). +% +% INPUTS +% mu - 1x2 vector representing the center of the ellipse +% C - 2x2 cov matrix +% d - [optional] Number of std to create the ellipse to (2 is default) +% +% OUTPUTS +% crow - the row location of the center of the ellipse +% ccol - the column location of the center of the ellipse +% ra - semi-major axis length (in pixels) of the ellipse +% rb - semi-minor axis length (in pixels) of the ellipse +% phi - rotation angle (in radians) of the semimajor axis from the x-axis +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also PLOT_ELLIPSE, PLOT_GAUSSELLIPSES, MASK_ELLIPSE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [ crow, ccol, ra, rb, phi ] = gauss2ellipse( mu, C, d ) + if (nargin<3 || isempty(d) ) d=2; end; + + % error check + if (~all(size(mu)==[1,2]) || ~all(size(C)==[2,2])) + error('Works only for 2D Gaussians'); end + + % decompose using SVD + [R,D,R] = svd(C); + normstd = sqrt( diag( D ) ); + + + % get angle of rotation (in row/column format) + phi = acos(R(1,1)); + if (R(2,1) < 0) phi = 2*pi - phi; end + phi = pi/2 - phi; + + % get ellipse radii + ra = d*normstd(1); + rb = d*normstd(2); + + % center of ellipse + crow = mu(1); + ccol = mu(2); diff --git a/matlab/getargs.m b/matlab/getargs.m new file mode 100644 index 00000000..8dd6aa64 --- /dev/null +++ b/matlab/getargs.m @@ -0,0 +1,78 @@ +% Utility to process parameter name/value pairs. +% +% Based on code fromt the Matlab Statistics Toolobox "private/statgetargs.m" +% +% [EMSG,A,B,...]=GETARGS(PNAMES,DFLTS,'NAME1',VAL1,'NAME2',VAL2,...) accepts a cell +% array PNAMES of valid parameter names, a cell array DFLTS of default values for the +% parameters named in PNAMES, and additional parameter name/value pairs. Returns +% parameter values A,B,... in the same order as the names in PNAMES. Outputs +% corresponding to entries in PNAMES that are not specified in the name/value pairs are +% set to the corresponding value from DFLTS. If nargout is equal to length(PNAMES)+1, +% then unrecognized name/value pairs are an error. If nargout is equal to +% length(PNAMES)+2, then all unrecognized name/value pairs are returned in a single cell +% array following any other outputs. +% +% EMSG is empty if the arguments are valid, or the text of an error message if an error +% occurs. GETARGS does not actually throw any errors, but rather returns an error +% message so that the caller may throw the error. Outputs will be partially processed +% after an error occurs. +% +% EXAMPLE +% pnames = {'color' 'linestyle', 'linewidth'} +% dflts = { 'r' '_' '1'} +% v = {'linew' 2 'nonesuch' [1 2 3] 'linestyle' ':'}; +% [emsg,color,linestyle,linewidth,unrec] = getargs(pnames,dflts,v{:}) % ok +% [emsg,color,linestyle,linewidth] = getargs(pnames,dflts,v{:}) % error +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [emsg,varargout]=getargs(pnames,dflts,varargin) + % We always create (nparams+1) outputs: + % one for emsg + % nparams varargs for values corresponding to names in pnames + % If they ask for one more (nargout == nparams+2), it's for unrecognized + % names/values + emsg = ''; + nparams = length(pnames); + varargout = dflts; + unrecog = {}; + nargs = length(varargin); + + % Must have name/value pairs + if mod(nargs,2)~=0 + emsg = sprintf('Wrong number of arguments.'); + else + % Process name/value pairs + for j=1:2:nargs + pname = varargin{j}; + if ~ischar(pname) + emsg = sprintf('Parameter name must be text.'); + break; + end + i = strmatch(lower(pname),lower(pnames)); + if isempty(i) + % if they've asked to get back unrecognized names/values, add this + % one to the list + if nargout > nparams+1 + unrecog((end+1):(end+2)) = {varargin{j} varargin{j+1}}; + + % otherwise, it's an error + else + emsg = sprintf('Invalid parameter name: %s.',pname); + break; + end + elseif length(i)>1 + emsg = sprintf('Ambiguous parameter name: %s.',pname); + break; + else + varargout{i} = varargin{j+1}; + end + end + end + + varargout{nparams+1} = unrecog; diff --git a/matlab/imlabel.m b/matlab/imlabel.m new file mode 100644 index 00000000..d0dc46e3 --- /dev/null +++ b/matlab/imlabel.m @@ -0,0 +1,100 @@ +% Improved method for labeling figure axes. +% +% INPUTS +% labels - cell array of strings, labels for display +% position - 'left', 'right', 'bottom', or 'top' +% slant - [optional] rotation for top and bottom labels in [-90,90] +% pvpairs - [optional] parameter / value list for text +% +% EXAMPLE +% load( 'images.mat' ); +% clf; cla; montage2( images(:,:,1:9), 1 ); +% imlabel( {'row1','row2','row3'}, 'left',[],{'FontSize',20} ); +% imlabel( {'column 1','column 2','column 3'}, 'bottom', -25, {'FontSize',20} ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also MONTAGE2, TEXT2, TEXT + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function imlabel( labels, position, slant, pvpairs ) + if( nargin<3 || isempty(slant) ) slant=0; end; + if( nargin<4 || isempty(pvpairs) ) pvpairs={}; end; + if( abs(slant)>90 ) error( 'slant must be between -90 and 90'); end; + + %%% set up for ydir reversed, xdir normal :) + ys = ylim; nys=ys(2)-ys(1); + xs = xlim; nxs=xs(2)-xs(1); + if(strcmp(get(gca,'YDir'),'reverse')) ys=ys([2 1]); nys=-nys; end; + if(strcmp(get(gca,'XDir'),'reverse')) xs=xs([2 1]); nxs=-nxs; end + + %%% write labels + nlabels = length( labels ); + switch position + case 'bottom' + set(gca,'XTick',[]); %tick interfere + if(abs(slant)<=15) + H='center'; V='top'; + elseif( slant>15 && slant<50 ) + H='right'; V='top'; + elseif( slant>=50 ) + H='right'; V='middle'; + elseif( slant<-15 && slant>-50 ) + H='left'; V='top'; + elseif( slant<=-50 ) + H='left'; V='middle'; + end; + textalign = {'VerticalAlignment',V,'HorizontalAlignment',H,'Rotation',slant}; + yloc = ys(1); + for i=1:nlabels + xloc = xs(1) + (2*i-1)/(2*nlabels)*nxs; + text2( xloc,yloc,labels{i},textalign{:},pvpairs{:}); + end; + + case 'top' + title(''); %title interfere + if(abs(slant)<=15) + H='center'; V='bottom'; + elseif( slant>15 && slant<50 ) + H='left'; V='bottom'; + elseif( slant>=50 ) + H='left'; V='middle'; + elseif( slant<-15 && slant>-50 ) + H='right'; V='bottom'; + elseif( slant<=-50 ) + H='right'; V='middle'; + end; + textalign = {'VerticalAlignment',V,'HorizontalAlignment',H,'Rotation',slant}; + textalign = {textalign{:}, 'Rotation',slant}; %rotate + yloc = ys(2) + nys/40; + for i=1:nlabels + xloc = xs(1) + (2*i-1)/(2*nlabels)*nxs; + text2( xloc,yloc,labels{i},textalign{:},pvpairs{:}); + end; + + case 'left' + set(gca,'YTick',[]); %tick interfere + textalign = {'VerticalAlignment','middle','HorizontalAlignment','right'}; + xloc = xs(1) - nxs/20; + for i=1:nlabels + yloc = ys(2) - (2*i-1)/(2*nlabels)*nys; + text2( xloc,yloc,labels{i},textalign{:},pvpairs{:}); + end; + + case 'right' + colorbar off; % colorbar interference + textalign = {'VerticalAlignment','middle','HorizontalAlignment','left'}; + xloc = xs(2) + nxs/20; + for i=1:nlabels + yloc = ys(2) - (2*i-1)/(2*nlabels)*nys; + text2( xloc,yloc,labels{i},textalign{:},pvpairs{:}); + end; + + otherwise + error(['illegal position: ' position]); + end + diff --git a/matlab/ind2sub2.m b/matlab/ind2sub2.m new file mode 100644 index 00000000..43f832dc --- /dev/null +++ b/matlab/ind2sub2.m @@ -0,0 +1,40 @@ +% Improved version of ind2sub. +% +% Almost the same as ind2sub, except always returns only a single output that contains all +% the index locations. Also handles multiple linear indicies at the same time. +% +% See help for ind2sub for mor info. +% +% INPUTS +% siz - size of array into which ind is an index +% ind - linear index (or vector of indicies) into given array +% +% OUTPUTS +% sub - sub(i,:) is the ith set of subscripts into the array. +% +% EXAMPLE +% sub = ind2sub2( [10,10], 20 ) +% sub = ind2sub2( [10,10], [19 20] ) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also IND2SUB, SUB2IND2 + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function sub = ind2sub2(siz,ind) + if( any(ind>prod(siz)) ) + error('index out of range'); end; + + % taken almost directly from ind2sub.m + ind = ind(:); + nd = length(siz); + k = [1 cumprod(siz(1:end-1))]; + ind = ind - 1; + for i = nd:-1:1 + sub(:,i) = floor(ind/k(i))+1; + ind = rem(ind,k(i)); + end diff --git a/matlab/int2str2.m b/matlab/int2str2.m new file mode 100644 index 00000000..267306b9 --- /dev/null +++ b/matlab/int2str2.m @@ -0,0 +1,46 @@ +% Convert integer to string of given length; improved version of int2str. +% +% Pads string with zeros on the left. If input n is an array, output is a cell array of +% strings of the same dimension as n. +% +% INPUTS +% n - integer to convert to string +% ndigits - minimum number of digits to use +% +% +% OUTPUTS +% nstr - string representation of n (or cell array of strings in n is an array) +% +% EXAMPLE +% s = int2str2( 3, 3 ) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also INT2STR + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function nstr = int2str2( n, ndigits ) + if( nargin<2 ) ndigits=0; end; + + nel = numel( n ); + negvals=(n<0); n=abs(n); + if( nel==1 ) % for a single int + nstr = num2str( n ); + if( ndigits > size(nstr,2) ) + nstr = [repmat( '0', 1, ndigits-size(nstr,2) ), nstr]; + end; + if(negvals) nstr=['-' nstr]; end; + else % for array of ints + nstr = cell(size(n)); + for i=1:nel + nstr{i} = num2str( n(i) ); + if( ndigits > size(nstr{i},2) ) + nstr{i} = [repmat( '0', 1, ndigits-size(nstr{i},2) ), nstr{i}]; + end; + if(negvals(i)) nstr{i}=['-' nstr{i}]; end; + end; + end; diff --git a/matlab/isfield2.m b/matlab/isfield2.m new file mode 100644 index 00000000..3e763e7e --- /dev/null +++ b/matlab/isfield2.m @@ -0,0 +1,57 @@ +% More comprehensive version of isfield. +% +% A more comprehensive test of what fields are present [and optionally initialized] in a +% stuct S. fs is either a single field name or a cell array of field name. The presence +% of all fields in fs are tested for in S, tf is true iif all fs are present. +% Additionally, if isinit==1, then tf is true iff every field fs of every element of S +% is nonempty (test done using isempty). +% +% INPUTS +% S - struct array +% fs - cell of string name or string +% isinit - [optional] if true than additionally test if all fields are initialized +% +% OUTPUTS +% tf - true or false, depending on results of above tests +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function tf = isfield2( S, fs, isinit ) + if( nargin<3 ) isinit=0; end; + + if ~isa(S,'struct') + tf = false; return; + end; + + % check if fs is a cell array, if not make it so + if( iscell(fs) ) + nfs = length(fs); + else + nfs=1; fs={fs}; + end; + + % see if every one of fs is a fieldname + Sfs = fieldnames(S); + tf = true; + for i=1:nfs + tf = tf & any(strcmp(Sfs,fs{i})); + if( ~tf ) return; end; + end; + + % now optionally check if fields are isinitialized + if( ~isinit || ~tf ) return; end; + nS = numel(S); + for i=1:nfs + for j=1:nS + tf = tf & ~isempty( getfield(S(j),fs{i}) ); + if( ~tf ) return; end; + end; + end; + + + diff --git a/matlab/mat2cell2.m b/matlab/mat2cell2.m new file mode 100644 index 00000000..e5d06eca --- /dev/null +++ b/matlab/mat2cell2.m @@ -0,0 +1,42 @@ +% Break matrix up into a cell array of same sized matrices. +% +% Useful wrapper for matlab function mat2cell. Instead of specifying locations along each +% dimension at which to split the matrix, this function takes the number of parts along +% each dimension to break X into. That is if X is d1xd2x...xdk and parts=[p1 p2 ... pk]; +% then X is split into p1*p2*...*pk matricies of dimension d1/p1 x d2/p2 x ... x dk/pk. +% If di/pi is not an integer, floor(di/pi) is used. Leftover chunks of X are discarded. +% Using a scalar p for parts is equivalent to using [p p ... p]. +% +% So for example if X is 10*16, mat2cell2( X, [2 3] ) break X into 2*3 parts, each of size +% 5x5, and the last column of X is discarded. +% +% INPUTS +% X - matrix to split +% parts - see above +% +% OUTPUTS +% C - cell array adjacent submatrices of X +% +% EXAMPLE +% A=rand(4), B = mat2cell2(A,2), B{:} +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also MAT2CELL, CELL2ARRAY, CELL2MAT + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function C = mat2cell2( X, parts ) + siz = size(X); nd = ndims(X); + [parts,er] = checknumericargs( parts, size(siz), 0, 2 ); error(er); + + % crop border areas so as to make dims of X divisible by parts + parts = min(siz,parts); siz = siz - mod( siz, parts ); + if (~all( siz==size(X))) X = arraycrop_full( X, ones(1,nd), siz ); end; + + % Convert to cell array by calling mat2cell + for d=1:nd bounds{d} = repmat( siz(d)/parts(d), [1 parts(d)] ); end + C=mat2cell( X, bounds{:}); diff --git a/matlab/mode.m b/matlab/mode.m new file mode 100644 index 00000000..860e44ce --- /dev/null +++ b/matlab/mode.m @@ -0,0 +1,23 @@ +% Returns the mode of a vector. +% +% INPUTS +% x - vector of integers +% +% OUTPUTS +% y - mode +% +% EXAMPLE +% x = randint2( 1, 10, [1 3] ) +% mode( x ) +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function y=mode(x) + [b,i,j] = unique(x); + [ mval, ind ] = max(hist(j,length(b))); + y = b(ind); diff --git a/matlab/normpdf2.m b/matlab/normpdf2.m new file mode 100644 index 00000000..84505965 --- /dev/null +++ b/matlab/normpdf2.m @@ -0,0 +1,41 @@ +% Normal prob. density function (pdf) with arbitrary covariance matrix. +% +% Evaluate the multi-variate density with mean vector m and covariance matrix C for the +% input vector xs. Assumes that the N datapoints are d dimensional. Then m is dx1 or +% 1xd, C is dxd, and xs is dxN or NxD where N is the number of samples to be evaluated. +% +% INPUTS +% xs - points to evaluated (Nxd or dxN) +% m - mean vector (dx1 or 1xd) +% C - Covariance matrix (dxd) +% +% OUTPUTS +% ps - probability density at each x +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function ps = normpdf2(xs,m,C); + + % get dimensions of data + d=length(m); + if size(xs,1)~=d xs=xs'; end + N=size(xs,2); + + detC = det(C); + if rcond(C)0 ) varargout={h}; end diff --git a/matlab/plot_gaussellipses.m b/matlab/plot_gaussellipses.m new file mode 100644 index 00000000..5519b82e --- /dev/null +++ b/matlab/plot_gaussellipses.m @@ -0,0 +1,30 @@ +% Plots 2D ellipses derived from 2D Gaussians specified by mus & Cs. +% +% INPUTS +% mu - kx2 matrix of means +% Cs - 2 x 2 x k covariance matricies +% d - [optional] Number of std to create the ellipse to (2 is default) +% +% EXAMPLE +% plot_gaussellipses( [ 10 10 ], eye(2), 2 ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also PLOT_ELLIPSE, GAUSS2ELLIPSE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function plot_gaussellipses( mus, Cs, d ) + if (nargin<3 || isempty(d) ) d=2; end; + colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k']; nc = length(colors); + + washeld = ishold; if (~washeld) hold('on'); end; + for i=1:size( mus,1) + [ crow, ccol, ra, rb, phi ] = gauss2ellipse( mus(i,:), Cs(:,:,i), d ); + plot_ellipse( crow, ccol, ra, rb, phi, colors( mod(i-1,nc)+1) ); + end + if (~washeld) hold('off'); end; + diff --git a/matlab/randint2.m b/matlab/randint2.m new file mode 100644 index 00000000..66dad74c --- /dev/null +++ b/matlab/randint2.m @@ -0,0 +1,28 @@ +% Faster but restricted version of randint. +% +% Generate matrix of uniformly distributed random integers. R = randint2(m,n,range) +% generates an m-by-n matrix of random integers between [range(1), range(2)]. +% +% InPUTS +% m - m rows +% n - n cols +% range - range of ints +% +% OUTPUTS +% R - mxn matrix of integers +% +% EXAMPLE +% R = randint2( 2, 5, [0 1] ) +% +% DATESTAMP +% 19-Nov-2005 4:00pm +% +% See also RANDINT + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function R = randint2( m, n, range ) + R = rand( m, n ); + R = range(1) + floor( (range(2)-range(1)+1)*R ); diff --git a/matlab/randomsample.m b/matlab/randomsample.m new file mode 100644 index 00000000..43e480b6 --- /dev/null +++ b/matlab/randomsample.m @@ -0,0 +1,55 @@ +% Samples elements of X so result uses at most maxmegs megabytes of memory. +% +% X must be an n dimensional array with the last dimension used to index samples of X. So +% for example if X has size d1 x d2 x...x dn-1 x dn, it is treated as having dn elements +% of size (d1 x d2 x...x dn-1), and the resulting array Xsam will have dimension d1 x d2 +% x...x dn-1 x dn' where dn' <= dn. +% +% Different types of arrays require different amounts of memory. Each double requries 8 +% bytes of memory, hence an array with 1.024 million elements of type double requires 8MB +% memory. Each uint8 requires 1 byte, so the same size array would require 1MB. Note +% that when saved to .mat files arrays may take up more or less memory. +% +% Note, to see how much memory a variable x is using in memory, use: +% s=whos('x'); mb=s.bytes/2^20 +% +% INPUTS +% X - n-dim array of size (d1 x d2 x...x dn-1) x dn (treated as dn elements) +% maxmegs - maximum number of megs Xsam is allowed to take up +% +% OUTPUTS +% Xsam - n-dim array of size (d1 x d2 x...x dn-1) x dn' where dn'<=dn +% keeplocs - vector of indicies kept from X; Xsam=X(:,..,:,keeplocs) +% +% EXAMPLE +% % Xsam should have size: 1024xround(1024/10) +% X = uint8(ones(2^10,2^10)); +% Xsam = randomsample( X, 1/10 ); +% % Xsam should have size: 100x10x~(1000/8) +% X = rand(100,10,1000); +% Xsam = randomsample( X, 1 ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [X,keeplocs] = randomsample( X, maxmegs ) + siz = size( X ); nd = ndims(X); + inds={':'}; inds=inds(:,ones(1,nd-1)); + n=siz(end); m=prod(siz(1:end-1)); + + % get the number of elements of X that fit per meg + x1=X(1); s=whos('x1'); nbytes=s.bytes; + elspermeg = 2^20 / nbytes / m; + + % sample if necessary + memused = n / elspermeg; + if( memused > maxmegs ) + nkeep = max(1,round(maxmegs*elspermeg)); + keeplocs = randperm(n); + keeplocs = keeplocs(1:nkeep); + X = X( inds{:}, keeplocs ); + end diff --git a/matlab/randperm2.m b/matlab/randperm2.m new file mode 100644 index 00000000..7ca7cb05 --- /dev/null +++ b/matlab/randperm2.m @@ -0,0 +1,40 @@ +% Returns a random permutation of integers. +% +% randperm2(n) is a random permutation of the integers from 1 to n. For example, +% randperm2(6) might be [2 4 5 6 1 3]. randperm2(n,k) is only returns the first k +% elements of the permuation, so for example randperm2(6) might be [2 4]. +% +% This is a faster version of randperm.m if only need first k<epsilon))) + theta = -theta; + end diff --git a/matlab/rotation_matrix2D.m b/matlab/rotation_matrix2D.m new file mode 100644 index 00000000..a09d8ee9 --- /dev/null +++ b/matlab/rotation_matrix2D.m @@ -0,0 +1,25 @@ +% Returns the matrix: R=[cos(t) -sin(t); sin(t) cos(t)]. +% +% y=R*x is the result of rotating x theta degress clockwise about the z-axis. +% One can retrive the angle of rotation via theta = acos(R(1)). +% +% INPUTS +% theta - angle of rotation (radians) +% +% OUTPUTS +% R - 2x2 Rotation matrix +% +% EXAMPLE +% R = rotation_matrix2D( pi/6 ) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also ROTATION_MATRIX3D + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function R = rotation_matrix2D( theta ) + R=[cos(theta) -sin(theta); sin(theta) cos(theta)]; diff --git a/matlab/rotation_matrix3D.m b/matlab/rotation_matrix3D.m new file mode 100644 index 00000000..15c83f0d --- /dev/null +++ b/matlab/rotation_matrix3D.m @@ -0,0 +1,28 @@ +% Uses Rodrigues's formula to create a 3x3 rotation matrix R. +% +% The results of R*xMatrix is x rotated theta degrees about u. +% +% INPUTS +% u - axis of rotation - specified as (x,y,z) +% theta - angle of rotation (radians) +% +% OUTPUTS +% R - 3x3 Rotation matrix +% +% EXAMPLE +% R = rotation_matrix3D( [0 0 1], pi/4 ) +% R * [1 0 0]' +% +% DATESTAMP +% 11-Oct-2005 9:00pm +% +% See also RECOVER_ROTATION3D, ROTATION_MATRIX2D + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function R = rotation_matrix3D( u, theta ) + u = u / norm(u); + U = [ 0 -u(3) u(2) ; u(3) 0 -u(1); -u(2) u(1) 0 ]; + R=eye(3)+U *sin(theta)+U^2*(1-cos(theta)); diff --git a/matlab/simplecache.m b/matlab/simplecache.m new file mode 100644 index 00000000..cd440c14 --- /dev/null +++ b/matlab/simplecache.m @@ -0,0 +1,168 @@ +% A very simply cache that can be used to store results of computations. +% +% Can save and retrieve arbitrary values using a vector (includnig char vectors) as a key. +% Especially useful if a function must perform heavy computation but is often called with +% the same inputs (for which it will give the same outputs). Note that the current +% implementation does a linear search for the key (a more refined implementation would use +% a hash table), so it is not meant for large scale usage. +% +% To use inside a function, make the cache persistent: +% persistent cache; if( isempty(cache) ) cache=simplecache('init'); end; +% The following line, when placed inside a function, means the cache will stay in memory +% until the matlab environment changes. For an example usage see mask_gaussians. +% +% USAGE: +% %%% initialize a cache: +% cache = simplecache('init'); +% +% %%% put something in a cache. Note that key must be a numeric vector. +% %%% if cache already contained an object with the same key that obj is overwritten. +% cache = simplecache( 'put', cache, key, val ); +% +% %%% attempt to get something from cache. found==1 if obj was found, val is the obj. +% [found,val] = simplecache( 'get', cache, key ); +% +% %%% free key +% [cache,found] = simplecache( 'remove', cache, key ); +% +% +% EXAMPLE +% cache = simplecache('init'); +% hellokey=rand(1,3); worldkey=rand(1,11); +% cache = simplecache( 'put', cache, hellokey, 'hello' ); +% cache = simplecache( 'put', cache, worldkey, 'world' ); +% [f,v]=simplecache( 'get', cache, hellokey ); disp(v); +% [f,v]=simplecache( 'get', cache, worldkey ); disp(v); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also PERSISTENT, MASK_GAUSSIANS + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function varargout = simplecache( op, cache, varargin ) + + if( strcmp(op,'init') ) %%% init a cache + error(nargchk(1, 2, nargin)); + error(nargoutchk(1, 1, nargout)); + + cache_siz = 8; % initial size + cache.freeinds = 1:cache_siz; + cache.keyns = -ones(1,cache_siz); + cache.keys = cell(1,cache_siz); + cache.vals = cell(1,cache_siz); + + varargout = {cache}; + + + elseif( strcmp(op,'put') ) %%% a put operation + error(nargchk(4, 4, nargin)); + error(nargoutchk(1, 1, nargout)); + [ key, val ] = deal( varargin{:} ); + if( ~isvector(key) ) error( 'key must be a vector' ); end; + + cache = cacheput( cache, key, val ); + + varargout = {cache}; + + + elseif( strcmp(op,'get') ) %%% a get operation + error(nargchk(3, 3, nargin)); + error(nargoutchk(0, 2, nargout)); + key = deal( varargin{:} ); + if( ~isvector(key) ) error( 'key must be a vector' ); end; + + [ind,val] = cacheget( cache, key ); + found = ind>0; + + varargout = {found,val}; + + + elseif( strcmp(op,'remove') ) %%% a remove operation + error(nargchk(3, 3, nargin)); + error(nargoutchk(0, 2, nargout)); + key = deal( varargin{:} ); + if( ~isvector(key) ) error( 'key must be a vector' ); end; + + [cache,found] = cacheremove( cache, key ); + + varargout = {cache,found}; + + + else %%% unknown op + error( ['Unknown cache operation: ' op] ); + end; + + + + + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% double cache size +function cache = cachegrow( cache ) + cache_siz = length( cache.keyns ); + if( cache_siz>64 ) % warn if getting big + warning(['doubling cache size to: ' int2str2(cache_siz*2)]); end; + cache.freeinds = [cache.freeinds (cache_siz+1):(2*cache_siz)]; + cache.keyns = [cache.keyns -ones(1,cache_siz)]; + cache.keys = [cache.keys cell(1,cache_siz)]; + cache.vals = [cache.vals cell(1,cache_siz)]; + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% put something into the cache +function cache = cacheput( cache, key, val ) + + % get location to place + ind = cacheget( cache, key ); % see if already in cache + if( ind==-1 ) + if( length( cache.freeinds )==0 ) + cache = cachegrow( cache ); %grow cache + end; + ind = cache.freeinds(1); % get new cache loc + cache.freeinds = cache.freeinds(2:end); + end; + + % now simply place in ind + cache.keyns(ind) = length(key); + cache.keys{ind} = key; + cache.vals{ind} = val; + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% get cache element, or fail +function [ind,val] = cacheget( cache, key ) + + cache_siz = length( cache.keyns ); + + keyn = length( key ); + for i=1:cache_siz + if(keyn==cache.keyns(i) && all(key==cache.keys{i})) + val = cache.vals{i}; + ind = i; + return; + end + end; + ind=-1; val=-1; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% get cache element, or fail +function [cache,found] = cacheremove( cache, key ) + [ind,val] = cacheget( cache, key ); + found = ind>0; + if( found ) + cache.freeinds = [ind cache.freeinds]; + cache.keyns(ind) = -1; + cache.keys{ind} = []; + cache.vals{ind} = []; + end diff --git a/matlab/sub2ind2.m b/matlab/sub2ind2.m new file mode 100644 index 00000000..28d71f03 --- /dev/null +++ b/matlab/sub2ind2.m @@ -0,0 +1,44 @@ +% Improved version of sub2ind. +% +% Almost the same as sub2ind, except always returns only a single output that contains all +% the subscript locations. Also handles multiple linear subscripts at the same time more +% conviniently then matlab's version. +% +% See help for sub2ind for more info. +% +% INPUTS +% siz - size of array into which sub is an index +% sub - sub(i,:) is the ith set of subscripts into the array. +% +% OUTPUTS +% ind - linear index (or vector of indicies) into given array +% +% EXAMPLE +% ind = sub2ind2( [10,10], [10 2] ); +% ind = sub2ind2( [10,10], [9 2; 10 2] ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also SUB2IND, IND2SUB2 + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function ind = sub2ind2(siz,sub) + if(isempty(sub)) ind=[]; return; end; + n = length(siz); nsub = size(sub,1); + + % error check (comment out to speed up substantially) + if( size(sub,2)~=n ) + error('Incorrect dimension for sub'); end; + %for i = 1:n if( any( sub(:,i)<1 ) || any( sub(:,i)>siz(i) ) ) + % error('subscript out of range'); end; end; + + k = [1 cumprod(siz(1:end-1))]; + ind = 1; + for i = 1:n, + ind = ind + (sub(:,i)-1)*k(i); + end + diff --git a/matlab/text2.m b/matlab/text2.m new file mode 100644 index 00000000..6380d4e7 --- /dev/null +++ b/matlab/text2.m @@ -0,0 +1,93 @@ +% Wrapper for text.m that ensures displayed text fits in figure. +% +% When text is called, Matlab displays the text, but does nothing to ensure that all of +% the text fits in the figure. This function, after calling text, shrinks the axes until +% the text is fully visible. Note that since font doesn't resize as the figure does, just +% because the text fully fits after text2 is called, no guaranties are made after the +% figure is resized. Hence it is a good idea to resize the figure appropriately before +% calling text2. +% +% Same input/output options as Matlab's text.m command. +% +% EXAMPLE +% text2( -3 , 11, 'hello world' ) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also TEXT + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function varargout = text2( varargin ) + + %%% call text normally + error(nargoutchk(0,1,nargout)); + hs = text( varargin{:} ); + if(nargout==1) varargout={hs}; end; + + %%% now make sure text fits + %%% update the OuterPosition (not regular Position) so good resize behavior + nhs = length(hs); + for i=1:nhs set(hs(i),'Units','Normalized'); end; + oldunits = get(gca,'Units'); set(gca,'Units','Normalized'); + opos = get(gca,'OuterPosition'); %x y w h + updated = 1; updatedpos=1; + while( updated ) updated=0; + for p=1:4 + if( updatedpos ) updatedpos=0; + % get overall pos of text in normalized AXIS coordinates + pos = [inf inf -inf -inf]; % [l b r t] + for i=1:nhs + extent = get(hs(i),'Extent'); % slow [l b w h] + pos(1:2) = min( pos(1:2), extent(1:2) ); + pos(3:4) = max( pos(3:4), extent(1:2) + extent(3:4) ); + end; + pos = pos * 1.05; + pos(3:4) = pos(3:4) - pos(1:2); % [l b w h] + + % convert pos to normalized FIGURE coordinates + % must move origin, and also account for scaling + axis_pos = get(gca,'Position'); + pos(1) = axis_pos(1) + pos(1) * axis_pos(3); + pos(2) = axis_pos(2) + pos(2) * axis_pos(4); + pos(3) = pos(3) * axis_pos(3); + pos(4) = pos(4) * axis_pos(4); + end + + % if necessary, move OuterPosition of axes accordingly + if( p<=2 && pos(p)<0 ) + step = min(.1,max(.001,-pos(p)/50)); + opos(p) = opos(p)+step; + opos(p+2) = opos(p+2)-step; + set(gca,'OuterPosition',opos); + updated=1; updatedpos=1; + elseif( p>2 && (pos(p-2)+pos(p))>1 ) + step = min(.1,max(.001,pos(p)/50)); + opos(p)=opos(p)-step; + set(gca,'OuterPosition',opos); + updated=1; updatedpos=1; + end + end + end + set(gca,'Units',oldunits); + + + +% % if necessary, move OuterPosition of axes accordingly +% if(p<=2 && pos(p)<0 ) +% step = max(.01,abs(pos(p))/1.5); +% opos, step, pos, p +% opos(p)=opos(p)+step; +% opos(p+2)=opos(p+2)-step; +% updated=1; updatedpos=1; +% set(gca,'OuterPosition',opos); +% elseif( p>2 && pos(p)>1 ) +% step = max(.01,(pos(p)-1)/1.5); +% opos(p)=opos(p)-step; +% updated=1; updatedpos=1; +% set(gca,'OuterPosition',opos); +% end + diff --git a/matlab/ticstatus.m b/matlab/ticstatus.m new file mode 100644 index 00000000..0b5fdea0 --- /dev/null +++ b/matlab/ticstatus.m @@ -0,0 +1,81 @@ +% Used to display the progress of a long process. +% +% Essentially, use 'ticstatusid = ticstatus' to start a new progress indicator, and then +% update the progress indicator with a call to 'tocstatus( ticstatusid, fracdone )', where +% fracdone is the fraction of the work completed. The progress indicator is shown as a +% text message (sent to stdout). For example in a loop over i where about the same amount +% of work is done each iteration, the indicator would be added as follows: +% ticstatusid = ticstatus('my message'); +% for i=1:n +% ... +% tocstatus( ticstatusid, i/n ); +% end +% Before the loop the timer is initialized, and then at the end of each iteration a call +% to tocstatus is made 'tocstatus( ticstatusid, i/n )'. The progress indicator is of the +% form: 'my message completed=4.5% [elapsed=1.0s / remaining~=21.5s]' +% +% The parameters passed to ticstatus control the behavior of the progress indicator. The +% updatefreq is the minimum time (in seconds) between updates to the progress indicator +% (a typical value is 1 second). So even if 'tocstatus( ticstatusid, i/n )' is called +% 100/second, an update occurs only once per updatefreq seconds. Next updatemint is used +% to control if a progress message shows at all. If a process is projected to take time < +% updatemint then no progress indicator is shown at all. The form of the progress +% indicator is a text message. If eraseprev is set to true, then the previously displayed +% message is erased. This ONLY WORKS if no other output was sent to stdout since the last +% call to tocstatus. Otherwise, each new update is simply sent to the progress indicator +% without first tyring to erase any previous text. Finally msg allows customization of +% the actual udpate message displayed. +% +% ticstatus returns an id that uniquely identifies the progress indicator. tocstatus +% takes this id as its first input. Once tocstatus is called with a fracdone==1, then the +% memory of the progress indicator that corresponds to id is set free (make sure to call +% tocstatus(id,1) if the progress indicator is no longer needed). Nesting of progress +% indicators is possible; however, in this case eraseprev should be set to false (otherwise +% the various progress messages may erase each other). +% +% INPUTS +% msg - [optinoal] additional msg to display in progress +% updatefreq - [optional] frequency with which to update progress (in seconds) +% updatemint - [optional] no progress is shown if process takes time < updatemint +% eraseprev - [optional] whether to attempt to erase prev message +% +% OUTPUTS +% ticstatusid - unique id of progress indicator +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also TOCSTATUS + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function id = ticstatus( msg, updatefreq, updatemint, eraseprev ) + global TICTOCSTATUS TICTOCFREEIDS + + if( nargin<1 || isempty(msg) ) msg = []; end; + if( nargin<2 || isempty(updatefreq) ) updatefreq = 1; end; + if( nargin<3 || isempty(updatemint) ) updatemint = 20; end; + if( nargin<4 || isempty(eraseprev) ) eraseprev = 1; end; + if( isempty(TICTOCFREEIDS) ) TICTOCFREEIDS = ones(1,128); end; + + % get a free id + [v,id] = max( TICTOCFREEIDS ); + if( v==0 ) + nids = length(TICTOCFREEIDS); + TICTOCFREEIDS = [TICTOCFREEIDS ones(1,nids)]; + id = nids+1; + warning('ticstatus: Doubling number of locations needed.'); + end; + TICTOCFREEIDS(id) = 0; + + % initialize TICTOCSTATUS + t0 = clock; + TICTOCSTATUS(id).updatefreq = updatefreq; + TICTOCSTATUS(id).updatemint = updatemint; + TICTOCSTATUS(id).eraseprev = eraseprev; + TICTOCSTATUS(id).msg = msg; + TICTOCSTATUS(id).t0 = t0; + TICTOCSTATUS(id).tlast = t0; + TICTOCSTATUS(id).lenprev = 0; diff --git a/matlab/tocstatus.asv b/matlab/tocstatus.asv new file mode 100644 index 00000000..96d7e83b --- /dev/null +++ b/matlab/tocstatus.asv @@ -0,0 +1,81 @@ +% Used to display the progress of a long process. +% +% For more information see ticstatus. +% +% INPUTS +% ticstatusid - unique id of progress indicator +% fracdone - value in (0,1] indicating percent of operation that is done +% +% OUTPUTS +% none +% +% DATESTAMP +% 29-May-2006 2:00pm +% +% See also TICSTATUS + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function tocstatus( id, fracdone ) + global TICTOCSTATUS TICTOCFREEIDS + + %%% error check + if( length(TICTOCSTATUS)1 ) error(['fracdone: ' num2str(fracdone) ' > 1'] ); end; + + %%% get parameters + updatefreq = TICTOCSTATUS(id).updatefreq; + updatemint = TICTOCSTATUS(id).updatemint; + eraseprev = TICTOCSTATUS(id).eraseprev; + msg = TICTOCSTATUS(id).msg; + t0 = TICTOCSTATUS(id).t0; + tlast = TICTOCSTATUS(id).tlast; + lenprev = TICTOCSTATUS(id).lenprev; + + + %%% update if enough time has passed + if( etime( clock, tlast )> updatefreq || (fracdone==1 && lenprev>0) ) + tlast = clock;; + elptime = etime(clock,t0); + fracdone = max( fracdone, eps ); + esttime = elptime/fracdone - elptime; + if( lenprev || (elptime/fracdone)>updatemint ) + if( ~lenprev ) fprintf('\n'); end; + + % create display message + fracdone_s = num2str(fracdone*100,'%.1f'); + if( elptime/fracdone < 600 ) + elptime_s = num2str(elptime,'%.1f'); + esttime_s = num2str(esttime,'%.1f'); + timetype_s = 's'; + else + elptime_s = num2str(elptime/60,'%.1f'); + esttime_s = num2str(esttime/60,'%.1f'); + timetype_s = 'm'; + end; + if( ~isempty(msg) ) msg = [msg ' ']; end; + msg = [msg 'completed=' fracdone_s '%% [elapsed=' elptime_s ]; + msg = [msg timetype_s ' / remaining~=' esttime_s timetype_s ']' ]; + + % erase previous display and create new display + if( eraseprev ) % undo previous disp + fprintf( repmat('\b', [1 lenprev] ) ); end; + fprintf( [msg ] ); % fprintf( [msg '\n'] ); + lenprev = length( msg ) - 1; %note %% (+1 if using \n) + TICTOCSTATUS(id).tlast = tlast; + TICTOCSTATUS(id).lenprev = lenprev; + end; + + end; + + %%% free id if done + if( fracdone==1 ) + if(lenprev) fprintf('\n'); end; + TICTOCFREEIDS(id) = 1; + end; diff --git a/matlab/tocstatus.m b/matlab/tocstatus.m new file mode 100644 index 00000000..934ab2d3 --- /dev/null +++ b/matlab/tocstatus.m @@ -0,0 +1,81 @@ +% Used to display the progress of a long process. +% +% For more information see ticstatus. +% +% INPUTS +% ticstatusid - unique id of progress indicator +% fracdone - value in (0,1] indicating percent of operation that is done +% +% OUTPUTS +% none +% +% DATESTAMP +% 17-May-2006 2:00pm +% +% See also TICSTATUS + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function tocstatus( id, fracdone ) + global TICTOCSTATUS TICTOCFREEIDS + + %%% error check + if( length(TICTOCSTATUS)1 ) error(['fracdone: ' num2str(fracdone) ' > 1'] ); end; + + %%% get parameters + updatefreq = TICTOCSTATUS(id).updatefreq; + updatemint = TICTOCSTATUS(id).updatemint; + eraseprev = TICTOCSTATUS(id).eraseprev; + msg = TICTOCSTATUS(id).msg; + t0 = TICTOCSTATUS(id).t0; + tlast = TICTOCSTATUS(id).tlast; + lenprev = TICTOCSTATUS(id).lenprev; + + + %%% update if enough time has passed + if( etime( clock, tlast )> updatefreq || (fracdone==1 && lenprev>0) ) + tlast = clock; + elptime = etime(clock,t0); + fracdone = max( fracdone, .00001 ); + esttime = elptime/fracdone - elptime; + if( lenprev || (elptime/fracdone)>updatemint ) + if( ~lenprev ) fprintf('\n'); end; + + % create display message + fracdone_s = num2str(fracdone*100,'%.1f'); + if( elptime/fracdone < 600 ) + elptime_s = num2str(elptime,'%.1f'); + esttime_s = num2str(esttime,'%.1f'); + timetype_s = 's'; + else + elptime_s = num2str(elptime/60,'%.1f'); + esttime_s = num2str(esttime/60,'%.1f'); + timetype_s = 'm'; + end; + if( ~isempty(msg) ) msg = [msg ' ']; end; + msg = [msg 'completed=' fracdone_s '%% [elapsed=' elptime_s ]; + msg = [msg timetype_s ' / remaining~=' esttime_s timetype_s ']' ]; + + % erase previous display and create new display + if( eraseprev ) % undo previous disp + fprintf( repmat('\b', [1 lenprev] ) ); end; + fprintf( [msg ] ); % fprintf( [msg '\n'] ); + lenprev = length( msg ) - 1; %note %% (+1 if using \n) + TICTOCSTATUS(id).tlast = tlast; + TICTOCSTATUS(id).lenprev = lenprev; + end; + + end; + + %%% free id if done + if( fracdone==1 ) + if(lenprev) fprintf('\n'); end; + TICTOCFREEIDS(id) = 1; + end; diff --git a/matlab/tps_getwarp.m b/matlab/tps_getwarp.m new file mode 100644 index 00000000..7c8dc250 --- /dev/null +++ b/matlab/tps_getwarp.m @@ -0,0 +1,78 @@ +% Given two sets of corresponding points, calculates warp between them. +% +% Uses booksteins PAMI89 method. Can then apply warp to a new set of +% points (tps_interpolate), or even an image (tps_interpolateiamge). +% +% INPUTS +% lambda - contolls rigidity of warp +% (lambda->inf means warp becomes affine) +% xs_source, ys_source - correspondence points from source image +% xs_dest, ys_dest - correspondence points from destination image +% +% OUTPUTS +% wx, affinex, wy, affiney - booksteain warping parameters +% L, Ln_inv - see bookstein +% bend_energy - bending energy +% +% EXAMPLE +% % example 1 +% xs = [ 0 -1 0 1 ]; ys = [1 0 -1 0]; xs_dest = xs; ys_dest = [3/4 1/4 -5/4 1/4]; +% [grid_xs, grid_ys] = meshgrid( -1.25:.25:1.25, -1.25:.25:1.25 ); +% [wx,ax,wy,ay,L,Ln_inv,benden] = tps_getwarp( 0, xs, ys, xs_dest, ys_dest ); +% tps_interpolate( xs, ys, xs_dest, ys_dest, wx, ax, wy, ay, grid_xs, grid_ys, 1 ); +% % example 2 +% xs = [3.6929 6.5827 6.7756 4.8189 5.6969 ]; +% ys = [10.3819 8.8386 12.0866 11.2047 10.0748 ]; +% xs_dest = [ 3.9724 6.6969 6.5394 5.4016 5.7756 ]; +% ys_dest = [ 6.5354 4.1181 7.2362 6.4528 5.1142 ]; +% [grid_xs, grid_ys] = meshgrid( 3.5:.25:7, 8.5:.25: 12.5 ); +% [wx,ax,wy,ay,L,Ln_inv,benden] = tps_getwarp( 0, xs, ys, xs_dest, ys_dest ); +% tps_interpolate( xs, ys, xs_dest, ys_dest, wx, ax, wy, ay, grid_xs, grid_ys, 1 ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also TPS_INTERPOLATE, TPS_INTERPOLATEIMAGE, TPS_RANDOM + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [wx, affinex, wy, affiney, L, Ln_inv, bend_energy ] = ... + tps_getwarp( lambda, xs_source, ys_source, xs_dest, ys_dest ) + dim = size( xs_source ); + if( all(size(xs_source)~=dim) || all(size(ys_source)~=dim) || all(size(xs_dest)~=dim)) + error( 'argument sizes do not match' ); end; + + % get L + n = size(xs_source,2); + delta_xs = [ xs_source' * ones(1,n) ] - [ ones(n,1) * xs_source ]; + delta_ys = [ ys_source' * ones(1,n) ] - [ ones(n,1) * ys_source ]; + R_sq = (delta_xs .* delta_xs + delta_ys .* delta_ys); + R_sq = R_sq+eye(n); K = R_sq .* log( R_sq ); K( find(isnan(K)) )=0; + K = K + lambda * eye( n ); + P = [ ones(n,1), xs_source', ys_source' ]; + L = [ K, P; P', zeros(3,3) ]; + LInv = L^(-1); + Ln_inv = LInv(1:n,1:n); + + % recover W's + wx = LInv * [xs_dest 0 0 0]'; + affinex = wx(n+1:n+3); + wx = wx(1:n); + + wy = LInv * [ys_dest 0 0 0]'; + affiney = wy(n+1:n+3); + wy = wy(1:n); + + % get bending energy (without regulariztion) + w = [wx'; wy']; + K = K - lambda * eye( n ); + bend_energy = trace(w*K*w')/2; + + + + + + + diff --git a/matlab/tps_interpolate.m b/matlab/tps_interpolate.m new file mode 100644 index 00000000..af3da91e --- /dev/null +++ b/matlab/tps_interpolate.m @@ -0,0 +1,48 @@ +% Apply warp (obtained by tps_getwarp) to a set of new points. +% +% INPUTS +% xs_source, ys_source - correspondence points from source image +% xs_dest, ys_dest - correspondence points from destination image +% wx, affinex, wy, affiney - booksteain warping parameters +% xs, ys - points to apply warp to +% show - whether or not to show the output +% +% OUTPUTS +% xs_p, ys_p - result of warp applied to xs, ys +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also TPS_GETWARP + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [ xs_p, ys_p ] = tps_interpolate( xs_source, ys_source, xs_dest, ys_dest, ... + wx, affinex, wy, affiney, xs, ys, show ) + % interpolate points (xs,ys) + xs_p = f( wx, affinex, xs_source, ys_source, reshape(xs,1,[]), reshape(ys,1,[]) ); + ys_p = f( wy, affiney, xs_source, ys_source, reshape(xs,1,[]), reshape(ys,1,[]) ); + + % optionally show points (xs_p, ys_p) + if (show) + figure(1); + subplot(2,1,1); plot( xs, ys, '.', 'color', [0 0 1] ); + hold( 'on' ); plot( xs_source, ys_source, '+' ); hold( 'off' ); + subplot(2,1,2); plot( xs_p, ys_p, '.' ); + hold( 'on' ); plot( xs_dest, ys_dest, '+' ); hold( 'off' ); + end; + + +% find f(x,y) for xs and ys given W and original points +function zs = f( w, affine, xs_source, ys_source, xs, ys ) + n = size(w,1); ns = size(xs,2); + delta_xs = [ xs' * ones(1,n) ] - [ ones(ns,1) * xs_source ]; + delta_ys = [ ys' * ones(1,n) ] - [ ones(ns,1) * ys_source ]; + dist_sq = (delta_xs .* delta_xs + delta_ys .* delta_ys); + dist_sq = dist_sq + eye(size(dist_sq)) + eps; + U = dist_sq .* log( dist_sq ); U( find(isnan(U)) )=0; + zs = sum((U.*(ones(ns,1)*w')),2) +affine(1)*ones(ns,1) +affine(2)*xs' +affine(3)*ys'; + + diff --git a/matlab/tps_interpolateimage.m b/matlab/tps_interpolateimage.m new file mode 100644 index 00000000..1dc6876d --- /dev/null +++ b/matlab/tps_interpolateimage.m @@ -0,0 +1,33 @@ +% Interpolate I_source according to the warp from I_source->I_dest. +% +% Use tps_getwarp to obtain the warp. +% +% INPUTS +% I_source - image to interpolate +% xs_source, ys_source - correspondence points from source image +% xs_dest, ys_dest - correspondence points from destination image +% wx, affinex, wy, affiney - booksteain warping parameters +% +% OUTPUTS +% IR - warped image +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also TPS_GETWARP + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function IR = tps_interpolateimage( I_source, xs_source, ys_source, ... + xs_dest, ys_dest, wx, affinex, wy, affiney ) + % warp grid points + [ grid_xs, grid_ys ] = meshgrid( 1:size(I_source,2), 1:size(I_source,1) ); + [ grid_xs_target, grid_ys_target ] = tps_interpolate( xs_source, ys_source, ... + xs_dest, ys_dest, wx, affinex, wy, affiney, grid_xs(:), grid_ys(:), 0 ); + grid_xs_target = reshape( grid_xs_target, size(I_source) ); + grid_ys_target = reshape( grid_ys_target, size(I_source) ); + + % use texture mapping to generate target image + IR = texture_map( double(I_source), grid_ys_target, grid_xs_target, 'crop' ); diff --git a/matlab/tps_random.m b/matlab/tps_random.m new file mode 100644 index 00000000..0cb5b4e5 --- /dev/null +++ b/matlab/tps_random.m @@ -0,0 +1,41 @@ +% Obtain a random warp with the same bending energy as the original. +% +% INPUTS +% Ln_inv - obtain from tps_getwarp (see Bookstein) +% bend_energy - amount of bening energy for random warp to have +% +% OUTPUTS +% w - nonlinear component of warp for use in tps_interpolate +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also TPS_GETWARP + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function w = tps_random( Ln_inv, bend_energy ) + n = size(Ln_inv,1); + u = rand(n-3,1) - .5; + u = u / norm(u); + u = [u; 0; 0; 0]; + + % get U, SIG, SIG_INV, requires some fanangling + [U,SIG] = eig(Ln_inv); + U = real(U); SIG=real(SIG); + SIG( find(abs(SIG)<.000001))=0; + %SIG_INV = SIG; + %SIG_INV( find(abs(SIG)>.000001) ) = 1./SIG_INV( find(abs(SIG)>.000001) ); + + % get w (and v?) + %v = sqrt(bend_energy)* U * sqrt(SIG_INV) * u; + w = sqrt(bend_energy)* U * sqrt(SIG) * u; + + %%% test to see if everything working as expected + return; + sqrt(SIG_INV) * U' * Ln_inv * U * sqrt(SIG_INV) % should be eye(N) with 3 0's + v' * Ln_inv * v, bend_energy % should be equal + +

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 ) + if( flag==4 ) + X = X / sqrt(sumX2); + else + X = X / sqrt(sumX2/n); + end + end + end + X = reshape(X,siz); + + elseif(flag==2) + % set X to range in [0,1] + X = X - min(X(:)); X = X / max(X(:)); + + elseif( flag==5 ) + X = imnormalize( X, 1 ); + t=2; + X( X<-t )= -t; + X( X >t )= t; + X = X/2/t + .5; + + else + error('Unknown standardization procedure'); + end diff --git a/images/imrotate2.m b/images/imrotate2.m new file mode 100644 index 00000000..f3665d24 --- /dev/null +++ b/images/imrotate2.m @@ -0,0 +1,40 @@ +% Custom version of imrotate that demonstrates use of apply_homography. +% +% Works exactly the same as imrotate. For usage see imrotate. +% +% INPUTS +% I - 2D image [converted to double] +% angle - angle to rotate in degrees +% method - 'nearest',{'linear'},'spline','cubic'; +% bbox - {'loose'}, 'crop' +% +% OUTPUTS +% IR - rotated image +% +% EXAMPLE +% load trees; +% tic; X1 = imrotate( X, 55, 'bicubic' ); toc, +% tic; X2 = imrotate2( X, 55, 'bicubic' ); toc +% clf; subplot(2,2,1); im(X); subplot(2,2,2); im(X1-X2); +% subplot(2,2,3); im(X1); subplot(2,2,4); im(X2); +% +% DATESTAMP +% 2-May-2006 10:00pm +% +% See also IMROTATE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function IR = imrotate2( I, angle, method, bbox ) + if( ~isa( I, 'double' ) ) I = double(I); end; + if( nargin<3 || isempty(method)) method='linear'; end; + if( nargin<4 || isempty(bbox) ) bbox='loose'; end; + if( strcmp(method,'bilinear') || strcmp(method,'lin')) method='linear'; end; + + % convert arguments for apply_homography + angle_rads = angle /180 * pi; + R = rotation_matrix2D( angle_rads ); + H = [R [0;0]; 0 0 1]; + IR = apply_homography( I, H, method, bbox ); diff --git a/images/imshrink.m b/images/imshrink.m new file mode 100644 index 00000000..40edee8d --- /dev/null +++ b/images/imshrink.m @@ -0,0 +1,85 @@ +% Used to shrink a multidimensional array I by integer amount. +% +% ratios specifies the block dimensions. For example, ratios=[2 3 4] shrinks a 3 +% dimensional array I by a factor of 2 along the first dimension, 3 along the secong and 4 +% along the third. ratios must be strictly positive integers. A value of 1 means no +% shrinking is done along a given dimension. +% +% Can handle very large arrays in a memory efficient manner. +% All the work is done by localsum_block. +% +% INPUTS +% I - k dimensional input array +% ratios - k element vector of shrinking factors +% +% OUTPUTS +% I - shrunk version of input +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also IMRESIZE, LOCALSUM_BLOCK + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function I = imshrink( I, ratios ) + siz = size(I); nd = ndims(I); + while( length(ratios)>nd && ratios(end)==1 ) ratios=ratios(1:end-1); end; + [ratios,er] = checknumericargs( ratios, [1 nd], 0, 2 ); error(er); + + % trim I to have integer number of blocks + ratios = min(ratios,siz); siz = siz - mod( siz, ratios ); + if (~all( siz==size(I))) I = arraycrop_full( I, ones(1,nd), siz ); end; + + % if memory is large, recursively call on subparts and recombine + if( prod(siz)*8e-6 > 200 ) % set max at 200MB, splits add overhead + d = randint(1,1,[1 nd]); nblocks = siz(d)/ratios(d); + if( nblocks==1 ) I = imshrink( I, ratios ); return; end; + midblock = floor(nblocks/2) * ratios(d); + inds = {':'}; inds = inds(:,ones(1,nd)); + inds1 = inds; inds1{d}=1:midblock; + inds2 = inds; inds2{d}=midblock+1:siz(d); + I1 = imshrink( I(inds1{:}), ratios ); + I2 = imshrink( I(inds2{:}), ratios ); + I = cat( d, I1, I2 ); return; + end + + % run localsum_block then divide by prod( ratios ) + classname = class( I ); + I = double(I); + I = localsum_block( I, ratios ); + I = I * (1/prod( ratios )); + I = feval( classname, I ); + + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% SLOW / BROKEN - gaussian version of above +% gauss controls whether the smoothing is done by a gaussian or +% averaging window. Using an averaging window (gauss==0) is equivalent to +% dividing the array into non-overlapping cube shaped blocks. Using a +% gaussian is equivalent to using slightly overlapping elliptical blocks. +% In this case the standard deviations of the gaussians are automatically +% determined from ratios. NOTE: sigmas are set to ratios/2/1.6. Is this ideal? +% +% The array is first smoothed, then it is subsampled. An equivalent way to +% think of this operation is that the array is divided into a series of +% blocks (with minimal or no overlap), and then each block is replaced by +% its average. +% +% if(gauss) +% % get smoothed version of I +% sigmas = ratios/2 / 1.6; sigmas(ratios==1)=0; %is this an ideal value of sigmas? +% I = gauss_smooth( I, sigmas, 'full' ); +% I = arraycrop2dims( I, siz-ratios+1 ); +% +% % now subsample smoothed I +% sizsum = size(I); +% extract={}; for d=1:nd extract{d}=1:ratios(d):sizsum(d); end; +% I = I( extract{:} ); +% end diff --git a/images/imsubs2array.m b/images/imsubs2array.m new file mode 100644 index 00000000..7b8ef5de --- /dev/null +++ b/images/imsubs2array.m @@ -0,0 +1,27 @@ +% Converts subs/vals image representation to array representation. +% +% imsubs is a 'bag of pixels' image representation which is useful for sparse arrays. +% +% INPUTS +% subs - subscripts of point locations (n x d) +% vals - values at point locations (n x 1) +% siz - image size vector (1xd) - must fully contain subs +% fillval - [optional] value to fill array with at nonspecified locs +% +% OUTPUTS +% I - array of size siz +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also IMSUBS_RESIZE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function I = imsubs2array( subs, vals, siz, fillval ) + if( nargin<4 || isempty(fillval) ) fillval=0; end; + inds = sub2ind2( siz, subs ); + I = repmat( fillval, siz ); + I(inds) = vals; diff --git a/images/imsubs_resize.m b/images/imsubs_resize.m new file mode 100644 index 00000000..df911f14 --- /dev/null +++ b/images/imsubs_resize.m @@ -0,0 +1,34 @@ +% Resizes subs in subs/vals image representation by resizevals. +% +% imsubs is a 'bag of pixels' image representation which is useful for sparse arrays. +% +% This essentially repleces each sub by sub.*resizevals. The only subtlety is that in +% images the leftmost sub value is .5, so for example when resizing by a factor of 2, the +% first pixel is replaced by 2 pixels and so location 1 in the original image goes to +% location 1.5 in the second image, NOT 2. It may be necessary to round the values +% afterward. +% +% INPUTS +% subs - subscripts of point locations (n x d) +% resizevals - k element vector of shrinking factors +% +% OUTPUTS +% subs - transformed subscripts of point locations (n x d) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also IMSUBS2ARRAY + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function subs = imsubs_resize( subs, resizevals ) + [n d] = size(subs); + [resizevals,er] = checknumericargs( resizevals, [1 d], -1, 2 ); error(er); + + % transform subs + resizevals = repmat( resizevals, [n, 1] ); + subs = (subs - .5) .* resizevals +.5; + diff --git a/images/imtranslate.m b/images/imtranslate.m new file mode 100644 index 00000000..46fa0eb3 --- /dev/null +++ b/images/imtranslate.m @@ -0,0 +1,37 @@ +% Translate an image to subpixel accuracy. +% +% Note that for subplixel accuracy cannot use nearest neighbor interpolation. +% +% INPUTS +% I - 2D image [converted to double] +% dx - x translation (right) +% dy - y translation (up) +% method - 'nearest',{'linear'},'spline','cubic'; +% bbox - {'loose'}, 'crop' +% +% OUTPUTS +% IR - rotated image +% +% EXAMPLE +% load trees; +% XT = imtranslate(X,0,1.5,'bicubic','crop'); +% figure(1); im(X,[0 255]); figure(2); im(XT,[0 255]); +% +% DATESTAMP +% 2-May-2006 10:00pm +% +% See also IMROTATE2 + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function IR = imtranslate( I, dx, dy, method, bbox ) + if( ~isa( I, 'double' ) ) I = double(I); end; + if( nargin<4 || isempty(method)) method='linear'; end; + if( nargin<5 || isempty(bbox) ) bbox='loose'; end; + if( strcmp(method,'bilinear') || strcmp(method,'lin')) method='linear'; end; + + % convert arguments for apply_homography + H = [eye(2) [dy; dx]; 0 0 1]; + IR = apply_homography( I, H, method, bbox ); diff --git a/images/imwrite2.m b/images/imwrite2.m new file mode 100644 index 00000000..53a4d44f --- /dev/null +++ b/images/imwrite2.m @@ -0,0 +1,107 @@ +% Similar to imwrite, except follows a strict naming convention. +% +% Wrapper for imwrite that writes file to the filename: +% imagename = [path name int2str2(i,ndigits) '.' ext]; +% Using imwrite: +% imwrite( I, imagename, writeparams ) +% +% If I represents a stack of images, the ith image is written to: +% imagenamei = [path name int2str2(i+imagei-1,ndigits) '.' ext]; +% +% If I=[], then imwrite2 will attempt to read images from disk instead. +% +% multflag controls how I is interpreted. If multflag==0, then I is intrepreted as a +% single image, otherwise I is interpreted as a stack of images, where I(:,:,...,j) +% represents the jth image (see feval_arrays for more info). +% +% If the directory specified by 'path' does not exist, imwrite2 attempts to create it. +% +% INPUTS +% I - image or array or cell of images (if [] reads else writes) +% multflag - set to 1 if I represents a stack of images +% imagei - first image number +% path - directory where images are +% name - base name of images +% ext - extension of image +% ndigits - number of digits for filename index +% writeparams - [varargin] additional parameters to imwrite +% +% OUTPUTS +% I - image or images (read from disk if input I=[]) +% +% EXAMPLE +% load images; clear IDXi IDXv t video videos; +% imwrite2( images(:,:,1), 0, 0, 'rats/', 'rats', 'png', 5 ); % writes first frame +% imwrite2( images(:,:,1:5), 1, 0, 'rats/', 'rats', 'png', 5 ); % writes first 5 frames +% images2 = imwrite2( [], 1, 0, 'rats/', 'rats', 'png', 5 ); % reads first 5 frames +% images2 = feval_images(@(x) x,{},'rats/','rats','png',0,4,5); % reads first 5 frames +% +% DATESTAMP +% 26-Jan-2005 2:00pm +% +% See also FEVAL_IMAGES, FEVAL_ARRAYS + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function I = imwrite2( I, multflag, imagei, path, name, ext, ndigits, varargin ) + + %%% if I is empty read from disk + if( isempty(I) ) + I = feval_images( @(x) x, {}, path, name, ext, imagei, [], ndigits ); + return; + end; + + %%% Check if path exists (create if not) and add '/' at end if needed + if( ~isempty(path) ) + if(~exist(path,'dir')) + warning( ['creating directory: ' path] ); + mkdir( path ); + end; + if( path(end)~='\' && path(end)~='/' ) path(end+1) = '/'; end; + end + + %%% Write images using one of the two subfunctions + params = varargin; + if( multflag ) + imwrite2m( [], 'init', imagei, path, name, ext, ndigits, params ); + if( ~iscell(I) ) + feval_arrays( I, @imwrite2m, 'write' ); + else + feval_arrays( I, @(x) imwrite2m(x{1},'write') ); + end + else + if( ~iscell(I) ) + imwrite2s( I, imagei, path, name, ext, ndigits, params ); + else + imwrite2s( I{1}, imagei, path, name, ext, ndigits, params ); + end; + end + + +% helper for writing multiple images (passed to feval_arrays) +function varargout = imwrite2m( I, type, varargin ) + persistent imagei path name ext ndigits params + switch type + case 'init' + error(nargchk(8,8,nargin)); + [nstart, path, name, ext, ndigits, params] = deal(varargin{:}); + if(isempty(nstart)) imagei=0; else imagei=nstart; end; + varargout = {[]}; + + case 'write' + error(nargchk(2,2,nargin)); + imwrite2s( I, imagei, path, name, ext, ndigits, params ); + imagei = imagei+1; + varargout = {[]}; + end + + +% helper for writing a single image +function imwrite2s( I, imagei, path, name, ext, ndigits, params ) + fullname = [path name int2str2(imagei,ndigits) '.' ext]; + imwrite( I, fullname, params{:} ); + + + diff --git a/images/imwrite2split.m b/images/imwrite2split.m new file mode 100644 index 00000000..5a96d21c --- /dev/null +++ b/images/imwrite2split.m @@ -0,0 +1,47 @@ +% Writes/reads a large set of images into/from multiple directories. +% +% This is useful since certain OS handle very large directories (of say >20K images) +% rather poorly (I'm talking to you Bill). Thus, can take 100K images, and write into 5 +% separate directories, then read them back in. +% +% INPUTS +% I - image or images (if [] reads else writes) +% nSplits - number of directories to split data into +% spliti - first split number +% path - directory where images are +% writeparams - [varargin] additional parameters to imwrite2 +% +% OUTPUTS +% I - image or images (read from disk if input I=[]) +% +% EXAMPLE +% load images; clear IDXi IDXv t video videos; +% imwrite2split( images, 2, 0, 'rats', 'rats', 'png', 5 ); +% images2=imwrite2split( [], 2, 0, 'rats', 'rats', 'png', 5 ); +% +% DATESTAMP +% 23-Jan-2005 2:00pm +% +% See also IMWRITE2 + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function I = imwrite2split( I, nSplits, spliti, path, varargin ) + n = size(I,3); if( isempty(I) ) n=0; end; + for s=1:nSplits + pathSplit = [path int2str2(s-1+spliti,2)]; + if( n>0 ) % write + nPerDir = ceil( n / nSplits ); + ISplit = I(:,:,1:min(end,nPerDir)); + imwrite2( ISplit, 1, 0, pathSplit, varargin{:} ); + if s~=nSplits I = I(:,:,(nPerDir+1):end); end; + else % read + ISplit = imwrite2( [], 1, 0, pathSplit, varargin{:} ); + I = cat(3,I,ISplit); + end + end; + + + diff --git a/images/jitter_image.m b/images/jitter_image.m new file mode 100644 index 00000000..f952a9ef --- /dev/null +++ b/images/jitter_image.m @@ -0,0 +1,183 @@ +% Creates multiple, slightly jittered versions of an image. +% +% Takes an image I, and generates a number of images that are copies of the original image +% with slight translation and rotation applied. The original image also appears in the +% final set. +% +% The parameter jsiz controls the size of the cropped images. If jsiz gives a size that's +% substantially smaller than I then all data in the the final set will come from I. +% However, if this is not the case then I may need to be padded first. The way this is +% done is with padarray with the 'replicate' method. If jsiz is not specified, it is set +% to be the size of the original image. A warning appears if the image needs to be grown. +% +% Rotations and translations are specified by giving a range and a maximum value for each. +% For example, if maxphi=10 and nphis=5, then the actual rotations applied are [-10 -5 0 5 +% 10]. Uses: linspace( -maxphi, maxphi, nphis ); Likewise if maxtrans=3 and ntrans=3 then +% the translations are [-3 0 3]. Each translation is applied in the x direction as well as +% the y direction. Each combination of rotation, translation in x, and translation in y +% is used (for example phi=5, transx=-3, transy=0), so the total number of images +% generated is R=ntrans*ntrans*nphis). This function works faster if all of the +% translation end up being integer valued. +% +% If the input image is actually a MxNxK stack of images then applies op to each image in +% stack and returns an MxNxKxR where R=(ntrans*ntrans*nphis) set of images. +% +% INPUTS +% I - BW input image (MxN) or images (MxNxK), must have odd dimensions +% nphis - number of rotations +% maxphis - max value for rotation +% ntrans - number of translations +% maxtrans - max value for translation +% jsiz - [optional] Final size of each image in IJ +% reflectflag - [optional] if true then also adds reflection of each image +% scales - [optional] nscalesx2 array of vert/horiz scalings +% +% OUTPUTS +% IJ - MxNxR or MxNxKxR set of images where R=(ntrans*ntrans*nphis*nscales) +% +% EXAMPLE +% load trees; I = ind2gray(X,map); I = imresize(I,[41 41]); clear X caption map +% % creates 7^2*2 images of slight translations with reflection (but no rotation) +% IJ = jitter_image( I, 0, 0, 7, 3, [35 35], 1 ); montage2(IJ,1,1) +% % creates 5 images of slight rotations (no translations) +% IJ = jitter_image( I, 5, 25, 0, 0, size(I) ); montage2(IJ,1,1) +% % creates 45 images of both rotation and slight translations +% % alternatively use (maxtrans=3) OR (nphis=5) +% IJ = jitter_image( I, 5, 10, 3, 2 ); montage2(IJ,1,1) +% % additionally create multiple scaled versions +% IJ = jitter_image( I, 1, 0, 1, 0, [], [], [1 1; 2 1; 1 2; 2 2] ); montage2(IJ,1) +% +% DATESTAMP +% 27-Feb-2005 2:00pm +% +% See also JITTER_VIDEO + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function IJ = jitter_image( I, nphis, maxphi, ntrans, maxtrans, jsiz, reflectflag, scales ) + %% NOTE: CODE HAS BECOME REALLY MESSY :-( + + %%% Eigenanalysis of IJ can be informative: + % I = double(I); + % IJ = jitter_image( I, 111, 10, 0, 0 ); + % IJ = jitter_image( I, 11, 10, 11, 3 ); %slow + % [ U, mu, variances ] = pca( IJ ); + % ks = 0:min(11,size(U,2)); % should need about 4 + % pca_visualize( U, mu, variances, IJ, [], ks ); + + nd = ndims(I); siz = size(I); + + % basic error checking and default parameter settings + if( nargin<6 || isempty(jsiz)) jsiz = []; end; + if( nargin<7 || isempty(reflectflag)) reflectflag = 0; end; + if( nargin<8 || isempty(scales)) scales = [1 1]; end; + if( nphis==0 || nphis==1) maxphi=0; nphis = 1; end; + if( ntrans==0 || ntrans==1) maxtrans=0; ntrans = 1; end; + if( isempty(jsiz)) jsiz=siz(1:2); end; + if( nd~=2 && nd~=3 || length(jsiz)~=2) + error('Only defined for 2 or 3 dimensional I'); end; + + % build trans / phis + trans = linspace( -maxtrans, maxtrans, ntrans ); + ntrans = length(trans); + trans = trans( ones(1,ntrans), : ); + trans_x = trans(:)'; trans_y = trans'; trans_y = trans_y(:)'; + trans = [ trans_x; trans_y ]; + ntrans = size(trans,2); + phis = linspace( -maxphi, maxphi, nphis ); + phis = phis / 180 * pi; + + + % I must be big enough to support given ops. So grow I if necessary. + need_siz = jsiz + 2*max(trans(1,:)); % size needed for translation + if( nphis>1 ) need_siz = sqrt(2)*need_siz+1; end; % size needed for rotation + if( size(scales,1)>1 ) % size needed for scaling + need_siz = [need_siz(1)*max(scales(:,1)) need_siz(2)*max(scales(:,2))]; end; + need_siz = ceil(need_siz); if( ndims(I)==3 ) need_siz = [need_siz siz(3)]; end; + deltas_grow = ceil( max( (need_siz - size(I))/2, 0 ) ); + if( any(deltas_grow>0) ) + I = padarray(I,deltas_grow,'replicate','both'); + warning(['jitter_image: Not enough image data - growing image need size:' ... + int2str(need_siz) ' have size: ' int2str(siz(1:2))]); + end; + + % now for each image jitter it! + if( nd==2) + IJ = jitter_image1( I, jsiz, phis, trans, scales, reflectflag ); + elseif( nd==3) + IJ = feval_arrays( I, @jitter_image1, jsiz, phis, trans, scales, reflectflag ); + IJ = reshape( IJ, size(IJ,1), size(IJ,2), [] ); + else + error('Only defined for 2 or 3 dimensional I'); + end; + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% this function does the work for SCALE +function IJ = jitter_image1( I, jsiz, phis, trans, scales, reflectflag ) + method = 'linear'; + nscales = size(scales,1); + if( nscales==1 ) % if just 1 scaling + if( ~all(scales==1) ) + S = [scales(1,1) 0; 0 scales(1,2)]; + H = [S [0;0]; 0 0 1]; + I = apply_homography( I, H, method, 'crop' ); + end; + IJ = jitter_image2( I, jsiz, phis, trans ); + else % multiple scales + IJ = repmat( I(1), [size(I) nscales] ); + for i=1:nscales + S = [scales(i,1) 0; 0 scales(i,2)]; + H = [S [0;0]; 0 0 1]; + J = apply_homography( I, H, method, 'crop' ); + IJ(:,:,i) = J; + end; + IJ = feval_arrays( IJ, @jitter_image2, jsiz, phis, trans ); + IJ = reshape( IJ, size(IJ,1), size(IJ,2), [] ); + end + + %% add reflection if reflectflag + if( reflectflag ) IJ = cat( 3, IJ, flipdim( IJ, 2 ) ); end; + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% this function does the work for ROT/TRANS +function IJ = jitter_image2( I, jsiz, phis, trans ) + method = 'linear'; + ntrans = size(trans,2); nphis = length(phis); nops = ntrans*nphis; + siz = size(I); deltas = (siz - jsiz)/2; + + %%% get each of the transformations. + index = 1; + if( all(mod(trans,1))==0) % all integer translations [optimized for speed] + startr = floor(deltas(1)+1); endr = floor(siz(1)-deltas(1)); + startc = floor(deltas(2)+1); endc = floor(siz(2)-deltas(2)); + IJ = repmat( I(1), [jsiz(1), jsiz(2), nops] ); + for phi=phis + if( phi==0) IR = I; else + R = rotation_matrix2D( phi ); + H = [R [0;0]; 0 0 1]; + IR = apply_homography( I, H, method, 'crop' ); + end + + for tran=1:ntrans + I2 = IR( (startr:endr)-trans(1,tran), (startc:endc)-trans(2,tran) ); + IJ(:,:,index) = I2; index = index+1; + end + end + else % arbitrary translations + IJ = repmat( I(1), [siz(1), siz(2), nops] ); + for phi=phis + R = rotation_matrix2D( phi ); + for tran=1:ntrans + H = [R trans(:,tran); 0 0 1]; + I2 = apply_homography( I, H, method, 'crop' ); + IJ(:,:,index) = I2; index = index+1; + end + end + IJ = arraycrop2dims( IJ, [jsiz, nops] ); + end diff --git a/images/jitter_video.m b/images/jitter_video.m new file mode 100644 index 00000000..49c02fbc --- /dev/null +++ b/images/jitter_video.m @@ -0,0 +1,95 @@ +% Creates multiple, slightly jittered versions of a video. +% +% Takes a video and creats multiple versions of the video with offsets in both space and +% time and rotations in space. Basically, for each frame in the video calls jitter_image, +% and then also adds some temporal offsets. In all respects this it basically functions +% like jitter_image -- see that function for more information. +% +% Note: All temporal translations must have integer size. +% +% INPUTS +% I - BW input video (MxNxT) or videos (MxNxTxK), must have odd dimensions +% nphis - number of spatial rotations (must be odd) +% maxphis - max value for spatial rotation +% ntrans - number of spatial translations (must be odd) +% maxtrans - max value for spatial translations +% nttrans - number of temporal translations (must be odd) +% maxttrans - max value for temporal translations +% jsiz - [optional] Final size of each video in IJ +% +% OUTPUTS +% IS - MxNxTxR or MxNxTxKxR set of videos where R=(ntrans*ntrans*nphis) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also JITTER_IMAGE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function IS = jitter_video( I, nphis, maxphi, ntrans, maxtrans, nttrans, maxttrans, jsiz ) + nd = ndims(I); siz = size(I); + + % default param settings [some params dealt with by jitter_image] + if( nargin<8 || isempty(jsiz)) jsiz = []; end; + if( nphis==0 || nphis==1) maxphi=0; nphis = 1; end; + if( ntrans==0 || ntrans==1) maxtrans=0; ntrans = 1; end; + if( nttrans==0 || nttrans==1) maxttrans=0; nttrans = 1; end; + if( isempty(jsiz)) jsiz=[siz(1:2)-2*maxtrans siz(3)-2*maxttrans]; end; + ttrans = linspace( -maxttrans, maxttrans, nttrans ); + + % basic error check + if( nd~=3 && nd~= 4 || length(jsiz)~=3) + error('Only defined for 3 or 4 dimensional I'); end; + if( ~all(mod(siz(1:3),2)==1)) + error('I must have odd dimensions'); end; + if( ~all(mod(jsiz,2)==1)) + error('Jittered I must have odd dimensions'); end; + if( mod(nttrans,2)~=1 ) + error('must have odd number of temporal translations'); end; + if( ~all(mod(ttrans,1)==0)) + error('All temporal translations must have integer size'); end; + + + % now for each video jitter it + jitter_params = {nphis, maxphi, ntrans, maxtrans, ttrans, jsiz}; + if( nd==3) + IS = jitter_video1( I, jitter_params{:} ); + elseif( nd==4) + IS = feval_arrays( I, @jitter_video1, jitter_params{:} ); + IS = permute( IS, [1 2 3 5 4] ); + end + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% this function does the work +function IS = jitter_video1( I, nphis, maxphi, ntrans, maxtrans, ttrans, jsiz ) + nttrans = length( ttrans ); + + % grow I in temporal direction + siz = size(I); + need_siz3 = jsiz(3) + 2*max(ttrans); + delta3 = max( (need_siz3 - siz(3))/2, 0 ); + if( delta3>0 ) + I = padarray(I,[0 0 delta3],'replicate','both'); + warning('jitter_video: Not enough video data - growing video.'); + end; + delta3 = (size(I,3) - jsiz(3))/2; + + % jitter frames + ISsp = jitter_image( I, nphis, maxphi, ntrans, maxtrans, jsiz(1:2) ); + + % add temporal jitter to each spatially jittered version of I + IS = repmat( ISsp(1), [jsiz, size(ISsp,4) * nttrans] ); + start3 = delta3+1; end3 = size(I,3)-delta3; + index = 1; + for i=1:size(ISsp,4) + Isp = ISsp(:,:,:,i); + for t_tran=ttrans + I2 = Isp( :,:, (start3:end3)+t_tran ); + IS(:,:,:,index) = I2; index = index+1; + end + end diff --git a/images/localsum.m b/images/localsum.m new file mode 100644 index 00000000..5891560f --- /dev/null +++ b/images/localsum.m @@ -0,0 +1,75 @@ +% Fast routine for box filtering. +% +% Same effect as calling 'C=convn( I, ones(dims), shape)', except more efficient. +% Computes local sums by using running sums. +% +% INPUTS +% I - matrix to compute sum over +% dims - size of volume to compute sum over +% shape - [optional] 'valid', 'full', or 'same', see conv2 help +% +% OUTPUTS +% C - matrix of sums +% +% EXAMPLE +% A = rand(20); dim=31; shape='valid'; +% B = localsum(A,dim,shape); +% C = conv2(A,ones(dim),shape); +% diff=B-C; sum(abs(diff(:))) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also LOCALSUM_BLOCK + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function I = localsum( I, dims, shape ) + if( nargin<3 ) shape='full'; end; + I = nlfilt_sep( I, dims, shape, @rnlfilt_sum ); + + + + + +%%%%%%%%%%%%%%% OLD SLOWER VERSION THAT USED cumsum +% if (nd==2) %%% 2D (faster version) +% m = dims(1); n = dims(2); +% mX = siz(1); nX = siz(2); +% C = [zeros(m,nX+2*n-1); +% zeros(mX,n) X zeros(mX,n-1); +% zeros(m-1,nX+2*n-1)]; +% C = cumsum(C,1); C = C(1+m:end,:)-C(1:end-m,:); +% C = cumsum(C,2); C = C(:,1+n:end)-C(:,1:end-n); +% +% else %%% ARBITRARY DIMENSION +% C = X; clear X; +% inds = {':'}; inds = inds(:,ones(1,nd)); +% for d=1:nd +% siz1 = size(C); siz1(d)=dims(d); +% siz2 = size(C); siz2(d)=dims(d)-1; +% C = cat(d, zeros(siz1), cat(d, C, zeros(siz2)) ); +% C = cumsum(C,d); +% +% inds1 = inds; inds1{ d } = 1+dims(d):size(C,d); +% inds2 = inds; inds2{ d } = 1:size(C,d)-dims(d); +% C = C(inds1{:})-C(inds2{:}); +% end +% end +% +% % crop to size +% if(strcmp(shape,'valid')) +% if( any(siz1, pixels at the boundary which will have fractions values (when a pixel should +% be say half inside the circle and half outside of the circle). Note that running time +% is O(nsamples^2*radius^2), so don't use a value that is too high for either. A series +% of masks whose angles together go from 0-2pi will sum exactly to form a radius r circle. +% r may be either an integer, or an integer + .5. A pixel is considered to belong to the +% circle iff it is within the given angle and has a value strictly smaller then r. +% +% INPUTS +% angle_start - start position of circle +% angle_size - number of radians to continue circle for +% r - mask radius (integer or integer+.5) +% nsamples - [optional] controls sampling accuracy [1 by default] +% +% OUTPUTS +% mask - the created image, size 2r by 2r +% +% EXAMPLE +% mask1 = mask_circle( -pi/8, pi/4, 20, 20 ); figure(1); im(mask1); +% mask2 = mask_circle( pi/8, pi/8, 20, 20 ); figure(2); im(mask2); +% figure(3); im(mask1+mask2); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also MASK_ELLIPSE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function mask = mask_circle( angle_start, angle_size, r, nsamples ) + if( nargin<4 || isempty(nsamples) ) nsamples = 1; end; + + % create circle + sampling = -(r-.5/nsamples):1/nsamples:(r-.5/nsamples); + mask = zeros(nsamples*r*2); + [x,y] = meshgrid(sampling, -sampling); + mask( find( x.^2+y.^2=angle_end ) ) = 0; + else + mask( find(angles>=angle_end & angles1) + mask = localsum( mask, nsamples, 'valid' ); + sampling= 1:nsamples:nsamples*r*2; + mask = mask(sampling,sampling) / nsamples^2; + end; diff --git a/images/mask_ellipse.m b/images/mask_ellipse.m new file mode 100644 index 00000000..6129fdd6 --- /dev/null +++ b/images/mask_ellipse.m @@ -0,0 +1,68 @@ +% Creates a binary image of an ellipse. +% +% Creats a binary image of size (mrows x ncols), with all pixels off except inside of the +% specified ellipse. The ellipse is given by 5 parameters, a semimajor axis of ra, a +% semminor axis of radius rb, angle phi (in radians), centered at (crow,ccol). +% +% An alternative method of specifying the ellipse parameters is in terms of the parameters +% of a 2d gaussian. For more information on how a gaussian relates to an ellipse see +% gauss2ellipse. +% +% USAGE +% mask = mask_ellipse( mrows, ncols, crow, ccol, ra, rb, phi ) +% mask = mask_ellipse( mrows, ncols, mu, C, d ) +% +% INPUTS +% % version 1 +% mrows - number of rows in mask +% ncols - number of columns in mask +% crow - the row location of the center of the ellipse +% ccol - the column location of the center of the ellipse +% ra - semi-major axis length (in pixels) of the ellipse +% rb - semi-minor axis length (in pixels) of the ellipse +% phi - rotation angle (in radians) of the semimajor axis from the x-axis +% % version 2 +% mrows - number of rows in mask +% ncols - number of columns in mask +% mu - 1x2 vector representing the center of the ellipse +% C - 2x2 cov matrix +% d - [optional] Number of std to create the ellipse to (2 is default) +% +% OUTPUTS +% mask - created image mask +% +% EXAMPLE +% mask = mask_ellipse( 200, 200, 40, 100, 20, 15, pi/4 ); +% figure(1); im(mask); [mu,C] = imageMLG( mask, 0, 2 ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also PLOT_ELLIPSE, GAUSS2ELLIPSE, MASK_CIRCLE, MASK_GAUSSIANS, IMAGEMLG + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function mask = mask_ellipse( mrows, ncols, varargin ) + if( nargin==7 ) + [crow, ccol, ra, rb, phi] = deal( varargin{:} ); + elseif( nargin==4 ) + [mu, C] = deal( varargin{:} ); + [crow, ccol, ra, rb, phi] = gauss2ellipse( mu, C ); + elseif( nargin==5 ) + [mu, C, d] = deal( varargin{:} ); + [crow, ccol, ra, rb, phi] = gauss2ellipse( mu, C, d ); + else + error( ['Incorrect number of input arguments: ' int2str(nargin)] ); + end; + + + % get indicies of locations inside ellipse + [n, locs] = mask_ellipse1( crow, ccol, ra, rb, phi, mrows, ncols ); + + % create binary mask + locs = double( locs(1:n,:) ); + inds = locs(:,1) + (mrows)*(locs(:,2)-1); + mask = zeros( mrows, ncols ); + mask( inds ) = 1; diff --git a/images/mask_gaussians.m b/images/mask_gaussians.m new file mode 100644 index 00000000..5a40bcdd --- /dev/null +++ b/images/mask_gaussians.m @@ -0,0 +1,104 @@ +% Divides a volume into softly overlapping gaussian windows. +% +% Return M^nd masks each of size siz. Each mask represents a symmetric gaussian window +% centered at a different location. The locations are evenly spaced throughout the array +% of size siz. For example, if M=2, then along each dimension d the location of each mask +% is either 1/4 or 3/4 of siz(d) and likewise if M=3 that mask is at 1/6,3/6, or 5/6 of +% siz(d). For higher M the locations are: 1/2M,3/2M,...,M-1/2M. +% +% See examples below to visualize the masks. +% +% The std of each gaussian is set to be equal to the spacing between two adjacent masks +% multiplied by windowwidth. Reducing the widths of the gaussians causes there to be less +% overlap between masks, but if the width is reduced too far certain pixels in between +% masks receive very little weight. A desired property of the masks is that their +% coverage (the total weight placed on the pixel by all the masks) is approximately +% constant. Typically, we settle for having the coverage be monotonically decreasing as +% we move away from the center. (In reality the coverage oscilates as we move past peaks, +% it's just that the oscillations tend to be tiny). The default value of windowidth is +% .6, which minimizes overlap while still providing good overall coverage. Values lower +% tend to produce noticeable oscillations in coverage. +% +% offset (in [-1,1]) controls the spacing of the locations. Essentially, a positive +% offset moves the locations away from the center of the array and a negative offset moves +% the windows away from the center. Using a positive offset gives better coverage to +% areas near the borders. +% +% INPUTS +% siz - dimensions of each mask +% M - # of mask locations along each dimension [either scalar or vector] +% windowwidth - [optional] see above - default: .6 +% offset - [optional] see above - default: .1 +% show - [optional] figure to use for display (no display if == 0) (nd<=3) +% +% OUTPUTS +% masks - [see above] array of size [siz x M^nd] +% keeplocs - logical array of all location where masks is (almost) nonzero +% +% EXAMPLE +% masks = mask_gaussians( 100, 10, .6, -.1, 1 ); %1D +% masks = mask_gaussians( [35 35], 3, .6, .1, 1 ); %2D +% masks = mask_gaussians( [35 35 35], [2 2 4], .6, .1, 1 ); %3D +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also HISTC_SIFT + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [masks,keeplocs] = mask_gaussians( siz, M, windowwidth, offset, show ) + nd = length(siz); + if( nargin<3 || isempty(windowwidth)) windowwidth = .6; end; + if( nargin<4 || isempty(offset)) offset = .1; end; + if( nargin<5 || isempty(show) || nd>3 ) show = 0; end; + + %%% uses a cache because operation is very slow, but often called with same inputs. + persistent cache; if( isempty(cache) ) cache=simplecache('init'); end; + key = [nd siz M windowwidth offset]; + [found,val] = simplecache( 'get', cache, key ); + if( found ) %%% get masks and keeplocs from cache + [masks,keeplocs] = deal(val{:}); + else %%% create masks and keeplocs + [M,er] = checknumericargs( M, [1 nd], 0, 2 ); error(er); + inds = {':'}; inds = inds(:,ones(1,nd)); + if( abs(offset)>1 ) error('offset too large'); end; + + %%% the covariance of each window + spacing = (siz*(1+2*offset))./M; + sigmas = spacing * windowwidth; + C = diag(sigmas.^2); + + %%% create each mask + masks = zeros( [siz,prod(M)] ); + for c=1:prod(M) + sub = ind2sub2( M, c ); + mus = (sub-.5).* spacing + .5-offset*siz; + masks(inds{:},c) = filter_gauss_nD( siz, mus, C ); + end + keeplocs = masks>1e-7; + + %%% place into cache + cache = simplecache( 'put', cache, key, {masks,keeplocs} ); + end; + + %%% optionally display + if( show ) + if( nd==1 ) + figure(show); clf; plot( masks ); + figure(show+1); clf; plot(sum( masks,nd+1 )); + a=axis; a(3)=0; axis(a); + title('coverage'); + elseif( nd==2) + figure(show); clf; montage2( masks, 1, 1 ); + figure(show+1); clf; im(sum( masks,nd+1)); + title('coverage'); + elseif( nd==3) + figure(show); clf; montages2( masks, {0, 1} ); + figure(show+1); clf; montage2(sum( masks,nd+1), 1, 1 ); + title('coverage'); + end + end; + diff --git a/images/modefilt1.m b/images/modefilt1.m new file mode 100644 index 00000000..a3d4a8e3 --- /dev/null +++ b/images/modefilt1.m @@ -0,0 +1,46 @@ +% One-dimensional mode filtering. +% +% Applies an order 2*r+1 one-dimensional mode filter to vector x. That is each element of +% the output y(i) corresponds to the mode of x(i-s/2:i+s/2). At boundary regions, y is +% calculated on smaller windows, for example y(1) is calculated over x(1:1+s/2). Note +% that for this function to make sense x should take on only a number of discrete values. +% +% INPUTS +% x - length n vector +% s - filter size +% +% OUTPUTS +% y - filtered vector x +% +% EXAMPLE +% x=[0, 1, 0, 0, 0, 3, 0, 1, 3, 1, 2, 2, 0, 1]; s=4; +% ymedian = medfilt1( x, s ); +% ymode = modefilt1( x, s ); +% [x; ymedian; ymode] +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also MEDFILT1 + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function y = modefilt1( x, s ) + [b,dis,inds] = unique(x(:)'); + m = length(b); n = length(x); + if(m>256) warning( 'modefilt1: x takes on a large number of different values'); end; + + % create quantized representation + A = zeros( m, n ); + Ainds = sub2ind2( [m,n], [inds; 1:n]' ); + A( Ainds ) = 1; + + % apply local_sum (or smooth?) + %A = gauss_smooth( A, [0 r/2-1], 'smooth' ); + A = localsum( A, [0 s], 'same' ); + + % create y + [vs,inds] = max( A,[],1 ); + y=b( inds ); diff --git a/images/montage2.m b/images/montage2.m new file mode 100644 index 00000000..ac3e0cce --- /dev/null +++ b/images/montage2.m @@ -0,0 +1,135 @@ +% [3D] Used to display a stack of T images. +% +% Improved version of montage, with more control over display. +% +% NOTE: Can convert between MxNxT and MxNx3xT image stack via: +% I = repmat( I, [1,1,1,3] ); I = permute(I, [1,2,4,3] ); +% +% INPUTS +% IS - MxNxT or MxNx1xT or MxNx3xT array (of bw or color images) +% showlines - [optional] whether to show lines separating the various frames +% extrainfo - [optional] if 1 then a colorbar is shown as well as pixval bar +% clim - [optional] clim = [clow chigh] optional scaling of data +% mm - [optional] #images/col (if [] then calculated) +% nn - [optional] #images/row (if [] then calculated) +% labels - [optional] cell array of strings specifying labels for each image +% +% OUTPUTS +% h - image handle +% mm - #images/col +% nn - #images/row +% +% EXAMPLE +% load( 'images.mat' ); +% montage2( images ); +% +% DATESTAMP +% 22-May-2005 11:00pm +% +% See also MONTAGE, MAKEMOVIE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function varargout = montage2( IS, showlines, extrainfo, clim, mm, nn, labels ) + if (nargin<2 || isempty(showlines)) showlines = 0; end; + if (nargin<3 || isempty(extrainfo)) extrainfo = 0; end; + if (nargin<4 || isempty(clim)) clim = []; end; + if (nargin<5 || isempty(mm)) mm = []; end; + if (nargin<6 || isempty(nn)) nn = []; end; + if (nargin<7 || isempty(labels)) labels = {}; end; + + %%% take care of single images + if( ndims(IS)==2) + if(~isempty(clim)) h=imagesc(IS,clim); else h=imagesc(IS); end; + title(inputname(1)); colormap(gray); axis('image'); + if(extrainfo) + colorbar; pixval on; + else + set(gca,'XTick',[]); set(gca,'YTick',[]); + end; + if( nargout>0 ) varargout={h,1,1}; end; + return; + end + + %%% get/test image format info + if( ndims(IS)==3) IS = permute(IS, [1,2,4,3] ); end; + nd = ndims(IS); % wierd bug in old version of matlab 6.0 + if( nd~=4 ) error('unsupported dimension of IS'); end; + siz = size(IS); nch = siz(3); + if( nch~=1 && nch~=3 ) error('illegal image stack format'); end; + if( ~isempty(labels) && siz(4)~=length(labels) ) + error('incorrect number of labels'); end; + + %%% get layout of images (mm=#images/row, nn=#images/col) (bit hacky!!!) + if( isempty(mm) || isempty(nn)) + if( isempty(mm) && isempty(nn)) + nn = sqrt(siz(1)*siz(2)*siz(4)) / siz(2); + mm = siz(4)/nn; + elseif( isempty(mm)) + mm = siz(4)/nn; + else + nn = sqrt(prod(siz))/mm; + end; + + if( ceil(nn)-nn) < (ceil(mm)-mm), + nn = ceil(nn); mm = ceil(siz(4)/nn); + else + mm = ceil(mm); nn = ceil(siz(4)/mm); + end + + while((mm-1)*nn>=siz(4)) mm = mm-1; end; + while((nn-1)*mm>=siz(4)) nn = nn-1; end; + end; + + + %%% Calculate I (M*mm x N*nn size image) + I = IS(1,1); + if(~isempty(clim)) I(1,1) = clim(1); else I(1,1) = min(IS(:)); end; + I = repmat(I, [mm*siz(1), nn*siz(2), nch]); + rows = 1:siz(1); cols = 1:siz(2); + for i=0:mm-1, for j=0:nn-1, + k = j+i*nn+1; if( k>siz(4)) i=mm; j=nn; break; end; + I(rows+i*siz(1),cols+j*siz(2),:) = IS(:,:,:,k); + end; end; + + %%% display I + if( ~isempty(clim)) h=imagesc(I,clim); else h=imagesc(I); end; + colormap(gray); title(inputname(1)); axis('image'); + if( extrainfo) + colorbar; pixval on; + else + set(gca,'XTick',[]); set(gca,'YTick',[]); + end; + + %%% draw lines seperating frames + if( showlines ) + montage_width = nn * siz(2) + .5; montage_height = mm * siz(1) + .5; + for i=1:mm-1 height = i*siz(1)+.5; line([.5,montage_width],[height,height]); end + for i=1:nn-1 width = i*siz(2)+.5; line([width,width],[.5,montage_height]); end + end + + %%% plot text labels + textalign = { 'VerticalAlignment','bottom','HorizontalAlignment','left'}; + if( ~isempty(labels) ) + count=1; for i=1:mm, for j=1:nn, + if( count<=siz(4)) + rstart = i*siz(1); cstart =(j-1+.1)*siz(2); + text(cstart,rstart,labels{count},'color','r',textalign{:}); + count = count+1; + end + end; end; + end + + %%% cross out unused frames + [nns,mms] = ind2sub( [nn,mm], siz(4)+1 ); + for i=mms-1:mm-1, for j=nns-1:nn-1, + rstart = (i+1)*siz(1)+.5; cstart =j*siz(2)+.5; + cs = [cstart,cstart+siz(2)]; rs = [rstart,rstart-siz(1)]; + line( cs, rs ); line( fliplr(cs), rs ); + end; end; + + %%% optional output + if( nargout>0 ) varargout={h,mm,nn}; end + diff --git a/images/montages.m b/images/montages.m new file mode 100644 index 00000000..8cc11d4c --- /dev/null +++ b/images/montages.m @@ -0,0 +1,103 @@ +% [4D] Used to display R sets of T images each. +% +% Displays one montage (see montage2) per subplot. +% +% INPUTS +% IS - MxNxTxR or MxNx1xTxR or MxNx3xTxR array, or cell array where each +% element is an MxNxT or MxNx1xT or MxNx3xT array +% montage2params - [optional] params for montage2 EXCEPT labels; ex: {showlines} +% lables - [optional] cell array of strings - titles for subplots +% montage2labels - [optional] cell of cells of strings: montage2 lables for subplots +% +% OUTPUTS +% mm - #montages/row +% nn - #montages/col +% +% EXAMPLE +% load( 'images.mat' ); +% imageclusters = clustermontage( images, IDXi, 16, 1 ); +% montages( imageclusters ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also MONTAGES2, MAKEMOVIES, MONTAGE2, CLUSTERMONTAGE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function varargout = montages( IS, montage2params, labels, montage2labels ) + if( nargin<2 ) montage2params = {}; end; + if( nargin<3 ) labels = {}; end; + if( nargin<4 ) montage2labels = {}; end; + + %%% set up parameters for montage2 + nparams = length(montage2params); + if( nparams>5 ) + % montage2labels must be particular to each montage2 + montage2params=montage2params(1:5); + extrainfo = []; + else + % pad montage2params appropriately + montage2params=[montage2params cell(1,5-nparams)]; + % no extrainfo per subplot + extrainfo = montage2params{2}; montage2params{2} = 0; + end + + %%% get/set clim + if( isempty(montage2params{3}) ) + if( iscell(IS) ) + clim = [inf -inf]; + for i=1:length(IS) + I = IS{i}(:); + clim(1)=min(clim(1),min(I)); + clim(2)=max(clim(2),max(I)); + end + else + clim = [min(IS(:)),max(IS(:))]; + end + montage2params{3} = clim; + end; + + + %%% get/test image format info + nd = ndims(IS); + if( iscell(IS)) %testing for dims done in montage2 + nmontages = prod(size(IS)); + elseif( nd==4) %MxNxTxR + nmontages = size(IS,4); + elseif( nd==5) %MxNx1xTxR or MxNx3xTxR + nmontages = size(IS,5); + nch = size(IS,3); legal = (nch==1 || nch==3); + if( ~legal ) error('illegal image stack format'); end; + else + error('unsupported dimension of IS'); + end; + if( isempty(montage2labels)) montage2labels=cell(1,nmontages); end; + + + %%% get layout of images (mm=#montages/row, nn=#montages/col) + nn = ceil( sqrt(nmontages) ); + mm = ceil( nmontages/nn ); + + %%% draw each montage + for i=1:nmontages + subplot(mm,nn,i); + if( iscell(IS) ) + if( ~isempty(IS{i}) ) + montage2( IS{i}, montage2params{:}, montage2labels{i} ); + else + set(gca,'XTick',[]); set(gca,'YTick',[]); %extrainfo off + end; + elseif( nd==4) + montage2( IS(:,:,:,i), montage2params{:}, montage2labels{i} ); + else + montage2( IS(:,:,:,:,i), montage2params{:}, montage2labels{i} ); + end + if(~isempty(labels)) title(labels{i}); end; + end + if( ~isempty(extrainfo) && extrainfo) pixval on; end; + + %%% optional output + if( nargout>0 ) varargout={mm,nn}; end diff --git a/images/montages2.m b/images/montages2.m new file mode 100644 index 00000000..e105a87e --- /dev/null +++ b/images/montages2.m @@ -0,0 +1,72 @@ +%MONTAGES2 [4D] Used to display R sets of T images each. +% +% Displays one montage (see montage2) per row. Each of the R image sets is flattened to +% a single long image by concatenating the T images in the set. +% Alternative to montages. +% +% INPUTS +% IS - MxNxTxR or MxNx1xTxR or MxNx3xTxR array +% montage2params - [optional] params for montage2; ex: {showlines, extrainfo} +% padsize - [optional] total amount of vertical or horizontal padding +% +% OUTPUTS +% I - 3D or 4D array of flattened images, displayed with montage2 +% mm - #montages/row +% nn - #montages/col +% +% EXAMPLE +% load( 'images.mat' ); +% imageclusters = clustermontage( images, IDXi, 16, 1 ); +% montages2( imageclusters ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also MONTAGES, MAKEMOVIES, MONTAGE2, CLUSTERMONTAGE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function varargout = montages2( IS, montage2params, padsize ) + if( nargin<2 || isempty(montage2params) ) montage2params = {}; end; + if( nargin<3 || isempty(padsize) ) padsize = 4; end; + [padsize,er] = checknumericargs( padsize,[1 1], 0, 1 ); error(er); + + %%% get/test image format info + nd = ndims(IS); siz = size(IS); + if( nd==3 ) %MxNxTx1 + nmontages = 1; + elseif( nd==4 ) %MxNxTxR + nmontages = size(IS,4); + elseif( nd==5 ) %MxNx1xTxR or MxNx3xTxR + nmontages = size(IS,5); + nch = size(IS,3); + if( nch~=1 && nch~=3 ) error('illegal image stack format'); end; + if( nch==1 ) IS = squeeze(IS); nd=4; siz=size(IS); end; + else + error('unsupported dimension of IS'); + end; + + + %%% reshape IS so that each 3D element is concatentated to a 2D image, adding padding + padelement = max(IS(:)); + IS=arraycrop2dims(IS, [siz(1)+padsize siz(2:end)], padelement ); %UD pad + siz=size(IS); + if(nd==3) % reshape bw single + IS=squeeze( reshape( IS, siz(1), [] ) ); + elseif(nd==4) % reshape bw + IS=squeeze( reshape( IS, siz(1), [], siz(4) ) ); + else % reshape color + IS=squeeze( reshape( permute(IS,[1 2 4 3 5]), siz(1), [], siz(3), siz(5) ) ); + end; siz = size(IS); + IS=arraycrop2dims(IS, [siz(1) siz(2)+padsize siz(3:end)], padelement); %LR pad + siz=size(IS); + + + %%% show using montage2 + varargout = cell(1,nargout); + if( nargout) varargout{1}=IS; end; + [varargout{2:end}] = montage2( IS, montage2params{:} ); + title(inputname(1)); + diff --git a/images/movie2images.m b/images/movie2images.m new file mode 100644 index 00000000..e880cd7b --- /dev/null +++ b/images/movie2images.m @@ -0,0 +1,39 @@ +% Creates a stack of images from a matlab movie M. +% +% Repeatedly calls frame2im. +% Useful for playback with playmovie. +% +% INPUTS +% M - a matlab movie +% +% OUTPUTS +% I - MxNxT array (of images) +% +% EXAMPLE +% load( 'images.mat' ); +% M = makemovies( videos ); +% playmovie(movie2images(M)); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also PLAYMOVIE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function I = movie2images( M ) + I = feval_arrays( M, @frame2Ii ); + +function I = frame2Ii( F ) + [I,map] = frame2im( F ); + if( isempty(map) ) + if( size(I,3)==3 ) + classname = class( I ); + I = sum(I,3)/3; + I = feval( classname, I ); + end + else + I = ind2gray( I, map ); + end diff --git a/images/nonmaxsupr.m b/images/nonmaxsupr.m new file mode 100644 index 00000000..de4676aa --- /dev/null +++ b/images/nonmaxsupr.m @@ -0,0 +1,147 @@ +% Applies nonmaximal suppression on an image of arbitrary dimension. +% +% nonmaxsupr( I, ... ) returns the pixel location and values of local maximums - that is a +% location is returned only if it has a value greater then or equal to all pixels in the +% surrounding window of size radii. I can be smoothed first to make method more robust. +% The first output is an array of the subscript locations of maximal values in I and the +% second output contains the corresponding maximal values. One can convert subs/vals back +% to an array representation using imsubs2array. Note that values are suppressed iff there +% are strictly greater values in the neighborhood. Hences nonmaxsupr(ones(10),5) would +% not suppress any values. +% +% INPUTS +% I - matrix to apply nonmaxsupr to +% radii - suppression window dimensions +% thresh - [optional] minimum value below which not to look for maxes +% maxn: - [optional] return at most maxn of the largest vals +% +% OUTPUTS +% subs - subscripts of non-suppressed point locations (n x d) +% vals - values at non-suppressed point locations (n x 1) +% +% EXAMPLE +% % example 1 +% G = filter_gauss_nD( [25 25], [13,13], 3*eye(2), 1 ); +% siz=[11 11]; G = filter_gauss_nD( siz, (siz+1)/2, eye(2), 1 ); +% [subs,vals] = nonmaxsupr( G, 1, eps ); +% figure(2); im( imsubs2array( subs, vals, siz ) ); +% [subs,vals] = nonmaxsupr_list( ind2sub2(siz,(1:prod(siz))'), G(:)',1 ); +% figure(3); im( imsubs2array( subs, vals, siz ) ); +% % example 2 +% siz=[30 30]; I=ones(siz); I(22,23)=I(22,23)+3; +% I(12,23)=I(12,23)+5; I(7,1)=I(7,1)-.5; figure(1); im(I); +% r=3; supr_eq = 1; maxn=[]; thresh=eps; +% [subs,vals] = nonmaxsupr(I,r,thresh,maxn); +% figure(2); im( imsubs2array( subs, vals, siz ) ); +% [subs,vals] = nonmaxsupr_window(subs,vals,[1 1]+6,siz-6); +% figure(3); im( imsubs2array( subs, vals, siz ) ); +% [subs2,vals2] = nonmaxsupr_list( ind2sub2(siz,(1:prod(siz))'), ... +% I(:)',r,thresh,maxn,supr_eq ); +% figure(4); im( imsubs2array( subs2, vals2, siz ) ); +% +% DATESTAMP +% 05-May-2006 2:00pm +% +% See also IMSUBS2ARRAY, NONMAXSUPR_LIST, NONMAXSUPR_WINDOW + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + + +function [subs,vals] = nonmaxsupr( I, radii, thresh, maxn ) + siz = size(I); nd = ndims(I); + + %%% default values [error checking done by nlfilter_max] + if( nargin<3 || isempty(thresh)) thresh=min(I(:))-eps; end; + if( nargin<4 || isempty(maxn)) maxn = 0; end; + + %%% all the work is really done by nlfilter_max.m + IR = nlfilt_sep( I, 2*radii+1, 'same', @rnlfilt_max ); + suprlocs = (I < IR) | (I <= thresh); + + %%% create output accordingly + subs = find( suprlocs==0 ); vals = I( subs ); + [vals,order] = sort(-vals); vals=-vals; subs=subs(order); + if( ~isempty(maxn) && maxn>0 && maxn int32max ) +% if( ~strcmp(classname,'double') ) I=double(I); maxI=double(maxI); end; +% convertratio = int32max / maxI; I = I * convertratio; +% suprval = suprval * convertratio; +% thresh = thresh * convertratio; +% else convertratio = 1; end +% I = int32(I); +% suprval=int32(suprval); +% thresh=int32(thresh); +% end; Iorig=I; +% +% %%% find maxes [MAIN LOOP] +% Ibig = arraycrop2dims( I, siz+2*radii, minI ); +% sizbig = size(Ibig); IS = Ibig; subs = []; vals = []; +% nmaxes = 0; while( nmaxes < maxn ) +% +% % get max nonsuppressed value and window around it +% [v,ind] = max(IS(:)); +% if (v <= thresh) break; end; +% sub = ind2sub2( sizbig, ind ); +% for d=1:nd window_bounds{d} = sub(d)-radii(d):sub(d)+radii(d); end; +% +% % store v if it is biggest value in window +% W = Ibig( window_bounds{:} ); w = max(W(:)); +% if( v==w ) subs = [subs; sub]; vals = [vals; v]; nmaxes = nmaxes + 1; end +% +% % suppress all values in that window regardless +% IS( window_bounds{:} ) = minI; +% end +% n = size( subs, 1 ); if (n>0) subs = subs - repmat( radii, [n,1] ); end; +% +% +% %%% convert subs/vals to image format +% if( nargout~=2 ) +% inds = sub2ind2( siz, subs ); +% IS = repmat( suprval, siz ); +% IS( inds ) = vals; +% end; +% +% +% %%% create output [possibly converting back to original type] +% if( nargout==2 ) +% if( ~strcmp(classname,'int32') ) +% if( convertratio~=1 ) vals = double(vals) / convertratio; end; +% vals = feval( classname, vals ); +% end; +% varargout = {subs,vals}; +% else +% if( ~strcmp(classname,'int32') ) +% if( convertratio~=1 ) IS = double(IS) / convertratio; end; +% IS = feval( classname, IS ); +% end; +% varargout = {IS}; +% end diff --git a/images/nonmaxsupr_list.m b/images/nonmaxsupr_list.m new file mode 100644 index 00000000..f1ad86bb --- /dev/null +++ b/images/nonmaxsupr_list.m @@ -0,0 +1,76 @@ +% Applies nonmaximal suppression to a list. +% +% See nonmaxsupr for more information. Has the same effect as nonmaxsupr except it +% operates on a list of position/values pairs. Running time is n^2 in the number of such +% pairs. For comparison running time of nonmaxsupr is order( sum( size(I,d)*radii(d) ). +% +% This function has an additional parameter - supr_eq that causes a value in a given +% window to be suppressed unless it is the UNIQUE maximum in the window. This is if +% supr_eq==1, then all locations that are not strictly the biggest in their window are +% suppressed. This can be useful for large flat regions -- nonmaxsupr(ones(30),3) does no +% suppression since all values are equal in each window, but nonmaxsupr_list(ones(30),3) +% suppresses all locations. +% +% INPUTS +% subs - subscripts of point locations (m x d) +% vals - values at point locations (m x 1) +% radii - suppression window dimensions +% thresh - [optional] minimum value below which not to look for (or []) +% maxn: - [optional] return at most maxn of the largest vals +% supr_eq - [optional] suppress equal vals (see above) +% +% OUTPUTS +% subs - subscripts of non-suppressed point locations (n x d) +% vals - values at non-suppressed point locations (n x 1) +% keeplocs - indicies of kept locations from subs (n x 1) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also IMSUBS2ARRAY, NONMAXSUPR, NONMAXSUPR_WINDOW + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [subs,vals,keeplocs] = nonmaxsupr_list( subs, vals, radii, thresh, maxn, supr_eq) + if( nargin<4 || isempty(thresh)) thresh=[]; end; + if( nargin<5 || isempty(maxn)) maxn=0; end; + if( nargin<6 || isempty(supr_eq)) supr_eq=0; end; + + vals = vals(:); siz = max( subs ); nvals = length(vals); + [radii,er] = checknumericargs( radii, size(siz), 0, 1 ); error(er); + + % CAN ADD RECURSION TO SIGNIFICANTLY SPEED IT UP (under certain assump)! + % simply divide into 2 eqal regions, (plus 3rd overlap region) using + % nonmaxsupr_window. then & keeplocs results from all 3. + if( nvals>5000 ) error('Input too large - use nonmaxsupr.'); end; + + % discard vals below thresh + if (~isempty(thresh)) + keeplocs = vals > thresh; + else + keeplocs = logical( ones( nvals, 1 ) ); + end + + % now supress equals - for each (nonsuppressed) i, suppress it if any + % of its neighbors are greater then (or greater then or equal) to it. + radii_rep = repmat( radii, [nvals,1] ); + for i=1:nvals if( keeplocs(i) ) + if( supr_eq ) geqlocs = (vals >= vals(i)); geqlocs(i)=0; + else geqlocs = (vals > vals(i)); end; + ngeqlocs=sum(geqlocs); + dists = abs( subs(geqlocs,:) - ones(ngeqlocs,1) * subs(i,:)); + if( any( all( dists <= radii_rep(1:ngeqlocs,:), 2 ) ) ) keeplocs(i)=0; end + end; end; + + % suppress all but the first maxn values in keeplocs + if( ~isempty(maxn) && maxn>0 && maxnmaxn ) = 0; + keeplocs = keeplocs(unorder); + end + + % discard all vals/subs not in keeplocs + vals = vals( keeplocs ); subs = subs( keeplocs, : ); diff --git a/images/nonmaxsupr_window.m b/images/nonmaxsupr_window.m new file mode 100644 index 00000000..7c1cca9c --- /dev/null +++ b/images/nonmaxsupr_window.m @@ -0,0 +1,64 @@ +% Nonmaximal suppression of values outside of a given window. +% +% Suppresses all location in subs that do not fall in given range (defined by start_locs +% and end_locs). For example, if subs are 3D coordinates of maxes over an array of size +% siz, "nonmaxsupr_window( subs, vals, [1,1,1]+10, siz-10 )" suppreses all locations +% within 10 pixels of the border of I. +% +% INPUTS +% subs - subscripts of point locations (m x d) +% vals - values at point locations (m x 1) +% start_locs - locations at which to start cropping along each dim +% end_locs - locations at which to end cropping along each dim +% thresh - [optional] minimum value below which not to look fo +% maxn - [optional] return at most maxn of the largest vals +% +% OUTPUTS +% subs - subscripts of non-suppressed point locations (n x d) +% vals - values at non-suppressed point locations (n x 1) +% keeplocs - indicies of kept locations from subs (n x 1) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also IMSUBS2ARRAY, NONMAXSUPR, NONMAXSUPR_LIST + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [subs,vals,keeplocs] = nonmaxsupr_window( subs, vals, ... + start_locs, end_locs, thresh, maxn ) + vals = vals(:); nvals = length(vals); nd=size(subs,2); + if( nargin<5 || isempty(thresh)) thresh=[]; end; + if( nargin<6 || isempty(maxn)) maxn = []; end; + + [start_locs,er] = checknumericargs( start_locs, [1 nd], 0, 0 ); error(er); + [end_locs,er] = checknumericargs( end_locs, [1 nd], 0, 0 ); error(er); + if (any(start_locs>end_locs)) error('start_locs must be <= end_locs'); end; + + % discard vals below thresh + if (~isempty(thresh)) + keeplocs = vals > thresh; + else + keeplocs = logical( ones( nvals, 1 ) ); + end + + % suppress all values outside of window defined by start and end locs + for d=1:nd + if (start_locs(d)>0) + keeplocs_i = (subs(:,d)>=start_locs(d)) & (subs(:,d)<=end_locs(d)); + keeplocs = keeplocs & keeplocs_i; + end + end + + % suppress all but the first maxn nonzero elts in keeplocs + if( ~isempty(maxn) && maxn>0 && maxnmaxn ) = 0; + keeplocs = keeplocs(unorder); + end + + % discard locations where keeplocs==0 + vals = vals( keeplocs ); subs = subs( keeplocs, : ); diff --git a/images/normxcorrn.m b/images/normxcorrn.m new file mode 100644 index 00000000..e59d10f5 --- /dev/null +++ b/images/normxcorrn.m @@ -0,0 +1,67 @@ +% Normalized n-dimensional cross-correlation. +% +% For 2 dimensional inputs this function is exactly the same as normxcorr2, but also works +% in higher dimensions. For more information see help on normxcorr2.m. Also see Forsyth +% & Ponce 11.3.1 (p241). +% +% INPUTS: +% T - template to correlate to each window in A, must be smaller than A +% A - matrix to correlate T to +% shape - [optional] 'valid', 'full', or 'same', see convn_fast help +% +% OUTPUTS +% C - correlation matrix +% +% EXAMPLE +% T = filter_gauss_nD( [21 21], [], [], 0 )*100; A = rand(100); +% C1=normxcorrn(T,A); C2=normxcorr2(T,A); C3=xcorr2(A,T); +% C4=xcorrn(A,T); C4r = rot90( xcorrn(T,A),2 ); +% C5=xeucn(A,T); C5r = rot90( xeucn(T,A), 2 ); +% show=1; +% figure(show); show=show+1; im(C1); title('normxcorrn'); +% figure(show); show=show+1; im(C2); title('normxcorr2'); +% figure(show); show=show+1; im(C3); title('xcorr2'); +% figure(show); show=show+1; im(C4); title('xcorrn'); +% figure(show); show=show+1; im(C4r); title('xcorrn rev&rot'); +% figure(show); show=show+1; im(-C5); title('xeucn'); +% figure(show); show=show+1; im(-C5r); title('xeucn rev&rot'); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also NORMXCORRN_FG, XEUCN, XCORRN + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function C = normxcorrn( T, A, shape ) + if( nargin < 3 || isempty(shape)) shape='full'; end; + nd = ndims(T); n = prod(size(T)); + if( nd~=ndims(A) ) error('T and A must have same number of dimensions'); end; + %if( any(size(T)>size(A)) ) error('T must be smaller than A.'); end; + + % flip for conv purposes [accelerated for 2D] + if( nd==2 ) T = rot90( T,2 ); else for d=1:nd T = flipdim(T,d); end; end; + + % center T on 0 and normalize magnitued to 1 + TN = T - sum(T(:)) / n; TN = TN / norm( TN(:) ); + + % The expression for normxcorr is between a window Aw of A and a template T is: + % NormXCorr(Aw,T) = sum(AwN .* TN) / mag( AwN ) / mag( TN ); + % Where AwN=Aw-AwAve and TN=T-TAve. The template T is constant, so we normalize TN + % so that mag( TN )=1. Also sum(AwN .* TN) = sum(Aw .* TN), since sum(const*TN )=0. + % Together This gives us: + % NormXCorr(Aw,T) = sum(Aw .* TN) / mag( AwN ) + % To get mag(AwN) we exploit the fact that: E[(X-EX)^2]= E[X^2]-E[X]^2: + % sqrt(sum((Aw-AwAve).^2)) = sqrt(sum( Aw.^2 ) - n*AwAve^2); + AwAve = localsum( A, size(T), shape ) / n; % average of A in each window + AwMag = real(sqrt(localsum(A.*A,size(T),shape)-n*(AwAve.*AwAve))); % mag of Aw per win + C = convn_fast(A,TN,shape) ./ (AwMag+eps); % NormXCorr in each window + C( AwMag<.00001 ) = 0; % prevent numerical errors + + + + + + diff --git a/images/normxcorrn_fg.m b/images/normxcorrn_fg.m new file mode 100644 index 00000000..6fc485c8 --- /dev/null +++ b/images/normxcorrn_fg.m @@ -0,0 +1,71 @@ +% Normalized n-dimensional cross-correlation with a mask. +% +% Similar to normxcorrn, except takes an additional argument that specifies a figure +% ground mask for the T. That is T_fg must be of the same dimensions as T, with each +% entry being 0 or 1, where zero specifies regions to ignore (the ground) and 1 specifies +% interesting regions (the figure). Essentially T_fg specifies regions in T that are +% interesting and should be taken into account when doing normalized cross correlation. +% This allows for templates of arbitrary shape, and not just squares. +% +% Note: this function is approximately 3 times slower then normxcorr2 because it cannot +% use the trick of precomputing sums. +% +% INPUTS +% T - template to correlate to each window in A +% T_fg - figure/ground mask for the template +% A - matrix to correlate template to +% shape - [optional] 'valid', 'full', or 'same', see convn_fast help +% +% OUTPUTS +% C - correlation matrix +% +% EXAMPLE +% A=rand(50); B=rand(11); Bfg=ones(11); +% C1=normxcorrn_fg(B,Bfg,A); C2=normxcorr2(B,A); +% figure(1); im(C1); figure(2); im(C2); +% figure(3); im(abs(C1-C2)); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also NORMXCORRN + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function C = normxcorrn_fg( T, T_fg, A, shape ) + if( nargin <4 || isempty(shape)) shape='full'; end; + + if( ndims(T)~=ndims(A) || ndims(T)~=ndims(T_fg) ) + error('TEMPALTE, T_fg, and A must have same number of dimensions'); end; + if( any(size(T)~=size(T_fg))) + error('TEMPALTE and T_fg must have same dimensions'); end; + if( ~all(T_fg==0 | T_fg==1)) + error('T_fg may have only entries either 0 or 1'); end; + nkeep = sum(T_fg(:)); + if( nkeep==0) error('T_fg must have some nonzero values'); end; + + % center T on 0 and normalize magnitued to 1, excluding ground + % T= (T-T_av) / ||(T-T_av)|| + T(T_fg==0)=0; + T = T - sum(T(:)) / nkeep; + T(T_fg==0)=0; + T = T / norm( T(:) ); + + % flip for convn_fast purposes + for d=1:ndims(T) T = flipdim(T,d); end; + for d=1:ndims(T_fg) T_fg = flipdim(T_fg,d); end; + + % get average over each window over A + A_av = convn_fast( A, T_fg/nkeep, shape ); + + % get magnitude over each window over A "mag(WA-WAav)" + % We can rewrite the above as "sqrt(SUM(WAi^2)-n*WAav^2)". so: + A_mag = convn_fast( A.*A, T_fg, shape ) - nkeep * A_av .* A_av; + A_mag = sqrt(A_mag); A_mag(A_mag<.000001)=1; %removes divide by 0 error + + % finally get C. in each image window, we will now do: + % "dot(T,(WA-WAav)) / mag(WA-WAav)" + C = convn_fast(A,T,shape) - A_av*sum(T(:)); + C = C ./ A_mag; diff --git a/images/optflow_corr.m b/images/optflow_corr.m new file mode 100644 index 00000000..43de0338 --- /dev/null +++ b/images/optflow_corr.m @@ -0,0 +1,147 @@ +% Calculate optical flow using cross-correlation. +% +% Calculate optical flow using correlation, followed by lucas & kanade on +% aligned squares for subpixel accuracy. Locally, the closest patch within +% some search radius is found. The distance measure used is the euclidean +% distance between patches -- NOT normalized correlation since we assume +% pixel brightness constancy. Once the closest matching patch is found, +% the alignment between the two patches is further refined using lucas & +% kanade to find the subpixel translation vector relating the two patches. +% +% This code has been refined for speed, but since it is nonvectorized code +% it can be fairly slow. Running time is linear in the number of pixels +% but the constant is fairly large. Test on small image (150x150) before +% running on anything bigger. +% +% INPUTS +% I1, I2 - input images to calculate flow between +% patch_r - determines correlation patch size around each pixel +% search_r - search radius for corresponding patch +% sigma - [optional] amount to smooth by (may be 0) +% thr - [optional] RELATIVE reliability threshold (.01 by default) +% show - [optional] figure to use for display (no display if == 0) +% +% OUTPUTS +% Vx, Vy - x,y components of optical flow [Vx>0 -> flow is right, Vy>0 -> flow is down] +% reliab - reliability of optical flow in given window (cornerness of window) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also OPTFLOW_HORN, OPTFLOW_LUCASKANADE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [Vx,Vy,reliab] = optflow_corr( I1, I2, patch_r, search_r, sigma, thr, show ) + if( nargin<5 || isempty(sigma)) sigma=1; end; + if( nargin<6 || isempty(thr)) thr=0.001; end; + if( nargin<7 || isempty(show)) show=0; end; + + %%% error check inputs + if( ndims(I1)~=2 || ndims(I2)~=2 ) error('Only works for 2d input images.'); end + if( any(size(I1)~=size(I2)) ) error('Input images must have same dimensions.'); end + if( isa(I1,'uint8')) I1 = double(I1); I2 = double(I2); end; + + %%% smooth images (using the 'smooth' flag causes this to be slow) + I1b = gauss_smooth( I1, [sigma sigma], 'smooth' ); + I2b = gauss_smooth( I2, [sigma sigma], 'smooth' ); + + %%% precomputed constants + subpixelaccuracy = 1; + siz = size(I1); + big_r = search_r + patch_r; + n = (2*patch_r+1)^2; + width_D = 2*search_r+1; + [ndxs,ndys] = meshgrid( 1:width_D, 1:width_D ); + + %%% hack to penalize more distant translations (closest are best?) + [xs,ys] = meshgrid(-search_r:search_r,-search_r:search_r); + Dpenalty = ((xs.^2 + ys.^2)/search_r^2 + 1) .^(1/20); + + %%% pad I1 and I2 by search_r in each direction + I1b = padarray(I1b,[search_r search_r],0,'both'); + I2b = padarray(I2b,[search_r search_r],0,'both'); + sizB = size(I1b); + + %%% precompute gradient for subpixel accuracy + [gEy,gEx] = gradient( I1b ); + + %%% loop over each window + Vx = zeros( sizB-2*big_r ); Vy = Vx; reliab = Vx; + for r = big_r+1:sizB(1)-big_r + for c = big_r+1:sizB(2)-big_r + T = I1b( r-patch_r:r+patch_r, c-patch_r:c+patch_r ); + IC = I2b( r-big_r:r+big_r, c-big_r:c+big_r ); + + % get smallest distance + D = xeuc2_small( T, IC, 'valid' ); + D = (D+eps) .* Dpenalty; + [disc, ind] = min(D(:)); + + % get offset to smallest distance + ndx = [ndys(ind(1)) ndxs(ind(1))]; + v = ndx - (width_D + 1)/2; + + % get subpixel movement using lucas kanade on rectified windows + if( subpixelaccuracy ) + T2 = I2b( r+v(1)-patch_r:r+v(1)+patch_r, c+v(2)-patch_r:c+v(2)+patch_r ); + gEx_rc = gEx(r-patch_r:r+patch_r, c-patch_r:c+patch_r ); + gEy_rc = gEy(r-patch_r:r+patch_r, c-patch_r:c+patch_r ); + Et_rc = T2-T; + A = [ gEx_rc(:), gEy_rc(:) ]; b = -Et_rc(:); + AtA = A'*A; detAtA = AtA(1)*AtA(4)-AtA(2)*AtA(3); + if( abs(detAtA) > eps ) + invA = ([AtA(4) -AtA(2); -AtA(3) AtA(1)] / detAtA) * A'; veps = (invA * b)'; + lambdas = eig(A'*A); subrel = abs(min(lambdas)/max(lambdas)); + if( subrel > .0001 ) v = v + veps; end + end + end + + % get reliability + %Dsort = sort(D(:)); rel = 1 - Dsort(1)/Dsort(2); + x=T(:); rel = sum(x.*x)/n - (sum(x)/n)^2; % variance + + % record reliability and velocity + reliab(r-big_r,c-big_r) = rel; + Vx(r-big_r,c-big_r) = v(2); + Vy(r-big_r,c-big_r) = v(1); + end; + end; + + + %%% resize all to get rid of padding + I1b = arraycrop2dims( I1b, siz ); + I2b = arraycrop2dims( I2b, siz ); + Vx = arraycrop2dims( Vx, siz ); + Vy = arraycrop2dims( Vy, siz ); + reliab = arraycrop2dims( reliab, siz ); + + %%% scale reliab to be between [0,1] + reliab = reliab / max([reliab(:); eps]); + Vx(reliab1 ) = 1; + figure(show); show=show+1; clf; im( I1 ); + hold('on'); quiver( Vx, Vy, 0,'-b' ); hold('off'); + %figure(show); show=show+1; clf; im( I2 ); + %figure(show); show=show+1; clf; im( reliab ); + end + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% since the convolutions are so small just call conv2 everywhere +% see xeucn.m for more general version +function C = xeuc2_small( B, I, shape ) + sizB = size(B); + B = rot90( B,2 ); + I_mag = localsum( I.*I, sizB, shape ); + B_mag = B.^2; B_mag = sum( B_mag(:) ); + C = I_mag + B_mag - 2 * conv2(I,B,shape); + + diff --git a/images/optflow_data.mat b/images/optflow_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..8a509dadc80cfff5706b084fc60de549220e9fc2 GIT binary patch literal 140432 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

SQ?!RRYJG@n`p+7APnOacC-o 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%0Dx<@ zL06o$5{5N}h{2dozgo~6WhS66!dh5c?20ZabH zm#QZAR##eWzl{Q(>4qSiHh6sS(fg$(vY<7(%PoIQ*%pSnzmfx zjMMGy?f2^xK!d9ph9aZ@9;={yS_R-%hy`@f3(JFMk7GEI-CKUOy1MKTc#Q=)L|Non zCVsH`Uw`}M7ck8-Xb@IW1TK+eBYW$=;Vb{&}s?oBTs_>&Em8sA-8CMQk5lr{Yu4$pH9A;l+mmw$uRq@POsD}VZ#Ku<-(;e*Yk z6_}lRo%(Z<|m1;Db2QT{Rj zsUWiPMEr2|mscw*7-7)-GNBrcV>})|T6?t)d8IN&@~x64a*0SV8u_&OW@E*s5t0u$ z@E{dC4*_s**IvK=N{t;kiOI0t>Y?jH!b~xF{t3;}+%L~CSgl^K0wAW<_{r|p1)75i zI*?Yi(eAYCP$1XQ5(ghXpj{a)em*1bL46ELUSwx&g?>+Kq6U+z1b{r4K}ksLuPpW8 zUg}h8eT4%Om3Sn0_-=W*N7p`!=MX+8ZKgt}yBn`wtv3AMO8ooJtcONhXM@Kd*AXa} zfWs0M+f0^zj0R^8w@_ji^ z&mz_HND25*AkM}EM|;1&@#t<788IMzhRTIPjF1eSeEP6K8Pv7^0{{U3|2&zAa@tz9 zhM%Lm>U2(QKtjye7-KNtImXO`n2`X15E3)kfbnc6x%a;G{nu7b>vYkny+KOQr+-*f ztMx{+S+C^N*=nntJU{li8jVK1R;^ZRwR*i)&S&yfsgj7B8x1VcUZq^hX9~4i=KS=Z zjarR%D&=CKB=zc-q0o`n*}{n`)mpt#uZqQdz9K7?sMqCj@=~K#E?4M8rF;OFKxn@< zo5|$z$q4`5##tnMgg${Qi-lY!d6&(faewVu_uI{Sy}_( z-?vh!lyaF=;>XRY@VABIB}t-xNEsKZh{as$<~k8~+Z--|u2HR)OJbQ`vx&>A#C6Ey zb=&Eiz;%nXA?8z8XE&MKpupShzkYtazw9>K&0;*7EFYFry{|M&nd_6!_t)p=r^nT7 z^|W2B?&nyS%QvUN!?%~`-Q#Av+b$>5^}~EL=yuz+#EH-U_WJy^+pJehIu>KCuV5n; zcG`E_^~1wzIiJp^lPT7Ftzxm94fEE`{c?e|$#^m{GdAnqulQdWa9W zjG-|a>o|+r?<<{ltDL=w9eW*i2Uav~p!T}mZb#|&o5l3)S>*W8@5W-khc_z`3dvlx1g;Le9o)he?l}Gf zDdlWRY>2m~M}AM+ytfRwTCI}L)mr)UP{8YMOD($Rgb8lDSe5&&o1;L$=aO5vg;nz? zmkQO6T8X+`xV2KNL13|UF%RIxOvJv=+4)WfEaD_|+r?rwS11-QY=7+oxHjQKNQ!91|u;KjpE^1;vkIUw>$;<2HUDU(dg|A<~KVF_+pV#C5VDhlJpN)p9R7_r+ zu#Mg0Zg)SOF6jR2J>U~R4t##RzrMZgw%g@+q~mTHYOhndjRp>WV(0Dk?RhgF8>8ub zqV>9REgf;$@qw48-EOyD&SyB$RBINBrMn={y*@t@ix2n9)oKOe2erE&H&G8K>^4|i zg3%d{(Qv5N66YZ=&k5_rd_il|>2zWY23ogxbsBJ4_iXp`>2ySZj>bSy?Md0o)1cF8 z5%AUt)^**WziwZy7ZPV7kHh7e%qFApbTS5{x`q#clZ$Zh&?}6HTHP=VeW>E0k!xk_ zoQ4iv+5jl31A0}u-Cn0zFX!$qP7YlCeoyJ(Xt&#)E*{uQvsF%Cp7`9IZm-)RhFVgm ztF&vya-*C&gODj*u-KMq10MpDt!DNj67)LS9onEzv`AJO9j$d8JPP^*sf`Ul*KCs3 z)SKcmM)^IPz~lUKi%^F$g1chAR6PCr-xiyt&EO@bp=6aJ z@JXEt`xYCA4Z@1vUKW93u9%D3_pH3RQ57LqB)dQ>pN%=Jf{Vu!j4M~n3+MCMREmIe zIXJd~i&TJUE}u&$lDSOG!&@yszkdDve1Cgd&qt&A{dzUSm)tC*uR}jSp>eOTFWbdv zG@dP%GhOY%4o(7JpPwIZ&(F`h)oh{zbb8bIc%aDj zRLE`vhCugmb3dOLLw!8arD8$MMfknvr>E`a@o~FZKdje_$w;r?U0=t%HVz`X0f-M9 zysnoceNg=o3%acq{^ek!~05jB-!bR9G*sS~pG%xO#kj2SlYG_&~9g75AHk%#q zgmzEIhHe16;h>$nI*S}Q1%5gPni{|wPp8IE?KZ``v*SR(?*g@e5dZ2iXjHrHX1SQU zI63sWhT1^W^dVz$(Ca{>s`=FUk;eh0Bp6kC?J0mysuxpN&{6P-|9VhLAPIqNHku-{ z)DASVtI*LUP#ev*T!2>l+)z(!b-*3Y5AKwad>uOSyM%Td@5h=!9QoAKGC^=6|2e=f#t|Jk!x=)L6r4TeNHpB0Oz*1s(_D^$8c zI!O)*6brdhAr9cIHjs-qGfRb#in(;5bOl{-a(D`G9wHsY6^i+ECVN8)$FrxY0d7Sm zedOD>VJFYqe*OIV`uY3wd9xS|4XDRhQ~MHZC;avS;9j1eV0*JMzI=VC^=o(WlY`w0 z>DBY=+=l=!EfhUw{I*KBSmgx!cO7+jcj-efR@I9kB_^@?E@%UuI7VkCUFz>ay+g8>APQ%@-64{`LLEai}?9{I~0+v!?WkJ zu`yJN7bj4-eU8p?Pk^rG^TlMS%DMCKp~GsmZys<0vSAqdbgU2BrQ5ThOK`bCKY`Ql zYx)Qq{YDOU9y~m7!^)v>x;`A@MeBE3l|u3=e(Vvj{@)E!(Kg&Oaem@+;k&`1v;Q0P zaHCs|5~R=XA~iHQ#2)}6%uGz4g}e^JPccF4DP8DgrKKv-K+2IZ*7<#IVdAW342TwQ9BhZbV6RNmIYapcN6*g zf>_${;2xU{ z4u{wns){1FD!Bv<(us(OMQw-|oKEcmj!Np{*z02M+v`IZ@f`Qm9-jI#Hhiug5!C~V zSVxGYw3|jaa66F_8F0iQB}P@PUBl=po-_Al*a5`0(k{dfaBJ;M!X!dYB3XffX2Lvx z<2o!?l4>=`pX*{(j9dTuzPCq?-KaN+E{dFDp_q+(EEdZ?iD!eA3A~W0ilsAQpX02s zZDzJ)szgz~Sh^5wE;lbRo=pQFWCR@*XI|q z*UNTkXgcCMnFUk0pTB;6zP`M?Jl;=fXFeJB+K6h$ftPn!?HdqXEp@5UGe%m!TTh1l zUIG!)2h*FW^;&N{)#PS1eIjtQ0ZWCa!mx+qkt*RaOdboo**~C6U}C;pOw?u}b9d(F zY)@pf_lqS;#c~NtRBOre@PS~lGBsR6vk>qgWPK@r9X)aaI0}P^g1~LHn2v`^BXboE zIyt01Qn)#FkQp>h>&wNPvyji_bS~!fuQd$92d1rd^4Ib3(V@>drt~&2`9Xo`)XVwA z6+YuMg>3K#tRC`mDRo17rE8>N=DLRONtWuR)MeP`VEQ%~u#XJ}iUg&oBFX9`CgGKoWmuVhc{ z7EZ7OK+?k&^G=v*wOWdE|FKvZSHvP6EvZ?~7f7!_oXoJQ)qx}R*kVpBpK*WN>~@(D zHG3@`rD9pUa9CX)jy?h4Xc^_FT0qf2lyEt0W?8B-cgAi$na(GpK7r?8sZg?)r#0Qz z(FB&->&eyZ_3@vLXE>)Z=nuzemz~<(StvlOFE2=Uj|;7<3=oV|S-guKdfq_d8#Z_A zX|E}(lbPPBi+9HYhqFA9)ovdahN|kLVG}}&(qMaM8!W@E=Ez>7Mk;X|aa(Kv(OieZ zJuIg4X&r6Q%^|97w!mJXoC*q;w;GqZckkTE*%%Jj&4uGB!4fzFxKEiWIF;1s| zTC3!KM34O@iCEKVOIJJ8R1wwu9sme=(;2$ju#afgq|V}Vfkd`J9lQqm5eWu7j_#k-M*)wTa;GiE-A<3o4)u|k+cFR#Y0cuP9nI3lDhUxm zh6v@W)(TO}e=L^0rbMlQq>uj8K+-B**#8D`Eg6x_Om=mOb7HxCZvSTC9RxE?dM(-NyYdg}Bd;*WLX@ zH&FBpcxtDXIY0W1*6{KE@wR(FT~PH2nQc9F9y<7m)_|?udVN3Y$oSm_rP%>kid@S?+;#{etErncVx6Rnj1ID7G9+*>@Mf~q4f+JC@KmkdU0p^z z78^>&c1B`iE#i;GCZ-{C%ylK>`HS-hoayb_hzVBPDe=;1@?N7t3Z~r3P-bt?DFX#qrbO415 ze=)0lC4(IHd)jDhXx++PJalMoygxm?Y>aNZZ$JdP-#(E>z48t0@-+ORB0^Y<2dkXO5fw-8o_L# z*M39;F55l_5Vs(O!X313G3^&Gk>;)YHoTYU1X|Fn`Bay)mytuk#t9oL8D!1(G?W>u zts=|$f_=lv#1zsuC2<{~`NU692%T(h@4yq2@a22V0KEw6f@lcfP9!k@Uoy>pkT=4%yPRcH&I{D z1XP1PCRYs>?%3q8Q7vA$EM%! zCi5}YlV>Lfv;jijULKcYwWH`Xnr)_H0WXA%j%P43>9x9(rQVV2$&lMg6rxN#B9=|m z?r=Jii^Xy(B-mcrxMYVEcfXp!+q6ddHgV>+(FSnau2=V)?HWBmuU?;>`fd9>GiJsc z`Y5DGEnP&89DCnvEZeOfNaGfWa=Ki&Iz4i6Rsri&GH8@SNzRb+H)ml#(hqqsf*tw? zsoZEFiJ62?WSvRInyv3w^rB&iVMEIemp6BJ3JAvL{#CNXBW*ev^SS~eP# zUXDyUWOY!vV$mUo$ioo2Bgm`ygVcGvC-OUGU#fHg`6vj zC=C?Va6Az#G+3J$jpWTu+;6kek00ypj-@+lo`Vu z(Gt;XJp!Ad3Ojgn+Z6K(-ihop!4QMXc4unB}j%@83`$*oHYUX;rIDG0N{D+!1ap z+EH^r0IQX0EMl=)%?{k4AMcohiiOO%*Dg5ixEz?RSIX2V>Sz&0Y@#?nY85^+Coe`U3nIqaIW907Otq$O|e{4Ek06mCR8jSWR$w>{ip@$Q^@Et5X7N0nT4(Capf zxA8whM&BJ-vqp6F8f2+{w23}zuWWMH$DvfOf`KESgZN{t^_bRyq9PQ|jQb#?hqZ-DrN2MXae!qg%KCV}YWc}et?|15{ zc<|u${qqyNp^vW7Gl1wore7MU8<5$)?C_DrXfT+}l~Pem9P!+fd4QqyYBm}#7gFN- z=G1NDpI%_8G!aHCr8+RFUB^y*cs_POlrV(;J>pYKO}vQ)oHmOUZzVN^98wdQjk<-a zXwYFbGaL=)zz=%ESXW9nacGa*gQl{eoHk`6mf5(E$LZuKfDCv4zwBxa&acX3xUM{|^8F|NkUeXLB1_cKsp#VtdEC>zc8*T&}gNygR#-Byki-iV->I zoEou#2G9*Oas~(zu^Wvczx~(_x;B=PLId!bh=zFr_^3_cHiz9}u{l)Ve)G*A{_S5aCX>ZtJhHe#hkyL)E3-kT)f#Xr=5fAOtH1d6Uw`w}Z@w~F z%sQRHsMqQAdYxXU(WuY<^7TLc^H=|Z{~2+d}x;Q`m;Xl9m=Ih_#*?PTJqgGwxxVpSPKYjo1&;S1W-~D#G-6+a>gMXK|{brdj z6!|R@dRV>%o;QDX8*7mH~Cy99u9{5E@vQ`pev-+ZogZ$OI(VHgaUq_)9J5hRqJ#{i^;gX|M2{_f8gs&}uBPVYZHJt(tLvy@H5A|bc& z{r~*=QvLETN2gC1pN`sZh z8f%0Ld|saqzue(+SWR^ypUWg-(MTv533$L+FP@oZdTVIsjmz)y$I<955OMuX9Uag$+(B?p3liPfZ6uZX3R zfIniry8)~)4tQarTE>AXL2UH)+x7YYMtRz=mw-W_tt?jBGk|16I9bc%R;5(T7Ykfo zC{=n3KoCF#Mx}n4PA?RI=~8{P+^tuH-0gPJDQ3Am-K)Th^&ucgFa+Xms(c}v#jP?a zw$!?rDu-jWl5Xq#0lEb?mF8;0I}FM)#+SFiRjz;|mr14yt^V^Bio6&%in%P8&9a$P zJem+%7{djMMB`XZCKiiEBf)Tnmt{%DPnQR!Oga^hgd^b)7CM~b_e%Orbg=EmZla^yd4gFCVwlZkbDj0BPO3KYf3ty}CHNRDXKdZKRt9 zpG|}V9;^DrAAi)Vetva)alMyr@5UW5pJpOqpXKtW?~YX`-~P|5)ARLwJnYs401=RI zsegWb^7hTkACKN&+>M9rs({)iWce)D7gv{Rz3S{j1>{x)j!h?`cm~j8^8#K@?X|jE zDHpQoR3gqqsW1U8x5s7CX;fl?O{bC!EnO(!b-P>+FtOFBRTa{)NR$v7!Gy;JfD->2 zv?`Dc(Fu{(dfu&7MZm38t~NUBH9-zw*sSEcrYMT#l2{R|jV=(fIbdrwziF2byvLU- zwa$pn23-Q7GawPe`8;N7o$;2A!^ET`3WfY(LTn5t7+nF3&nuY+uz-`I*d9+;;61_v z;6vvZd3s2-H(7w(RzR;J-L=a+hUw|0)^G|cCXQPv^KJrQG5 zbh04uTqesmZziZ1X(<7rpyPZlo6E6S&?HxB;u0LoNw<`v)l4uBFqO9>J9AQ{q*=+Zpo|Ik@pDN(-2EyT>*Xxh6+*)329=DTvHo-*vU=gn`fVvMx z)40*cPwQcYjrpBsli8>@+Fba+Zr|?l>C^qRRm?>FZkthicB%nmn9O$f=P$oJEQhs1 zI_h^>4QJo~^+bL0^U0;!{IHQH-3ovh3%U$vFaPw{Gu4|PU!PoPmFdl}CFC=S1QWEp z`{Dbev$LZYZ{A<3C!=n&MprP=faChz+vDS(zWwga`?K@WunWzC$S{$B%XoQdu;?{9 zo%&kctO``X2__Z^``s>YFqUBa7OhGp3OV5LFdhnm=6rsy69TT&0M1x8ATb;Yp!Pf- zuNU-Z(rJiewnTCJtupJ?YxPE>-e?V`^0PP+>{j6BX1!jkRco!mM541dI22_*Xx4y3 zL98{0ljVAclL@}t^`Z~16nMVU?B2{IAZ@2eGA8kaYDFxAC~IJ=<%(F3C=rC!D)9oK zUa7T4ljRDR;Ni-0j<25QIH6Lj)%%mV41GKRQCW-Ruo{t!7w6qiN8oL9#fwrwm9g%255FK#aO}vs}n=Ip{_@Ni*QIAedRN5leYE z9t>yFK;!|B0aTDibx+_?2r293xLvP7Q)`{UcrJr`b_eR)Dbrq~R;!f7Mt?k&R-41g zWQ{;%IK5P=c1CwIX?>{2Zxpm zTu~6qY$VZ;q{&n!30Bst+lBy*=L9hq^0A#^e=ILy1(%Dvwm=NZaoJQfoGetD9e{AY zT*22gexHlJp3!1+dgaZBr~6qu&yY#9+AKDg z<@!>sH9B@59v`>kT0WJGc=e|zS8CPqPcKiewU%E#t?ouGe0P>{t6m;ms!xxO-n_ro z>i_;>e$#6}QgV#z>ZhMh&tCrc_Ck#?aKC`o)$~2j4DB^Sgc%sH)ZLog1Lxp5R92XMQ*A;O+Qwqt^#tt#$|QQ-Gd+ z1Kv*HA!%cL*8>}F4|3P7l?jM75ZoM)T0b9(bla&2LZwm?Tm9R`ib(R=k}Zj^Z~-tq zT1bG$vmIM5@7g?kAkV`P4wSV769rg7@@B(2AOh*+Q%rd(O{a5EC`fcYZSow^Rar;} zvxB?Q@Q&_;(m?`%YI0bBgg?qRTHPB7&s}Y$UOtt{<#KQ+F`p-t205$9#^AkfsG*-y!x-dp6kwDe0OxA)#>lovq6LBvPmXveEFBxSLa7Rym)i2Qft;z z@Rd*icp`?kN5>~eFJ8aD1b7V-f*TQ8I_%J?jZUx6V>2L~ng;z|Q^-;ji$_sn#CQ)0fNJ8kb6Cu{dnp=MFMyu3TR&7t7^zAZAlZga#%N z3;6?KCX?fl88*tKU4++*CsXk-?3gbQj>c1~)%I~euCh_+Mg)!tPTS%3`a|)>V*Mbu za&f;GSInpt^@kx;j6*Q0r~p`;U+7QH4v#!d~;mn-jJ6 z{N&{HN^3A9y~1B`nPkkPJ^IrR=isYXZ_d;@!+JLA)Oe0f#oVgbuil*>zxet5@=B%E zPHu+n3QkhytaB;hl6)z-Ja) z&hF?=*2$^~b}}9m0Wxq8U}NT%?ehXfRc6bqAv{$vNUN&t{Na z^VwuL5MlXhyE}qFuQ&5nE|Fw&5Y%KO5QOc@^Nr;K4sKk_GVv5kF%@An5QR6(1D~sT zSI982IN}8W2M`6qkpzbyv6Gtl6q%SvECP${c023=u8LG5-i`l3;eFK|svb!HXKgsPPf^^uWzr56H&tJbjQ)zSt^T!YCNxPiS zrK9$Xqod>FS3muHey!E%jO*F3T`R+pCEco%YlHUkN@p<{z*vjheiKAi$Y;WKv&-kO zS{-(a$!xaV4m&mSzeNs?3>YFvcXzZF_9=cDl6m;0B=5QU;_TFHJTq< zWAJ=LpbO|}sU(y|fve7lQt`Q|%_qaZ(vRm$NoQoVktQ=`O9Z!^-n1(vE?X$^jNK=W zdfgF1D$ux=1{9@OPT(1vBZEhEdc!+v<|%D1!)A!cl1^JBS45R`2v-}a0rSe{^7(As z>k6jwC85$CFXz*{ekqeorqW=Cu-EMl#F7cN(qAs;qeg+Uek}g19d2JRoGi6hTX|T? zBA*6=k!Z;8aaznahd0Xdn}_YVnuVMInNh#fqF1YQM!Pr2?Dx{36oB^L*lH7`#M>UXbRy}Q;MOjgH-#h@u7;sxwyfBOF7{O!+g-(RXUdb4dm zY1c~G498fI71Ww*l@44*S4@YS z%WikLyA2pJfzPw)To#p+PA4IqCX3Yp9Oe&A(rhNf5>kR5$DxBJ6v@3&!2*W_M1)uk z%D@C^c!m{eZ4^ZAG-^==Iz1$Va0w8`kuPi}y-ur9YqeUVbX8 zjO`9ll$vuiAwq+|FB{5yyX_viXwa-avl5c)f*KMVN`s5V9dIR-L|jzqEr|CBr;x%q zY<|8_MEP(@ajDFv3u5+%|JeG@bzOW6^_Q zCY>#a9Z6Oe9f7i4I0iQ#M0&>&lTq&Jv7ku>+^%l$}T8Nb`jJh5(o?cA_h@W_}xLT3zs-Wq^ew&`Xce?Rf!-}Af#G>oOJfUR*0hEAQY8+nqF@@ zxHKRzL8dR@cG}G*+IP_Cpr|RZJ;*H>gq9lhY7K2WsMLgq4eZ){*aVYR>s9e!uwcB9 z1rOZUM{p5qwK6{Itpt9<>1$b%W`mXp16M%|5L>qrb@_MH%#aZokX%Y)wUSQ@H_~D@ z-^hpN#I#w;=U~Vh)od`;n~rbp4)T0|KWp&03|A5>rL-?x8TOGN$?8i;ahVib6a-jh ze>hjJx7*Z)Lp<*BMC~~Q{zy2M=20gS#b^1hRm|e2W;2O!D8j_k`C@swkk*^UppvEi ziY%gNAP|m4;+evHCU4fa^;{yJg0ls0`6(|369sv5|G1mfb8+O&SjdZ1X$O%|FXQRU z6Cyw^8H+}PPDDGa`a)v@lRf?K|9+NxLXN^{z^*qrjPG7w>Wnt`)8lS2Y=D1~v7keH zr8iu>J=YpdM)Swbd_3q>^T~K3;;|XcZjY1pvOJ#c{HEU$4;wyV*e6E_CqUBuzUkel zTN83@zL=wT4N;exYQ)p;b?Rk`P&uFi_ag{}BhhH6Q!5E@9zp?TG(oNE2=!qBu{xj4 zQ5`3+Lex17MkwrrgZ@$haLc8WEUq9S#BC1l%LDU9t&a?KIH(Pd?CN%-44t4bI+glu z2ucuOC+)!59gcYN&@`vkoR6xLHZ06kA=I>xsjt7dY1gWiYKQ!mq2Gz&}yl`HzH!ffenHUff)!_CiNxa;7Pa4Q zRLZ~vC1fPLIAxKoj11Xs*2EI!KQ0SWPNwi#S$TTXZ8V$JgR2L-gKSVJX*N3<^swHz z4_`bOerkOYK-f{MQH7`=L>8#!&1G4VKD;_^f4U@YM?XdCcFHCYU$|ej`}UMPeCB?F{YIphAInhy|b*2u2gM?FG>J{eF}H zHGqSD4+$PX0v3R6nvI9;X0wi?(b!X(*idU$SuUnGgLbn~1sv-&+I`*Zpt#5ZlpM-} zSQabgN=2deF~M*UIoZTRuAtDs>88*9;pW7^$T}nn^2z|?IK1Zk|Zq;y*n7jQKwA!P0$XYZ;4p4T<`85z~ncrV(LH+z={he zO3MD@r%(55Y1k;h@q4{)8x-f^e)sV4|srZ ztx6$7`&Ed8X5;<+{=?J99la~i2*8H|p2L>?{_!*Jugph%m}lBg0;M4D`u+QdPjvoG zr`4<;P|Bu~5s*!Iho!;?>HwqyO6~sv00960Oj!qa>PWNvmEYO~0V3y|F*&0wA#z3} zWBYD6yYKJ4>S4e09@l2~Xf&gl?&_*)xlylGE2UhfP`;iIo5fTW#)D3)*=*J8AGKPo zTrAfPo4Kxv<3YFe@lkI!@rAK^wOn0JRcSKl;(Dc0`>5dyKlN&+OEAE|<&we!E_+^ZA5L>arwXt;_X_AAD}N+vR*d%nenNw5f&ve_hAan{_;_l*wo~ zmi6oHaev&dmWAv0>-n@_h@)o!Gi?yH2 zqtRf1fg3G<#=zxzIi8Lybvzo5gvszi&%_sP=wcoBD{V694@aXBX0sXA#X23a*|j$6 z4~E0x*t*>ASBrLl)8MX+I;6{!fptDw*NbIYr^5mBjx!P0dxJp-TS6F)yWL^GKb|f} zV~Cixo6W}kdOBmHH+t6NdfBU;YN=W+74pv~Ma!}f#K-sZyqL5~>2x-qj$V$t?Ph;C zo^RLl?Y7hVg=jdDjK{;+l65*^UytYWabAd>axxr^g#+Ht&(Hhg^ZWVv_58YGLZgxi zheCcg_xbhx{Pp|K&(D{&-!0@`qne9`0$z{n_W6AN`hGkv`-QH`<9@S}OTa#$~>nmForS`8qrR45ekxeQj@%~f$S>~vZ{bES~WX0o|#8jHnEY1nNx zx`TQ-pUtEbsazqK$z*crBu;+0oGnU+ML0U2whUM@QUP!f4)26Tq-ABuvLGl7BbN0q z=&aLzWsLg(ka)JP?8Xxkg76==GiBHvj6~^pvgk&Oph!1tO_|Uz7LmOxgYWru$3~Zc z9U$mTs3tgIo%8W{1Va1mF6JD804f9Qj!j(4;~_nKg8M824}O5s+vBJX2N)QQsBVzh z`{$j&Ygq@i*X{Rv{h@Vc$O5#mD9B(b^}4-ox7R=lT5kdOk0Q?M!F`i2=Xg?fUxt&p-e8 z{paiRcG=E#Y0#=<08rlTy5An(KhN6jC`~7b7qnOPk5)q#J25PqpLlcMHcB=)>%V%@xSTGPcuVGyi= zk7}h{s#Xe_EWj8GZcXCE)oy^5uHk-PNUXnR`OuDOgx%MXHuzTG8soU zKyOznPyC!VhA==fCW2@YS%6FE^6h$Dsw3oMFd7TsD}?s*^G4`7@1~PZ6IdWF0WiTo zboq9-4)bxl)dTqqhZka*+vUXYcCl9DMze?O{Vp*M2+0C5(zAAxdIMnSwwnwa#JxmW zH*4Ol)cZJBvqxEF0|c$}e%k-2Gxli#xU|zNV^eD_x1j}fk_C&dGO~VrJ^VdIrJx;qdKs6qAYq=Ehn9Id~ef|9YeOiNl1e9c} znnzZnKqyDCJ3a4@i6o6=|iRFNzaGo_QUSUeJnm@)ucuT~MZL==}|QG6%j(TE|9+8^b7I+=*S zF5(yeqETVkD5TRVTnzg?zCbt<34^Ia;pht^ge(%Z>v?Mmqh1?zPTGjecLD=OaVFXe zR0?u=yFVT;-XnroN<(0D(6fj~NK@dmpMU-J$FHyZajx{Lz=_}OwBhm}|NQg!|NQ;y^LkwCLbsZUg#sR@ z{r>#={Qmvcnt-F* zHF%+LFzAPJBIM`I60`)p>okG5WITic3i)X_Hzbf-9VRWGN+gr9NYMMdoDSPl0qmrbkx;<*T+B^n(rr}X0W+wLKp>3D0p8D=EcV*< zVlJDE#iK#q7sTzsP$&SQ9l-GAE?R7n#sLNE(6p9>;VtQaZX8A%ry=# z^&4eWR5I-MLL)Fml++nkGQ?i9R?5c1exCR6yxZyMkCeq4o>%DAEBQBEHBT~W;uu5rknG*I%-ymnFx5z?Q*+Z zPN&Po*{AcRDRim@*tvk0ZpL%%oX71nriL;EXrPx^9XI1_4vuqihN%mkdO3?s`Mhq9 zbJJS3cbi?;6*5Ew4E9(TCb;l$hc1u1HDYF{C3YOdL@uHEaSBtQDiAabhg#dJ)HxLTxnm*sdZW&@N9szp6 zieZY4Q#YoI?GZM<2csKLr4lhx3C{kmYSZQRbexTAsemsSOT?nM?#6(usPi2;w|*fK zjHLjq0Hx4jS7ljWZa1dX|Hwm}ux%&-V&Wi(n#;8@Zr5w29Fl?vxG0LUqR&=K5P7#* zEoBoy%AyC)unB^?+;67J1Q0ExqI5hY5i>BbK5q0eVvOLU%CHm-yiX?j_5_oJxS($W zeh621woQwp7lBNYZh3Fib{2WHHsD&UZZ za{?bY9Zov+Yd{z9gfvzH{2g|e*ULEw6PzLRiS7_>FGDAu;NU%aq^A*!>PI_lK&ah%M94_2alp>Ad`z+r&!#@N_le^*pvt_@yDe-YWg zfK%1!OlnsO*+hV9hK>M?;8#~f3Mjh(7+o}~=EIc&Bj`%t0Im!r)W-b|Fd;k>UXm+AkH+(GV2IEl2 zJ0T83PTt1@i65wM&^^V~!(ko32LTv#S|8q3Pn6JWM#T1r66+mQo zpPvShp(MbI>JNq@jLGm(HGR6+9X6)e%!a%{7`_Mt7Kfsptq$kiZ1Rx`@cwW#9En0} z0XSo}SRJgrIjSZC{ty<5!50E>5J=VBqKz2U(r^XfMBEQ%wo9T6`8uriVWX7K=d&Pr z7prQ44eXclph+E3l4&`>;G9gxqOsY{rG66z3K~z6N~$A{C(2^CTf#p9yUD1Z!a*}6 zLC}`_l`?2oaZDJB{|?CDrR{M(K#ZwJ1ExJ5mKa5nr`w&;tCsSK5HlF$<~f=n8-R58 zBcF<38T!YrJ3+`(Q|`B`q(&aM`vo|na78neQIm1*{{ar12>sB+UX5NL5PrD-BF?5v z0iaH!lp<~=CSx=33#cRQ)dI+sWPl2mNt_>s=AmZ z8-o1OfFMeeGFwf_80Fy1{iMR65*rPuCY)3YJtg@WxD56bNs`s+Tpy#agLJ|q;xgpW ziCt;Ne6DnWT+jv}?Io;$uQ0(_n3F~kfDSUJi`!|timp$mY7f4MQ7B_R8gM`*rpl;+ z(g+bX&{jzY!9M!b5WD0y8N&fMa7;+M(|}hSw~3hi#J6;6oC4=CrW$-G`Br+z=Hl_? zcG-a<(-fJvV+eI|ZXgB7wZFZY#;6H2#F1Ao?gXYBq?7h{ohHCXFh6U5$Aig`xm+HZ zaU~mITYY~gNV`1zq|<7$o)bMQ4#+mldEg!fEdpE;WE2Sp(OnSD5%uvy%&5Y{pKGpgBC89kP8S^l5B{J!Uc$mlDS$MQlE-90ps!l!(=32wdqvups>;}@@I<) z6G>HddOrn8MK2a){RaXj2r})sUx(|(bx;|l9uy!-+SHs%9rXIpT8Qeu12#c6=8)7D zIvj>LFC#xNji8t_v?b^$VQ2$>rooJn1#J#r&@QueeC#U6I7`$QGkMs^Fk{SnxPM8* zN&2BeQb9i?^32iN-^qFjnjy47WawF63o$1OEUIW4s0YA_J3h6La z7@`fUW_$Y$woF3vi=v4I;Hfy<8%ZZx1~8mBV6QUbK@=q`0_r7PF0UU*BuA2@h8evn z6dRQQAo7DYBsEJE5~7CBLk7<0^#}X|U>XTxni^otM*&7h+9OTPqeV=>rLhm7ik=~) zQkrzwH8hc(OfU$o1!<#HziYM2Bt z9GDF4<#sMKixkQlgiI$0Gz++7paBJ;GC5zbn{{eNj zFr-1ZUPk!6u(!|&Rgr}WCP0wLRiuKXmxidbq1rErqqFOWJv(r zKqJ38-GH;h_WqlV$kae_0CDI>13b>?9=iy}?HKZQ*^FDPlY*UvX zqn9Ue6S$XJ2A@wHb(^pr=tYCn6TsC`NIbk>Km!7IoTL{6pgsUNg#W=8GON<7k>zqK zw&D(lKSC`mIw2YWncJ4){O-B+giB0qPrn zq{6XmE`jnzC9-G8+G2x&2D(v%jFgHa5mqEogQ)7{(K8Sjx10Jw65;VkS!`xv7q%i3 z^COH976-u!?d58zPx>utBYgk@Vuk^kyw}2%2klxuMQwlB7U}~Yi$s<6c%)u7 z2Pvmvpj(8f!n-4X9v8FFB66#1ihxEq`=UxO&&-;r7^b0$L^LVJt*CQSJZ>TzGeaKJ zd#xmsJbakDqXCdR4h_dd-iu=v)nUf~M7WEc(mMzy!{qjDHc`>kNtf_Lxdn-ku#!UK z6e8Nu9Q_pmxAXK$gLuwHq3WQ2CHAJWpu4H9eOF}W2Gi`#u>+)MLjdU@hCHZOFac)F z%h`VW?TrW#yK?FHeFmNPF!_3^}c zesVKD9|4hG6Gy0%z-6*;0Tg180VhG)6Ntq^$RLf(*4w4hFNQsQkQ^T1 ziy6d;^X-1246D?^hG~CjGl(k{*+3Vd^vhwdFBD>W;i8p*6k|<)11!=&n1bncstj;6 zFsBYSMQ?M0)PU%^Do@6ex!suvW{LU?SX4xq*h(A=v%^kD(_f^%(?boLhX$mvIHkW( z)l2l^o~P`(IGL=aBBr}) zvNE$;?MA7fNV%Ml<+FkyijwT;$My4c*lE@)rF>q@36h-8hmhJjM7+AYWt0-lkeq@wtQM4S}c3kfoM1i^O zDN?CgE|zMwqHLOm<$B&V3_X26Di`aGYQ0e}7Ze+hgQddARX5XCtyV6TX*&t8v6vU$ zUt?p{uT^Rv=gSMUw`IA}+s~W5o3xwlPQ6@IWJ$nVTi0|qiv7!KKIyk`@PaG~Sp&PP zXEXWdn}69X#{G7+SdfKmHm4hgp{sWM7MaJ@bkJ#(6GSx~wL>MoAI`N+Orxd0uyX&oz#l#jstk z6fq)TB$G;Wnn~~1&y#+$RuFR{t%W)1jBdG(c39F5B}D=V5T;y~<8r#~+Uj;b?9>rD zgb2alGFi+ztA@74mFs0CFA01)&Ea-AOwtVPy!jZA5eqIuLs=m&d#<|QzTk4zQa+bX zWjKz@3fY`o2)xU7MbQHY@&Yf&h?PW$(=UhhV%%#rkkCAiDzo>ptmwz>ayINVYLz0v zkl@JxR|47`F>VPA@~ePd%jaC0RuNfGgV#Bj4DK z8-=_A$mbPVLHcNh7bSsp7&j}`X0uT#l@t;09nbTEIJugKX}eypRmwoG!sGY<81VGn zxYcL@w>Wl=!+>!)t4?%}-1DN_>9mmdJeL+t!z4UhqsTMP>-nhLz=e><9KlLgH75-1 z^L{xQv}+{*k>@!AoNJqI6k7Y$Y={X3iDx<2kwee%uI^>~jF=((A{#I;0;HJgVf!+r zAS1yaNJOw~0PeVao(*v#struxI4VHz>KXgzDK^F(2!|XE0B^o$owo#OLNq%P4FJ=Q zaoS+xcB4#p2H>)QgJC+ZrS4aAN_$=q|G;!s0InSExSBCI$lx83pao#-j%%N{iy_|Q zKms5r(hni4TBf>Nj=KOuUKDeHb2^hF_!_o(-puI+1;j4PXVQ<485{tKG7c*ol?HNL z3i!u^+$z4O?U(aDEBhSnD@njSpk-b5>u16h2nS`8r`p78rD$Cat7*SgD*{`f(e%efXHHk|-eCP9)iHuvwV*DDL z$7lS$l=}KzEEQ}ciWfrMzg41PsU3H#Nt+Q_j?aPmu)Um@Z9_Yu3i_=| zo-ime9Fnpkfu?r8oX^MIcC%j2hwWM+{oDWj?JH#*WI{hK2h{qgSrQ(9|CSa^lZg@H ze)X;MYSO8Q0AfZ`@W!=4i;f>$?c=OnK|Vm##e(g+4$_VkMptt`ZCA>*M!nIfC`6(p zUS9l~So?XmUTd_P4R8}78k+#SN$l*$jY_RqFQQaLQf+Y0#kfX+wV(F8-A)sD$nh4d z4_!0;IC72)*at>g032XNfVVNj+&$0600e}D=NMmErX3`ads@#)o)zQ}oCs31EzJlL zU)wDq&#gLxBBx;hyW3%)gA=>0YNb?^X$l4m8`9~}`(6`>M%qb0H3}e9o49W@Xe0RG zG15;s18m}2=N;I%Q(-E>2n)VI123A#HK1F~OT-UgI8eBzYM@t$HyRE%7j00%O$oG5aS%h?DM3S?c55N+EF zoHJZpr&&fu1fVA?=1lE^?7AdveezfmSv6RxtPa8=8wc}67E6MFVFO0Uq_*a90SYaV zy5)KvV}53Mrd@gm{AC#O&E1c}DQyP!*Y(0>X4o zG~KJG!zcEL;_}3jLXMh=ykEot|GWSH1YUwoNcE73^=m4UU zz@-@TS+=G+_nUKCQV5v4%di1(i51-Z%Np(u;U|v;l$f-b;YL`9-h+$TfM$>degLEpD$yy(F&{7XzxF$6? z1W*7%LkSw5hrR(jR9PE9hvl=T3MGU@BJCuFBwbi50}4mg8kT-|8IwPiW!5&JzvM5V zKFc5tZcv*+9R|<9sG?rY^9r?5XShl~rBY96*t?7F0_rc5VHceYWP<>WZbFn%uD-r| zCY7&(?Fnom@tAaBTuCYbOItvOK-FaB6yG}wntJ9v;vyf1n8pV7FmbI7;R()?4RS<0322jMOUPEGGNh%5HeaaRU?Q4 zbS4Y<69OWnh`J)*HGxClWTuaqcO;iJsjlV0S6<+)d+6q5>SWTyqM&sTjSL#t4mu)5 zVt}I=u1l^SopX=61A2{IeJtg=)H#p3Fh&q5v}8PQGwy>shV1m4A9%owbcVFnLfVO> zaUhuh2fv@f=DKeCHft}d3Ym5w2-xK{O|zM)pJIYc9GZsjf&sf6FSc*u{SaDCQl8CZ zcv8;GNprmm>*YxuvZS2ItSAzy<_B+vf+Nh=glUyW{DiY3QbgjeO?&*9X2(rp620t{Q-kx$c*lp%#>K ziS)^aL$)KZ(yCW2RZGQcqfu3;u_V!^j#pa`nhkV2aKi$pLsAhhbQ#fAUk%%>M!m}V zSH`X&<$ykzyiCU<5E=Y!mIvNoAZ;&9Vqf1bCZLBB(GM~RCIL#~d+cflvRL$$Aonrg zQ^RuiwF8V!r&aloRFlES3**q(t)8(1Oqs}<1`wI&hvC)Qzs!M$Dxk}Vi46pV^yPd) z%2trF%r7zO3ls0WnnRi^1@@_iMi5;X)GIkA0+#YG>m@*Kboc69_HV}N=RFq|N2j%QHE)o+6=$)n-C zq7428LaC>w?^A_hiBy$L9D1GG>-~OzeS3R*y(JMsd3pu`%cuq9I=S6n@!W4o9Qpcs z)F?`PIu*qUW?&i{pwD;XCI(VZae~EOUvIbj{T7A5&}rH#=d-CNEQFW0B)Pxdq5xE* zF5riA7zm@}p2TtT_Ku11)zy|=R2G*?Fa-y?(=NC8>O03Na3Z9iZnO&f@s1Nmz6lSB zwmSV7(;hhQovw0EuIBNjSB4{gjBj*SyuK$1tppuzSL9s!;eN;cXnmR)fjgE%h-&WX z>y2G3xrHHadJAlIGwHB_dyEHnyLz7Q`;KkwXT7SDOMS(!vlyAj!+w7}9=0&>)x41U zhD%_|)iO@I%@(F*xfr*=>^TH6is;jhao(=h>m>?$G=M>>RbqrB4t;3IVYgX5&*!u8 zgpJXq18DGW`LdWzhJ)d--|2Ll)p~+G0?O`u3c~NUJMe@u|M`FZJ5Hh~bkyC;blB^4 zS`DyMQRcq!$?w#^z`=2Hg&}?sS3GLiWc4R!VS<3)=k2u-EU=)2=C8I%e>B`}y<%tYzXj3S(sC?VVB;*vCb;RsaE{5+sh27)3XXgub@y)zK=a9%(6t5M=j; z16mvEY-s?y-)Pn?!5*-2+es4~z@={Ym{yBE5FGo~VN@lXlM13cvP-C=LI`0Mr>&yM zr=Ma#IR;D!a`yyR-B6R0%lrUpX#Y2$5i5Z@wnOx_+0?`9D?#)A_KJO?t8W{}NgZXK z`j*@n&_A}1d`qPnBKP=}&WV!+evrJrBL2r`G@dg5;|tFE`bHBx%Y_(g=k*Z2o`3kn zDk%muFM!GZc-p@VFp&L$J?^ZGFQ@Yf09r%#>hL<*uXOM5>KNxE;cB^DBF7!r3FRZ_ z79?c9->hC<;0Xs~z-xeGCZVk!x9sJ3j0UjN9gg}PRN3uHh<={Je6>5h9!2EqUw*+r z;$5)FY&1q^(rAL{r1Ym>{vFwfog+{_?i1YFU?+)x{PNfTKme&Te*rOddfir=oLQcG z_(VvIJsngw>a|-<%xJc%($lxEzabc*Z=TRwVQY*uTb*`Q=2B_Q2z^^Utg$@ zR%IcTMxqD~#7c31e4JiJC=jqIV>kSHdw-`~K?{lDpiwcw?Ug8z&=6lieXWuRx(*l= zh>~JlHM&~6X{RD_=@bJsp%lm^9`(+%PK7u=W@tlJ-rsJN8s{)WD+kLGQrtl_I6*=% zbpZEjo=>IN-lzgv3B`4_&d{1CohC@GG$&p$J{ruu%jj z;=*D4{{FF2$gV!9mn80y7AE=z;t|fP57vh-1LElaS>CTTaIK|soK4!nEAT7hd^4u{=pwcC^WR7%Axg(Sv>wbS8n zJRPai8;{!cMm;2!34Q&rd6_T3h_l&rI2;Ye3mgbLLsPde)6sa)>yL(Q`s7{=P@MtL zu-Sm)h5%3#U5@bd_x}v>fLnGz?uf8J9zfY&;sE?*iiB80B0xOuztl z!rSXxF&%?;f5^XDsMLEnrUaNF4o?wt?}-#&EeszGbXv!rozNKg{R zj8l@p+>Bvw(bI!kVm9fG1SXE0{g_xk!_n`v9D-?p2sD4AdJ(1~O(BWFR79CT;?>wq zK<@n0BWV;<`a2E9kW>sPB*NI35$Wyq{pTCR>M(7RiAyI~h>7a$h9U`F;|LK}a!=n$ zg5Tb8HCpc$g52Q%AlpAk{co&7NN~D>KhFJCvoVZ z;f9TcK& zcndsZj{&xNi`;f0`~4q(!=*_U*$h~MdJ`&Nma|V!4ATbvh3b%KwB70V;Z;SBC)I+U zlIYw}&91RUNXUjWjY4LB{`@EDPUxOUY|#USB#v+Y#2k{&By`Wu{Th9=iO593LSYhE z5eETy>v;@NIzIf;8!2bt8&EIW^E2JG-2+1yqPoI84J-ywp#&Jtu zqdTB0L{Q9r`}I#0tJvGl79gx%yU}PsJIlhuZ-2c)gd=ain3L-x4WB^>fB&Po#00960JXv>t8`qWnOq>0sY&M%XmaME~%M!%~5QPNMG3dQx(0doqFHY&wJg(wR&$?DJgNcX#{4 z;qI`vZOc%V?Q+=6#{AcAmuca%-`k>Qnc8;VF2wv^w@b&zwDxzFjEt@4&OkG`ei=trKhr`~`3_R#?hnwl^VHpMYm8zMhVdCyKN_*Q>m;F-Q?{PW| z)6h+R{r=9zGR)ngS4sr0-A>!a_l=!u9q@PjLtS)>@gUyAFvNm!qq~E6m1U0wx6|5N zrnSe{O{@-!Qp6S4R~P&zF5(N?rm5{V({@1=EOBeRiiNtV?>6IB9tGD0_R!qlS(>ub z4a+i6Xk=rdTh9faihpC#%4WM=EtiX7qnHlgdK@-aZ|It`nhZK}yW8(Hi^)*H=hO|u z;wsmZ!Du+>ciW9>AsO-Ccunk+g*U_ngZ^O9Yt?I&N-3L6U`I4v-z_GCcB@gVmW#!5 zrCKT$O9#A}u5YKKL8sNMmGhZ&Dix1}ZoPO3OV`$;UZ-9vTcO@RLg~ICKZoGBC)X7`Rf05b*E{{qSvSvGpTes znMlN?$c^*lnXT_sRTRp_Y%(q-QptEU0+gf_lSz+pFc zQ#mIJs*ba>ti%2NYXZnrXYG8<=XE(zFb$p}pmo@rx-thC0$%3@o&c=x(G2|9rZUA9 zw_Z07O5pu)Ah>LEJ3)U0d~SzD?A*P%$5l4aqOFIGOf2Ygo#XZCc$STqvyUtc`?6SqWL4sh=RzMYWpL8G01_Ge()Fg9b{sE|&k zlTsuajRd^spFTD&oe8>uHAyjj+cPzOk=kICkAdjS9?LnhG7Hm771(7ui$9im-xE5zdxWAuq?|w z!X$d@zSMcAhr6LYwB5W@OaKg*_$s+l2dW5)9a=4i6LFpz0=$GHAc_Xw&DzCO>J{Tw}%W<#Q>-T%@Mme9$;w;e?nx?LSP?>nE*6P(#p;WF^unVArIgs1N;pTH0 zP+24#3Ho?~+Irk=6SaAOHX083J?EePnX3Zxby|%|832-`7zpv|YEp3L4M!iJl zi%apO6ufb~c#6HkyA7Ktmb7Gi;GfI;K7|5^hQA$RfM zjoX18YEv`S#J<*`Fu8)$(2f?UDQRt-Kv&L1%U=Bg02NqlZ_{G z6Ng@a&L+TDAfM+S(-9dc$el*9kjp@7W#XI$q|ELJah5r*fWHz_znDABfRn*L8~t0?s&o zXdQqpOWn+Iv?1>mxa5Ho`IG~iXw@%EfoqQwnk59)am!rvN7X z{s6lVKb8*ru01x|4}G+rP*6K^tJOLJE~xKz27x#k^t$b4ty%}*3i)CwuhUL~4|?rp z9q3G_z!(s!L=qsO7X%l=(g8k+L==lXd-6wZr+^YiP*j|F`e@<2m!~fttA=f97?2qDIi5cPkzwNoO;|YcSVCgu_UiO=l|8m(p-3~Bh~xh#I_;Dvu5BiAy;>!# z2si-S=X9uONgcY~YBZYl3WPqBA;kr**|O%*6InuV2Gw)~3x=xEk=?y{bB_ZAem0XP zypP-QV75tP^j*jz(P1#Y+Jaoc+DS$}x1!U7jqt$@K8`p(S%V~m#SIfnGxn3_u ztx_s-bH#1n-|e*}Sg9?yI~}=R$|NE|@43d^0Ip`^0lZpU=Gh}n+<0xa9|Ug-=IgZT zbzrDe$|oaXQ^*8Zb;Q3{D%C0vIi1a^*eCe*aUcAHv&{;;Ns(YkB(Kf1C)XGa2(0k6 z$93}Pce*948gT_EBnY42_2udFk9pt*jXt0ZrIlikT121E{)+7ZP4w#JDq>1fip3J} z`96rPMwh!9)=L$Jl6Wj8C1U8bi*szEpd2g{vJG}kB!Mcg%dLSkl+ApIHb9eMVcA?h zEro7xjE6Kz4+LINR)boK7LJh&M7DqZ<_$#(GB~cKvFj+9mPl)e3_^Fd<9Y^2gwwZ3 z8V?_f(tdQ|7hokzm>)g{2dvDPYr$}I_nP1;`wB!&M>}|oWU|wwnYk(_Um!vO2;|6U7xC5bq9{G&;WV0E3%C7}naYhsh zxa~A%)YY_C&58oxrtAB?rmPp!;czsa4IZvAGo8H!rSLy|P|Gw#$8F#y-G;%Q+^pfEW zL1jF64j`7pCW8q?81S%|nHYk0J7&%-6vTP13eBeX-z*oa)pA0VAQhbnszh5XXXD{; zFzB^w1-O%&iY5yus>+-}RYLMjdwJ{kaZK7{K+ zR;<^n#Y_%+DedoGWzrd(IZ~q6b@u!Toj&$% z*>9C|h=YVxI0!%g^b=u%^+jLi@FNk8N%45pfA#9~mx3|WS*KAh6mm&K1Gv7}?Zvqh zQj2UbY7jlJWcgeg3xEUgid4QC)gkWqa{>Qhaq)04fD6b)%~Fw}xm<pn>`0B{t z6uU;N-!7+PKF=jUMXRsO21t)^?If9eCLZt_Xf^GEmU0}BB>_W^>+~@#ADD7J08H5W$aVp* z;|%P>T@><_2Pwp3C_oD?oB0Bg~~&Smq(O1%X~!JR2;9GIx90S9!YO1(1}PiJWPL5~*7 zB3+3w+(yxqaU&bPaXF5PdM_*-;9}pI3%S5?0$*Ik`HFDBLo-(G0_exVtui=EFokx) zpwHX1WLMg82EbVcqsgy@8@K3Y8c3UB1&gwop#Z&uO*4;*2Y8W&rXv|*i)cv>=T(Bx zY(rU%An1PYC5@V>z)=iGli7SasHG#fu5-&4VMbRLqkbQh)kK0v!E^aABZFK6ZlEkA zzkC{}>v*8m?QGDdn};DQ6pLAyWL`NOov>r6pyq-9Xxsb-{fw%9~h}3bTA%^#_)E|i<7^J zY_L-{lScl*kVV5j=jrE9(U53LWeY0}NlV7UVKF>={*?0=`lvypn9XKWv2YZz;nsQb zl7j+`LWmwC8ztEYQNP=*Ka3rTH&7YchQbQth1aHX*7E60t^m9-tRkPpLgI+f1Xxol zSE)C#FW4Du0V4yVOdEDHSE#k*&TzJvkNcgr$cQ*`PN{6_;A+$a;5-fR@c z+T+xYc(OPip@bqSHgiCUlRPO>j+j|+NH%F?5E?Ey<->~LyP)!lvfZwje&A~bQvxXJ z3PBG0(Uz~u>^*6HpJ3;{bL5hiYT z{M|r|KY%N+{H$G+cq?L!jvKnesRpuotC#?VKXBE9&C;1h8{jL?1xL8zCxD|&YrFNh zCZ=javBhr#=0jmr<>>w#M^0*G^D3M5M%k`L)l}4Xb!H2Gg90yLz2r`}E7uucy#%$$ z59(qM9$3C~BGx?SlIk z)BY@N8I;dpZfAkYQV=r>3EFk}f)@a~lWq%gN7=%keXdte{$Pl%-As@Tgw zI{H@7QblCZgc!CtUw!&SOuTqSttfuJVg?Af&tHBhQ5>w zcyy*%#V$6Q{CzDCu0+>vhxCb1fkwMOCg3{V@4x&0`)|Mg>We$*)(8YxDDZa_y#EhB z{P6DkZ@>BKHHXr2N!VccgSdpk-`{@s?bmPkyGf^t7Kuh8pz+8*@cH5G_iw+sw{|lW zQv7KIhBWpQ3O~Mk`}W({HVO!EQM_M-xB8Kn{QcdxZ|vQ?Tggb_P%s#ZghM~Q|M33j zAAflF4GX#_;yw}Xf!(l!>7)ku{&!2yI z_x9b}uk1B=CJS#IibO(TDgFNMUw!fA7hisPZ>|STJR*$0<8Fz(bzmcLu%nEc#RMJ^ z3_!p#wS`VYd&hB*v655%8{aKf8%vfqyPY8>nRm9fnbZ@3YmfIj5X;t)2HDN9#}Lrn zs$U2=omYWWvAS4qwu&nJ41cj*&pMflznw(N&BbiCTy0gb+;%pe;j`#p|Ml^$JXwz6 zEEdc4a@>Q|mm7n{Qg(mhpKNC1@nkxk%_qH9IeO!l(#1+Sba`9ukA?`}!$H4Y&BnYZ zFE4$;Kq%<By2b#tB?d7wNe*c^Q`u(5& z^nXvUv;8SD+GsrLRx>g8^N;@cKY#e&j~;*W!e4y*?RVdO1HipTFRWoBA1p;I@*}W= z(wDCf+>%c9-v9sr|NktR2XotIn#VuT&CSi0yG{18$(|F(>+aZ+tu8iHf&|!m?*;6= zs!F)nf%gJOsd<1|be(%4$a99qV^~gD zt>&1FudhevovIphTV)LJK0jYBSIfm6j=Ahs^HI0OEOMM68O8bf;r@QJnoVvldo>zJ zoI!73agE2{A27I^+*}Rn`IyHlag2ds81CWsCmgc6n@vW8Mn3Mb8d<%L4#9agkB<+_ z`Shw!r&2J`>kPcOTCVONAMY1;;|qM;kX;fOJtjKCe6haAsb;rVy;>m^w2E{9{$u|2 z_;CO5u%6$J&MK*x-(nOv7FW?4=9@LnKe-(ZoB6okp$Payj6u(egUR^%^8DiRqE{~_ zJr*Nt&@(K)xmoQDI_=(IFz9z{8NbZxwOXxCr{|<-xzT9$F*qBx>p8DUyLWJ+(dq?j zx>B#V`orOX4r&%+cINnCZ(k?Kg?hExXm$JjUbkJV*2}qwRrB%9uHKw27Yn6&tKI2# z869*I(W;K^22yv0QIfi}_SC7R{8J1!d>GHj*!9v$8-m(8T(LAP16f6Pddz!{E?xSX0vWwPmbH0UbVXp(g z@htAiV!6Z!%-vi7#f0BxlIQ?|U*11#mh;)&?B-(7D#pDu;5lA2F4vp;&3ZAP-CSaj z@Z#Pw27>|Y-rqkwK5Z7$$@Q>VO!}=x&cLz^!$1A=>4ET>&29#bQYL7_rEz-=!qdYB z_^g+U*);}fzeU8`T8++dzg#}h`_ClC-6kBs8VnlkeD&}|T+POp{YoZm6FHWlQ!$TE zkL%Uue!Z9sYS~1J#;p9leDRzsbKhh=eUOEM8!+wYH=)*tW?jG!a-Q7LZhEnN7JQjMjlwr#+clU&Vizui3dG4vnYz(9aL1e=hHDitN>xYNcVm_ZuZ*iSgIUVuYWw6L|An|?;@te+w(4#j>{~7cD)8?!36ZqZ_cpR;y#Cog^KF6 zH>=HRu~==^v+E)5c+9N;QUjycRd3g;ySwFjd3y=*i+Jqv_DouBs(ZJbP44FS7VTo( z@3x2xA#KnH)1A?1bbWPxcGf8+15QHmirJ$Be zF`Mqi|L(<7_-CnHYqpy88oppWQ!M74?|=M^BT9w5S}0d*6*cB@x&z^8!mIu5w_q%j z%ce6qRm~>+77i=MVOJ#n z+X;EQxxE317w7#>yIxjv=~%$)wA)~)v+*qsxxN_m+F%jyd%P~2GGF3ugWmBNlTM?Y zOGJDwm)#;y7J!OWae93@q(Lm;vRh@zI9-s{F6WCaiIB3e2Y+r7h2>VqaNEg-`;7wb z6|5c-1QFe=X>bRw;I=U@ei7&~yId^SgeVrn&E>F>jlx8>UO1aA?w=rL%ex8uu!(_V z%Y%Ni28K8U5_fansiZ@&dY%JU^VNnfvRvJbuLjL>Cgj5U;8>mRYPtZ|xcY1~XjSqF zw@EZYVRhQ_HU4}}XSy1;%ju8rS5aG^KDUjxKp zx0Z`I%&bOlpp@Z?l+Lb(5V!tt(5@Ea9uuQE)nQ`yBx|i!3xh$gQ7Ykk*hJmY!O^KZ z0Do@4YkPxXuT@o(;h@uW_~pwtZ#Y{5Qw5a<$&X`}iKQ zcr+UI39nyyL&PRjilPR4nNCdK?xBcWyk!$>6nphz~3ufA6#_;@x}+=^IZdk+p02 zWGn>ZwmTg11fsAt;mOTetCE5I+N=({RWUDd_g18rx7Sd?K=mMG6cn$| zI+Y|604$PW1>^lA6cHa_4!vp>(?L58ScW&Q5$=Hdb``Ws7$9RHN^s(MD~MPig`H4WJeO!A@s3=$(O8j27}>n*zb3$Nw>sty5l1) zE1JSE(N?S7?cvV0YPo<(cR-5BOMy(O)}{d@5xFlPbsDvM??0Ye;)N2jWgG9q?<#QO zT-?omc=^Q~Qwv$OR7W`I)Jt&ce5qWFiMzX!w@}Gu@+J5-eh-I5wm5y^pmMTv;#Mo! zR5q{XGRde1S3cr#_awv7=>#4~84fFIYmkX(*yplYOdO-<)B%w80EA}ZVLxQa zVv&Wr<#w3^MA)O62>abgiWC)>D^e0NL12}Q1>Lx^Y?4eSm>?y!8I+;79bjq5GA;r@ zV8Wz5u;3gbr-GoUSitU*BxXs24xHAlNTMhhC6lyR!+=*b7`7{!Ao2o_7spHg`u!1H z<5brdJ%l@##f0tyNKBg*I?HBB*4%==fpug~hLcRw#rlzQ;`FLhEhN1Nec+JcCDZkK zE6DT7Wv7yhI)N2KNmMd-7hoD@eghDbJ_|||OR6i#*=t$^F!N3|8?u2noQTEME&kT{ zZo8VA#YE5{8PH;M3@4hcu3Ycx;tUl7NJo7#gP5q%=wN!jRIP&-fNSIv9!1cc9vx{7 z2FV#McRDS?YS?dMX-ay{$==5uz15ehG#kz5LAP1Whpdd|+uJwatg&3JQm!;R(9mWD zY^mvxOFVq_M#&UGK&e)5wTPW$GNY;~AM@&sF_42x1K)C`luP)`CRZRD37Ahcyn=p( z*X8-3+X2*SnrJ|8ki^?D!9)6n08q{)BSD|r8~{bUTOi164}s?Ax58()04(DezA`6s9CjN;D5V!yu-mMPalTrU zTHQVmf*we&#ey@j;0?}ocMI5?r6he+Su$bmh}(3vnvdb;%_8w8%O^1P~+K?*EW~ib>m2*LZvtFHQtx14ZnUGQ;aE}k*ZFB~4jrq_^&~GH14)Kj(K#^&e zvr(4}sT8Pgn^)9*R?F#V&@80`7APn$uzFT9Po5VJj%XF4ZkdNx@r<4`SuWO3zvCK+ zo3%{PY3B9tO;jI~t#-3{dR$Bp7u2ZFZbJFkwhz&k9nKc?nL0IuM4Je%v!(I}&2z_Z;}ivyA}$7=@Lyg;#}D|noCtJP{T@e7h39CJxgDH;Hvc-x`~ z3|SX-3=9zLyiS{9HkkmBkKuuvn#O0Mf#y^zTHS$=+J^46 z8ud!f2XX=8$uS0=XughAH$-M{R@In8_w7)tJwDPY-axC@?hbG!fK^u`R{g>LKC+-W z5JOh4!-8pmZdr<%k3W6*xNAz};k#(a5I8V`dR;3-jGte;5mUL6s+MXE^iYJffG?6M zS5orc4&zIbBwdkj_S*GYITsK4k-KaN?o+D&*HE|~l&=6G3;laQj=D8eC|@BRPelD& zRg#gG=CIT&bPRO644uj2a5(LfFkg^bjYb#!CeB1iJM9+YYDNk-#Z`vwS}}_gIiOgO zD-PX&&PG+Dnoov24iYjmdgtTQ!+L=@HX61{nW*1kwJ3^gmSqvQZ?RlXuaUuvsj$Z) zlZ?r-VuJD^5h9PF^rgctMKX#Kj#133HSN}bYNRL_r&$DW5Jg3KdU$%eU(Dvy^KI_J z;sZQzVKZF&;U4|xW&r<3p%%AXfy60FHMpML43Rgz79#~afyZ^ORu6!hoD-Np$k1tF zo}9_nT|AKXO)k5|I5d>gZzYZ~If^$M+8n&@ZwVEF6}Vyq#U1NR=1@4ed@AIW`R#xe zWT)Sq8{jShlX~`fK)XS_#TASdn%xeXAh3$qrIP~H%Ts&SY8>(19NJ6teTZ@@MomMxfFrP0WTl+#bYev}gVLZwng z{b;u8#XO3GS}q2dw=Yiv*+4!gyS6eVzXE0QH-B5(!XoHlSmNljQHk0JV?3?g2UUYQ_Fc$psPK2hoG zH%Z7SkU=m&7Ilf$zXzzUvdELyS*>QuX~1FjyrJj7O=m=WC`qQsx4PdfZqHh!gqQYX z3(buNCo}-bcQg(l!n(^_-e0Zn|E_ zLF7cqb~c?&X3NFoyj@8JkbezY^h!>$IBM5-u}A_&I}!n#+2#rP9Q@w56H6vnC>8RBLOumy7c@sY#A)vI+pZAFscMdDYCPnU zPCx(pW?yU2X%0>$7xhYt`EB$7;6NY0f^F!sDJGLiGIDohb~nf|^Sm2Ra1S8L`@3%ST9D|h4M%&8dM4}`uHe@(x zk99Tfv6w}kltGYW1bQge-57T^AA=~-792+xF+M#$;*cplX4pPWU2bh*Ys!Oed28tH3M1L^`hQ{KolH8G0e!N5W3_+q+Mv zqT+OjjNnS-Qpr>*5s3ud((#+W{Q2+icaAlOpATezERjfN(}`%n${c)r@!enk`nMN9 z|N8F8>Re!Vk4FLIMOpbpLRVgtHCdYRs)DW)b%aT@lW?UemV3cGK4_(>AJ( z;h~B1hll$uiWtPa3TH5Y1$r3v`1|jqG1up?+9-u0Bp(*yBR{M++rb$<{ct1g87ON* zffi6p1hT6E+MVBN;hp(p~kH3hOkvk-S9!NH3R1d9C6CxkWf;41C%NsRXSA%`H% zkOpaYg>n}PB;q_;Ez2ve?lpw{;=EtSrL7V!p*L{wV4E+~M~Uh8+f8Vw1+W7w9cx6; z&$hrDvU#slPB@w4Q=Rq{6WJ51HX10FG;3EA7R|xI(ea6vxA>y0bK7ZJ^CQ^k`sRX-gwBV^|jJcRi`{|cY_H3HGu39NV zt|A_nCzvd#Vck!!oCT;-9xs3raT|{gIcF#llivR(M-th5j-E3_{4Qbl=bv{B$gL)h zMc++i(`o#<*T$cIef8)6{OvZfkh85cd*?l$=F@rPxk+zK`z_g~HMHD#&8>bYo}8 zUC8tKm`4GI9K(vFaNFcVyIPf8%uQ~GzlU*hOM2bW0Id&4z|st;UV^ZCeA;YxGFoNi zt}ThIK*4=OHFZJzu7yN^{1G>o!O3JW{hZVq^cao?2BO4dTA;n+8W#{tc(aKo!P@SH zp$22+T+{vo22fE-;j|C8!9_OH+fg?kg->wwxNCbVc}~j%OR%ZN=uAKtfs7T*wzI3N z^RvOAQ=v^e7P#rO1gO6Ckup{l3BFLN7Xv51ywC(PnL-}O!3P1H+lq9UDJJ!=cAeQwHVu2s zq1Jg6{nt;YR&O|L+}RQQ@mxNi%ffu!vf=B?AO3Nu)9N`!FIfG+Fb%GJ4)Nr}kAM2p z_b=c7_WsRBjp9isl4(qWPU-a1i|_yNAOH2;-+uh*oyHM-=Ixvw0OS*X7g_=NCV<0@ zn$vdIphL0`MZML5-Rbf9zJB`n>EpZKe(I@w zJwr3>cAMSl4Fx}a{CNHT&tG46Wwx9OdK`9}?ZV-7y4@e%Uw`=Pk6(T?q*fv3cU@R5 z7Kg*(^7#M$`UQKxxzhPcI^=WOEmnui;qU~*pWeTH`}WtL2P#uchCGgo3!Bw`;q-+f zZ+?FL=HIWcdU8Dz3%czVv(;v|JA;W#r#HA935l?}NrF07`rbBiMojpsW3{-EDA zdR>)Cd(KT}v&m$31|rF#rWu3FZl^oA?1@Fc`S|4I?A+>#aru2%;#yt0z%vFs(+dQb>lJr&~+kk3Cx6+}YjUvqsB}R;$@;RI)LTd1wCnhxaGHdpt9{ zZjTqvCLw z{P6y-KYsoB(vX=_DjLMsJzgIMzJC4u;ZG#w%8*&?6!f|Y2_C2O<0qi!?XPbz&?=?E zJ~wjZ^7-BF>+8>-KD_%K15y)*2289rhu80R{*AQ=a6m&N9}i#xP~{J}UH|zHkoE5O zp9dOO&Bpu~umQY*P~h{I;Zi^Km3B2l_^~19c85Q3eSMA1e|c?4IBgggvjPoHx5xJx zP$W!u_y(%LePK0QE}Rah*Z-9Ue*gKh(=MlQCY#yr0IpoVz=!Kk*YDr{+*jMBxZmRj zsDU}BCm8wt-P_-Pd-G#gYGk5*mxH!If%v1T!RsHdF8jT%Tu+5OcB|#=_|$B71>!la zGx+hcKNuK7De5qtTTLe?W}7<@&+DE3)sHl#qqGv%le4qalQXM3oGNq-qknnX>*yV$ z!zSGp)9L=!fjgeb3A{=u!~{{0#ahg9ygs+;Or^7eq-vVp>FA2c2|!)hv-Yp&-fFGL z3ljYixmGowueNxR@hm>K<(oAIP!tGa=NMswuWYE5|uypM5 z27}%Un=e}isOkV*!f!j-oWA#HVQqVFXYa@!D>WMRdaYJU2kgh2&mT_Qd+@{b%+i4) zR($sku=@4iKVNlKq%a=#d);og$Kx=6ydEO%&84BR<#Z(AaUsACx6}6N^OtK%NMDy) z#YEWax&W74INXjeUp`;IfA{;puXLeVOd#-J6Nk&~z>Ke-{yWep#C`bKY6fdK?H@mV z`GOSEKs_JxI`BCL+#c8GuU|3n2L|{$&9GU_7MlZr|N4JG+YE@tKDLAIvsBBTNLLXzq}sED1wmJVX+agFd;B_ z^W)V|s6e5f#nx7f`P^hBdQEf(z3%1JK$F;f)Pu{NpP!m+PJb-d@Aa>)2K`=7spmrW z^E0#g^wj3`hBJWG)$7Y{ucs-kl-G20dUAMTbqAtJP0@|ZtDXVG3AK#ZW;)p2J#|OZ zX+;nfy=wrFsw86{`|;NDwmn%Y@NG`gIvrIO+pV@JHj?hm*;QwqDYwCQU^tGc=VFm~ zt;LkA+b>Ne7DNUvY&ELIwC801EKq0`0_U42$x4a%s#Y!Lk^$TH^z##|%@uH(oUweR z2E5g)MG)E9*8KDjPuBOhH+K&miAuFzuQ%(ZY}|diG52ud!PD89xzz)AwmSLU=r;>_ zLsd0ZQS^?k>V~GsVB*Qi+mmOkp=)}t-|y*qx2vhDBFXC5$jFPBtmEc}VRX7(qpPcm zDofJXo$rpziq^pwI|u;&txJ+D3EbV=3lWaxRYeB-D(C={q^JfBw&$(756AK3d!63d5UOYQK zc*XKEaZe+UwSobk*KIeSogD0LZy}VjB=b#R-S79HKF&{%_qMlpcRR8mK{lCU9Hekz zIXON$*xg)vxxJ%GBC;wn#hBNQEsu|0ZLPgnSbVX9M5tJdDJ6V%)5+=a;m+#9-0ZW( zMMcpxP#;%GdM(EXd)qIU=jUc-rXP+gs;)_bz~sXhXNNl*D+_beGjnq@-%rZe0RzpX z<798=2_sa;2YUk zB$mwOa{yj20B7J}WblF{vgKqn8c%04iCD<*C25s7h7%>BT}elyu|z5n2aJ3kKvCg1 z$d}lz!IMNHQTz?T23Rd76dej&=3AvSU>zZxJ1l1>$A<#Wggpe7E0DW27I$m;@I9v|#(ZLF@WbQDf8KyZ9B8+6)C z$A<@dFPERqJzpH?-~kmuuV(@mr-z3JyBkY$({uAv;E0Y4dneRmjFn&>yd(ppKu0U*Hv{LZ3saB2pMJi+yCcw{IvuGJ zwjb|pt}f0!ee!tf+0N1G#Qo7bOSwLP2G{`L08s}NC&?3&qYsXmK0a27mnDp8pfXv$ zb7yinz!8JNAawC%Oe4rixBmIyC@1J$UBidE4g%B_)QiB4jLiF3S?lP)kgD(urx2u> zMrGvQW*YGYSebgIl+RZfL4aqi7H&;hnlg+BaFx#&Z*bM9l?$1%moX01r?7=gCX=he zbZ~4Fl%AMzGw{qpvy_a+lbK?*22QW!Q?bx`P6auzrCd6h%9iW2N-mv%Rkbq6p~xcR zQ9@icn;rtl>n&;^CP8jxg1&G(iIGG!GW3_4!2?%3Q%;70@k};@WrAK0Fd;~YuMAXY zqp@T<8IKNu<#gBpX$i3rT7?vF7!A=MpTlZC1z+G6;H7dZ9*c%SaR8#_>~O!$BV>p& zSI;G4(MZtevYnru9`0_pSaSLV-drLQ1|x!l4qokTZ;^GQr7#d5TFw&!+}ip^S4Ywy zN*IWG0mReegYDIY`Nb6!zDyY9n)$Gkcy)hs`T5NB+^hx?L7EjbB?0^S$-&;%>fDp3 zGgFULSu+SBay{-iJsQ~c_5{A_uDB4Bk`)v!yi zp$}n5B%zVPx%_T09EfjgW22`qoU9E|jrPiJK0N~Otu4J+(y)@E5#X{huNCxpu)n=J zKRdrjc}Ai|re1(V9v=ZIq^YwrI?N7Hi_*&Y&;{>pZ@id!{ABvczdDkvcT{jm6BcoQ z=LT?3XXoePrC`J~mCL!&#B6}crl+Q!E^O_g2*?AlMIZQiXJhHv^be07O|Kpuj!sNY zJdbOzY9K0do}eX}EZOMzy(ec(S5;v~hvo}njWWi-=>3(bVt|x&up1P(OEVCOySMM} z@_mF92G^D1OJptxlFdy6vQ^utQGFw-_Al$`BpKPD-`nOI?Dry z^-Au}Q+osI#aA+^6j0LS_;$NlE$36C8z}+pK2u1gQV_@%d{DDi&ZlFKFBk|uTS-CF z(%Dk2UawY)q=qY59A06I$!H{jwTdM`HBC9TwpH*?n+9S@@KpvBM@^GAt1B&r=PIdq zG@1a9fyp9a5SB|ez)QTq)eDg4WIBy6gy5ST4uNIqR6N?d3=};DZ~;N+loco{$OJhr z5}u<`nn3afgF#Ftaj32ve0qlrw@0;0QHG{wu)J?5sgT-zaDX(d>vkm-9ugm1*3S0U z795a*8^VlK=*h`yB482VI+{cz0;w-2&@Gux2v{!`o-aa>kZ%Z16RnIHrVrnre>yWa z+Yv=wS2aU#=K?kWWp`_3ehP?t49$aq0+lft_vx#>&Gn^cPp78=I1w2p)735nEr*cQ z7tf}?|6%Ic>PuV!7*KUKcyjP+djkym7-GBp>TqmwVq!IW!(xbK3vF(-&TzaiJ~{sI zumJ`G+>qgVwN|e+SPV=|-kbMwWc4(;-K^xHY)$H#g^BS;hgF^04^3z`YQ=26)+Ehq z-@QBUXUW=1avMTdDZ@#%*e1i=o?K7C$nda+T&rHGR>}>AYvTl?b51xcs1YI$uUDxz zzDBBAiv3hTTvt_$X-zFiJS>4l5z+Mz4cDq)~&}i~w7HkHo;BBE3czri6vY55?SNGm8X7col;J+^!bL5Bi*z zlOt9nSEN(eF{6};`T!x*+3_J&y+V2eHb94v2s+R;9PaOIU+PrfIzdQbD+#a5YC1XC zTzRqB(-0{5Al>Mz&5Xxvv7Q}luPr{G@2XhHpcxvQ^4M+Xr$;;Btl3$GRLj6ZDqjjY zET$u9;ruM1g&pv9KuahF(8V0@Z?2IDPfha@S#z~(G-EDwJ%`(9OXg-kast>1L~4lX z3$yk7Xz%3;NO5*%aee&W#Q1VT)~G|(J5s%v0S%y;t4!Xz`|zCYLDR{u35`l7PFhuK zjE{^iB|H7jFj}b5Rxz2(Ld2NSZ|@z~Pzw-Qbg49_kj<6LwHBI&poogTF?Jp3x580> z$=;dROpzE-fQ_C(Y7Uucv&^k0wkjuL2Y{ElVI6J&D$F$QuBAo5hw2l@Ma_}-WzelY zu(JwqNS2bmk3BSrB>{htQK$xxb&~(Vpie@ICbwu|R1sTr4eHG49SaoB0&|&+3=1wP z7*Q2^YwZ~_Tg}63ak@+?1hC+FAxZ#O6_TG!K~e?s)jIa46;-}LEp;?3z>(p46e${l zfo~Mk#9N$1b{IkL_6I%k%pkNVksq%h9)ySfV9-N+(V+l|Hp>}sCc>t4do*C^Vm%c^ z`*D7Hh-1t2EYR)t20fLlWh1@|VB*zwM{W-Rhk#%9q> z1DM|1TzfJ96tqsZs-yFzn8R#2Kic1=E_Qx){Qk(Tr9#&jrcgt9LKO-j{wP$^YLZ;vm>RaiclG{l%1?^=au>(2k&H`RcuULS~~@DATEYR%T@ z=whG^vB%}R{eBmJiJf8hza2-@0I5KugLvT&5(5CWTVqe{&0)DAkiFi`atfHMKDHWd zQ!{PQKOlc39_aVPlwuyI9b`$ZfJ_f!GR3i@Ht@O24kT`^EzIJuG)L_Yj8?*BwOO$* zp!^CvtPHV3um*TVzFy2_vkJLe@sJOaDiOi;P)>xpo*~uJQNPQ^1MQM#82=?Qa6mmB_M)-XM0((*454hWj?m1< z{7#GMtS6z9qm$B+3?05Vik1RS4p#%NGzth^yO|Do9k%nsy{)b)4G-JJ_qA3Eoe29HtC4Pkk3QF-QRh+tlgM+4CrDdO1}Y+-`rY%aZ_fX07I$Ask5?!%XT(a zm%!jRB(Ajce!JajF`uBNUSD1uzdtszR_b@*6wx#o^k6H%O;xL7uFBXAN}M%8-CiBVF(bc(4rsp#|qy zL8VX-nBvbkjh+cpAGpsJuK}`;eMDHt9PW04{=*tk#D3EwQ z&?RNas|LN$cR+FULmjA0AJ&aVj|sSf!c`MK=Y<(9MVAh$(l4+G9aoBnL7~v*-8D+6 zI(!E+dU`D$_BkE4Gc=iN(omj;4Mk5#qcsO|kM?%9R?$Ss^y?Y)Ln-;4E|<$fuOMsa zgeCEY^`%VoWBd1R^ERGWd~T0t@ub z$a(z}-1VndMb_VIiZYcQF9skoo@y00960ESXo69Ore0|BB0^#Q*|? z0MVi-TY`wR2)o#b&1rTg=b4?HbM71`_Qc%<2$7=1l2o#6mn>N&Rr$hIzR=I{dwMw_ zdC_0@m(FwE_Z;HRMuuTnQI=)3+tpRQ*VA=fli1d0)`lP|s-h^Gt|=PER85tbX6>lE}A8xfIWII8IbFO~Yn%z1#095>qXtV;bLKIbOtOby}e}80dU0 zmx={h9-oSmto6E@-X9J}L$zH@M*Pl3hZh79d+qgl-JY(gVl$TryKNR(>U4OC2KxPe zSChDAHXQI+PmWcQ6=X$`a0aX*w92^)kHdO$cp$P29RkZMxEQXSjs(0;%i-RZD)NFT z(LHFYP|HMpE{FYeZ)fWjCQ&5m=5o1A(Cc#8&JMRXR$t--sx0A;rn1Gb*XMCsPY+(N zy?Vjnp+p0^(#i(iPWzeVcyEgaL>`L>I15*by6v{}lcRln@N((ay*sy-vb`?FNj3MN zsJgC5+$W#j|NNkalbOp?baD4sRk(fo{>lZbsj{r78V%rP@Tnqw^xh8+s(7esx+0sG zPq(S7(yd!hBAmdAxWsN3&k!v|K{UCK?{8!!NicVOgNnHcnfv}volV46l}#FST(FAy zRI&5Ha+>2fKNrokBfbgZoit?HAMEQ_K@6X74N-&Ga8s{pLy zmMXBkAgkKVsc{lr6ILXw9FjQJerJk#b7LWxoX z%c`1GPldhC^HTy*GB=?22R%(}=Px{VoAvBORzxJAB#M*@ve?RA_}upM)5C3r?T8c? z4D@uuwZrd5&Uw^64sU@YWg3)%u=k;OX6L9j9rxg$; zghH(ZT^_g7W;xv1T3hCDwIXsy>JG%L&*gTW6L9OR%K~;PnLnWtcG&GUkhs6SvA%NW z{;dyR$-UYqCw(Y)yHv;bV^oD zNEJFCl!PoFjChWGWEGtqv;r9AaP-I3Umxy?6CoGHH7l|vVURUAU)m$v# zwVxig7>)!^r6kuBww%vIgC58E$pMbd3pWG0!q-#Lu+QVRo*wNgqN!mDEh1DiVZYaD zw^kGi z!RK(fzz>9JeT9=uB|{)oHtV%HoDS>R(cbpPD;8@@#GImXdB4MnrO%FbUT>}gI7(VT zEem=2!fH7^+}+;Vy!)fO?>$H%m2}f75GnE~Kz8@uolg(z6j!=P^~SwmO5&XlZZF5B z9uSn38!aIl(G=m%M?c&t@B-ig4is?B9FX~sZ~e@}>yjeh$X~BNAeT}^=7YPhQnJW! z(v1z8{)i-Hn&11etu1mq#gIrhInnSzYsWfRWJ`uB$9}l z&RH!k706Z0>?Ezy@C^diC}u4!2pL@>{knaGT~?%aIh{xfGS32P^CsYrkR`EGNnZrz z9&R0CNt#ZaVBuCd9dy}vfJkf8+e2dnNA2Vj7arRw=DFbq3xMgK(gF}Zm-QIRU z`)zio%W+0RwjvNX09#S{Rv~b1bvkWl$9u0gR#>`PftC@Og7@?sM>st_*xg#gW|94h zAShxZ=Q}&I0Z}aSdgJ!}yB|MEA>O8Uk>w#C0@rDNa_{ax?=^ZbAgC89T$c(5rcwFi z_77fO2xgSJH#Q6=MZQ_R{ocL9sw8OL8!6KUMqgwYSk4dbJaD!Vb(IP$vJl)nG^UXH zr#tIuj%P*13@$mjAaLzkKK1@jtW6xA%+aI-D+o-Zludp7GTfo7g9*Mlq92 z{>a`zdO{S<6PN{Dr3>s+O|J zXryJrL+U&j4zY&BRi~ha#?{M1D=4x?S=s#?7m)qx%8O7Ifum6(mr5_6%KZ{ z*O#AR05XaZrj+zM9I$v8=W7}ec(91M+BsBkcy2{*Y@&vHcIWQLx1J=_9+hY+{GdnW z7}u&-@BQ%3XD4mM6|M!lBbP!YTrZdI-@W@RCTpY(ihN^{7^oF?@2DsyzB5Q{2~}4ymr2DRCnb^YgeaBCd!SZW zAsMra>yTn6pnP=)X!|h=XO|G8Ie+`p4Yn|QSKCzL7&HV zyw9SKp}3=f>kkJiSIb8Ii2KnV%cD6k8KnY)uN7hex1FjS4rW7zCE2qA3}XS;`SHQd z<_gEKux;oM1uG3VwVfXB?{2LuNobaMs+jP)>6_=K#4J4mm*#VcFNM55Q$KgX;nPPN z6i%ihqm%J@V5e4i+WO0Bu^V5T!jaM(8e(?YasFJ=h3D~UNYKqv} z%cVy@hc_c_d9fX}+ibS;Gn8YSgzh7hC8oSJqfQK1G1czoIOVou64w zLFm@T>hg={pWMIm(bIGnjSp2C&;UrC%(p7}yFdKo-d?+}$U12Qxu+s>oq9Qc=k~oN zxC^R2-BdUHN9Z)l#oR~#aPKhJ7Dy5G?u|u@AheKq|9f9t@EpTaRn(=LOJF4Ml&6<;ejNS0C)@-A8 zz8OHHQjU3T=T^(!=ITq{42XH<63Rfo%X)gex4FFZP~;ef1HF>K)MFl4m*rq*YxVi# z2MD*o6V{z_Cgg%zQ4PNO;>kl~HEEy7*C1CORQbpI8!OMBJp8!?LpKM?LAT#yKey~d z-<~~w^aTP&?IV*5InTk!>CxWiItCs-G)qBAz8N?>IXc|kTw8wj^zkF=mB3Xy6L0{l z)8j*U;|c~ILyVDVVk_yj+3eO+;_CJ4i|5atil)(ut(3=ddPcwn*0Wz?1Q0zF5qRp<$?8qgpDKYaO1OEiM<+*?cjZ&!+RS%3z>e zskd1E>gxJ(HpMiT^XXzDx9in1rb5$&mlt!qj(;Xbmu(^Bl}fE6XjpSP$MeZ}JXEl9 zsZcBxD{Xl^pH487IWRC~wOA?@3dMGhmZd$-rjx$Vtd>iqQZbv1S?D`e96leh@_{gLr(W{haQ zAy>&JW3gy7g2Kz^4bE{P_+qvgv~uxCI2;NEeJ-cX?lwllp)od$vDV0?F1#LJAmm4* zczk?0HwL2#?o}!$LIFhm4C#Kny}e_Mr&n*^{^Fg%mlFZ6%euF^@@nnXi{-V6q3YM) ze0|-6jzztet*4JR_cm9aK3VzouLjEG&8#Q1im9m2y8ffjwvJytdA7Xv=f8csxSS1; zlf`sA=-hwwVDn&eeQSH?fBtk0%hDwl#Y-G5t>wh#4To$ehkyV5w2wBCYnHO{Xd;G# zpzuR~aQa&V?NO%%F-XND7Z7{D-{)~b)aZG=T7{})ki%iW2Yo6z=s9emQY;p78K^`g z918fnZoChQWu~0N%ZYeA76}DIL7K>Ew^~k!g*h0yx?ao{GnMHytF=z2(UvZ+ujWM0 zVm2A5Vy9lKl`AdO(%nmhn*s|UjIP*e)N0jgla-YI4AaaIr^~CWNf(k-t6_{$^Z`J_ zDr3wwH#DJLuT-FW4W&C+%%(taI-44!uF%8+O{U;aDWl=km`o?2dTIYWW<1%OyiT ze<%f_fe)}7i}gY}mBi&-1Ovg)g)tnCjFB-OYqe}L9>Xsj@Olvw`T`_QhGHR^jD_R5 zOu&V*`pj;OK-_dTmTH+~D(VkrQZ5VhWcLWKj|bz+xmrs{F8qj{-FmpTytaKX9vSoN zx9=8OJrfPN&-PX~4z`{=Uftdwj`ZI3*Ka3sBcF`9ww^v++unS&`g-s1>)%YY>6>Yn z{{KumxbuAD==kvX_}Fsxm;e3k{OZb3I`wKP7j+z;!#+Ju)J=c;(_1t!n$W0LN;%|G zAQX)R{a&~8@4qt!Lk%@`;tS2WH3jz20tI1FkTGe7E0Ri&_gCRfAw*U8kemU*Q z0^6(>b4erYn$q8bT!p}iij-{<(Ihq9@KK$NoSL=3m#4*|r0 z*KVLfY`}gBIl|E72k3enX9{@BWsAieffX@F{AQaYGWmF_P|7FcWDuAHO$$W-=zxMp zDo3}hbQ<+~sZegUS+NVHT7VJoW+1C7)k-m6X?3Ljcwt%^!ZXh|CnSI26mNR4NvZ#Bjr~3YQD}9Sx01uLHx01bjhQi_3b3 zp8?&Qy}cT=v#|>#GTMl9%g)C3-ri_D7$7zKtrX6ePfV=;TTcZ{>HI~e9&q=|NVb`Gwx|3dh%R06$t{7U@!ogvHj*( z6Z9Tj6JNmFk`b>5QTHM4ZzsCQG#fRuDh@d9E{_*KT#KO!OtTDo$fY1lVInSQ5`_Mv zQ8vStfTM=UYyIY5H*ihV=$YINZ?rI3rvvRt2h~U-37@@r=tIha!;{0^YY;+J*?czc z@=d4`fP-EQ3@DgcdO_e+a0T^2rN-)n4q>$bMSYoEtyC&k>#Sx>VWnillgX${m3gIB z%H_)JU}})a+=z+NsT7J3;9?<@?WhXL7>J%uyO8%nCReJJVlH>8!H^451v%@s%eia@ zI#x<}z41~LOi#(RXBvRR4}ECZ;Rt6+(B~1>SxlsAHj{xNB;#SP+aFER`DWv>p+T?A z%H$&83wWGvFTfo^m`$C^1!z0k=r;WCA1tM03Dp z18~(cNdoft0)+=w@KUXIe$=i2@&w%X!Yu6YgTSHj+Mk1+%S*EZAlpMtiju5SZ!_eK zWVOV~kSc*C`OMT1H*gH(6aQhRsy zZx?DkbrE!*tUmbJ^6Sl)PoMtb-}DlXensbN$!OGn^78Y~p6~9wT3P+SKT3=-?d#OO zCX*NT%|{Q`&|mKE|Mgd0eKzUJObsP!BIZ5a*|NBS?&)9O^+$#()8ERWaz%@5vwFh; zx5M(gX|F4{o6Tw=11rPg{Ow7WpKJ&POIgbYU(M49po+MBb1m`C|09=c@3nfBb>u~#sk76 z5AkbtCZKROAr9x?^@^oJzSL;9FX5(U!GsQPI_)v_3Yx`oz11Ppo>3zVv@fTMS(Ktr zt#f3Y=JM1>YD^Wy7x*bOb$XvXnx~?Uoe8W=oFF>zt`t;I~`WDS>QRA z7kO^En$~l%fXC(XxEwZ%$uMI$o?pzk71v5f{BE1YY_k}2TGctXn9g}#SY0!Z z?!A1r@#`NtsW!vSy474V8uDs4{`McXPxjxw-Tt3H&3eLeKI~M|(QweE+4^QpadE1; zIQiFy`HWjk2AxVO5)Szsx-+fQ=XO}MfBC{rC&O-|R!qfWA-~7za@%cIlR^8#d^+hi zDurA+5e@p>E(eoqD>uURW*;u2xHd z<3v#qmiV8=xKqhtx^%s{6ql<@T#XCF<&quNbLm_zm8(@Sj<{N3EP>;f;;dE9mD%C!J~`9ZzHmNuR&Si+DL(!Pu;q*z(B4LOdH?r|?C=dt++zy9>pvEp(4zTMK;vv7+>-BkDc8h5-XIP%z zQkXTTp{0I-T}riSb$S>U!Qt2i;b)L8nox zHRnf)$zUohSJ&^~%`12qlm2*Lt~gfiy?Mh3lm6o7?%i^V4v+2Z)weJA4|dj{ZT`34 z4HHe_k{L9M@u1Is{L6p;?e6~8tIh2{{nRVXmg2lu$)%${$N8&oo*kSXD-??V{=PdA z+1a>L!o~$XrsKUsjm4z9Q2pEI`GSDhC}(2PsL!g?8|*H-QK$bw9QN9cN|_KB2eLdK zH@&xBd&do$wMr?U1rozPCt!u5GFglocHF5J^Vv))9>GGn9X52CO$NPo*ed0+sU(mH zz+wHIcHDs?)DoIFtRc1@d(8BzdHUtb6)Y>Z9Blv=H|;j7`D8qq$<^BcBH`-skL}jV zg-kM&FIC%wKy0tHBf`90%;oagY_U@72)GmjT>*?hZo8bz;8F7BMxQ`_c?rm|JUeU^ zbJ=VWMYFgZ&|v_gd9R#J#-oXJI^wq3T$cbFj}B3sw(^NcC>)7`20%{YaxtE< z94oNBVloo)`2qnql`fFTEQHG?%S{_;RIbPEaa)Z>gTchG9Nu`!3jKU6?6X@OPOHUg zLZOR9l`LwYn+bz4tVV-Tr#ew86wCr#dG+p^ZKi@Ai&}ZGzkjIM-F&?xh|FU3?na!{ z(h;9UwfE}9mQuO(a((NEucOLXbQ5$6$3wg~ahboiJZq=z(|L5a;J{h!Y<$MabB9u719(1UG zyBzhpEwrcOQ2@*B2HuF740lYwRj(BD60m$kWEPXjVlnEb{T7HQjd9{(zsC(&SuGZ; zQLkxME4f4>nTUW~Aq6g%(_yn&4I0&oC%6d`({R%^(JA)4RBZwtXvCI)d?vj*(49=A z^VRm~`ij6txLR@(uo8GSkuFr)Kgw^$+(Pez<(cT9pU%aU+b(s=(EpyD>`EgsCvF$-+`yp;tl`9Ne| z7nH@svkNdgzvTP5Xu#*N+C4t6!vd@@EFOpxFZos?=<_%%c3MRXbdu#6;0iMoLSDDs zq}OTiJ2^NwLdBw(mi(|7@;Gh!)5CrFq3reR9r=8+5Uy@6nQk%ab=vj&FP^ zx1saG{imx*vzYL^%<^yl{=1#S?HB8>w|@02VZOR%!3fEK$A0$w7aK>X^6g#u{=fd= zcFrzF%~CEI^11a}Pc{zEE>vfy$AA3Ywj z$0B$Wm(^;w8MQjiS8mv=SExNou(FsfKo2TMcRB9V%lSe!8GFQ=#Y#P3tbV6f%q3$n zz$)Oya@cJW#~HP?YAz9%nhA%b&0s!K;iZ7Rz%E{1tpsk~!|mA&wzphe5-ssWW&$%G zHVfGd^e$VfcY%@>frS3pu_W#3bgtAGlF~lH7wye*HUq*+Wy|e3-LaAYwB&l_TsoB@ zjF#F9NG}LW6gh^OwZMDi1`>&UYYLdNWb|Y(#cqys>^4$1~3E5@Yr~9-pVE5H2i)Lyv6JQdlDEi)1X35 z4f^3EcVdT_a_oW;SMz!*?DM)@ZnwjZ)itt<1urtp)$O8)a&}sPIJ+4tp=HT@EEX%F zoesF27Ng!|GhCdXD3mP6Oc&hpnr|ijPGIwFZ%cM4f4jLgM`2#xzK6F<_#9@PO1`-v zS8hFjzQJ>&3IFbPIVwf{POEP3KmEI3?Cz~UUw`}Kmriv|1(=Nld@jr3cmMIt@g5j% z@2`Il=9eP8T_zeNt$q5w56#6-{Gi`!*8tskBna>7wwp~x=%f1Mywj|g3xr%h+y%)VV^@Os=Q>8i)4Dl81ys#KFa7Q|o%$6FDBKXL2i*c`3 zE@o26M5fdPJXg!r64SkX#tm=q9TPps>OfKd5Kn zdPAWgR?Tjcm=!n_uDDJaVFImyqtj|8UkA63*~j%#!tVw^vBoxw5siyESadcSmQz8r zg8UUx4Um&|MhoSUx!`H zC#^g}gTtu!er;=K|3J3&$C0J}>(8rMuYrzu*m1t`Y)5%|s+9k}7wlZKlU}WmiFktn zr&V*PJW~Op@0xX%?=@jb(ur^=;PCA!f_x?usoZiYZ94fr0XiZw{b~*vO(ZFlU<(DhM}(o7v}mM6 zGAAi5ki8=92K^06Ao)Zpn(C>c(`jW_tHqR~ zY`fw**^md$+-RZ=VHx4_5+!|mBaF*2WMlO?RM=qDfLD<>3&RgTyq^>!Zi`-hawOkZ z9xHzHW9?LFjJ8*|d>e+)W>Rgxc)7K|`|7Vh`j6ubs&>*UCZj=*?c}?^S=&>*{{GK1 zWA>*%e`2P?ZZ#c?2JDJ&{^o^Tw*K_@B~AX}^Kw4!)pOBEEM!+c{ch(-sW`fdMf&Uv zxdB`OS&6uG$BHwf&7!-WF5fZjdaXkC4y+&W|186ot81ZGE#(mq04&O*c8k@9oGMOx zfKdTKGaB&v0$#g8t=5~2dhHcr>eag|iJOq{R!e43D;CQY3Jt=~s!BNGXM+YbESt>( ziAzx;EGfYvEK2H`Fa4ZerSwOjn>2DM7`#lG)ET595O9%f`EjENwuIVJI}Nmw?m<}0 z!L6l}sUnSxr-4E<3x;O~)pQ)-K{lbsd7J^{#7*I#0k?EE8DKa`vLWgK%dB4`geJ1N zkVTNpUf65BQe6w?XsWpxNREM`T2!fuRfl#Y`@(dFYj;JW;*CGYfj}m@}uK}onL>gnKYgn zf5r7GnRvjVkw0DAJ(6v__`kmm>GR0E?1*AR*s0q1yZ^9zCR<l2L~gGL_C=iW1g%GEA2+*rRSGo6cmiMd^A84WJ-Y zJd7W?uT(*l4mjv?X^#)b%TNSIsYof%J{9=X*tvtHB zY*`uyBY}x=eY=(?8yAb_tNi0(2_|M(X4EL>NwopS5O|Du5|72eLW8A2(h01NM>-K9 z3jh(G_6vl!SS%b2`55VRj^0|BbsHHvNeaLcI}GSxC5W;NyekBoG}Qrrhmg%8sj}>R z)GlTsZU-37ZZjLSOF}5AGdF5vqduEar!|_*R*P=F;K?<^%ZzIY5FBuz(p;$3C!#p+ z_D2jVXIxKut=g0Qo&Cf8J^Ai`{jueA#rr%9t%`Y_8rjCP=R30Pt<69EQ`J*pRwB_o ztf=nI+Bd)0k-vWN@}DNL!rkvaAWsxh0J}-{{QGAIr@OB<|G85h^2oKFI&k9m*iN@M zw@-DdL&cY7mz{Ll%?ibXkl$rGKRwr5EC%)G;dt6C*Qy{sxH7n4r`h7Lo3$!&IBJ)Q zWeN^ZRIdw}3xNX4IqJ0^r4~x-^LiXcoq@caUPs#vW`ai2LFl+cjw}Pfm9cvq#eI?y zpsi9M>Oq*O;o`>xOIoz(U~AJ!gobL16m~`Ddf2H241$EuOupKG6jah>ak;=q)RD@R z8a?dNqpIPbF@YzQibayy+Jq&yBq>y=DwqMRBqEX-~p_;7btcT~4dfXeO!x48h&aTo@MF?nGWg<(e5R(PYN(^L8$dJZP}Gon}2;xSE;H z$SYh4&4|P9ptcLOMy1@_;~2=t_1)dF8M0X|NVIQX!*;#de9Nqu5p(e4 z@c!Qa_%z{f0INnJ5e^32n%&n*qt&ESo&5F7Y&!0=nw2aJS-@q!xG>Y{u3q+`(Fh0t{3h^Bmk#&x#XMj_nSl6+qQqp_Ea$-tsa&PeA=bn7 zfEPLj4az9-M7CJ#@T(=uEwAVZnHj-uCqX9ZY_8Ik&Xhqhn1tyf2h({Ql(sz}fDj`> zjwX$CGzJ(#*>a7kK!=0UVKFzV=Msq&EMGL9>rTnjJ*qY{tmh>+27*iED$?=vBY_U8 z2*TtAV}6I-PpVJo0e3g^@n{^Si`un1{89)eBI8HZWF#02hl4(s)nIW+9YoV?7xEbJ zxIA936TZttfkmSBc_S$~WSb4biB()M3|uv^)yo8-k46jB#%$KBPM7?AHk}AJLMw*U zp;hTLr)OH7a&I4tadUff_d#sN;ChU@^Sw7a@?8W3j-3t{*SFVfI~9Nosos41bpL4k z#fI#+zitHbQ+7V6rr-tj$FII!Ka#(Ey0QJg|D~FoUUB1AHX00gtruJ0z1Z7(^LAJM z`}c+R_2sl%%f=9gJo@clK2sQN`t#F&6B;vq+HKSd$wI z=^WhWBTI%ns#kyE#)B3JjvQQo6xD3d62&Ap8W9j)5ni@T({BbRFhtlN-2A@{_M%qCr`e9ez?ECnbgbmW-0D6s1&lT*Bj5) z)}DX)cz=Jt8h6M8#68Bd!#&yV&g=E{R}UXPJlu)HcC%JU$NV<+k>XIkyS=rw_5S^b z57$huR;deSgzqL9iZ&)KMo=YpY;U}H{&a0^?JKq4Uyho!YBBECpC0Z4iBF$=|NU2t z^l-}!+U*8945tUXZ#UOpJbU{5>&JV*WY%pqtA&KmcqZQgs5aNv*B|ch-d_tt8YvU= znpH>pSg4(??XCO!ySsP7pxLaK(qWfbdvT%w-1heO&~baYplYk;kl}O}r%EiAd~fgl z?aj3?0l$~>sW8$YHcEM*#Eae_N6ZIggRxfukF+Hxr)S4X;Efsg>AVQ#9Q3;^dW}Y{ zK0A`rvCDMOsutqdxx`aQM+dlG6?8O-ee#``kn1xz$*3v%Hg%Y@W{^ZHir$2lKC4Rk|)@rR<3b>NJ-F&(B z{o2zfzxwoW|M6kjuQ%(3s8e^cxApqv(d*_@d7hyRT1bByX+>d`uyw^n4-|wROb7h$%;jSKDXn} zdTYMEG@VLCqaoXEma`9d?)SJ|E|q1Y~mpv z3HSrPyUR1RLM9Q58BrmdN+mIMz~gk-Ee4HJu0RJyaFWfWlJWa+z+=C?F<)JrX%sS< zLM9dol8HE;d)>6kE93boy2xn?<~|Y*2HbX=)pBhzoT*hxxlAU-B$9Bz=XTmKipgZc z@6{@~L@LGH4Bp6bXR};inT&ef*_lc%mn)QVMkM;#aD#F5r&{f)N~Ta?B$0^u@#FpN z+spIgf^C$NLC5u(lHq;*ytRAq=a2XAZ?CV<(^fg3@LA4eLf-!8-#&ib{p-*7@893Q z&3g4pF6O?{h)<68zI^(;y+uR4y)IhiN;wsqgEl8iBEVu z{_*R#m!~D$s#S8y`=HBW(5e&?p^#w&&ySnMs9P%)^66N>d3&kXDrB^c%x1Zm44S1( zCY!qVJFHh1I<-oLt(2}8vnkssW^w9azsq`UJlAVgO6=uwF&+1sVlMeWkcdRXKCAImC8txb zmWsJdCK-=J!kGQee4&*~B@(GvzyU7#a364cye{*(M#KGHA`)a%$wcxY3IthiEqHHg zkck;aoCIuR(SXxxzA|2%pQ$;#F$^P#MX?oL7oG!e1Ve6S04p58W800zd~Lb_-Za>C zu~f>41i&Hcj(e_019nfQkV`~D2K#e|dCgY_y-uf9D;097RKf^^qCfxm{`&H`UN1(S zQX=fJ8niOu;qKSH{l9*EfB*jNaXIN$Gxy$GyUpMfjjVcjhiis{g;UM)G^-3H*keEH)$F#R~G7t7_8*L9-Bdp@(}QO$A<@Kc-;(}m2w`e z;kY~n67hOM0q^PQ>2W@whGaD0xYnzcRR0pOaJ^d1hpkE>myUX*dT; z<>Jw>->Ks{F`tJ+qWRi*rWA|%V7N*?orvFua5PS?=#3~*ejB&~q|qaUqjWidL=$L0 zB&-2g`CKLu4TVC10FY%txhbTglS;W%$fnUD3{LcWZ1f@$iG*Q_dHntXO9IrLw(B#M zLaCI~yJym=1Odx^XR}#Mz?A~K#RvqVWP)3%3(Ry$M5a>7r5qG7N-%&D|S~l*xJy(NE4tK$D988`bXZ?Ea-fuUlL;%*-*3Qnq0nu;Y zo|l70IeYIgsilJBy{%7QcDDZd1C02(A)I7_7OfNr-Tn+Dq5)jF8Mms{a>9M7m5Vqe zZf|W7^F1&6^>Qf}_g-nFBEbp&Xz%Op_RGt+*Uh9`D`t~X*QFZ!Cla0<9UOfHLSHwd zMk$|tpz6@bWJG<($4Af4Pn&tK1{R2ieRpQPnq&pk&R>JDhMfx6;B|l#)z}hrV-_H? z0U0M}+kSI}{nwwO z+99dERwbK^M?+|ESS>iQa}AEL-|Mz&pv1^eINaH+fUim{5I||mB}nQ|h~jW;W|LkC zUV;LbO8K7v0x4p!E4>OMiOR)XE)TAZhJi!B+jf1SB~4|7xojrG0WkpCcHLZn5kX6M z_cRcPB|+t#c1)|~0LL*LQC!6Dy0e1#KujtnDW^yzibVl(pUZy35f=Df2Ha9XM^JfA z4nUwjJXa8~#H5@qyNwi>L_mYbO2QmX!ZmP!(`!gklrp&jXosY7hrZctmcv#l8FrZs zr%Ev>L%>Pu^JX~#;Nk)2^_fC^a(oPy;Ux8CJ?&yALwA=tg_sA0+~3Q7-3V9X~<&OQ*{^g19{ zp-?HM3}KXO_$jqIv?$Ra1HlOe|Nip_gmbl6Eb%uVHjAl{eTXakL?mgi$w`u!Ar~Ocsv|*%9(r5jp0lMx69}ApEeN4@o)%b%f|h-3$+sO z%{w|edU{&VMrfk;r@EHoR0e4c0C{WK~a@rvG8agWpFT`K?hrn zT0Q~Kcdn97ZS>Oc9W-(r1|0Ixq9-m)dK`$Ze8m?X=1HUn%coLcofC5CIX_SCQCF2}c z>;e8F==VAu4!hZangK|}G*&Q7dC2Fb;DF!j)F@~n@OFYia+6yFg&Oo6_i?UI%)nSU zVB(;*#`7~GKdJ!{X8-g3+j=%0&t{|Ha5U=G$twHo0OtGK^J+SsO}YO7xa>p3V~6$B z!q9IP^U07M|7^&_f)3hc$un%!YRdKpquFAPhIH5oYpaqm&p-ogQFkz-f4h~0@5TTR z&Ike9*#vN#ZXUrm&0NHBd8Soh7nh60d^#LX*3XagQMZ~3*nw%eM981dX44TnSw3#o z(?KH}cH9^=MAiJsWI7#<7LQMx)v$qquFgRKz%+j}g2Q5G>&1N3$V41Qcriu{Z1Dzz zLBGe&=XhxpllfFG#m@4Nj}H6&Uavo%k9)OD*mHBC#1R4OXlS?Fo!$U4oDR8eji)k< zen@U~zh1A^n;^Ml1UcqZDJ9lDI{do5TP~NXNDY~X5bV4b#V>$k*!jADTqu<4%~}qA z(*>~0#2D)6=wN62AX}`}Yv>RSdTtFr(FUUCA0KB6HH?%-{BYcu^jf4IiHOewtTP47 zl1)VYE;|$wzJSPBAUHY6*K6b}0a3(J6NpLq6Ntict5$+&LnbNraL}cUDil;|B=b}r zlrzwUoG@@D%)@UY-%yV``^_c!ILHqAq>BK1G=czPvD{kC##7P>>XORA4MoBj3O)iu zk;TF6BIf<=Wiw;@!|@17tKFzoD)12GPM<+wK;dXSL|t>)DUYYvh|PMlo`W8SgC4S3 z6Fv*x6fWAiS^`gFw%6$E3E`jzYO$Cv$QI%G5b9Qj{qlQUHbiWK4~*1+oh$&K zA|%Oezr8xwo#N>T9s2BaIcJ-NL=?@@luv$heMVf z%^#oVgF28%9tT3mbh|xvIACXw&yTY~J>>`1m0ad+wL5*xynbBI*iPx*dC5@|w!P74 zcl(nSxO51t`^vQ_Vt)Ae2Axt^>(|G3c2A7 zlwcB=iTxwqNhp%6G^_bU)N8xCK#>87yu*VdzQ7;L)f$C|aL|2wW%zlAB0N4k7Knlc z!g>O6)OHI-P(hvWc8K)x8tgZWCE|pY!Z9bbB#@2=7QGB8GtxMVb%! z$jDjfhJ{i9IGL$ahKeF)JFIkRLOP5Eps;GlN+=FDB0G0Ga<0WR6z`V60^1#oz+=D) zpw;g75UpzE*%X(A(X1oXrj71O|bW5iW3JyVU3z7Yy34@^aAk-v=K)ReQcoQ z%cWweT;?1PIEDqEK-lUHnBqc#Vi?51g{OTqbUICRsN}P-9EfuO7eLzs8V19DtIpj@ zkz%;vw7O^*jtE@6b`{_B!KzL%eyOX`uxR#CiZjkIa z>~Md#SFS?8UrR?lU|khq9mjei5Q(o{$>yM*e+W6vC`wB0uwy4kke))TQH+PE>ZvRN zH=%%}Qk9BToi5%kZrY^7AG8!0fg>k4y!X{A*#SpAHb+r==54$Xzdi5*JsBQmaKFk zpXoz#zzlfI;`9e_Jgr(8wl&fPM1~-~Zl~33cDkK5u^+*|-5cO>zl+Cp!XnBj86(r$ zXaiONR~x{E3CgBZ58OqBrP}QD35q~ErMXlb{@n?`VXQVW7?hBO{i1vcBjQB;=+Daa z7UmyKrvtcx$i&%lqXWDxCTIwI>}F0UpxXQK zY`Hz0uUE4{E#@}{@?@=Yq%(JviqAao^P*SUN+NyDQYv2 z5CKqK)Ixv#JT_$BeDCM!&Wio zu~{xoPZ5^Hbk!ymOQqRzvsp}rJa%Za4r56GLMWk3+GrNBM|2Z+eWBOuV9X_4ToTl( zxiojT>~>hl^U)O@@~BJ-LBtVfam#EdyB@0@l@LkJEhwfP)kUOn6*Z|nx zSi002Ocvlh#8JP?1`|u3S0o5OWE#`;<7!ZT2qSdT4Z1>df}r7#BN!|)G2|Mr_J zHhf$zX2WI@j_fDPfX9$C;+fuZIUB&X-co#&iD9RK-D94|*O(1kWyE;{T_?y%w=F;7+aASQ6z#Irq^( zE|>P(#T24BHv00M5C=+<112&lA|r^;=W*YG@AX>B;7U0WRui5t==GD-l26oVDY+}5 ztCd1B9zho`m<(HZrlSBWlPlG9#|Q`K@_1axOD1kK`UE0_DSjXwFS!FU2=-)mJ1 znN%{B&gOH}0I>xYNv%uiINW3;8oiH}ntgC87!-ro%IW(67ETH2HrMD5C-Vv0p;SnQ z7!jT_+iA8`>x^OW*e-n-3L|ITQi4}Y!;$P@y_s|TMmkI8pbFz7Yn{eS-Lzy9&* zAk*EvzP_vnS>$gnlZlT${{6o{eA*p7KCKtie)Yj^p^!)y`bWS2&p$sMG@+W~K`S4% zbM!`E281VMy~;z>28`O>rS9i*pa)r$VaBUPznTi#Inza7mZVZnR+;D30Pul2>UB76 zy13`=GKAt~yO<8Uh|iHW=^jj>P?D3A*C9K^^x!eNlvS!UDm6Gzsmf+kbP?^iqiA`m zR@2QaVN01s2?w~3cGxGn%GIjTPpMKOtV9BSkH_t@n@tGS7!PdjfnsvS=_r7N=D8*a=blY`I=9!EW6aTwJ@;t{2;b$pq10yh0vi zd(8?tvU;lHItAl(GerxQiF2@xN4kzq=?MA&VmY<))7I#q*fp8=rd zY&<~U2jD?avq<#W`e?NT-XNzSJ;I=fFGOC7WgFwwa@fqp0?r$FSGn+D=i?4fDE7wd z)6Htq%7k1uM#!o3@Z&#z`LM$myVBG5Kb|JFn2RJwt7Lee{`+sgd^`}Artg2gZAR65 zx5cREr0DSX4?k3Z2qa3LW}RZpWig(ifj)dnWpV@9DT#jony;^+^#oA7kplMG?*ZDp z+^w@gr=qz@gyG1B6d1_xcWU``B1YeNOgeS1PiIacpbvWv_RMZbRi-nl0{YUiV};TlQ*tE_00Hp>s6j^ebH3Hkj#m(6T6nk{CN z5#`6vkK&}0kA*@ZpWBW*EHcoP}|>nolR9L9g3svs!FUr^D{B+m36t*RGdy z=|m*xyLCC8PM6#5!sAw4zuRusN_0=i=k<7QZ{4>pd|@#jbQ<+Wt(?zbG@sw=rh?Pq zkQRe>y;>=kiur6J?56_V;IPj|OuyT#l!_=MV|b3!Zg)8GkR{h|)~eN7y;{nplaZju zX}8&I4x43vI6s_^hrOooi&3Xq%p^k|m+j{AO55K(prXnAay)3265)W`VK*DDjmqxy zaDUn<{AxOARWc#B?dIz8!{xP6)eh(TyS==bk2;k!u3!K3>JP6ku5M&)f4)B-LOgR35iaf`?AKrZT-+%b&!+ay2zW(Lw13xH6eJ&Kt zR~PTzU3|P`m&(Im{`Sig-^ElNcDu!F_;B&_hbv>3)xQ4iuP?_{Gv;?Y9X6BU^5f;@ zmBG|!kN^9(uVKZ>2@#U{y@0Dpi6?9n40E59`B$$}i$1g8;@}!*! z`dwC&(P+d))XbLkc7IZ4&3x4BcH4oQ8v{N@tKA~(&->M&R!Btx9^67#aUTljleQkU z%h@Cq>}CR?&1S`WKJL~mwl-)4zCAWjUC5pVrv(Z zF+1pYYWY+w6aYqCE*GK4Zktb00D!8cY&;UgT{;@EW{WAubZVti8CZ-*0UxXjDmKe> z%=KHGyKdJ%hhHzWB2==DhiUcUC*bJ@p!UWE|;s-oMRMOQE`*BT`lLc zDL0ocdDs$xspw$^F?ik%Zehd$Nf&P*DOZE znS3gd$>%j~r^}hJ zDD!M3od|m^@7@Pe9!DS=#fqqspzQ?~9qV&ke*ZR-^O(J{grbU@jl9#gOd%TZ*gn4b z7)!ZqzGy_ktBbqGM{!t;qj34=A`o-ioSuLrQ{O&6Ny7?;a^C!WVRIO+ZEnB1lMgS? zcX&oE6AQYnmzQSK#d}*IgrUw~pEYsCHjC+4$a#Hfwi$2izR+5Ecz!zV#3kFV*Sua|N_<*$D0ne3GrIJVhnwAu}D9qmUtzSjVUJvMz!V4HI6 zh!8X$_OKa*D{;Lbym6z^WHz7A0BB7ELKS(dU&qFer?cr~!VNo$OgkcO&_Dnv#|}sI zAJc2>cL!Sc&3p{_0B?O}#P)%!8pgr4OY7;7VW)F6QI{EX+wEohyD(|j+Z{ArKAS7#bD3;Pr91E*vu+(P z-mGL|iEKI%PbKt%Eb+@hvtF-PvO#wsm5M}SF}#LGZLnbKT1zvu*o0TG7m-XYTSH_^n>hO3lDPGc!_xnjT?!UEteEsUuX}vZ%+@h>V z+Wo^xoHWxRuhaPc?IoDe?DAo@$NQ%TZ9VQ5qG7+we060q8EtOgYAxSAp7-Kv(yydJ zJ}$#Yu&&+Z-tyYxr#nqraou_$pHByDCX3T`>-NZp^V7pl+%AUgX0=ofZz0X333*t!kxMtk$ST z1ew}v*eP`fKx{!+Go8$4vkB7$D``YDvanfz$tE121pxJ1haFLwEQ$Yr1IJCKKxiA= z3dR7FZ5C4kAx9jC>vh0qr|MXoO(s-e2F$S6X;rbWDt)BYn8hFyZqV(bg&H+{8}uUx z{Ax5{IKa8rYBsANGK@m3A@d7v&}S#37WltfD;Ki3gWxU+SodzP-)|Oj#Zn=c%K)O1 zLOd=`K!#YaOd^v_#*;~zC{e?6q)D>|k}O93;b<%xkL~uVBngr%ZO8ROA)k(T>@I&a z8V=LT$p9R`nbcB=c+h3MGPxs>KtL8mNf0Dal$MQDG;nLacxP}!t9%kh5d;B{5Ieb; z|JL~98-v^Lar<}?>$F{q`?JtWN4##+AAh)Zc|Fcsi9TC?e?If=blC5_dh`0q=`tB? zk|Zjsq~1TCw!K^|9I*cB)uqkw(d@)dDEq_1%Y(9H%9(U3WWD?dW8ide1rY}1>2c4` zM@`bTfaAtsvf6JkTUmQ}x>NZj*R2){*|^(cu{mx%yrAw*_h(hu&eCcV%!uKz-2!$IKm2M5G1Utk(^WNW zl|lk7uV;YUXvDIk5!35xH2whqmNtvYi15QQ3^cw;QlyYX^2;eV8qcP%pgl6W02SdK zYq=zy#qf9=bX{K70ZOx)vjdPH)V9@bfzU)9KTvvpHtcp8cG#&^>eWIzt>|L`D&l%F z==MPU<$MX|B|&Wf>q@UNXWHGtuv1DTGH6a>U73)=uef%l4h_kN{E>J(g4d7R;9yzmRM zEUY2J+i^P;4u_l{|9Ihx27Cli0;BeD-Vm_7ruRSHgnSl&h%3MBz6=AR-pD1)XZERGf^iThjke(mNnN0g#TJ|9`=)r^Lk4M^BGGD5!%O`z6 zTq8)WO5C91WC>oHP64d(h*5PdQn0})3V(XmbiiL1AqWSKn}k{X1_n|h)t-l z7!weg;cy5D?TBH>eZlxmMzD6H;ecVf%^HOmFd}wqGvkIsc7hJ*Go5N#19T+voD%sv zjD(+lw^b{XI+NIgY8HdeU^3%Cp{;76fNQ%0a0Pyyf%EgDmk1{B{c?Cypw)Y&vplGB|?afGENp z^JoHI=0`{y0jQ_Z<-5HVc@Zrl^SpZAFS>~Iy8(pmKHo2@=~TpHy)jtqR_hWM1ySDJJwIuSekGHNdW;_cMH{GUBWS0m zm(TaolIxUm`Sk6L$!@hxVZqhI{pT0Z<#f>Lz>Y<2Mw>r&Rhey+`{z&R9S_WO(fqZ1 zGMOuv{_%(O^7!?a1GbQ`FzQ2fI-PF2x+5&?@Q+N^3d}f$v!Bl9+*Skc2oqfS)0C*kI2z~*=| zVmine)oK+gNRC04w==fe0nA&tS}vAK-@F|lw3&^%;QU6dkOw=}hXnvf7>Rk5ETQR3DhC6>|APxmN!5AM?ud!$H|D$GsM1zILPD z#L`y?HzK4E@(g;L%>lLr!swVKwo){5aM0N?Y#sbQrP3ibNe=Tv>C8zZNVfG$wk4p$+9f^IIMr~o0L)$4b6x>Zwz&5Rw4rgLhME~K{A)O2gPlU4}7 z3XuWFe*huAesCtdHkTjpgs95L`{SY(^SQ0>zx%-&bQrC-lyF4paDUe3^;9J2 zv%Gy{uo{X+ z>#cHrc{wXfcw=O-V(ivpwYdTjMN&a;k0*6IWnf9lxv2Lxl&RM8lf%QOPmd=B@ovzA zYQp%H8ZBh?tD10kBo7A@&NOO`W*xuHdb#)yzfWmT2Yxl_*6JN_3);Vh%vLLcmNZEw z3P1>eJaR~*i}_^Cs@mZImIGh&D>@h5eN$#&biEjXC^@uSt5L5M^E6j%uE=i|Y@cC9eW0_1l$xXFAftxV2`%Ui`*mcA zbUK})>_Krt7UunCvq?})#?$a$kZo#pAZ6KaRMD-un8zK71%0~7ppU#_8VG8su-jtw z1-(95*HmhS^{`n;#lvo!!Q>5i+;p8xnILaRtwJK~b(lUHJbtHLC2uG2o2|l+yZI={ z=fjWhJwA(-mt=m6T%w$`c`pla8ZLgkaNZhC;Co>UPj+~`+cNn`z-|5b<6DcvXe4$; z^MJ|DB3DVpgYKKRe=>lvAi|I>8QZ9BxOyR*jJS>0Mx)WXS#L2{^>nva)}v;rh+O2d zSt(5*IZN8%eBKLlwnc|)iGauJ4MkZjpLBPBe^NG6wu9BG*U-(`LgBKs6hsZ&1jQMW zhl8Q6HR{#UZ@!OA@173Zjj-sGuj_WYJqi_7I=)gA>=t=P3ORororc98C6X; z`?J|XkC@|;tTO{y^!-j+&*;k>yxMT6eslWd>g8_^i!i|s`uHlu_L~Z?A?Pd&Br_Tf zy1IRnfm8C2ph{pA?s5RY=~9aaU`lfk z02V={9Gwi6i+iF`I%@>77HqFS8jre-YNe3ZpR7@Cz#YSOdoV)KD8a)i`tgT;_9Lu@ z&3cC!w9(ATsD7Co6ZmX3Y*gx;wUmwo!r>t86JCLb`;)hm zcDa~O1#g}HpqFATB~@LYN6lOkIm6-f`aFmdz$Xt<#9Ga|xkS`&Gn$=V6hOvEyaK$U zvh0yU8sC4gxSRkqoxR|9_jJGM7LyUr&D*y|yBYaLrU{FZ_H@7Q7E?$K7w;}j*K0f( z!YwJMhX|j7vrd-J7vgFh>%8+F2 zF+0$le)hYdFoAHn*W;y3J`R9`s*X>4veY{YwkV)U*OZANp5(xZ<@SGf;!`??gX8B& zH^C>Qd30zCnjGo{mY%#P^G-k!mY`R?z;yRIkJ0xPf+7cgWr+NmsxFY5Gd;TbTUS? z2PlZ7lcKonmy4BJDHV-`WU^|=obVdr2EeLT0LGX<5Tv2;1Ui*LrdagL2ozzL!yA$a zI&@tIQss5On2beSh8q`x33f-M$4koozz;Bf(D~uQ6~Qv>BA3(2na5*CtkkV-Ups-Q$;Eo{w9$ zSxN-`4x`y}Szhw1t#&#;JU#4%^`zIT<`W*X+4AdGiSc#|Yw$o0Zw7&?*Q+VF?N&eE z)%IBT1MNEWb1|DQSE~h`!=srF#K`*J72xH@)A?dbxKzJkkq*Sx%jI%Dravltqdg#w zywr9+hQ%YdHsS!CgPw#Tl)`%Utw1Lx1VnlYunVM5DX(xKr%|7BD5*1{X9I6ZXLr59 zaM-8AHhKzRCog9li$FaFL_2kAfW5A^z}pl-0~FWo^&!H@D?1$ypj}wP(G0e?jpU9r z0lZNcKhvIrkGC( zysVKcBW~v>?M54hJDW^p5|kcEwdvdv4A+1{=VPHrEJ{30nks3UD6Bh(&9Ls_R4gD< z-USu_A5oaKij*|m?qI-2)C!bHG%I1+hF1)EjMwgXD zPzw!S=0SAfKLJo_3o- zosMP92II}u^t2aw^>lvu^XGecJwjI&g2pSW{l-{jSCVo(o*s_kYQnUDx0J_hvDp9l zO?vxuKArE5$`;zlv|tsZUbi=?GlQ-xBAu!MZS&=NyIs%p1W9m^ge?klz;L->mc)k_lJ&>sC=M2(zt)I@(S?+SP22cTp!vPDnSyAesKT4snglzA0mnic{ zDYJ=w$e|zqjz$DRh5iaav`X4cVhiWTs**&fYOs|YU4t~km?4e#Fi|=Y7LZFA-6Hn& z6XaTxh)hLc1;5Mm`@Kd3mbOwX*Y!Urfb}*rrVEGBDiz`R3i)C~Qt9Xyayst9{+5vs zvWa*)l`iS$;LyPJw9_c(GpSgDj^d-S3>_4qZ_#DF1_&nP4TL=IP$-hrkExF*WjpQG za#8=S)!}vCh9c1fzg2d!yaTIus+q9IZZJBmHjg(DqqEnYc2xLfuY&Muzq+v-3~rwv zfmb`6V7pX-sY0|I*H`}s00960G@0j;8_BkvUqe5nh^rTniBRab&YU6HO|}Kl4&K{> z_b7PpfdUEz@4aud<6MOvPAf6@AV^M3CaNkc_qW$t+0DPZeUZr2?crcJos0*Ac80d8 z6=L2Ek9Yqpkt)00UUxL^_qxqo*lpBG`TQq7Um_JNd!1g7Otjd1f_6|^(Tng|D3i-n zqrqr6=yzN7N-h}*xa|g&T&7m4RO-fTHtIGT^=dJfh=u$fhux?$P-dgy(#bSioqD;L z&n4sWSSa9gJ6tY@!~S3Ym!`~BvgvF(5sSs6kr3^7d)!XDrPJbS6@0&t&14J3O1(W; zuI8f_TkUt7Y^74n<#16pTdXjR{&+lS)+*gji>;Ik*&MD&r}M>PrP0NgnPRKiV2ZhP zGLuQCPhTq>DL#^RAMo}Wl&3dK@B(d~BFLM9Q#LTR5b;12|Y z(G=F0>~z}od@>RW`8*z{!|8B%ydhkbOf*{@HY4b9+bFBaXrW9to5LT=Bof-ZF`3HR(L?os$8lq&RQo6|lS z4tv!MZ8ymTyxS}Ov*1Z2)tW4J^K3Ni*K#4JNiN`BUEV+bYl0dM+iW=#@w-fl=R5w3 z@bOWi)S1i{YTR$J<#d$x+4V}1P%f9qlxn?+GMoAxu3pN-LjkYdqE~5k27^IwGMg!5 zyU8+zbSxYUcwAPa$!xb<%vPI~GB%lNDUW(bBbaj9ov63d<+M?TVzHP{r{Vx45()-< zej2;%cG*n&ayFMqCK6Hb5em_$h7X8XEk?aNl}RPyu`sZqLxBJt^t&AvlgXg_ht5w& z5=nBSAa3LHc~KgZUZ?%H|NZDn$Afez9P+xHZc;`YrPHbu`D`Ww)N=7yx=^V%JKg@U z-)1X?G~POv&8H%vXd;~}ma6q;x5F{TbhMI*MdDGgOh@8?BU`98xLP?I57zTh+&;yT;0(v((J<|1(mtC}DZKsj zjxq@Za*f{VJ8yxL%X&>}+0(CoT&lIaTai*rIlKY%sI8m#p@W~V|Gbn)udklPDx=-w zLxjtPsYjJ*oE%$k=cnT|4=Y)+@$j`p`0^O+tSd2lh2W%>( zT>hW`+e;)J_E;&ag)(Z@8kJI|#*JjsOezJTibcZlY^hMHvW-T&RVzbXa_Lkm6$|=2 zff(Qha}|~?7c%i+25STqE}JWyz}v^u`D(QQe*9^?RnYG=>&+;djbg7(A$7pXh z7Vx@ldZkq5@K6S`GZ4?_)A5kknTz@yP?+Z@iNPe5Xv|JJk;bceoY|1eVo*K{UZi@R zP^hJB?nojULi?nB7MPo1RJl^tE274f$hz0{*N7ienbi!ZXc{15EPasxX{h=@& z@Vl&~pv$6{+*}HzA|C(YNp5oa{C>aBX|5%GHaz1&EV{b5dlV@Rc8?!LahRc1PN>+k z@bTv_o>*tJINV;Z$7wT_lHq{YqI~8*2qhAg6{L7QE~mq6C?+D|kjJ19DQph2#qIU{ zYoY|;!T~#kI6%AIJ`jZ3KxIsL|8N+B5rmSUJ!!Ao<8|9nvRpD6i$#L)0klzofJN>E z6!C~Slq3e7k4MN=K9}8Mvsp}#B%la{;)w*jE9kacQDl=zUn;;WFa%2>3gj^xDIlRy zt5ZObd^d^(fI=(5M5|RR6%jxcCHm$En|6q#L8npz7KJklIS!tmX|-4^CY?s3!v%8b z4?P|7L)Y9kqh5#)5v-BNz<0 z%^JNg=(O1#bgEd)B*Fp6676-_4055y@OU1!#IqpYkWlsXB-SjNhne3r7 zfD3w^#jx87818PQR@ME3TxX?|DXh`sOuH$APImXtA4*De^Q2T!bnLu8j#9v4(1@@8 z_$g8Fe%?#fMyD4lfem8AHptc8#hqBhySWvJ^)4C$0Zn1!Ub|KEbo(TGzQ4QUiL?%g z25D6$N&DQC7*z3oTs=s2W|!9uIWe26sR->e%LVrj54>j;<#7AxAn>so;RYd}O(%X7 z8_a}5zlZQcNJJ}#ymph`7Kx)UG;R!E!xaVO1)vy&pwKiO2n5gsgg7djiWA_1VZ2rV zDZ@)Zw7@wNKqQfjh9hxo9pumFazn4oCc_!EB%~>xOhm(w8!$mpCcP$`IlE>AV_+M- z2MfeUtt8QgNFv(D>-V`KWCopDrBcekA;$4#pBt20DZLIPs?|!FH4afCbh@2Z6YvCB zfJ-3}U+R4D9ghb+1-p=|6yQpw25|rBe+Ve-nNhD+0yHJql*(jssrV%oOC{s9!yQe= zqsc5nSA!%m2v$5CPeeQ>s8!JC569C5rgk0=K-Pn9tJdJfhCma-=`vHrM8qF(IxRZ2 zOzrg9EmnuypD0wyc>mZ}U^Pc)MUa1q+=H0fo$+xr*F{K6Bf^)@<@ zNfW{HVGpD?msdQs?(tr#Qkw#a3@#v1gwji{eqLWa$sX@tq)J;PN%BL;?{rf}#odiS zz!TivK8a-pPY6v-c0b^-86Iz+g@T)l@3%sY)g3^EA;gxb-(wc@A0O{;ZulY%WDF59 z3fZ+Jq5-Q){PHB0%9RGI+e?Q-;Yh$?wV>M^ltHbwxvUn*Asq}7Z^N#}NG667dHw!i zB>hAXDA9#37mmQ1mTf@g55^J!;wUc2wZ@)0A#{pHABB*$V%ZvJWO&F zz77onh!hM5_81}h7m55$g#9c+B$E?8MCih|oi>{l2@aLkW01fW2zcRxkS4ng>SWX^ z73k_S&hTWbjSPZMBS2Kd5~O(%+e~_ciNd}0P$(VvvH0C&5eB_R1vAwV-_&SSa*5>s zyy%S@wcenViX{q_8rW*i#wq%@|9&Ag+YBC+Qi(_`lU=*<(uOa^7@8##>Aw_4$67HJRpUwL6|p`}G3j z9j=;BhQE%BL8m)j9pB#Gj@#8@Htsc%j3fTH(`LYR=DXMT&$q({1*V7SCm`#T5T0RleGI+TwyOTvEQ!dlO9`423;_t6PCW-?heP}9utdkyIxG;Kw!|lZkM=XyWQ`w zP0Piog-3_cO{ycFxLmI{n+^W1=0mQW!xfZ9cG#@ftJNCA2doNjSItKK4wFi$IJ=JM;bP+xv;&GadKARWj`PIIJe!?raYlwi^_E)Nj>+ zgWLRZTusN|?Q}XGNDGWRwNgIju~8q#^?bJ4zn;jGSIcRiE2U!rhuQdvqA%9_feY5Nev8Q>bC@&=@yp`_FeINjI)kfb!%kQm zzWylS&j1{b;?qf&E$4uhO!$ORKA$(80IdFa(r0stpwl3KhAZ6O-QC~y``u2f)$Onu z;$bq3|N3=xg}>cyr%iq;k_{p$%U%RL*u~}Lj~|y!4pgyBITdnS)WQe;-Sv-e7Z=~Z z{QzzCdaYVW_>EGL@ZtXE`o|yN{`|)u-?!UYmu1-IV7A_$H-0&rjC##l<@CN8)GKUf zyd*6Rby!YD1Vrf7rdO>rhv4%S6(Mpm#H;2L?}tgN#!WWI_m8*Z4$?3pKhi0s17F8U zyERxJPVeupyA|#~?2w!ocK<%jhoc3d1noR0`_pF2>7ax9dR>fX8({THG-f>Lby4() z-=+tzOCoRYuh87pbkyT2g-pavX+Dk{=q&^nKircDJeY|cqJF-r6!G1An zgSVgu#ge}tLCFr+K*_c%kPAp$mh;4JyCV}s`WBN8lZz3L*UC@(vxwnyZodwCgLas- zN;xjr0wF*Leo*&PE`hVDN-8;E0K&c5L&nf$wOk@XPCcR*EFL;GTW-+=6QXZn@TQVH z3)ZUzuv(EDjap1G3DR{6iSUUJ-@(KhFFk0MP+zlFDHT0GKJdZY9Fj<$TS-H3RZ`&# z$a)~aO`(avwv>rD^>X1OR7@bazZ;K7AhF*fs%q0ppZVbJ=8kuF3nA;YnvF_|cAC}V zC*IA~ub&qem%pyN-8NURmeRD{td%?o?ysR?-~asQkE>RLZPd%TxZhy}x4he57e6k3 zeEa9OU(E(vN9GSh&LvO$`l8AR|)|t}B>$1}zhPpr35ORXL*DLuX1g_m2 zEYJQ3;ad<+m`W){pLVluZ@!1V5uqfcx7i8|&-1pQ_aUICS8^MS_d6UMIP7aE$R>b5{UF!X?T5eu(qup6#NNePhArGZJ?bhqvfh=@G2<@^sInpjlC4<1N z|L!HCCZkR*9}ke~N>9KCy+=L=_%V@0zul-)$&bK_Y|)vk>7Wg(_1g@{GT4N_Wek6a zKQj3^ngbc$Bnv7~Xgo(Te6rR0T>xR{Q|v&C{T z>9^~7+D_IZdcycU1a2^%&(Ylg-Jz2{5j%zQ-4Wv)j3*sL1>9c#%)7q6xxTr*xq-rU z+Qh9w=wbQG6YmlNclqn;nrpQ?%~}zloAuHM-u*A|My&G}ODwgLOZcsNwd8@vyZiOy zJ3g0Jo5OD0tQ7L)Mh6k=Z%=@?4LZlS*VUj_Dpt7;)DPigy~GP+H-CS@;fFC|oT*Pd^0-?dxJ-ME8agcW`A$3)_XpAIIiky?->MZeF&~+j z&(0wcS!Onc2{)L0Ea3clf5p<_saVk(@S=*5xB@F>GD&LQoK*fPBNn~T_dM@Iz7}Rf=SVDhbg(T^YdaZgP>aplm&|$1{ zPRx^hVB6Ika-~*E_GdwSaK1o?gWe{Q6-q1JkcONR_uL|6Oviugt6m`@z!AwJuDZl_ z!{$8}om>P&F)2%5b@cK@)vRhyMU#(5aBqk!NMMJ zOvh^Yw^tCq9~W#L3RkZq2nFqWlI`wqe&T|Qi~aF*T(&E@LaEZ|P8Ou^&@gbf1N>|~ zWJ|^J-}1LYO(v7cxcm0`{0M2U^M8%9PqYr`s)i5GensM>3CECkEmqh zLFaEoOOzC;8kt}`#!}n0TrB7@e|?-_{L=;TFyze{DPtDL3FA9S3e(A)q$v{MCzwFb zTXf_+G8<2Do5^T|naQAyg1L-J5`Cwm(PS_f^aoSI1%x!}G^(N8@W=@={d6>55=m|% zGkDBOa_B%;;7;SwY`vKeyEr!Z?K ztK}kYBSh|jjE@H0Zhtget>-Y}s0(rb5ekRx!S_48FFYZRxc=H&<@-#@I*F7=tfR^1A6)a@l;ofGjsa zSD=jD&hNjzKHlEetx`6ZFENca8SQmj9QXF|`SJ0-Z5LCie7WB24*K18y9N9|-akJ- zj+0t0oh`G?PM_2qZBeWI_4WDrz8kWYQibdFdjnutuQAn9_W%9 zq*^HzGO^!({l+O^*eF-(ZNeIoY&o0BCc?PW8xE=*Q*V;{w7FV2pUb5p^e67LTaH>R z*Mc#$xO%0S%VrWG@5dWC!Hhdxvq`qIUaeG0*<_4%e*SBM<63wvmTX);74_TE9tR-M zK~KX-*hUlU%O?U3>O{`DBv^1{tcG_14rqD9ITNGlNVcxm8dw1?Nu%etXF>0CEV)1S zs@v-}86`tfg}M-l4`JD82TEgX+8 zuE4ejNEwhzqeO6X)xZa50H#tb)LMgnJsZOP1y>gr=fQFnSLCa8j?D+{CbjVX>hglA zR?5XvsaVJrYsiqumP(=E{_5iUC!yzUKd9$ZU@l*6bnx;7mEWK5L^YVJKHe*X3QZ8c!BnOrWLEui$|_q}D*{P(~Abz1f-V7E{x6l+|QMOG{P{{8j) z>tjFfl+x*J9?A%N$2v=S(DU&DyKNRT**qBH@V2!|A(w{2y}!S0C(SaHw?^_n9lDoF z#_?>@2SXTjsoKEVn`0~4L?jdhR|tp;2n8k>JfT|1Bw`WTOU8i-8o7ji!@UaRm%5lZ z;e#v4k9ZiS#xkW$DxD+07Z`r? zQ6`=&RO`xl}0Rvzcrv7SH7JxpX{WQ!mYN%cWvIm&>M;$yi`Jk}j9x zewR@(&t;d33uyBiA18wOtD;RG^&MMo{WG0_VuKdiN|8mcsgG!SIYTxDvj|UKYx5VZ01w3 zSUi<26pO`NHj_^O`1#L2|Nef`t7H@LB*sgnQZbiKBoaUW`T6t5*TYUR5lLio`BJ4^ z%q63tVDR5RzkT`g@vu`$#!`iRp;RtpQ_Lu70~&$!AijL_FJUw|A=fsK>ZVuI^5wTFfS*sZyiA->Q|;A=k!k zuh-k{w(6A<3Ylu7+pFbM0f%m-)5bqL4SZiVohi3Ft!6d5ZPP4E>$Q5lQLg|Myi%dw zs1))Ew_dpOBbSx4M{P_Ok`{xh)?P{go+QAKE)#Jd&^Uptc#D~2d6q>C@y;cIM zk$`X0_T%fPFDSGdwR!`XR|=UVc=Ng}pRws5j`~>m1}a$m6amiTFn#{?37fv(Y2s?& z3B_D09`w2Gx=$ZJo*WEA5)Oa8h50J^xYwj!-rw8X-`gc$Tx;&M+B;3a z6LuTc;&xwwOkBDTFrW`TB+9R zt#-4TPX-+N4W*RdYBd_9fL*ANqo0j>jq9t6bNqS@e_Ji#c$dncA{X|UH7im9n+5g3 z3CrcMfjBmapv$aPEC{&_DiIm%dme>cDiPQ;X%&k?4u?s>(MqLK=?rSgNXTQ=sbnG! zgUO_Tr#J*6ks-_NbKuM7c@QNQJr)i}<4LGUA{_KNO&f~EIWAwoVbX(vAWE?~Bqrvw z>DS~7;yFHt%V7ipfnX?-fK~;3POE->bxADb^LQNAKi@u`9Pamfdk1^nMin0fHH9*m z_20gHJi!6Q3GLumRRKv9TW;5@zkWsm!@Uj`rwXdbjytg*WM_ZfvD@!8E7-m*mknRJ zgmD!5yWLKw+ig}0>9E&s&?=XuAC3GwHM%PExG~PO`DE*M@x(K`v-i8odl?%B4!F zlnHySI_!pkL#NZIR0?z+_!M%PnBQq!UtXB!|0+;3*?hj3&m<#(O^Ze$lR`(B4C>oA z)KoT~D`XRqZ7iy4Wl1tG;IJ69nHdIDIFrxCBU^5pUbVa^nHO?7Oa`4sga4#5>1fEm zY13;IU_>b3lL{jmizSi?a?>NP5bd}%=<67qOl&gYNB5B9KI9UMfW z7aqGwuU5#QFxcEaS^W+vM7CU3y=rwyf;$e0A9TA=_-Zj7#toWPEG6#1u4ATMQYa*G zrq)+w(mDPyqzC(caQMClugHbn)(xdhiuXDomeb!qJUZw$>y=#4Y0xNT5`4f2T~;!a&wb$Y!${ zpsLs3-`{Oju!mquHZK(Nxf~W9(gUd4jY>WdaA@RGF&}4{jlJ4w?X-7$O;}gZsg;X_ zEG8W~*xl_wbhhAR3nCtaLZQ)V3?`#mZ#M8c0grV9<8T@Zl}?$ZvY5qkwU`RJ z?G}TId>5NOJ3BiwLt`+AaU~<$n`Vttz98bV=wzHiV=_y4{g8hP*0j8|fG=j!D6_LP z7K>FVWa9y^%WlL;1tNUd7L`iJ8)wtl@-4UBs99UVV$AUYB7@0db5ik0!0&ZC%w)$2 zJy<3-2Ya4DG;=#_HmljVp~4Q$3wc~FkI!YN5)uEV(_u3k^c(6m+#=%h@DHCCB~P|l zOlFgD;}>uOTyyinXehAlb=oXOlToKuu7K+KIe`Ex918e-ZigMuAWvVEis$D5rpvOuo@sTbNrK|_j^QnpjSJHIT0_$R~F{D z92n7FuiJz4?bIuURKyL{lg#5G{cevu1jV_ldtJ!I?g11QK9$1_TJkZ3 zDM^TjI2J6(1(iZ&FiX`&t6qeg0Tc52M3QDHbOs#-d>39*1rYfh28}`m zKMXdzSS_a_K_X%+i_&=>WN+r}3=NnRN(I=~mSY1424?_YF!PQ=r!zVE94yA`B+>(R z0UVt|p|jX*em)(Kf*%V!Lnf7y)5l~oIiL)=N5{HvbMuJ`!3MQjg zAzKj7i?Akqh*>Hg_PLxcn^CXRuK%Y3uy|Y~Akbq6p}O@oC1DiwKo_~O0A$Z@wU~@X z1J+z3m5RtX5DjkmHeF!XGI+)UNF)^=Z(wS0wJuo5rz3tB@PUlY@eT%B1r*!$647^) zc5N9B!ex;H=ouIh_7-XdQ5Ip%-X9zg<0QP5GhxI{tR*~+$vEiuK-3#$ukxs0ko z0Zh|oXQ+5D4mXvI_b~v2d4&##bP9)+a9;mqSLIc zLixm?iVsBCOct_{*G;g}s0N}mCqRJ|13s_E<%Ga(tgk7SKnc_ew{UrWkH=-RSc$%o z!Xh>trV2{^;LQoGv=HUPJB!6)(Ew4O4+T3Ig^0)&BoY{^fX@>OdBk{Vtd{9yQNrW0;_bR1Hz` zyDb~=bR1F^9pgY3`qo6q_70BwK$WP2aXh76%O`_wvswXJ;z3U+D8PZy#*vwvMgoL* zp2wh5FbWW%h*c7z5K@U!vfw-YgI~gj_!jY6G^>ze{y>8Ixv~2QZOus z$>@^~0M?%lVt=tCup;n7XR@H)yKT}MI(14p;ejv*fn&i>+lco;*T#xe1hBYZh((>H zGTJcaOauo&A%$-;S!l*E7n8$7=ah^3u%gQn*cM!w1`biXG3K@`F36Q!gPBV@Ay zA`&z zYSW2bSY4Kp2+CrxV5gXh725W>af@29vLpouTqX<32iSRmEzjnEZo$zfnoro}@Pq^_ z2P}>dx(t3GR&zxAgnkcH%wmBzuPaCf5P@7U%Hs}hAiU`is}`4*;PnEb2+$uNfB5*} zXsuD!h$UjKeDAY z0qu1_F8M_y7j>I7q{+gLG0^F@$&V2Aa-on8xu6kJ(ps|U{HQ@bW!-9by z_WJ$zM_{zmET%%(7^ouj7{vAV_K!~vdfj#%GUw2($rlKsP`_4p|L{Hfo^m$24Ot|n zhYd!d(donHtH>k)mr*Ups-tnB(W$ew)=sBgD`sQpQP)T>N`eFx4M?rkZX=#1FuzhZ z&m)`1WziUHR=w3G@f7{aD%6qw(TT*QZZVB;i!8t6>nx+k1zvF;+aK^bEoO^_BhzENkPF+FXYT#QH+r^w9vHvP#+uh`rE=MXPsjd!;<3!? z9JDnSt4*kMM$-90+`0Vb<}_Dlx0#Jbquyw?$n?Ghdi}7T|MEFkWwhDJ{AOJ9rU>wl zZy96)zFcRqA;=NNjtMf7Z0gmMVfS)4alfg ztyDi1J3aYUWihH(6&l@!26<+6WmzthO-x>% z8lAjH6U~d}7gumWAr?qqHav0V#?^`OYY%65LY_d3CK7#q8E_Z31Q z2MLM?L>U~$$mrPkGjHEf-klm69vL1Po0^&!zkK)ko0)fSU;X`p zTxWkfH##~xGK|vr_>D)eUj6<2*^?)aA3r;N=Irpu=y?>!#-}b^y7}Pmmyf3JK79P- z^qJqzp@QrDpmO8Sd((GrPd|Ke8kMtW&z&RHvGMWoiHlc%zjf=*{U@hRogN~kvx6CN zOuQG;7ndc{ls^U#HKWpBOto zJ~=UY>DJ>{Z{NIm_2SvH=PzEKIx{?S4){z=ogck;^ZxUfFP}eo{OHl+7iYi~@ED)K zHFfFwt@}@&J$ZQl!Q*FV0K!=U9LNE2mu~{N>FIlqo(&D1J~af|2vqoYZ1U2z8-LuH ze(=}O5WpfxjS$*K30Ie|-}>|JL*PbWB$%Q$Ao#+So42MP{_E5bfEyY>Iv|)l>C&}Z z_nBPb;<~T2Q_JUyrCdBnem$|8OlAw6FJ3ms>g`H4lM1>VE;qc|VYS*URN;|I&L;4N1N~KmQhR&~23rg6> z%9?6TsaTOOEl4F&@zmuD6BC#3ykYYN^9ut6iM|PVd~El{OH-5A9?!72Jb?%TM@$$^ z0u<@&If%%W>1S{0qzmOR(T~nj-VBdUPEDL29UGgx_VCp#WtKvjee>$oyLT^76B0&2 z>G_Fk(@$Q$dJW*7KL>L|19(P;&!aSX^U<>xFP=WUcmLjlXJ^hp<1o{JstZ?cJ$U@+ z-rc+R9z7WXif4yM2hulz%I|k>-vT|4UYr`p7*VPb!s*!5<*V0j-no1KDGF!K{8GOW zGUNEvMF4mA?gKD&noLI~92v|vF?IRIoqLZ?6W(wSk+}b;;@HH+>(fsd0+Cqh$u^tC zY#yn4%j>~j!NAPCd5KIHs_oRW$wbg;w!489`RUKX7D|+ke6N)a*tN?G3X8{!UK$Q& zo)xT`{FzE2VqKhl^q6n-`L{Mn2V>I!bhayjvh}eLYvGR#_o)rpZfjD44W^Uo1Yhp_=6D67#W+Knmj)` ze&zPl83y~;FE~^Rg*rQg{T`jVI5{?P_3rao8kI8p?(N$*uV4Lr_T1?BIJSChY~sr8 zzh1wErM`Ue{OMERbB<^W#05rt{r>Y;FP{GO=;4EhfBn}v2NYbo`up_5M-T21g(C%0 z!5xHxt2gibdFR%hyAPk88rUW&jf{-oK^LxEyMFWb^!>m7b^5=+5wnH*OW80)jarN)pLA78F%QD6(S0EQs1|chAi3 z-n-}APkEoWuxD?b?wNCVRZICSl`9#{&H#S>{g1bYo9pvhsaQq} zIf@_+7H_KZ@bUh1U5YuZ?o74Os1}PwI%{-9vRBWo$2t};Dpls(d81yTbGbZy?8EA< zudg?>XJck^GgdvTl?%CSmZIzdy#Dz9(#V(>q_ehMt(?uED~+FE^@rE@$4YQZwPuTw zbRm;Y!=F^zldRpgo-YWW+2o1i6ive}B#}-Nj_hsw`Tnw2Ad=B=f?!_8Q^{0jGu8f| zpZCqX3p$fd#$w4d`d>5_$Ho*VSM8hAN{J?t2@FdlQ^`m$5{-s={E>|~O~j({Xef$d zu}C-+4EX(CuaMvWUp&1h=&;({p`h0v2>85ixLh3Ju!JX-Z|vl_f)CinZPCodb)_X0@1%2S(%G0FMuMhs~8tFY4C!;FSZz-tNxc?iPzR$ma2d ze7nQ z*WcF%Z(?&{Q6L$alJ8rNt-;#c&$p*mr+s&ERzIy4b7Uq%87vNWs`>r<^VQ{5qg*JK ztCb>9lFJ*co+$nF(YZOz#=QMViiMjm~JU@$m9ki`w^>S3K25u|U%$xa|H+ zb;dP(S>+|r~0|QdsvB&H6`Vg9-fY;@8I9)C-Um_I^&9CeonaozF$KyJ&SA%7*H(0Zn^v>j2lN029KL`r9Ga4A zw7{EEwWQX4>G{$>2n+x_LXmi6O18MTFfUuw=ozdASR77wMLIGuIXN{eS1o@*NM_i9BtzxdTM=#`;Q;5%?c6m$Ma=aDHK5B4s1cM4ZZ(d%m3toj#6{Jga9uUnJ z=wiW_EH+yYSF~$+)fvTdl`@@2SC;f-8c$EnN-7)(Mv`QK&I51+0jjuzKmB|Mm9A$~ zaf~GK6pkn3pmQ0C!hieq>FWBbUI3JF3{(yjE*1%J`$e0?b@PK9AGka5?zmApu(?+q40dKEKcFaUNSu0GtK%MJSaBN3~|> ziS-0HG#?%q_74sWY&Hv^5(nmBa})7NDhV+Tl>4aJDY23 ztE(Vry+8=i#uErdL$m6Y^)=v4teIUlBxAQU9lPjMS>Mr8X6g!m|ak+;T>oJfa}5| z5D$$2iHl1Nh>XB7ETa8{L*w%*UC$RJaJ^mN5Ww(h0_lW8XRw@jqV@Mb-=AAAFZY*? z^G2%c%=t_wX}SVlTgU?rhmJ_` z>Y@Emi&}P;wEokxGTe2F$`y`7nd(jF+ik`y8&}&hwMw1>xdI`xxUt&9Yx_L0CK}m| z({qi+NYn}@FsHw5=&EH=R`J;%wN8}US^!eBX1&;FBh{EnMtL| zypw1=b)GIOWI7p*WvDEPa3kRF3f}qW*ZbR>tJ6X{nNEXjVM#1QrV|2L;J$NreO@UR z;d|mqES(JdL$P>-(Plg)wHrx9?$U?}7h@CSNDdPguE@dx9HC}8OKdfYCj zlPeGl`Qqs{o6l`O@%p`Phuvxcjk696@WdiMe_VZFKQ>$KcB|jKAu zivf-&kRnG_ENXgysy?J}jHiN{0*X`fi(TLtd_NZeVZqS&tU}xKE5QAF3mbjG5!tHY z$YKlCIv?*Z?atfF{q;EtSQJ4~1``0+1R;BVez>kzDqY|}GWN}$MCtMS*Qe`hCLF?Y zr78k0OJ)JM?B&aQ>xzyXt>{nk=Vw(qOJuSIlP6UM!Mde`+w)Uv;ZnT}Dh5DgtzNv* z>a?1LlLg7VIaQ>=1;O%g0)V@Ce0iuw4RVD!Q!3@saV(X>aLS)7oZYpaPNSy116M4Q zFJy3nNW+3V*F>41o(_2ZF`UZ7Lqp(LGEL~x&)?tgF0Pw(GMP-J@HFg`h$WJkc+qw7 z_4)kz_Pm@;V^|8quw*=eC8GR6@mB8k5~&*)KYSl78V-gc(XfEi^Edu#AQ=e+qKQZ- zjy%}oc6)sg(}cWX<+jD;0sK6HP|yb&XSLaT2a&)D$FxUwi|N?qb~)^pBje$bagc`+ zmqa`!)9spVR;$%)+~3>Z-`nczXY+Uvy#@T?#qGmG!~X8p#>VFM<_Zf%D+D%QAf3~0 zK(t%cEidbrmj^g(6p{vcVj)j7uF$Qm>NF~)QmO9!<#M1pBJt?#qDm>3$>fV_|j~U!0wxZU9l|$nJ7uSMML4r>FY{oiEnT z>Hr*pXLc>_5Z(Im?Y@%30^TrLy}CRtLy*cDkAvB(&Rgq(a2q%D=4=DlEujTlAYHwE zeZ9##H|D2S0>#rx0W^gmC>wNu$JbVauqwqPMxs(A(}*9Oa3p}x_x4$Ab5UyyXXzZC zN~1WH@ulkbt>&)zH6LTbD2~O5?nMA@_7Q$ScJ`)+)q}kB>ZGN8jZ)I zk)Yq_hf5-1{f(t{hrLdh*B5{u;rD^S!3F6=IyAksv1>RyJUVuO%Q{bhqGRg-TPWo7 zgrhS3&hDjfr!TjHy)o|0tmHBDy2&M1u*D_F=!g1 z;aQbNvnXFwDz&{RsG%jsZBfXF(g4j;%di8I#9}e3#1jsUO-uoaOFh4I>{G8G|Bp^g z&n+l>KV7q*ac`!fz?%R#Kz9HnmPvOEqo}}2M<(U_X1hJu`2AlWFHg^{*24wzM+!s+ zH`qPCbo2X1`|%N+_N-b)@IbmFO?HQudieSM>7tVMyP-ltMa_fVkw!40vPT*-W>x&ofU!Q78=i#n3fE7=xVCGpoMNqEv`Ag@fn#E$V zNF-fCPXI+=Nt^)S{&>H=IIn^)V;KSjE}4i$pf(5>oTraB=NIQCGMRu2UPeL|iLm;{ zc4Eacg-Qk#-8hgK3$gVF%Jfow^Jhs2^0*~*>?n6kUQ;Hlk~ z+CRYDogw*-aev2ne1bgH2$gh~sd{3GKsv8k+X7CHz*C`1Y;E+j1p+P`8h~hQVR>U4 zg}9CN_4U=&UXVBz4`_o7H@&n9F9BFujaJwHrH_T!0Sn}U!YzZ+5G;;x0k1f=2;zqm?bkfP8jUI2zC4I{rTp+l#ZqHfDZ+UiOL_jW4Wu>ug}d& z)U>f_r$8zp!GT=b18ESlmnQAoTwFSc6)QAEEJ)Y=rH*=8_T$fi?7p33BCPrP^wErU4LXpJEvU#b)VPvE!UrY@hJp*V-E z7H^y^luAYDI6zEh3xE3a=L57JC=D?jg))-Fq6s`HRJzaK9xg7Qk2WSCrfHMuH0s1QvKd%F7 zs@Y;qO8tAFI9*`@9HBSJPj>wkvkl_$;YK8+w$C%PE zt5mBN=H?aZ6$UsKnp7Z56%S8LPftzGEf{5dlD}- z+wCTPD4*N#K*Y~rXaODrA6B|)Kb%pnU4tuvQTZGJ)(PL2@)vJkI**qX3UXMIqze?9 zuiykluErmKg2G+hUR8($)YEhtBrX9#j=$i)ZrwqKfR+RX4~7ldE(Yqy9h7ciG=*V! z7WT(bX9xv+9%c^LBhWg)W?`EYN^sB_z(7yn-%`jG&TZKPA)nhH@&i~<8mt!6AX^|E z5(>sO2CLO_>~tKP4~@t_cQ`!O05VnSly={0If5>M;M&<4{bI}pw{{R)_QKY@2@W}>SfRdfML&U zcO@>r|Ni>)aC4fcN~fn)q-A*8;D{2X$KQXnuF46g-A`56 z()&w|MzuiY0AGtAKYe(E(&^Do$P8GeQeft?1bOVo%HXv(nZp^0+D(=6IEE9b9l8^A z6C5({UYDs)GNmGw#vsFi%K78;P5ZHt51S3vU?L4TXF!8eWZp$wwAy!)pWh#vch?PQuo*OlL#~>H(jfPoKQ&JwEr51sL9rm&fqzD0++Oi!vRWci zX#${4A>tyT5ac)kQn*!zFBlF70-$`XibQK9;gwQoMF}DCUqdPD8WsXc7gVG>d>`r%4 zwMDZOP)s2j>&?hDzvjLJzxHFOAD!12%*R$wq5botegD{M-8Rn7Dxg2PLSf(R@+B`n z{&>H;YF?dHi@;T}P@vI*FPXpp`J;VV&Bq*$Na6gVR-_Br!hs{2zqo&VI46DPb)6Bb zpVv!;0u)$_J6U^r>)e)O2XkY3f1y^P(YTh%odof-=Z~)d){;QHh1V(+^h+v3<*nfY zDBMjhustu^4ObeqY=(p;L*+uL+T+{HZ837Vei%#=*? z2U%nLsWKQX1;Pg%71S_><{|-!nEge#;*Ev8fp8Rl5DG@n=LO=#QZbJ$QEVR^nCvc> z$LsTXoF~WNqHK;xDi(+)z#R=nv)y60+bluZ z)QrNhyWx%}7@3hTE<#IPkgL18!(@Eq-sogtZe~uV(EMj^#&|SOG(0{rH8U?){)VVx zJe7%esHH-A>#H(2@&E0|G7&4aA!)-*+BPiNMkJkvCPWpLUNL2=auy zZa?4FiJ;3Bh~sn>gu0N04uY@aoqvA2zdSAF$waD9p>tFg)ml6$Qibkb?=P;d>S%Za zT9zSF(Qq^t60nDNvR9YT%9-P_6cg^CHuyz?!CryJ6^{nPv1l|Ak4GTfdE6c+M=(4L znQOyfvN=8eKp^0Ap+TI@%o^Z97v&8rHujAstId95w;UP_#>0J~kUPi`iiA=mR=eP` zhX;E*&}6s2u)tCwSqX#?$2P%ax0%wgzSxwxcessa168VDs5=xA$pZb7B%?V`x}PidH)o}Q5@mwW#@`$Q{zK00Zb zoS9cFF^D3G>&`x46(v7l^wT+ibpzCFC8OgYm*||KyMRhBl2g<)MyBNktNkQYY5(~7 z-tN4Cr-E9+Ey;HWzj*WG=eM^ugz-wP4n~;ELnAeq9MNLy&!3&Ui!zzYKyXJ#4LLG< zbP^)Yp1-|bWFtrV9XDAl0H4rCX_GTqzk7aqsQR~L3&v!*oX;{bvFL#Mdf$1uN^eg{ zRZg%}xbdi@(kD^+^0EC`@v27TM=_*&1eHZe(Gw}$Jl~&@cCGp-f>Sh84k*~po4b8! z-Ja!wR$DNI_AbG0IHPb6-{0@fD|sRfEfpC#nNC6m!=!RYIDh%=g?tWYcYjjBAl**-L6x;hb zs1AdfNuZ@F7iF_(`oWAvm}ZO4n^3Eqo|*tv()9elkdG#3d}OKJvsC8z3U=%cak)bA z(AYF;slQGWx;n<#w{(1FVF^I|?61EdMRT|@nRcRRr)^w z00960Jeh}A8tc37|AKq(*-9@%x5koKV^>5hH0f=IVdz~EEQo@=cg2Q1F=l7)bJp)a zyw5u%hpd&g8z|ZLKdS{C=;~I6kg(2IqH5kB{a1>*Jm6&6R8-NV@H|34_Hmvw8mT?WJ_I zzq7Tmwz7~4(F2{spDLU_Jl&og?C)-_=9aSYAW68KdJ~z*9X>waoE#n;Y^^S3XA_Zt zk0J>@PKNWBkGH4$TWf{fd}cNp3NyMM=&C{J+JQNCg>^8d-jXZ9bOe*9kCQ`Yi555NV z_>|7#rhHz)jf*fLpYazqV7IF}T08njwKkmexb0ReCY8u*Wms){M@!4+)|T!`Cy6_4 zW}|`2Ve`Z?u}~yyXlbecG-&ftE{oBi*Kv55L?pyS5~*BK-==cKl0lbIr`2khEEbzD z!gw5kNK)H99i7j{Nt@AN&@$n{<_Sd-i9{q)bX#LFpW8C6(@ruOOct9f6mU2Kv6#4=L;nbZ9V;cjOuD8g8`R@M(7v;Um&S(?dYtks%EiROnSnp93&8+Ps?Dy zshDVnuA*{29#0^xA5?0rE_bAGdh_(-*RS`7%ft0dG(ea&!(%!-;m;o4zkK}q@p^x8 zv{Rgq2S|raHDPp;(fq~h&tLD4x95ACYpV-!Kj|SB7n5+w=Y9>CxVLvAB{&1Mj5P?91-mJlx-09_{aK6_)e4Ofn2)nQVA8cX<2! zczv?Fy;01~&!toGXgCy@G!x0q%iGJ7!|nC8!tz2o5lQ=xVEnk78BukG6aM;3127_ z@OmT?0Yj*aFV6-%c7xVn&{@a;+_nj2cjJkcOw)f>%5SR5e+3xLUL8=5-D z@kAozbz99wEi5ZnAXUhPaHPCL=bxPklTJWa%V2R>3|Lh@h6zMG$PXj1yE{97`Xsp`$2Ko>_XuyF79K;6{Ve+}NtLm@6s;ZeZRP-_QdtuVrCI&o@ zPKP)}=i?&qc|39LfJ$R=dLk<)H_sn`zdx5wc2+a-u-|1G9oJcjU}o?3?bpBWPj~10 zn=6@EfFj(ZlX|N+o&TZEdUrSALSD z#taTBwsP_M1}{I@-rN9!=HfvwMNJr-ftmHv+w<-D;r{koKDRVKlZXWUl-}e?ZC*d# z-<<95Y_G2@Waeg)@mM%WX`R8$R_W&K_;9K&YP210()?X>fSLa{{1#Twh% zJKI}64_SOc(q*?s!ir%+fKdzz7f8-TJr0|BT3gLT3n~($2PWyTrvNyUVQPG=8i^8@$3-j% zIh@)dv(2c}jH^^gst|=3V1S9lB3V+0#LqJd*nvZ)xwUt{_T_B6>3|1??oRjCSLR|NkKH&pZm{CM%zpXD$G4aJ%cGr*m2`w699Ff~ z=%AA8cR&CB4vu=Tw^Lk521yU@8aLREX`W>hfYHJ)24* ztUPK*bbh;3IzHH0TghcX_F^%lZzR#K3Fa@J?+!O|3(NUzDhfOUS3w^ssT-ZSe7;!E zCSvJK6kHkiP<~|3Qjw&?ncpwY1Okzu(`0qHJ(SN!d2oqL%$E*Ob29<6T0N!J8eQ<) zAl(j!SR@h)nA~o&VX(Wat$S3DBd2xPtQaN&9mAxJO-)}~>)LcU<#mD6noaZ)h!rxi zyuPlsVSq@4y>_$NVm5-j@Hs4w5EF|fp9V~USS*Coz_DoC6ajF2X;bfX6v6>+vlz7# zU}~_U0t^7b1mZSpEa0>n4Vp0}lg$DaIcz422TIEqb!tu12EAr%gl31PgNJ|<190le zi80k^HG@{GiqFv#@XdkYp#c`CW%d682igaOG_>{h^)RZzJL$o1szAu3jcr|BG*!r- zD?Uu05frYzxf&@PEpdM+6;u>XIj*<5soAZI^6QWH=c|+5LM9mrkZ#k6T5t1&myYjW z-@iXz9PVweW)dJ69>?Ug6^~>$?tcCAc6)k+lm>zqMUuE?+D1h4C*{|2>EvJsGSa@LH7#z#aZx25EG5v8=Tp@f4n^dhb$IW7G@HOIJ~>Z|8c8 z8xKRWgKX#ZdPP!I{_*J;u0D~71}S)k@&!QP2ym??dv0en34h^MlgW+)qCpCG$`pKt zY{U}}+tfqDV;a4gfS-T|6bs`EF%DBYsOf3^(%IT&pwMaDPMZZo$x14d*EKb_G&b}* z!BCwxFi1U@D-er>e1TZ5kk$0sLJ=Qfw^~52SZrn$I3W-$t?$ZAUVlX)ZA&<=ldN4svzaCyap&A*k zt}HgF7#JO3DsAagjjKjRl(ap@lIUZ($(AhwYr*) zcNOBea1f%jwiy)ePgY~oBMv$p9q(wbWmHs=jfQL8*F$afBN|C?d9&`XmA5mBq|VG64f0;nF+&xs%fQ(cbntT_vJ)P=jUfF;I&q zC2-W`+!DMz7O4P7diaX*<%fsk0(6EMhy*lmpl>8uqrjRS`JG(Y7Yuo90G!81*AGG> z;WM!TYBuK9jSef-TALS6hl3uM!vRjnVld!)7Vt4eeM8HTEgTOJPP@}-H-o|nF#%5`!GwxVLl9ypm@r6| z7S@i*K^g+0+1PLNMMIR^4&^{o^%s+evOl;PPatd8c@S_qt!9eF;jtM^aA>YjBIa-u zeR>eYG2p7AR-{3I2>6kS-07Kjoh~`iBPldXbKS$T2t-^#e%7 zissIquN~-ARaJ}%I(kwpOfm#gGCi)=SUsV|{7?8=e>yLlF zKi*y*ZExh!5gx*+9Gk|&i~BcEFK`}+aBIt15KD^0!Gpc=!sW|r`Repw2TI1$ToUDZ zQg5{T(p#m6^5yXXl!F37D25I(J3ZmW!@I}3v%T%Djp9-!J(GxqAV5x8d<***7w0E? zo9pYKttnWlNDvZamxjz9m+wx&f>&2pmNLki0}!xWeEHaX`Tb_ExV*Hum`x`lA>`SB zs9Yv#F)tr%E~RH@k`cd$41z2IaBitw$d-?W=CfhKVbojP{v@jBZkJO8X3Js82W__g zhFeF_FBfd(sy}WyS4sx$I^R z;szlisc9Q^_;ZfXt<6Z0jFU z4iEg{gKnZAi>PTdcJ}put)eRc%@ndnKHX9qKDW0c=lrdg96H1yvZadpPrxBccNN2B z)6Nd>C6v|Fu5oc$(|o>Pxm+13QM!m09dL^XLfpHt5?t& zO6P|=8^uCyE*TE`ytvNd_NCTKFVEL!==s%UATa{Di_lv zTUpFPpMWX>yt(8u`Dbh4cy~23vzVJh?u^_V1|o@&qtGPb=aNbVTtq0ANWcdNg#+M3 z%>Uwc;W4Lja5|WT*Msue0XV1yGKr|JPu16@3C~8513LgXGxP!;GF438I7DSqP*&hP zK#&Rgf&>_VAHBR|%0UK#px#cm+ir$MLOUWDEND$b$E4Hcu-R-5n`s&aE1(pbs8qxi zG>vHV`swLuy-o|#gYrLJIVDn&qFp(m)#)^vDS9J=#o{5TAXtfN+WUr8;}a8OXp;j$ z08Al?140@)hgHgfUM8a&>=b!sC5#CKqT1$;uf4qtkgJNHRzMYkSYh(!?!Kyu*Zwh8 z#1$W)uW$a-8GffYdPK*?9;M#qB;sr5_s<_cUvG}La(t;VwA9eTLHYa7U*GS} z4>lKPAhtueQ;un@)Xe(j^ZSqQsHCo=YCzzGQ$3-#2bXAtyE)qhd?2cU1dxPU?+m0? zPoCc&OBcsG>&4Z@R0wR%z$vC1x>kiHqFYc}mc0l z^o?s!Y4{W2Xs#-g9;I46It0K~>ID4z16<43{{9|X;eM9}PGuw%DVo~5!8t3${obSF z!6yP8Yy48F8Gl*>(nZL9@M-IM$F$RCXKd~44wUT2!^Lhs4H*u%X$Ho%Myn@%Q2zGu z@#E=Ye`7fv1M%@#N5^#*Je)gu{`v9!`Q~u5xI72nBk3c?wI&CZ-n@8tdc3t6 zn?eeA@mfA!UzpFYz)v6y+0O69oeqga){bwUZ7Pm3QYh)~)!WwKhQwNsPG)xaM4 zXqN>>lA13=lRC|~daM%VQG}!S)Zpqqb&ZUVjST)Ca5?PX<_T%B`Ric+*FOW4{5Z6y z@_C}#){ZV3s*2TC29QhzB6;Iyx--B471)Zx(LqvDGo+j{JMh^0#m(*0-~W6AQi}75 zfX8Va9hoxO$?VbHO^d0)V0tf<;RK%Bbnu1~E5jLZq$z-FZ$>+jI zB;ZPW45+RcG?VnkFTLT4f}cn%|E!$07^cQ2e(#+9Rw{Ui8hb{^)vA$-Qh`=g?is*2 zvDzph+1#=Wwrshr~B*kWj{2*{ zXotRg`TY7&LL11%)%*fdvT#6eazzWJXHZ0RFKoTAvY1XLlknYZom6t|>aGNQZmz8? z%%y>=7?9=Z8pD@P(H)2#dVggOFbqLtB5_H*YNqu5aJ;dU$u2>Gt!(s>1Oa)X&AEBG zpPx-6W)eXULBSQl^MI&CC|4zlxp*|}glrBMNl`HHz?#Xq|Cc}H^%({`JHIORF0Vg8 zxvdt+Tp}sPle7)?d}(cM?YH_Nt3iY_!P1H3Quv<19~JUu6&@sQMw7*Cp?7M5Q$8lI zYv|PZBdDahk)90M6Br0k^u@wG0}t~9MT*P z8=5MIS36*EKuR=fCeYR#yRuV(coWN;hYS||#Q0QIWp|g0WRZ^f(#CG(iI2{KhXdZ+~JRy)6tQ zu>^kpqnc^6JGBAg@ciS~`{U(7F&hhjBPf+q79zB?e}41)@z1Yk@WR!(2=qReYD{l+ zhgZ(aZ~y-L`fz)3xV<_XLOZ5oDvg7h+qo>izCPYvo}!(U47$_cozPqH@XF=m^Hcfy zoc7LKHW~K&yn3URh!w7$Udliax`&lV8zYgB&unokiIG@Ww zXNUwtA+!-!BgI->ySK-M`D9`?9fwfq1GA-kq*TIZ*G#3?@(F*?XSdkwE>8g63&W8w zajJwPzNkyp+1=ki;h_9}ig3Cx08S#t6dg)sXG?2Shr#DZ_0?u$Lw%G;#A30urlDRY zA0Qwl+HH2572Q`t)sm0ZG_`(Fxufxr2h|BDL@P`TS^z69uIrk@gOQMzfOO|%F{`VX zs53}J0;rBU3IYS}a+r;1M;JvU0ottKaufq*H?m;Ja20Jqn{)KdRB7vw-exsSP5e$) z+{#^6v{BpGIjmNzl)v*oV1=v}9$=|W-Gjq}2&+nefhTU6@f#Q zL4bC_>szb;_g2GiFNW(7@c5Ftkx`A=<_xV~l&&9t{?C6tZV!uDi04kLdQ59}_~-Yo z@1B1C`|G`YwzHb0o8sh@-t2;war5x;pMRmh9`CGV;;@F4QmwaA*{$>2r*Hos00960 zM45MAYFV0vKSS455hNWlqN13^1QHA=f|8M(On^Bn=7{8^bwl0h>aMQtnx2_YIBOqo z&G5Tbf3V%>Y<-`z)_ULb%X_Vozt5cPZASgxz|4Xxl+L_1zJ2}jRxM;7ZZaqPskKNr zJip}fZDfj{zkjI}a?iJynX{wat>pSz+`QynKY6Kt|Mln6%hUbMB{pntr8n0S7Po)n z{I&l6R(gHBy}7+PKip0ylWXzF@QicwuF|OFpYEnh~YBUt!%O=;0Uw zUmhPE9v|(d))I-;SUBL9@VNt_r?h5ea9uK%& zF1y1QNhHEPFOL$5I4uHwbbV!7tsYSuU7<)g=<|3uY&IomV{nz@lY_l|%0Y7^9`?DN zPA99ajl#ls^Z9bMB@zpV0{#`3t);nz(b~$y)i``^8%H+2 z>~XssHp>F}y0w+X=5je44wpxXd!{V5CG-3o?$N?vv@%&Z1RE*eCL7B74ZLHgY*Gn!s|&?bXHUK7dO^ z%}buu)7<;FZ*QgC^Zm{B<>}GhR%#;=F?%A(ljr(-qxgJ#b9H%nezdop+5lL6GvSk` za;;i?xxUC`F3yj3QXm&#wY5*D%YXY`dAdB>KRi0vO|2&qi8x3UQT$%-T`hlel-fw9 zH{+3TBoO*}L;G0@lBp_~n^#Y0}V%LS;oLJ^`o`D!)ar( zP#>YRy?4eJk46GsV6uc7F*pK|fXC(V#H!hqa0I}4y)JumYwHIjD7H{GU`?P%9=F%y zAc%r0HiO0I^Ej=dNt@T>aXT01fB<%|I9v{!%LAn%)zsp$)x2Q(1QKWpKowBra`}p3 z{p_4k2Y8x4u)-RP#cpG=#oeP*I&BlZ(9B?x6JU{S5-R#fC+P19aM%PGS!^7E%@cL@ z{e%UYxF&MBRwk2)N3V^|mrfgJt6)E3*}Spc$6Djt zzy9lA-^(?30&cOP4>D%|;{`md-TQPfozPla`hk~;PlXrFhw*2|~_isPf zOD}iVnWI!J81T(5xy?*1xsewa=~!vT}o8Qr}pfB6PL3olT#OsV{apYT3(eVs$+K+Z%UkjJ?h0I;9PFgiSO}=}{)5|W zrCxdlw&$nE2iwVwjg3Ue#}#W+)xZBzy3d@R90S|rdJJ4efaS)@pdgxn#B3y`fkv8d!nC37AdPWH1?=R*$NOw9A1AB+l#R zw6Q3em?P}hO%4w9cXUsC@%(w9SZ(Y!j!;5zDXF4UA>?#h!jXU*SS__OIb0@#2~tIJ zxl-$l#-jk&VYfB?)XW5Md?JkEo*7Rd5)G|*y>2^U1jTM;qoR~-csYs#c|0D6_0y*o z24M#p!sD`-(g`S>(`C2L6BWY;g=W(VCsAq4HrpZ;t_grNx3scYG;=(@Krw8XHyL$J zO)XF`UfBpWqfBg2Xp1(WW-CT_Z z{4>T`i#u^v`1vXqWJ##=URz?czJ%XwH}YfB1=mvo2Sp!&k)M& z!~OmB#nH~jT4FU3F*yPoXNC8-GC04yI3v18XbGekx)Ay}=` z-b%oN#|R{f4jGr-HRq26J+!6r_-p{e=W;2TqEo#TibecRt7U1qrJ2#jP>Lsv#gq4q zj5X5>EiJfQE7^qmd?*~f0Iq2*rHNx>i6f9UYUOgZUT-uS^-3}Kc)7P8c4(DSaeJ*= zEtg8=N~KyU<)3d(wpIg66Wt1VZxugY!KYL#WvCE;8S|NyF5GI*+?We6S1(j zR4$Y%)l#WcE$1F@Gl#%15f6IpOVvWDhRa~3n18xC-z6I6wp->+x%V25Q><1Bx!hys zFp2cFv@m1P=@t(1wQ9MHab=S^?WX$y}LX~hP<`~qh?G!GN|lPw2#N18b zzuR_{Ex%kGZm$I#i-xhmfxhle9$zRDAh)bNR$osyB5uo!Mm^B4>cRq__$H@)@!<9> z9a^5&j12awy4vMz5G9bvWt4Dmd2KUf)vNovI~5AKtQB-XBE(W2TdJP5nlwYIF1bvO zg;o*>*(^4^o39vB5A}8_WKx+-4hv)vVL=|`Q3A2NtE*imkxHbpPqa|6_yWQ^x0NlC zOU3ku!Dt~8N34;=G%jB(m5L=YnHb;zL?~t(F=$vcB@~NALXoVM(eh!aNC!knq00i1 zR4SxeT4+fGy-;~_IfyJJlE^!1bpQw2@DF8wzP&h1$Nje1@&0-RRjSr%^%@GFf4Vx} zUXKP`mIZU8QY?WTLP;_I`fv$%3`5<$EA?6(7a?4g@+j`sT5xyA(ZJgWNnvg*<7es0UW-^!oxLS4|<%)yVFze#X`B1E07)8 z`^-Ty7VtPM^G5C1Q=>+%MxcJVJKJ7E{C6!F^_sD{om?&dk}u-%c)mSBS_pcVXEc*z z!_t0Frcf%9g{SM2owcBQd0|>RHry{2woe~dYsF&zVBw>KRwtC;0Efxp6+fXml7kviM1OKrR-Tc;xuVT`n$V2 z6zv?IKp+%Q!cNoi^Ks0zFg4t(>>xa#%oHvs=1O!f--=l~tm*`9_z*!NG9?jl!~>J# z!@wC_Nu?4ZZd{V7M0}vy*`w@Iv`ZyG@rT7B4Dz{bo><=A-Yyl1W$o?F%^&FwXW*dK z5Qt?`u|Ob^NQun?UHD%s5i34It5iZhv`jIG2@~nVHTgoZq`kAVhi(aA&$KzyPXtdO zR`lsy1ULqr?8t|v5r2$sW29QC)rekI>+dAE-=Q5;s=E=)J6O4YH?Ruh+@|?hd-N5f7kavR7+_1X>lbaE*>3 z5%D@~%a(Gj1`(@4NlV$s`^%$r%k`I2D1%FPo-yn)#hqoIeM}EWh5I@2!RWEAFLP zy>?tS;JTc_RU|rwfm}NGy;{tiCp~r|F1e-Y_}b z+oSAI@B~7USVU1u+eQ8&=73TTbb~{g1bwJLC{;*#;t6lWHK!TrRkq8ZCL+3DK+!06 zn@}}AKHT38-XtQSkf1{(4ws}Tsj^4e*)GG1RN6wPKGKC^1?gdVX})Z-oKPr|5K5qzgdCFkAj0^0F*K1#9~}vQG@@L-2uMrYyUD@_z2peA_K9SQo?#<{ z0jqB%(ns8sZiexTDYUV-2BZO&M_jdDc|}}0++L6PT_&P<0H{(TCRup7zdYVeu0?(J z8Q5UC)*v!xgeI0N#h07Yy^UCK#c7>}p~8QQ5TJZ6mwU*- zIwL;kvUveYN$!E06kcDm*GFh-BO%YC$%Jc{$~adUdiD5leY%Sy5wK<&rD6r1O0JZD zeY`$NM|>`uWq#UNXcP)WFUy4j`r50bjR2f>(PYq>53@zsFyJjbUYs27MBUEi#d+i8 zm~zmW$pO+rF8h!<+FSQI?8_FDenKslsLaRpdLj3UM*Dmx>as0a%`;PDBi+3noyN6? zS~d6laCMXlI+n}}bA}1^por8+*vc&KhVdgokylwe=fdWrNd71tPxh& z)6>Hz^%V(3J=W9g<>rdnpqm(g@^y4_2^#Gka!NAlj0Bd9+VLT!0;I?oEG`d)7Eo;r zQUB=p#Mod@hg^a?Gg?VKA$~lH%NBH~R9!M$Stt_G*$LW$J#ac9Bu*-XlMBU7AMHmQ zmqU}q6T!jx6kNBN?s!=wjQwekVxa(A81(FgbQ5i~JJR+jkr3PdG5Pp0V?kP^#Nb^@ zz9gLqJu7LW^CiF+%jLud>y0-6_x4st(7!%E+({;)E0(tgz=1Z^Y5+0!bbo!izqKAk zp27E(V!8TZUnuVN>0T-k@_;Mg3AaVni$rE1OvEBR79IVgP%CI@0itnvvbzxla3(!1 za8F5e>Fl{vGq(iO?l2QvVcNYf- z`(^03z45@^Pbt>huvBXQY@C>YyardHWe%>^r9qNN> zNCZmD;cNC{e{U;}=xWgEwIiw?K6(iuPo&$pzPmcx30UXnXAPRsJ|!|7h02SlE_3?y zaNRM7$UZrYY}bLZKt0+!B~;&1(6tEdRuA-aD%#~xBpw;U2?ab+-;{oG6d6v@-Y%0e z=_v&ij-t3cafh-;rBnb=sg%r7$T*LS4AsU0RuE7jL`w?b7$40Ehe!|L2XA~zEcsyP zL#(*G52{2$J|+B^ebBglP(>#KWH>VSpyws@3LX4t@g|p|hc7I;!Du5&N}v}BA#l(( zf>wj(?ehE>&1gL2d8+}CGKocylV=)-tu?ghON6U3e!NC}4fb`qpWaA>J(0?_h7;?{X~7>9vz%RIfXeFV_l>H^=GZ_EywkvCJFB)oQhb z-!XqsZWNy`_cvD8;-1A>BkDUcJlxSGZJ&(Z7oIYE=+}KVlR+~+Hl`j_2_z7eZtKzg zX)2jo_gQe;NeyvBiWsLzI=phQpH8p3OgfDQ@k`a!fvO0FVj*8Ny0RMaEKZG%PK*t7 z12{G*r4%4_j4oJaHN*XbLjzrk&JH9p(on*lT0il65FC5p%ycXx;=-ZpDHbEJ%R3Y@ zk%%~93q7Rea@!b$Ej|t@Cf*O{Y$j^eN~DptNPz@81{g&29EC~40|%tpAp$27eIm0L zT#dFz0vsR}3It*anTjC!k*OUSvXF@%o+QX?)1UJ$3a zs+C%g2b?vMyhw9bqNCb%=421whrQN1y#;9-3$Kuqll}C1Jmg)TB@3j*C=!=?CRV!< z54o+gTId@*68IK#FVBxxC&+LiAM(;@t(Ys2UN@J!r)O=cwXoNYKeM_{x0O((X9(pf z8ovmHY;k5{u#_)UDoE`QH#eE%!@Xn-Lbha{(~pxbmGlMI7pF%D`&)?+1a4v0Xf(|3 zzvf_dH|Gbb&E4&U-)*;oH?7_%@3o!Mdb^W|C)Zctv#?F|gjOS!sVo=u*GpuJL_Dx; znwd6eM@L4~BTBhIstKQ6?Qf;lLQo&QUZ6^+eERHfS_j=oOHl zh_wm$J?4$WHHXQdofs#=q(nDC>O#arHS4ev%!kl4kPlrkSecNL4~z_`db&H?DUXemOzzM645thy;{aDkqBgF)OBpi~vV|WwaSY#E1tI+}IzT1`aRa6LhhQ zK_I13q&p4tH8ed{lHsZ(F5S{I{p4!URih&uNU4-_Pq(P=2{K$F-S`5P#Ad;iG zeZ0+FKtfk(;IxB4uu#lqUtgZ?uFg-7wi02#XL(^pqe2oS96lmzo*eCOk*?Nmou4tN zbB$6ypC>8*@Zex?GX_8{uwW3klP%=(+53yVbb5Dt)#tEU7N)1P(olVSy}bglRLqy@quU#a)sVw7tDDkK4XaeWy*#KGkIhrrk~`~elR-a4097ixI-y4t zUo4|Iss-ob^yKImg&O7wG59eIbR@Z_t22C0<|`h@(!73RIQymXnkAEu%*oLKv23>; z%4al8>64Gea_RXR$4n+uYlwm%NUziBrG1XGSMpwNdm|o?`Ii>}*5t&5c1j`Yu$&_C z9Vg=?Ld+TAsN-X!qoXLid^~t|f3X>fg&ZcM!Kl|vjt%vyXy@se4X4S3$ZIudCN+}) zQPqtoPVssCo`v{!(nF>+~3|`Lb2eGp5=MOa46sZ0ssL2|3sMwQzGl0#=pZoqoR_biRO%ALd;n) zq2vsbL2^!l0Z=f^Ik)cK-P-+}`@D^3mno-e`cH@P{q+;N+wYzC)>E~R&nDwxk6Cwf zcCfWN{rj`~_0?%U*URa69NR5-H6hkHF&4acI~`{2+2QWy+RDo6x|lz9mTA8f z6JDFeYP>qy*;21AEiNu9WKu4F$(XHXeI|ohcf7H-w!VVF!Yp4v@j2oRYuIbE+iwpx zR&kWo#p#I&4xi8Ga)q;pCa>RowzIalw6dz08Xq5Lad zMfKr>8Fn1Ths9#^1Oh%!K#BW){lbL7AQyollf~f+g*cY*AAgWN$dTyn*bDnmnEdfa zA7h}uuaCjNc$i!vlg-5rqOZ@7&f8n}Y$6s72i(|x2Ci0STOX|^z-koJ58+_IW7b}t zpPd|Rs#evW$JSf>xsnO{{r-E~-R1eo(cad^#-?cIGTmy{3h{v3;jrs9#|OLWwbgai znur=dOuRp5LT-!EXt>zl-c%_U6-$fr@)40_*_bLst#^8zW)HwEgTwjhX%2{^#&-;M zi_v7b++R~JtJJFtljGwU;CC#Y*}Qf*b*DRPON&b7{N&ikD4PJsV{^oc1I^Lq+OlGP zZfbl)E|Uy1F~VM4HZ`SKoS&T>lY=&iSj^}xD2F}FqU2*^BQh~1l1Rlu;Q$#hhlhqa z0xp*?qy&5}pO8oq5C(@?!-Fg~esDq_7chv#;(j1S!!|@HVfXF|GQxHSFzIKI0|G08 zhydHAJqiaIgS`QhMPtS13xDB*!+|%(5CIWb@vsji8DM~E#{Um6A(T>l0vx#Netdnl zs<~Vy0p1)o!}ZA*CRpBfv)z8F=CkQU)DPgUj<+%B60X`<-fBKWxU%T4Pj^>8$$$Xb ze0i!@axuTtY5+g##m{fD$J^@@ackHO+AGb`j(TaL{fYBFH69E2ek|lR z-CSx;54Tk-%5DE+^Yyh}NJc}!kk5Q`esXfOyRo*a;!S8vopvo7_20Yio%#zXnQ8?J zv_kRZN2!-uHsmxDevZN6vSMLzNiixHP)p`aI$+glwU_&ws`a(?wdJ{~2`=GkM5S|C z^@dx`fof5?u2RlUO-^#iL?E2nx-y%zXS-`lOUn7_$?1tvtR+nxfBxk97y`PmFf$5$ zlZps%z(&9m$Y&Ibvy&6!a*0$fp~MV&J&D4xx#E!#nS>HhAWgA67Q+9(za zc{Em1DFI<{n9XG~hXpg|lMAn>qRP(P@!kS7rLa3hTN?gwx!5Q>32t(EjXv?dbW<`ERR-=CfL_wMJ{ z_viadIh#pE10JW%e0RG2`|AU;_wm+xeXiuQ*+j(avYBon|6kwu^U-~4J~t})Og!xO zI4ru$gH0uUlrE(2xlt`;;vt{Ye2ZmVo9ll5{{7v3Z@#=VDur}3;Iinh&kxj#;~=`z z`D{NuLJ(8Ypx0pn(K{RSvR6oGr}bQ~6tbx#_%VW?C~(D#2alX18chA&08fg}DXAoK#K;=MCAM-)zv| zKv$t;tHdEExB`)oD_*;Gm<=ZU>QpOh>&vqfW8-7Erv+R#Z+z>{Y11BUtuHSvEl!V3 zOpLO*TrP%8*6g9?cyncGVP>o60w0!7%!1{KF_}aPITJC6Jq``Ag%B_? zR8JxnVP&O+D`*dk!=$x}5{oH5pVk;D@j!wBhszoqWD|(tkVLSEJ;I2GK^74#TnDZN zUMv^@ApL{%d4|a0hzkQO0N39KvVJU>NfZt{i9{kXu}z!?22BrGMEfW)484y&3Bi|k z=bs5B6n^)V?Bk>JQqH7^eYtE#Ec@p7Hw24_UmL!bOaMga5(IAL>x&+Ay6t)~3m?44 z_Uq$K$}^qC zrn@-VUPFXio*SPSAH!YE;}PI)otBGz^(rFY+!R2BrGhv<5SZH49Bn8S^Rp9#H@S=` z7>8&dPdZ6}8y}H~rE(})FC!5QAY&sVa*0R?OO;4y;Gkp7fq`L2hzP)e5~6Tq!HFVq zIl~Y-0LLc)0m)wM0&znOL_gpS83R`o^+#XNY-!0P7$>90G@=cA+`mQLQK@pMQVCoQZYD!hWam`r_<(e+!!#aY^*G=uPbNA#wNLl<6P;=>7Chfi*B<3MM1j0zN}nXnwgv= z!0~xpCTsH0>@uG1AtJ(2!Qt2lsDfp2`O<~`^P{cRrKNcUyAkNtV9zwUY>s4NZgGBQ z5}iQ~fs^)}jx0D=C>x&~mm-Xb@gpU!g~bM1M0I3RA;gL=gbl;hV4I9#fslhG2aLp3 z1rjMyI0mE*J_v;y9AxsrDCrEs9#;^hp3ZXVs6bJ&k-lF)lOL?eJwZuF#v~B3AK(V* z1V?h8P$Cxa`hN9{dywXh3`p+d^GIpvzIVR<{ImO1%B12UubY5%w7LH0?=OV1&#$ky zMlq9&2HbXwfe6{mH!X49&yQv;m-;`h)@DXNNf7M3cix@}CNN0z-NnJiyqrgfCcri8 zMPx*e&DaBOR0uWfyrUpA8>P%c09E4p{BU!5QaIFn!A3-{2COjbb6E6RB(;sDDKWqW z(#@wbQA8KI>%}RoP`$p`{%7aqwcV=ak};xu*P0V_(Jl4XrrQ5le`>vyk`K|K+jw<; za<~KG+fu6~Q)h|BV=4U*341L!;1kZKT;Et(L}}OyKb0Z@zt4VqdPpK1>7sKpQi(vM zxODqG9+&Zae_O3mZ>bdHBa^cTEninza(ZHBW&+KO!(p-IyEdg`Y*bEn10luXPVSx`Z>yFUrpHIdMx|mYSvH6mkIRwFDdtfnMq#M{QP#6L z%uoR2volaW7#DO*P8UQblQFyAWcH7L{PBx!6trUYbc|GGib1Oz zJet(up&v+je36X!Y4_us09Qob4*A>;v+nY6bLIQv?H$B@eYHs=4Ex=7)7|BNelHomMRyi$?s8+pEiq)BWx3-JQ+t&2{w0d8$=V^b}j zxkx@eRkE>2_}+L$DlLFpSyn2AEYVK%r55*lTo&!w;Xb5naZxchGb0@l^5?F+J~s^< zKvZoZNlc87a|L|%kU)86v^!0g1n3Q1>*UnrD0w2mV(}(-kl{4j$b!rB*gj4>Cowa= zWJY~-Kw9by4l@q0h#X)$m&KLMz{O`LM`52bnOx4GbplJy!m5pojgO+a0=H2)9lC~D zY}OF83OG>^A7CYu{vs)#v<41o6!34-VZo^Qk3S$kq#TfZMHG{wJyk4*IWvX^2S`h0 zF-Za76L>(}0G^4`pR@4iltsqEML(v9xJ76$gs7bzR>Djp?D^n%9bki=jUoMU#aB6mOHaI z7EdLUnXKI#NR+FMdIMoUolNB`)p8-9%Vjgm+vkDjx7JgwQmxg>g(3#U0=8#Vx1qu# zzFsMns*km5wT8dS`D`Y+Y;S$mOQmA5Sjc7zm1?z8sX&>NG5(S{T`uPHg+eZq$T zCnBM6gwK|!9mU6DCY8$OvZ=(w18Ruh9|%(1Vd083oqUKq#9-XPKp+_K2f|@LM<`@6 zsBNn+7`S)4-7crgbMFm=gI@fSg<`Q}_RQh3*j-Mu+2U|{d?CM^O&&L3HOICLZrknk zt=?p@*<4nM4J|qgLFTpIyg8wzqvD*>`uFhHaenx zJPubpwY+tN->w<0#z3@+(97bJR3%?fA71E87K_cXYf-uNf#CfC%3d#bC0Rs2q}R}k@7sc zba>T!q(=ro5%GZw3ziCm6RQ9I&wu^(`S$WyEvEv8edYSe&BeLS6^LbFgB^q)^v7h# zdZ^sGzCOP+xqQ)lrwdJLzdRPRnYcqGUp&3K&|3Y`M84f>zrH*->eW&q?LAcN=&V+! zKbFoFGTBnS@$~#uFJ}^P$cJ<~kw~R7`GVP(dwqUtJXWjKVlI^_gC2rRF?Z(6)|$_i zQl(O@lndbJXOPua+LbcBtynIXi)D~iDxgHCE;7wpI+e?%)0sS=%NL5pJW5b9E>UV@ z)kY zUa!v|2>6*?ipSt>=$-dom&0MVTJ0{6HxLZ^cpTjF0zgWc{uz<|x= zaRgIaHx`Tb>Q<+{HQC*6yNz@@qHvUCT77n-)!y9bEOr|(8TxrdO4e<0`{YccHCW9C zgV{v#Kgm`^Tci_9Tcr^Z*$bO!9y-(!a{$bzSHg(3l0G`nxQcUcE|z%d4yM5oZZA)(WI zI-9M(_ppsV4{5GqiHOga&hOp)-BIacOC%fDCZR;*Yov@quaK@{KI87{(cSs}xzQPj zWnf(7N!TO$U{JR{qrTQ&8C;=3^tHo@y7>rgY(KxTyW;c${&MvOBw>qO0N2PN)9iOO?dDX$``GwYK z0X@3GpSFkOM@gracTcYLHsEd0_o6&`u7`6;Cls3+9eA@^jDM&6-unW+czWaP)`WqX z79a4-g4yCKIMnp!rO9G483udLX=$~hUrX?Xb0;>p&D`JD_jjEj8jI>7lTWFy4aWYy zAK>Wv4BHlnMM9ZkN7F~bAcJna^nVn(Oq_OX<=_AQ=V$Aga25C6t*@K^>*JGKhc}wcb-L}hck&Jii+i)UaiP`TTD_4>zVr+`g+125Qo?a< z@P>ntXd(w)3dakL=cng7OfD6RXQ5EU`EuFZt-k_0tyjSiEU#FC(mf)_7xJFmBeBF% z872wytU=Y_wgmC_ZZ%gdmx_e~5xH6!UxBKn6F2GSS}vV~Z9>QJDdf|sWFi^~@szrU zGWt+5l_KAJAiPB);ZTUjk#Crz(P%6lk3ri4KEhih9t(4r!_=}q5b*hYUXR=5hC2p= z(L^lB5s5hie6`W(bl5E>qseBsJG`NA;GRi8cb6zn^=6~ah&8p@J=oXdWYJIYIlQq= zt;2SEb!RjfEl#(~Zl-bLq8o}P*N-nQG&g#3Jg41EQ$+_M+0^3t_L1h+V6xa9RwE4@ z5kQZw zcRHQH0)lPkUJv9!4n~ywr)L*8x0pB`kfq*}2aW)XGq<*PcC9m*t>D|p_<6oS-ib

l#8yh$_Xa2f>n)Kxri(GMjSabk0^ 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 Aq5uE@ literal 0 HcmV?d00001 diff --git a/external/svm/ecoc.m b/external/svm/ecoc.m new file mode 100644 index 00000000..2575bf76 --- /dev/null +++ b/external/svm/ecoc.m @@ -0,0 +1,46 @@ +function net = ecoc(nclasses, nbits, code, use01targets) +% ECOC - Create wrapper for error correcting output codes +% +% NET = ECOC(NCLASSES, NBITS) +% Initialize a wrapper for error correcting output codes for a +% multiclass problem with NCLASSES classes. Each class is associated +% a bit string with NBITS bits. +% ECOC(NCLASSES, NBITS, CODE) sets the code matrix to be CODE. A valid +% code matrix is of size [NCLASSES, NBITS]. Each entry may either be +% +1, -1 or 0, where 0 means that examples of a certain class are not +% used in training the correspoding classifier. +% ECOC(NCLASSES, NBITS, CODE, USE01TARGETS) +% By default, it is assumed that the individual bit learners accept +% targets with values +1 and -1. By using USE01TARGETS==1, the bit +% learners are given targets with values 0 and 1 (for example, for +% multi layer perceptrons MLP with 'logistic' loss function). +% +% See also ECOCTRAIN, ECOCLOAD, ECOCFWD, MLP +% + +% +% Copyright (c) by Anton Schwaighofer (2001) +% $Revision: 1.3 $ $Date: 2002/01/07 20:53:17 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +error(nargchk(2, 4, nargin)); +if nargin<4, + use01targets = 0; +end +if nargin<3, + code = zeros([nclasses nbits]); +end +if ~all(size(code)==[nclasses, nbits]), + error('Code matrix must be of size [number of classes, number of bits]'); +end +net.type = 'ecoc'; +net.nclasses = nclasses; +net.nbits = nbits; +net.code = code; +net.learner = []; +net.use01targets = use01targets; +net.codepath = ''; +net.verbosity = 1; diff --git a/external/svm/ecocfwd.m b/external/svm/ecocfwd.m new file mode 100644 index 00000000..f28e94da --- /dev/null +++ b/external/svm/ecocfwd.m @@ -0,0 +1,57 @@ +function [Y, Y1, Y2] = ecocfwd(net, X) +% ECOCFWD - Forward propagation for a set of learners with ECOC +% +% Y = ECOCFWD(NET, X) +% Given an error correcting output code wrapper NET, the class +% predictions Y for a matrix of examples X (one example per row) are +% computed. Y(I) is the class label for X(I,:), Y(I) is a number in the +% range 1...NET.NCLASSES +% [Y, Y1, Y2] = ECOCFWD(NET, X) +% also returns a matrix Y1 of size [SIZE(X,1) NET.NCLASSES] that +% contains the Hamming distance of example X(I,:) to the codeword for +% class J in Y1(I,J). Y2 is a matrix of size [SIZE(X,1) NET.NBITS] with +% the outputs of all bit learners for each example. +% +% See also ECOC, ECOCTRAIN, ECOCLOAD +% + +% +% Copyright (c) by Anton Schwaighofer (2001) +% $Revision: 1.2 $ $Date: 2002/01/07 17:59:26 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +error(nargchk(2, 2, nargin)); +error(consist(net, 'ecoc')); +if ~(iscell(net.learner) & length(net.learner)==net.nbits), + error('NET.LEARNER must be a cell array with individual bit learners'); +end + +[N, d] = size(X); +% Matrix of outputs for each learner and each test point +Y2 = zeros([N net.nbits]); +for i = 1:net.nbits, + if isa(net.learner{i}, 'numeric'), + % Handle trivial +1/-1 hypothesis + Y2(:,i) = net.learner{i}; + else + % Compute output of each bit-learner for the test set + fwdFunc = [net.learner{i}.type 'fwd']; + Y2i = feval(fwdFunc, net.learner{i}, X); + % For learners that produce 0/1 outputs: rescale to -1/+1 + if net.use01targets, + Y2i = Y2i*2-1; + end + Y2(:,i) = Y2i; + end +end +% Matrix of distance to each codeword for each test point +Y1 = zeros([N net.nclasses]); +for i = 1:net.nclasses, + % Compute L1 distance of each line Y2(j,:) to codeword i + Y1(:,i) = sum(abs(Y2-repmat(net.code(i,:), [N 1])), 2); +end +% Output: predict the class with minimum L1 distance +[dummy, Y] = min(Y1, [], 2); diff --git a/external/svm/ecocload.m b/external/svm/ecocload.m new file mode 100644 index 00000000..e0c33e18 --- /dev/null +++ b/external/svm/ecocload.m @@ -0,0 +1,108 @@ +function net = ecocload(net, fname) +% ECOCLOAD - Load ECOC code matrix from collection +% +% NET = ECOCLOAD(NET) +% A collection of ECOC codes can be downloaded from Thomas +% G. Dietterich's homepage. This file, named 'ecoc-codes.tar.gz', is +% assumed to reside in directory NET.CODEPATH. ECOCLOAD tries to +% extract the code for the chosen number of bits and number of classes +% from 'ecoc-codes.tar.gz' +% NET = ECOCLOAD(NET, FNAME) tries loading the code from file +% FNAME. The file must be plain ASCII, each line of the file contains +% one row of the code matrix. +% +% See also ECOC, ECOCTRAIN, ECOCFWD +% + +% +% Copyright (c) by Anton Schwaighofer (2001) +% $Revision: 1.2 $ $Date: 2002/01/07 17:59:45 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +error(nargchk(1, 2, nargin)); +error(consist(net, 'ecoc')); + +deletecode = 0; +if nargin<2, + if isempty(findstr('~/', net.codepath)), + archpath = net.codepath; + else + archpath = fullfile(getenv('HOME'), strrep(net.codepath, '~/', '')); + end + archname = fullfile(archpath, 'ecoc-codes.tar.gz'); + % Name of code file + shortfname = sprintf('code%i-%i', net.nbits, net.nclasses); + fullfname = fullfile(archpath, shortfname); + if exist(shortfname)==2, + % File exists in current directory: load it + fname = shortfname; + elseif exist(fullfname)==2, + % Code file exists in archive directory + fname = fullfname; + else + % Code file does not exist: extract from archive, load, delete file + deletecode = 1; + callstr = ['tar zxf ' archname ' ' shortfname]; + if net.verbosity>0, + fprintf('Extracting %s from archive %s\n', shortfname, archname); + end + status = unix(callstr); + if (status~=0), + error(sprintf('Unable to extract code file (calling %s)', ... + callstr)); + end + % tar will extract into current directory + fname = shortfname; + end +end + +% Open code file in text mode +if net.verbosity>0, + fprintf('Loading code from file %s\n', fname); +end +f = fopen(fname, 'rt'); +if (f<0), + error(sprintf('Unable to open file %s', fname)); +end + +i = 0; +while ~feof(f), + s = fgetl(f); + % try to read one row of the code matrix + [data, count] = sscanf(s, '%f'); + if count==net.nbits, + % read a full row: store in code matrix + i = i+1; + if i<=net.nclasses, + net.code(i,:) = data; + else + error('Code file must not contain more than NET.NCLASSES lines of code'); + end + elseif count==0, + % no numbers read: try whether these are the lines with the Hamming + % distance info + [data, count] = sscanf(s, '; Maximum HD = %i, Minimum HD = %i'); + if count==2, + net.HDmax = data(1); + net.HDmin = data(2); + end + [data, count] = sscanf(s, '; Maximum row HD = %i, Minimum row HD = %i'); + if count==2, + net.rowHDmax = data(1); + net.rowHDmin = data(2); + end + else + % Read some unpleasant number of data + error('Invalid number of columns in the code file'); + end +end +if deletecode, + delete(shortfname); +end +% Dietterichs codes are given as 0/1, we use -1/+1 +if isempty(setdiff(unique(net.code(:)), [0 1])), + net.code(net.code==0)=-1; +end diff --git a/external/svm/ecoctrain.m b/external/svm/ecoctrain.m new file mode 100644 index 00000000..6edf4392 --- /dev/null +++ b/external/svm/ecoctrain.m @@ -0,0 +1,79 @@ +function net = ecoctrain(net, learner1, X, Y, varargin) +% ECOCTRAIN - Train multi class problem with ECOC +% +% NET = ECOCTRAIN(NET, LEARNER, X, Y) +% For an error correcting output code wrapper NET, the bit learners +% are trained given training data X (one example per row) with class +% labels Y. Y(I) is the class label for X(I,:), Y(I) is a number in the +% range 1...NET.NCLASSES +% If LEARNER has size [1 1], it is assumed to be an initialised +% template learning algorithm, for example SVM or MLP. This template +% with its parameter setting is used to train all NET.NBITS bit +% learners. If LEARNER is a cell array of length NET.NBITS, LEARNER{I} +% is used as the template for bit learner I. +% LEARNER is assumed to be standard Netlab structure. The name of the +% training procedure is [LEARNER{I}.TYPE 'FWD']. Any additional +% parameters ECOCTRAIN(NET, LEARNER, X, Y, VARARGIN) are passed on +% directly to the training procedure. +% +% See also ECOC, ECOCLOAD, ECOCFWD. +% + +% +% Copyright (c) by Anton Schwaighofer (2001) +% $Revision: 1.2 $ $Date: 2002/01/07 17:58:21 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +error(nargchk(4, Inf, nargin)); +error(consist(net, 'ecoc')); + +if all(size(learner1)==[1 1]) & isstruct(learner1), + [learner{1:net.nbits}] = deal(learner1); +elseif length(learner1)==net.nbits & iscell(learner1), + learner = learner1; +else + error(['Input parameter LEARNER must be a cell array of length NET.NBITS' ... + ' or a structure array']); +end + +if any((Y<1) | (Y>net.nclasses)) + error('Invalid class labels'); +end +if any((net.code~=1) & (net.code~=-1) & (net.code~=0)), + error('Invalid code matrix. Entries must be +1, -1 or 0.'); +end +if ~all(size(net.code)==[net.nclasses, net.nbits]), + error('Code matrix must be of size [number of classes, number of bits]'); +end + +for i = 1:net.nbits, + if net.verbosity>0, + fprintf('Training for code bit %i (out of %i)\n', i, net.nbits); + end + % Code column i gives the targets for learner i + codei = net.code(:,i); + Yi = Y; + for j = 1:net.nclasses, + Yi(Y==j) = codei(j); + end + % Squash out examples of those classes that have a 0 entry in the + % current code bit + Yi0 = Yi(Yi~=0); + % Code trivial hypothesis directly + if all(Yi0==-1), + learner{i} = -1; + elseif all(Yi0==1), + learner{i} = 1; + else + % If necessary, convert the -1/+1 targets to 0/+1. + if net.use01targets, + Yi0 = (Yi0>0); + end + trainFunc = [learner{i}.type 'train']; + learner{i} = feval(trainFunc, learner{i}, X(Yi~=0,:), Yi0, varargin{:}); + end +end +net.learner = learner; diff --git a/external/svm/loqo.c b/external/svm/loqo.c new file mode 100644 index 00000000..27bbdbef --- /dev/null +++ b/external/svm/loqo.c @@ -0,0 +1,262 @@ +/* Filename: loqo.c + * + * Description: MATLAB interface for LOQO Optimiser + * + * Comments: Quadratic and Linear Programming + * + * Author: Steve Gunn (S.R.Gunn@ecs.soton.ac.uk) + */ + +#include +#include +#include "mex.h" +#include "pr_loqo.h" + +#define Inf 1e30 + +void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]) +{ + double *c=NULL, *b=NULL, *A=NULL, *Q=NULL, *H=NULL, *l=NULL, *u=NULL, *x=NULL, *lambda=NULL, *x0=NULL, *primal=NULL, *dual=NULL; + double *tmpdp=NULL; + double big=Inf; + unsigned int neq=0; + long nmat=0, mmat=0; + long how=0; + int i; + unsigned int verb = 0; + double sigfig_max = 8; + int counter_max = 100000; + double margin = 0.95; + double bound = 10; + int restart = 0; + + static char *str[] = { + "STILL_RUNNING", + "OPTIMAL_SOLUTION", + "SUBOPTIMAL_SOLUTION", + "ITERATION_LIMIT", + "PRIMAL_INFEASIBLE", + "DUAL_INFEASIBLE", + "PRIMAL_AND_DUAL_INFEASIBLE", + "INCONSISTENT", + "PRIMAL_UNBOUNDED", + "DUAL_UNBOUNDED", + "TIME_LIMIT"}; + + if (nrhs > 9 || nrhs < 1) { + mexErrMsgTxt("Usage: [x,lambda,how] = loqo(H,c,A,b,l,u,x0,neqcstr,verbosity)"); + return; + } + switch (nrhs) { + case 9: + if (mxGetM(prhs[8]) != 0 || mxGetN(prhs[8]) != 0) { + if (!mxIsNumeric(prhs[8]) || mxIsComplex(prhs[8]) + || mxIsSparse(prhs[8]) + || !(mxGetM(prhs[8])==1 && mxGetN(prhs[8])==1)) { + mexErrMsgTxt("Ninth argument (display) must be " + "an integer scalar."); + return; + } + verb = (unsigned int)*mxGetPr(prhs[8]); + } + case 8: + if (mxGetM(prhs[7]) != 0 || mxGetN(prhs[7]) != 0) { + if (!mxIsNumeric(prhs[7]) || mxIsComplex(prhs[7]) + || mxIsSparse(prhs[7]) + || !(mxGetM(prhs[7])==1 && mxGetN(prhs[7])==1)) { + mexErrMsgTxt("Eighth argument (neqcstr) must be " + "an integer scalar."); + return; + } + neq = (unsigned int)*mxGetPr(prhs[7]); + } + case 7: + if (mxGetM(prhs[6]) != 0 || mxGetN(prhs[6]) != 0) { + if (!mxIsNumeric(prhs[6]) || mxIsComplex(prhs[6]) + || mxIsSparse(prhs[6]) + || !mxIsDouble(prhs[6]) + || mxGetN(prhs[6])!=1 ) { + mexErrMsgTxt("Seventh argument (x0) must be " + "a column vector."); + return; + } + x0 = mxGetPr(prhs[6]); + nmat = mxGetM(prhs[6]); + } + case 6: + if (mxGetM(prhs[5]) != 0 || mxGetN(prhs[5]) != 0) { + if (!mxIsNumeric(prhs[5]) || mxIsComplex(prhs[5]) + || mxIsSparse(prhs[5]) + || !mxIsDouble(prhs[5]) + || mxGetN(prhs[5])!=1 ) { + mexErrMsgTxt("Sixth argument (u) must be " + "a column vector."); + return; + } + if (nmat != 0 && nmat != mxGetM(prhs[5])) { + mexErrMsgTxt("Dimension error (arg 6 and later)."); + return; + } + u = mxGetPr(prhs[5]); + nmat = mxGetM(prhs[5]); + } + case 5: + if (mxGetM(prhs[4]) != 0 || mxGetN(prhs[4]) != 0) { + if (!mxIsNumeric(prhs[4]) || mxIsComplex(prhs[4]) + || mxIsSparse(prhs[4]) + || !mxIsDouble(prhs[4]) + || mxGetN(prhs[4])!=1 ) { + mexErrMsgTxt("Fifth argument (l) must be " + "a column vector."); + return; + } + if (nmat != 0 && nmat != mxGetM(prhs[4])) { + mexErrMsgTxt("Dimension error (arg 5 and later)."); + return; + } + l = mxGetPr(prhs[4]); + nmat = mxGetM(prhs[4]); + } + case 4: + if (mxIsEmpty(prhs[3])) + { /* No Constraints */ + mmat = 0; + } + else + { /* Constraints */ + if (mxGetM(prhs[3]) != 0 || mxGetN(prhs[3]) != 0) { + if (!mxIsNumeric(prhs[3]) || mxIsComplex(prhs[3]) + || mxIsSparse(prhs[3]) + || !mxIsDouble(prhs[3]) + || mxGetN(prhs[3])!=1 ) { + mexErrMsgTxt("Fourth argument (b) must be " + "a column vector."); + return; + } + if (mmat != 0 && mmat != mxGetM(prhs[3])) { + mexErrMsgTxt("Dimension error (arg 4 and later)."); + return; + } + b = mxGetPr(prhs[3]); + } + } + case 3: + if (mxIsEmpty(prhs[2])) + { /* No Constraints */ + if (mmat != 0) { + mexErrMsgTxt("Dimension error (arg 3 and later)."); + return; + } + } + else + { /* Constraints */ + if (mxGetM(prhs[2]) != 0 || mxGetN(prhs[2]) != 0) { + if (!mxIsNumeric(prhs[2]) || mxIsComplex(prhs[2]) + || mxIsSparse(prhs[2]) ) { + mexErrMsgTxt("Third argument (A) must be " + "a matrix."); + return; + } + if (mmat != 0 && mmat != mxGetM(prhs[2])) { + mexErrMsgTxt("Dimension error (arg 3 and later)."); + return; + } + if (nmat != 0 && nmat != mxGetN(prhs[2])) { + mexErrMsgTxt("Dimension error (arg 3 and later)."); + return; + } + mmat = mxGetM(prhs[2]); + nmat = mxGetN(prhs[2]); + A = mxGetPr(prhs[2]); + } + } + tmpdp = (double *)malloc((nmat+mmat)*sizeof(double)); + for(i=0;i Inf ? Inf : u[i]); + u = tmpdp; + /* Equality constraints */ + for(i=nmat;i<(int)(nmat+neq);i++) { l[i] = u[i] = 0; } + /* InEquality constraints */ + for(i=nmat + neq;i 3 || nlhs < 1) { + mexErrMsgTxt("Usage: [x,lambda,how] = loqo(H,c,A,b,l,u,x0,neqcstr,verbosity)"); + return; + } + + primal = (double *)calloc((3*nmat),sizeof(double)); + dual = (double *)calloc((mmat+2*nmat),sizeof(double)); + + how = pr_loqo(nmat, mmat, c, H, A, b, l, u, primal, dual, verb, sigfig_max, counter_max, margin, bound, restart); + + switch (nlhs) { + case 3: + plhs[2] = mxCreateString(str[how]); + case 2: + plhs[1] = mxCreateDoubleMatrix(mmat, 1, mxREAL); + lambda = mxGetPr(plhs[1]); + for(i=0; iDY5ul>OBAP>C&G~V$V%@ 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 J{qM;F{{`aqk!Sz_ literal 0 HcmV?d00001 diff --git a/external/svm/pr_loqo.c b/external/svm/pr_loqo.c new file mode 100644 index 00000000..6ad1d55a --- /dev/null +++ b/external/svm/pr_loqo.c @@ -0,0 +1,614 @@ +/* + * File: pr_loqo.c + * Purpose: solves quadratic programming problem for pattern recognition + * for support vectors + * + * Author: Alex J. Smola + * Created: 10/14/97 + * Updated: 11/08/97 + * + * + * Copyright (c) 1997 GMD Berlin - All rights reserved + * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE of GMD Berlin + * The copyright notice above does not evidence any + * actual or intended publication of this work. + * + * Unauthorized commercial use of this software is not allowed + */ + +#include +#include +#include +#include +#include "pr_loqo.h" + +#define max(A, B) ((A) > (B) ? (A) : (B)) +#define min(A, B) ((A) < (B) ? (A) : (B)) +#define sqr(A) ((A) * (A)) +#define ABS(A) ((A) > 0 ? (A) : (-(A))) + +#define PREDICTOR 1 +#define CORRECTOR 2 + +/***************************************************************** + replace this by any other function that will exit gracefully + in a larger system + ***************************************************************/ + +void nrerror(char error_text[]) +{ + printf("ERROR: terminating program - %s\n", error_text); + exit(1); +} + +/***************************************************************** + taken from numerical recipes and modified to accept pointers + moreover numerical recipes code seems to be buggy (at least the + ones on the web) + + cholesky solver and backsubstitution + leaves upper right triangle intact (rows first order) + ***************************************************************/ + +void choldc(double a[], int n, double p[]) +{ + void nrerror(char error_text[]); + int i, j, k; + double sum; + + for (i = 0; i < n; i++){ + for (j = i; j < n; j++) { + sum=a[n*i + j]; + for (k=i-1; k>=0; k--) sum -= a[n*i + k]*a[n*j + k]; + if (i == j) { + if (sum <= 0.0) + nrerror("choldc failed, matrix not positive definite"); + p[i]=sqrt(sum); + } else a[n*j + i] = sum/p[i]; + } + } +} + +void cholsb(double a[], int n, double p[], double b[], double x[]) +{ + int i, k; + double sum; + + for (i=0; i=0; k--) sum -= a[n*i + k]*x[k]; + x[i]=sum/p[i]; + } + + for (i=n-1; i>=0; i--) { + sum=x[i]; + for (k=i+1; k=0; k--) sum -= a[n*i + k]*x[k]; + x[i]=sum/p[i]; + } +} + +void chol_backward(double a[], int n, double p[], double b[], double x[]) +{ + int i, k; + double sum; + + for (i=n-1; i>=0; i--) { + sum=b[i]; + for (k=i+1; k 0) { + s[i] = bound; + z[i] = sigma[i] + bound; + } + else { + s[i] = bound - sigma[i]; + z[i] = bound; + } + } + } + else { /* use default start settings */ + for (i=0; i= STATUS) { + printf("counter | pri_inf | dual_inf | pri_obj | dual_obj | "); + printf("sigfig | alpha | nu \n"); + printf("-------------------------------------------------------"); + printf("---------------------------\n"); + } + + while (status == STILL_RUNNING) { + /* predictor */ + + /* put back original diagonal values */ + for (i=0; i counter_max) status = ITERATION_LIMIT; + if (sigfig > sigfig_max) status = OPTIMAL_SOLUTION; + if (primal_inf > 10e100) status = PRIMAL_INFEASIBLE; + if (dual_inf > 10e100) status = DUAL_INFEASIBLE; + if ((primal_inf > 10e100) & (dual_inf > 10e100)) status = PRIMAL_AND_DUAL_INFEASIBLE; + if (ABS(primal_obj) > 10e100) status = PRIMAL_UNBOUNDED; + if (ABS(dual_obj) > 10e100) status = DUAL_UNBOUNDED; + + /* write some nice routine to enforce the time limit if you + _really_ want, however it's quite useless as you can compute + the time from the maximum number of iterations as every + iteration costs one cholesky decomposition plus a couple of + backsubstitutions */ + + /* generate report */ + if ((verb >= FLOOD) | ((verb == STATUS) & (status != 0))) + printf("%7i | %.2e | %.2e | % .2e | % .2e | %6.3f | %.4f | %.2e\n", + counter, primal_inf, dual_inf, primal_obj, dual_obj, + sigfig, alfa, mu); + + counter++; + + if (status == 0) { /* we may keep on going, otherwise + it'll cost one loop extra plus a + messed up main diagonal of h_x */ + /* intermediate variables (the ones with hat) */ + for (i=0; i= STATUS)) { + printf("----------------------------------------------------------------------------------\n"); + printf("optimization converged\n"); + } + + /* free memory */ + free(workspace); + free(diag_h_x); + free(h_y); + free(c_x); + free(c_y); + free(h_dot_x); + + free(rho); + free(nu); + free(tau); + free(sigma); + free(gamma_z); + free(gamma_s); + + free(hat_nu); + free(hat_tau); + + free(delta_x); + free(delta_y); + free(delta_s); + free(delta_z); + free(delta_g); + free(delta_t); + + free(d); + + /* and return to sender */ + return status; +} + diff --git a/external/svm/pr_loqo.h b/external/svm/pr_loqo.h new file mode 100644 index 00000000..5c0cc289 --- /dev/null +++ b/external/svm/pr_loqo.h @@ -0,0 +1,93 @@ +/* + * File: pr_loqo.h + * Purpose: solves quadratic programming problem for pattern recognition + * for support vectors + * + * Author: Alex J. Smola + * Created: 10/14/97 + * Updated: 11/08/97 + * + * + * Copyright (c) 1997 GMD Berlin - All rights reserved + * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE of GMD Berlin + * The copyright notice above does not evidence any + * actual or intended publication of this work. + * + * Unauthorized commercial use of this software is not allowed + */ + +/* verbosity levels */ + +#define QUIET 0 +#define STATUS 1 +#define FLOOD 2 + +/* status outputs */ + +#define STILL_RUNNING 0 +#define OPTIMAL_SOLUTION 1 +#define SUBOPTIMAL_SOLUTION 2 +#define ITERATION_LIMIT 3 +#define PRIMAL_INFEASIBLE 4 +#define DUAL_INFEASIBLE 5 +#define PRIMAL_AND_DUAL_INFEASIBLE 6 +#define INCONSISTENT 7 +#define PRIMAL_UNBOUNDED 8 +#define DUAL_UNBOUNDED 9 +#define TIME_LIMIT 10 + +/* + * solve the quadratic programming problem + * + * minimize c' * x + 1/2 x' * H * x + * subject to A*x = b + * l <= x <= u + * + * for a documentation see R. Vanderbei, LOQO: an Interior Point Code + * for Quadratic Programming + */ + +/* + * n : number of primal variables + * m : number of constraints (typically 1) + * h_x : dot product matrix (n.n) + * a : constraint matrix (n.m) + * b : constant term (m) + * l : lower bound (n) + * u : upper bound (m) + * + * primal : workspace for primal variables, has to be of size 3 n + * + * x = primal; n + * g = x + n; n + * t = g + n; n + * + * dual : workspace for dual variables, has to be of size m + 2 n + * + * y = dual; m + * z = y + m; n + * s = z + n; n + * + * verb : verbosity level + * sigfig_max : number of significant digits + * counter_max: stopping criterion + * restart : 1 if restart desired + * + */ + +int pr_loqo(int n, int m, double c[], double h_x[], double a[], double b[], + double l[], double u[], double primal[], double dual[], + int verb, double sigfig_max, int counter_max, + double margin, double bound, int restart); + +/* + * compile with + cc -O4 -c pr_loqo.c + cc -xO4 -fast -xarch=v8plus -xchip=ultra -xparallel -c pr_loqo.c + mex pr_loqo_c.c pr_loqo.o + cmex4 pr_loqo_c.c pr_loqo.o -DMATLAB4 -o pr_loqo_c4 + * + */ + + + diff --git a/external/svm/svm toolbox.URL b/external/svm/svm toolbox.URL new file mode 100644 index 0000000000000000000000000000000000000000..6d3d1117d7599fc41d70af578200379d7a0ff2f1 GIT binary patch literal 74 zcma#{%qvMP%1bQ?&d4t+NiHpk<>d+u^0Cb*DJihh*Do(G*UL=L)GH}XFG{S^ODxe( dEKbfSPs~i$FV0UZDNig))ypW!&Ee%@0001v8leCH literal 0 HcmV?d00001 diff --git a/external/svm/svm.m b/external/svm/svm.m new file mode 100644 index 00000000..f3311e0e --- /dev/null +++ b/external/svm/svm.m @@ -0,0 +1,123 @@ +function net = svm(nin, kernel, kernelpar, C, use2norm, qpsolver, qpsize) +% SVM - Create a Support Vector Machine classifier +% +% NET = SVM(NIN, KERNEL, KERNELPAR, C, USE2NORM, QPSOLVER, QPSIZE) +% (All parameters from KERNELPAR on are optional). +% Initialise a structure NET containing the basic settings for a Support +% Vector Machine (SVM) classifier. The SVM is assumed to have input of +% dimension NIN, it works with kernel function KERNEL. If the kernel +% function needs extra parameters, these must be given in the array +% KERNELPAR. See function SVMKERNEL for a list of valid kernel +% functions. +% +% The structure NET has the following fields: +% Basic SVM parameters: +% 'type' = 'svm' +% 'nin' = NIN number of input dimensions +% 'nout' = 1 number of output dimensions +% 'kernel' = KERNEL kernel function +% 'kernelpar' = KERNELPAR parameters for the kernel function +% 'c' = C Upper bound for the coefficients NET.alpha during +% training. Depending on the size of NET.c, the value is +% interpreted as follows: +% LENGTH(NET.c)==1: Upper bound for all coefficients. +% LENGTH(NET.c)==2: Different upper bounds for positive (+1) and +% negative (-1) examples. NET.c(1) is the bound for the positive, +% NET.c(2) is the bound for the negative examples. +% LENGTH(NET.c)==N, where N is the number of examples that are +% passed to SVMTRAIN: NET.c(i) is the upper bound for the +% coefficient NET.alpha(i) associated with example i. +% Default value: 1 +% 'use2norm' = USE2NORM: If non-zero, the training procedure will use +% an objective function that involves the 2norm of the errors on +% the training points, otherwise the 1norm is used (standard +% SVM). Default value: 0. +% +% Fields that will be set during training with SVMTRAIN: +% 'nbexamples' = Number of training examples +% 'alpha' = After training, this field contains a column vector with +% coefficients (weights) for each training example. NET.alpha is +% not used in any subsequent SVM routines, it can be removed after +% training. +% 'svind' = After training, this field contains the indices of those +% training examples that are Support Vectors (those with a large +% enough value of alpha) +% 'sv' = Contains all the training examples that are Support Vectors. +% 'svcoeff' = After training, this field is the product of NET.alpha +% times the label of the corresponding training example, for all +% examples that are Support Vectors. It is given in the same order +% as the examples are given in NET.sv. +% 'bias' = The linear term of the SVM decision function. +% 'normalw' = Normal vector of the hyperplane that separates the +% examples. This is only computed if a linear kernel +% NET.kernel='linear' is used. +% +% Parameters specifically for SVMTRAIN (rarely need to be changed): +% 'qpsolver' = QPSOLVER. QPSOLVER must be one of 'quadprog', 'loqo', +% 'qp' or empty for auto-detect. Name of the function that solves +% the quadratic programming problems in SVMTRAIN. +% Default value: empty (auto-detect). +% 'qpsize' = QPSIZE. The maximum number of points given to the QP +% solver. Default value: 50. +% 'alphatol' = Tolerance for all comparisons that involve the +% coefficients NET.alpha. Default value: 1E-2. +% 'kkttol' = Tolerance for checking the KKT conditions (termination +% criterion) Default value: 5E-2. Lower this when high precision is +% required. +% +% See also: +% SVMKERNEL, SVMTRAIN, SVMFWD +% + +% +% Copyright (c) Anton Schwaighofer (2001) +% $Revision: 1.6 $ $Date: 2002/01/07 19:51:49 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +if nargin < 7, + qpsize = 50; +end +if nargin < 6, + qpsolver = ''; +end +if nargin < 5, + use2norm = 0; +end +if nargin < 4, + C = 1; +end +if nargin < 3, + kernelpar = []; +end + +net.type = 'svm'; +net.nin = nin; +net.nout = 1; +net.kernel = kernel; +net.kernelpar = kernelpar; +net.c = C; +net.use2norm = use2norm; + +net.nbexamples = 0; +net.alpha = []; +net.svcoeff = []; +net.sv = []; +net.svind = []; +net.bias = []; +net.normalw = []; + +net.qpsolver = qpsolver; +net.qpsize = qpsize; +net.alphatol = 1e-2; +net.kkttol = 5e-2; +net.chunksize = 500; +% 'chunksize' = Large matrix operations (for example when evaluating +% the kernel functions) are split up into submatrices with maximum +% size [NET.chunksize, NET.chunksize]. Default value: 500 +net.recompute = Inf; +% 'recompute' = During training, the SVM outputs are updated +% iteratively. After NET.recompute iterations the SVM outputs are +% built again from scratch. Lower this when high precision is required. diff --git a/external/svm/svmcv.m b/external/svm/svmcv.m new file mode 100644 index 00000000..2f7bf368 --- /dev/null +++ b/external/svm/svmcv.m @@ -0,0 +1,261 @@ +function [net, CVErr, paramSeq] = svmcv(net, X, Y, range, step, nfold, Xv, Yv, dodisplay) +% SVMCV - Kernel parameter selection for SVM via cross validation +% +% NET = SVMCV(NET, X, Y, RANGE) +% Given an initialised Support Vector Machine structure NET, the best +% setting of the kernel parameters is computed via 10fold cross +% validation. CV is done on the data points X (one point per row) with +% target values Y (+1 or -1). The kernel parameters that are tested lie +% between MIN(RANGE) and MAX(RANGE), starting with MIN(RANGE) for 'rbf' +% kernels and MAX(RANGE) for all other kernel functions. +% RANGE may also be a vector of length >2, in this case RANGE is taken +% as the explicit sequence of kernel parameters that are tested. +% SVMCV only works for kernel functions that require one parameter. +% +% [NET, CVERR, PARAMSEQ] = SVMCV(NET, X, Y, RANGE, STEP, NFOLD) +% The sequence of test parameters is generated by Param(t+1) = +% Param(t)*STEP for 'rbf' kernels, and Param(t+1) = Param(t)+STEP for +% all other kernels. Default value: SQRT(2) for 'rbf', -1 otherwise. +% Determine the parameters based on NFOLD cross validation. +% If STEP==[], RANGE is again interpreted as the explict sequence of +% kernel parameters. +% +% The tested parameter sequence is returned in PARAMSEQ. For each entry +% PARAMSEQ(i), there is one line CVERR(i,:) that describes the +% estimated test set error. CVERR(i,1) is the mean, CVERR(i,2) is the +% variance of the test set error over all NFOLD runs. +% +% [NET, CVERR, PARAMSEQ] = SVMCV(NET, X, Y, RANGE, STEP, 1, XV, YV) +% does parameter selection based on one fixed validation set XV and +% YV. CVERR(i,2)==0 for all tested parameter settings. +% NET = SVMCV(NET, X, Y, RANGE, STEP, 1, XV, YV, DODISPLAY) displays +% error information for all tested parameters. DODISPLAY==0 shows +% nothing, DODISPLAY==1 shows a final CV summary (default), +% DODISPLAY==2 also shows the test set error for each trained SVM, +% DODISPLAY==3 includes the output produced by SVMTRAIN. +% +% See also +% SVM, SVMTRAIN +% + +% +% Copyright (c) by Anton Schwaighofer (2001) +% $Revision: 1.6 $ $Date: 2001/06/05 19:20:00 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +% Check arguments for consistency +errstring = consist(net, 'svm', X, Y); +if ~isempty(errstring); + error(errstring); +end +if nargin<9, + dodisplay = 1; +end +if nargin<8, + Xv = []; +end +if nargin<7, + Yv = []; +end +if nargin<6, + nfold = 10; +end +if (~isempty(Xv)) & (~isempty(Yv)), + errstring = consist(net, 'svm', Xv, Yv); + if ~isempty(errstring); + error(errstring); + end + if (nfold~=1), + error('Input parameters XV and YV may only be used with NFOLD==1'); + end +end +if nargin<5, + step = 0; +end + +range = range(:)'; +N = size(X, 1); +if N2) | isempty(step), + % If range parameter has more than only min/max entries: Use this as + % the sequence of parameters to test + paramSeq = range; +else + paramSeq = []; + switch net.kernel + case 'rbf' + if step==0, + step = sqrt(2); + end + % Multiplicative update, step size < 1 : start with max value + if abs(step)<1, + param = max(range); + while (param>=min(range)), + paramSeq = [paramSeq param]; + param = param*abs(step); + end + else + % Multiplicative update, step size > 1 : start with min value + param = min(range); + while (param<=max(range)), + paramSeq = [paramSeq param]; + param = param*abs(step); + end + end + otherwise + % Additive update for kernels other than 'rbf' + if step==0, + step = -1; + end + if step<0, + paramSeq = max(range):step:min(range); + else + paramSeq = min(range):step:max(range); + end + end +end + + +% Storing all validation set errors for each parameter choice +allErr = zeros(nfold, length(paramSeq)); +% Storing the confusion matrices for each parameter choice +cm = cell(1, length(paramSeq)); +for j = 1:length(paramSeq), + cm{j} = zeros(2); +end + +% shuffle X and Y in the same way +perm = randperm(N); +X = X(perm,:); +Y = Y(perm,:); + +% size of one test set +chsize = floor (N/nfold); +% the training set is not exactly the whole data minus the one test set, +% but it is the union of the other test sets. So only effsize examples +% of the data set will ever be used +effsize = nfold*chsize; + +% check if leave-one-out CV (or almost such) is required +usePrev = (nfold>=(N/2)); +prevInd = []; + +for i = 1:nfold, + % currentX/Y is the current training set + if (nfold == 1), + currentX = X; + currentY = Y; + testX = Xv; + testY = Yv; + else + % start and end index of current test set + ind1 = 1+(i-1)*chsize; + ind2 = i*chsize; + currentInd = [1:(ind1-1), (ind2+1):effsize]; + currentX = X(currentInd, :); + currentY = Y(currentInd, :); + testX = X(ind1:ind2,:); + testY = Y(ind1:ind2,:); + end; + % We start out with the most powerful kernel (smallest sigma for RBF + % kernel, highest degree for polynomial). We assume that all training + % examples will be support vectors due to overfitting, thus we start + % the optimization with a value of C/2 for each example. + if length(net.c(:))==1, + alpha0 = repmat(net.c, [length(currentY) 1]); + % The same upper bound for all examples + elseif length(net.c(:))==2, + alpha0 = zeros([length(currentY) 1]); + alpha0(currentY>0) = net.c(1); + alpha0(currentY<=0) = net.c(2); + % Different upper bounds C for the positive and negative examples + else + net2.c = net.c(perm); + alpha0 = net2.c(currentInd); + % Use different C for each example: permute the original C's + end + alpha0 = alpha0/2; + % Start out with alpha = C/2 for the optimization routine. + % another little trick for leave-one-out CV: training sets will only + % slightly differ, thus use the alphas from the previous iteration, + % even if it resulted from a different parameter setting, as initial + % values alpha0 + if usePrev & ~isempty(prevInd), + a = zeros(N, 1); + a(currentInd) = alpha0; + a(prevInd) = prevAlpha; + alpha0 = a(currentInd); + end + + % Now loop over all parameter settings and train the SVM on currentX/Y + net2 = net; + if (dodisplay>0), + fprintf('Split %i of the training data:\n', i); + end + for j = 1:length(paramSeq), + param = paramSeq(j); + net2.kernelpar = param; + % Plug the current parameter settings into the SVM and train on the + % current training set + net2 = svmtrain(net2, currentX, currentY, alpha0, max(0,dodisplay-2)); + % Evaluate on the non-training data + testPred = svmfwd(net2, testX); + allErr(i, j) = mean(testY ~= testPred); + % Compute the confusion matrix + for k = [1 2], + for l = [1 2], + c(k,l) = sum(((testPred>=0)==(l-1)).*((testY>=0)==(k-1))); + end + end + cm{j} = cm{j}+c; + % take out the computed coefficients alpha and use them as starting + % values for the next iteration (next parameter choice) + alpha0 = net2.alpha; + if (dodisplay>1), + fprintf('Split %i with parameter %g:\n', i, param); + fprintf(' Test set error = %2.3f%%\n', allErr(i, j)*100); + [fracSV, normW] = svmstat(net2, (dodisplay>2)); + fprintf(' Norm of the separating hyperplane: %g\n', normW); + fprintf(' Fraction of support vectors: %2.3f%%\n', fracSV*100); + end + end + if usePrev, + prevAlpha = net2.alpha; + prevInd = currentInd; + end +end + +% Compute mean and standard deviation over all nfold runs +meanErr = mean(allErr, 1); +stdErr = std(allErr, 0, 1); +CVErr = [meanErr; stdErr]'; +% Find the point of minimum mean error and plug that parameter into the +% output SVM structure. If there should be several points of minimal +% error, select the one with minimal standard deviation +[sortedMean, sortedInd] = sort(meanErr); +minima = find(sortedMean(1)==meanErr); +[dummy, sortedInd2] = sort(stdErr(minima)); +net.kernelpar = paramSeq(minima(sortedInd2(1))); + +if (dodisplay>0), + for j = 1:length(paramSeq), + fprintf('kernelpar=%g: Avg CV error %2.3f%% with stddev %1.4f\n', ... + paramSeq(j), meanErr(j)*100, stdErr(j)*100); + if any(cm{j}~=0), + fprintf(' Confusion matrix, averaged over all runs:\n'); + fprintf(' Predicted class:\n'); + fprintf(' %5i %5i\n', -1, +1); + c1 = cm{j}'; + c2 = 100*c1./repmat(sum(c1), [2 1]); + c3 = [c1(:) c2(:)]'; + fprintf([' True -1: %5i (%3.2f%%) %5i (%3.2f%%)\n True +1: %5i' ... + ' (%3.2f%%) %5i (%3.2f%%)\n'], c3(:)); + end + end +end diff --git a/external/svm/svmfwd.m b/external/svm/svmfwd.m new file mode 100644 index 00000000..62f8f517 --- /dev/null +++ b/external/svm/svmfwd.m @@ -0,0 +1,71 @@ +function [Y, Y1] = svmfwd(net, X) +% SVMFWD - Forward propagation through Support Vector Machine classifier +% +% Y = SVMFWD(NET, X) +% For a data structure NET, the matrix of vectors X is input into the +% Support Vector Machine described by NET and the matrix of outputs Y +% is computed. NET must have non-empty fields NET.sv, NET.svcoeff and +% NET.bias, these fields are set during training by SVMTRAIN. +% X must contain one input vector per row. Y is a column vector with +% one entry for each input vector in X. Y(i) is the SVM output for +% input vector X(i,:), it is +% +1, if X(i,:) is classified as belonging to class 1 +% -1, if X(i,:) is classified as belonging to class -1 +% [Y, Y1] = SVMFWD(NET, X) also gives the column vector Y1 containing +% the SVM output before computing the sign. Y1(i) is equivalent to the +% distance of point X(i,:) from the separating hyperplane. +% +% See also +% SVM, SVMTRAIN, SVMKERNEL +% + +% +% Copyright (c) Anton Schwaighofer (2001) +% $Revision: 1.2 $ $Date: 2002/01/07 19:53:06 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +% Check arguments for consistency +errstring = consist(net, 'svm', X); +if ~isempty(errstring); + error(errstring); +end +[N d] = size(X); +if strcmp(net.kernel, 'linear'), + if ~isfield(net, 'normalw') | ~all(size(net.normalw)==[1 d]), + error('Structure NET does not contain a valid field ''normalw'''); + end +else + if ~isfield(net, 'sv') | ((size(net.sv, 2)~=d) & ~isempty(net.sv)), + error('Structure NET does not contain a valid field ''sv'''); + end + nbSV = size(net.sv, 1); + if nbSV~=size(net.svcoeff, 1), + error('Structure NET does not contain a valid field ''svcoeff'''); + end + if ~isfield(net, 'bias') | ~all(size(net.bias)==[1 1]), + error('Structure NET does not contain a valid field ''bias'''); + end +end + +if strcmp(net.kernel, 'linear'), + Y1 = X*(net.normalw'); +else + chsize = net.chunksize; + Y1 = zeros(N, 1); + chunks1 = ceil(N/chsize); + chunks2 = ceil(nbSV/chsize); + for ch1 = 1:chunks1, + ind1 = (1+(ch1-1)*chsize):min(N, ch1*chsize); + for ch2 = 1:chunks2, + ind2 = (1+(ch2-1)*chsize):min(nbSV, ch2*chsize); + K12 = svmkernel(net, X(ind1, :), net.sv(ind2, :)); + Y1(ind1) = Y1(ind1)+K12*net.svcoeff(ind2); + end + end +end +Y1 = Y1+net.bias; +Y = sign(Y1); +Y(Y==0) = 1; diff --git a/external/svm/svmkernel.m b/external/svm/svmkernel.m new file mode 100644 index 00000000..332a6c3a --- /dev/null +++ b/external/svm/svmkernel.m @@ -0,0 +1,85 @@ +function K = svmkernel(net, X1, X2) +% SVMKERNEL - Compute Support Vector Machine kernel function +% +% K = SVMKERNEL(NET, X1, X2) +% The Support Vector Machine structure NET must contain 2 field +% NET.kernel and NET.kernelpar, selecting the kernel function and its +% parameters. X1 and X2 contain one example per row. If X1 is of size +% [M, NET.nin] and X2 is of size [N, NET.nin], K will be a matrix +% [M, N]. K(i,j) is the result of the kernelfunction for inputs X1(i,:) +% and X2(j,:). +% Currently the only valid kernel functions are +% NET.kernel = 'linear' +% inner product +% NET.kernel = 'poly' +% (1+inner product)^NET.kernelpar(1) +% NET.kernel = 'rbf' +% radial basis function, common length scale for all inputs is +% NET.kernelpar(1), scaled with the number of inputs NET.nin +% K = exp(-sum((X1i-X2i)^2)/(NET.kernelpar(1)*NET.nin)) +% NET.kernel = 'rbffull' +% radial basis function, different length scale for each input. +% If NET.kernelpar is a vector of length NET.nin +% K = exp(-sum((X1i-X2i)^2*NET.kernelpar(i))/NET.nin) +% If NET.kernelpar is a vector of length NET.nin+1 +% K = exp(NET.kernelpar(end)-sum((X1i-X2i)^2*NET.kernelpar(i))/NET.nin) +% If NET.kernelpar is a matrix of size [NET.nin, NET.nin] +% K = exp(-(X1-X2)*NET.kernelpar*(X1-X2)'/NET.nin) +% +% See also +% SVM, SVMTRAIN, SVMFWD +% + +% +% Copyright (c) Anton Schwaighofer (2001) +% $Revision: 1.3 $ $Date: 2001/06/18 15:21:55 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +errstring = consist(net, 'svm', X1); +if ~isempty(errstring); + error(errstring); +end +errstring = consist(net, 'svm', X2); +if ~isempty(errstring); + error(errstring); +end +[N1, d] = size(X1); +[N2, d] = size(X2); + +switch net.kernel + case 'linear' + K = X1*X2'; + case 'poly' + K = (1+X1*X2').^net.kernelpar(1); + case 'rbf' + dist2 = repmat(sum((X1.^2)', 1), [N2 1])' + ... + repmat(sum((X2.^2)',1), [N1 1]) - ... + 2*X1*(X2'); + K = exp(-dist2/(net.nin*net.kernelpar(1))); + case 'rbffull' + bias = 0; + if any(all(repmat(size(net.kernelpar), [4 1]) == ... + [d 1; 1 d; d+1 1; 1 d+1], 2), 1), + weights = diag(net.kernelpar(1:d)); + if length(net.kernelpar)>d, + bias = net.kernelpar(end); + end + elseif all(size(net.kernelpar)==[d d]), + weights = net.kernelpar; + else + error('Size of NET.kernelpar does not match the chosen kernel ''rbffull'''); + end + dist2 = (X1.^2)*weights*ones([d N2]) + ... + ones([N1 d])*weights*(X2.^2)' - ... + 2*X1*weights*(X2'); + K = exp(bias-dist2/net.nin); + otherwise + error('Unknown kernel function'); +end +K = double(K); +% Convert to full matrix if inputs are sparse + + diff --git a/external/svm/svmstat.m b/external/svm/svmstat.m new file mode 100644 index 00000000..ec6dcdad --- /dev/null +++ b/external/svm/svmstat.m @@ -0,0 +1,139 @@ +function [fracSV, normW, nbSV, nbBoundSV, posSV, negSV, posBound, negBound] = svmstat(net, doDisplay) +% SVMSTAT - Support Vector Machine statistics +% +% [FRACSV,NORMW,NBSV,NBBOUNDSV,NBPOSSV,NBNEGSV,NBPOSBOUND,NBNEGBOUND] +% = SVMSTAT(NET) +% For a trained SVM in structure NET the most important figures are +% computed, that are +% FRACSV (the fraction of Support Vectors in the training set) +% NORMW (the norm of the separating hyperplane) +% NBSV (the total number of Support Vectors) +% NBBOUNDSV (number of SVs where the coefficient is at the upper bound, +% these are the misclassified training examples) +% POSSV (indices of Support Vectors from positive examples) +% NEGSV (indices of Support Vectors from negative examples) +% POSBOUND (indices of SVs from positive examples that are at the bound) +% NEGBOUND (indices of SVs from negative examples that are at the bound) +% If the SVM has been trained with the 2norm of the errors (slack +% variables), then NBBOUNDSV, POSBOUND and NEGBOUND will be 0 resp. []. +% All the indices are for use in NET.sv respectively NET.svind +% SVMSTAT(NET,1) prints out all that values. +% +% See also +% SVM, SVMTRAIN, SVMFWD +% + +% +% Copyright (c) Anton Schwaighofer (2001) +% $Revision: 1.3 $ $Date: 2001/02/14 09:05:20 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +if nargin<2, + doDisplay = 0; +end + +nbSV = 0; +fracSV = 0; +nbPosSV = 0; +nbNegSV = 0; +normW = 0; +if (net.nbexamples<=0) | (size(net.svcoeff,1)==0), + warning('The given SVM has not been trained yet'); + return; +end + +if isfield(net, 'use2norm'), + use2norm = net.use2norm; +else + use2norm = 0; +end + + +posSV = find(net.svcoeff>0); +negSV = find(net.svcoeff<0); +% Indices of the positive and negative examples that have become Support +% Vectors +nbPosSV = length(posSV); +nbNegSV = length(negSV); +nbSV = nbPosSV+nbNegSV; +fracSV = nbSV/net.nbexamples; +if (nargout<2) & ~doDisplay, + % shortcut to avoid the expensive computation of the norm + return; +end + +% Extract the upper bound for the examples that are Support Vectors +if length(net.c(:))==1, + C = repmat(net.c, [length(net.svcoeff) 1]); + % The same upper bound for all examples +elseif length(net.c(:))==2, + C = zeros([length(net.svcoeff) 1]); + C(posSV) = net.c(1); + C(negSV) = net.c(2); + % Different upper bounds C for the positive and negative examples +else + C = net.c(net.svind); +end + +if isfield(net, 'alphatol'), + tol = net.alphatol; +else + tol = net.accur; + % old versions of SVM used only one field NET.accur +end +if use2norm, + posBound = []; + negBound = []; +else + posBound = find(abs(net.svcoeff(posSV))>(C(posSV)-tol)); + negBound = find(abs(net.svcoeff(negSV))>(C(negSV)-tol)); +end +nbPosBound = length(posBound); +nbNegBound = length(negBound); +nbBoundSV = nbPosBound+nbNegBound; + +if strcmp(net.kernel, 'linear') & isfield(net, 'normalw'), + normW = norm(net.normalw); + % linear kernel: norm of the separating hyperplane can be computed + % directly +else + if use2norm, + alpha = abs(net.svcoeff); + % For the 2norm SVM, the norm of the hyperplance is easy to compute + normW = sqrt(sum(alpha)+sum((alpha.^2)./C)); + else + % normal 1norm SVM: + [dummy, svOutput] = svmfwd(net, net.sv); + svOutput = svOutput-net.bias; + % norm of the hyperplane is computed using the output + % of the SVM for all Support Vectors without the bias term + normW = sqrt(net.svcoeff'*svOutput); + % norm is basically the quadratic term of the SVM objective function + end +end + +if doDisplay, + fprintf('Number of Support Vectors (SV): %i\n', nbSV); + fprintf(' (that is a fraction of %2.3f%% of the training examples)\n', ... + 100*fracSV); + if ~use2norm, + fprintf(' %i of the SV have a coefficient ALPHA at the upper bound\n', ... + nbBoundSV); + end + fprintf(' %i Support Vectors from positive examples\n', nbPosSV); + if ~use2norm, + fprintf(' %i of them have a coefficient ALPHA at the upper bound\n', ... + nbPosBound); + end + fprintf(' %i Support Vectors from negative examples\n', nbNegSV); + if ~use2norm, + fprintf(' %i of them have a coefficient ALPHA at the upper bound\n', ... + nbNegBound); + end + fprintf('Norm of the separating hyperplane: %g\n', normW); +end + + diff --git a/external/svm/svmtrain.m b/external/svm/svmtrain.m new file mode 100644 index 00000000..3b34d5a5 --- /dev/null +++ b/external/svm/svmtrain.m @@ -0,0 +1,596 @@ +function net = svmtrain(net, X, Y, alpha0, dodisplay) +% SVMTRAIN - Train a Support Vector Machine classifier +% +% NET = SVMTRAIN(NET, X, Y) +% Train the SVM given by NET using the training data X with target values +% Y. X is a matrix of size (N,NET.nin) with N training examples (one per +% row). Y is a column vector containing the target values (classes) for +% each example in X. Each element of Y that is >=0 is treated as class +% +1, each element <0 is treated as class -1. +% SVMTRAIN normally uses L1-norm of all training set errors in the +% objective function. If NET.use2norm==1, L2-norm is used. +% +% All training parameters are given in the structure NET. Relevant +% parameters are mainly NET.c, for fine-tuning also NET.qpsize, +% NET.alphatol and NET.kkttol. See function SVM for a description of +% these fields. +% +% NET.c is a weight for misclassifying a particular example. NET.c may +% either be a scalar (where all errors have the same weights), or it may +% be a column vector (size [N 1]) where entry NET.c(i) corresponds to the +% error weight for example X(i,:). If NET.c is e vector of length 2, +% NET.c(1) specifies the error weight for all positive examples, NET.c(2) +% is the error weight for all negative examples. Specifying a different +% weight for each example may be used for imbalanced data sets. +% +% NET = SVMTRAIN(NET, X, Y, ALHPA0) uses the column vector ALPHA0 as +% the initial values for the coefficients NET.alpha. ALPHA0 may result +% from a previous training with different parameters. +% NET = SVMTRAIN(NET, X, Y, ALPHA0, 1) displays information on the +% training progress (number of errors in the current iteration, etc) +% SVMTRAIN uses either the function LOQO (Matlab-Interface to Smola's +% LOQO code) or the routines QP/QUADPROG from the Matlab Optimization +% Toolbox to solve the quadratic programming problem. +% +% See also: +% SVM, SVMKERNEL. SVMFWD +% + +% +% Copyright (c) Anton Schwaighofer (2001) +% $Revision: 1.19 $ $Date: 2002/01/09 12:11:41 $ +% mailto:anton.schwaighofer@gmx.net +% +% This program is released unter the GNU General Public License. +% + +% Training a SVM involves solving a quadratic programming problem that +% scales quadratically with the number of examples. SVMTRAIN uses the +% decomposed training algorithm proposed by Osuna, Freund and Girosi, where +% the maximum size of a quadratic program is constant. +% (ftp://ftp.ai.mit.edu/pub/cbcl/nnsp97-svm.ps) +% For selecting the working set, the approximation proposed by Joachims +% (http://www-ai.cs.uni-dortmund.de/DOKUMENTE/joachims_99a.ps.gz) is used. + + +% Check arguments for consistency +errstring = consist(net, 'svm', X, Y); +if ~isempty(errstring); + error(errstring); +end +[N, d] = size(X); +if N==0, + error('No training examples given'); +end +net.nbexamples = N; +if nargin<5, + dodisplay = 0; +end +if nargin<4, + alpha0 = []; +elseif (~isempty(alpha0)) & (~all(size(alpha0)==[N 1])), + error(['Initial values ALPHA0 must be a column vector with the same length' ... + ' as X']); +end + +% Find the indices of examples from class +1 and -1 +class1 = logical(uint8(Y>=0)); +class0 = logical(uint8(Y<0)); + +if length(net.c(:))==1, + C = repmat(net.c, [N 1]); + % The same upper bound for all examples +elseif length(net.c(:))==2, + C = zeros([N 1]); + C(class1) = net.c(1); + C(class0) = net.c(2); + % Different upper bounds C for the positive and negative examples +else + C = net.c; + if ~all(size(C)==[N 1]), + error(['Upper bound C must be a column vector with the same length' ... + ' as X']); + end +end +if min(C)0, + fprintf('Training set: %i examples (%i positive, %i negative)\n', ... + length(Y), length(find(class1)), length(find(class0))); +end + +% Start with a vector of zeros for the coefficients alpha, or the +% parameter ALPHA0, if it is given. Those values will be used to perform +% an initial working set selection, by assuming they are the true weights +% for the training set at hand. +if ~any(alpha0), + net.alpha = zeros([N 1]); + % If starting with a zero vector: randomize the first working set search + randomWS = 1; +else + randomWS = 0; + % for 1norm SVM: make the initial values conform to the upper bounds + if ~net.use2norm, + net.alpha = min(C, alpha0); + end +end +alphaOld = net.alpha; + +if length(find(Y>0))==N, + % only positive examples + net.bias = 1; + net.svcoeff = []; + net.sv = []; + net.svind = []; + net.alpha = zeros([N 1]); + return; +elseif length(find(Y<0))==N, + % only negative examples + net.bias = 1; + net.svcoeff = []; + net.sv = []; + net.svind = []; + net.alpha = zeros([N 1]); + return; +end + +iteration = 0; +workset = logical(uint8(zeros(N, 1))); +sameWS = 0; +net.bias = 0; + +while 1, + + if dodisplay>0, + fprintf('\nIteration %i: ', iteration+1); + end + + % Step 1: Determine the Support Vectors. + [net, SVthresh, SV, SVbound, SVnonbound] = findSV(net, C); + if dodisplay>0, + fprintf(['Working set of size %i: %i Support Vectors, %i of them at' ... + ' bound C\n'], length(find(workset)), length(find(workset & SV)), ... + length(find(workset & SVbound))); + fprintf(['Whole training set: %i Support Vectors, %i of them at upper' ... + ' bound C.\n'], length(net.svind), length(find(SVbound))); + if dodisplay>1, + fprintf('The Support Vectors (threshold %g) are the examples\n', ... + SVthresh); + fprintf(' %i', net.svind); + fprintf('\n'); + end + end + + + % Step 2: Find the output of the SVM for all training examples + if (iteration==0) | (mod(iteration, net.recompute)==0), + % Every NET.recompute iterations the SVM output is built from + % scratch. Use all Support Vectors for determining the output. + changedSV = net.svind; + changedAlpha = net.alpha(changedSV); + SVMout = zeros(N, 1); + if strcmp(net.kernel, 'linear'), + net.normalw = zeros([1 d]); + end + else + % A normal iteration: Find the coefficients that changed and adjust + % the SVM output only by the difference of old and new alpha + changedSV = find(net.alpha~=alphaOld); + changedAlpha = net.alpha(changedSV)-alphaOld(changedSV); + end + + if strcmp(net.kernel, 'linear'), + chunks = ceil(length(changedSV)/chsize); + % Linear kernel: Build the normal vector of the separating + % hyperplane by computing the weighted sum of all Support Vectors + for ch = 1:chunks, + ind = (1+(ch-1)*chsize):min(length(changedSV), ch*chsize); + temp = changedAlpha(ind).*Y(changedSV(ind)); + net.normalw = net.normalw+temp'*X(changedSV(ind), :); + end + % Find the output of the SVM by multiplying the examples with the + % normal vector + SVMout = zeros(N, 1); + chunks = ceil(N/chsize); + for ch = 1:chunks, + ind = (1+(ch-1)*chsize):min(N, ch*chsize); + SVMout(ind) = X(ind,:)*(net.normalw'); + end + else + % A normal kernel function: Split both the examples and the Support + % Vectors into small chunks + chunks1 = ceil(N/chsize); + chunks2 = ceil(length(changedSV)/chsize); + for ch1 = 1:chunks1, + ind1 = (1+(ch1-1)*chsize):min(N, ch1*chsize); + for ch2 = 1:chunks2, + % Compute the kernel function for a chunk of Support Vectors and + % a chunk of examples + ind2 = (1+(ch2-1)*chsize):min(length(changedSV), ch2*chsize); + K12 = svmkernel(net, X(ind1, :), X(changedSV(ind2), :)); + % Add the weighted kernel matrix to the SVM output. In update + % cycles, the kernel matrix is weighted by the difference of + % alphas, in other cycles it is weighted by the value alpha alone. + coeff = changedAlpha(ind2).*Y(changedSV(ind2)); + SVMout(ind1) = SVMout(ind1)+K12*coeff; + end + if dodisplay>2, + K1all = svmkernel(net, X(ind1,:), X(net.svind,:)); + coeff2 = net.alpha(net.svind).*Y(net.svind); + fprintf('Maximum error due to matrix partitioning: %g\n', ... + max((SVMout(ind1)-K1all*coeff2)')); + end + end + end + + + % Step 3: Compute the bias of the SVM decision function. + if net.use2norm, + % The bias can be found from the SVM output for Support Vectors. For + % those vectors, the output should be 1-alpha/C resp -1+alpha/C. + workSV = find(SV & workset); + if ~isempty(workSV), + net.bias = mean((1-net.alpha(workSV)./C(workSV)).*Y(workSV)- ... + SVMout(workSV)); + end + else + % normal 1norm SVM: + % The bias can be found from Support Vector whose value alpha is not at + % the upper bound. For those vectors, the SVM output should be +1 + % resp. -1. + workSV = find(SVnonbound & workset); + if ~isempty(workSV), + net.bias = mean(Y(workSV)-SVMout(workSV)); + end + end + % The nasty case that no SVs to determine the bias have been found. + % The only sensible thing do to is to leave the bias unchanged. + if isempty(workSV) & (dodisplay>0), + disp('No Support Vectors in the current working set.'); + disp('Leaving the bias unchanged.'); + end + + + % Step 4: Compute the values of the Karush-Kuhn-Tucker conditions + % of the quadratic program. If no violations of these conditions are + % found, the optimal solution has been found, and we are finished. + % KKT describes how correct each example is classified. KKT must be + % positive for all examples that are on the correct side and that are + % not Support Vectors + % 0 for all Support Vectors + % negative for all examples on the wrong side of the hyperplane + if net.use2norm, + KKT = (SVMout+net.bias).*Y-1+net.alpha./C; + KKTviolations = logical(uint8((SV & (abs(KKT)>net.kkttol)) | ... + (~SV & (KKT<-net.kkttol)))); + else + KKT = (SVMout+net.bias).*Y-1; + KKTviolations = logical(uint8((SVnonbound & (abs(KKT)>net.kkttol)) | ... + (SVbound & (KKT>net.kkttol)) | ... + (~SV & (KKT<-net.kkttol)))); + end + ind = find(KKTviolations & workset); + if ~isempty(ind), + % The coefficients alpha for the current working set have just been + % optimised, non of those should violate the KKT conditions. + if dodisplay>0, + fprintf('KKT conditions not met in working set (value %g)', ... + max(abs(KKT(ind)))); + end + end + if dodisplay>0, + fprintf('%i violations of the KKT conditions.\n', ... + length(find(KKTviolations))); + fprintf(['(%i violations from positive examples, %i from negative' ... + ' examples)\n'], length(find(KKTviolations & class1)), ... + length(find(KKTviolations & class0))); + if (dodisplay>1) & ~isempty(find(KKTviolations)), + disp('The following examples violate the KKT conditions:'); + fprintf(' %i', find(KKTviolations)); + fprintf('\n'); + end + end + % Check how many violations of the KKT-conditions have been found. If + % none, we are finished. + if length(find(KKTviolations)) == 0, + break; + end + + % Step 5: Determine a new working set. To this aim, a linear + % approximation of the objective function is made. The new working set + % constitutes of the QPSIZE largest elements of the gradient of the + % linear approximation. The gradient of the linear approximation can be + % expressed using the ouput of the SVM on all training examples. + if net.use2norm, + searchDir = SVMout+Y.*(net.alpha./C-1); + set1 = logical(uint8(SV | class0)); + set2 = logical(uint8(SV | class1)); + else + searchDir = SVMout-Y; + set1 = logical(uint8((SV | class0) & (~SVbound | class1))); + set2 = logical(uint8((SV | class1) & (~SVbound | class0))); + end + % During the very first iteration: If no initial values for net.alpha + % are given, perform a random working set selection + if randomWS, + searchDir = rand([N 1]); + set1 = class1; + set2 = class0; + randomWS = 0; + end + + % Step 6: Select the working set. + % Goal is to select an equal number of examples from set1 and set2 + % (QPsize/2 examples from set1, QPsize/2 from set2). The examples from + % set1 are the QPsize/2 highest elements of searchDir for set1, + % the examples from set2 are the QPsize/2 smallest elements of searchDir + % for set2. + worksetOld = workset; + workset = logical(uint8(zeros(N, 1))); + if length(find(set1 | set2)) <= QPsize, + workset(set1 | set2) = 1; + % Less than QPsize examples to select from: Use them all + elseif length(find(set1)) <= floor(QPsize/2), + workset(set1) = 1; + % set1 has less than half QPsize examples: Use all of set1, fill the + % rest with examples from set2 starting with the ones that have low + % values for searchDir + set2 = find(set2 & ~workset); + [dummy, ind] = sort(searchDir(set2)); + from2 = min(length(set2), QPsize-length(find(workset))); + workset(set2(ind(1:from2))) = 1; + elseif length(find(set2)) <= floor(QPsize/2), + % set2 has less than half QPsize examples: Use all of set2, fill the + % rest with examples from set1 starting with the ones that have high + % values for searchDir + workset(set2) = 1; + set1 = find(set1 & ~workset); + [dummy, ind] = sort(-searchDir(set1)); + from1 = min(length(set1), QPsize-length(find(workset))); + workset(set1(ind(1:from1))) = 1; + else + set1 = find(set1); + [dummy, ind] = sort(-searchDir(set1)); + from1 = min(length(set1), floor(QPsize/2)); + workset(set1(ind(1:from1))) = 1; + % Use the QPsize/2 highest values for searchDir from set1 + set2 = find(set2 & ~workset); + % Make sure that no examples are added twice + [dummy, ind] = sort(searchDir(set2)); + from2 = min(length(set2), QPsize-length(find(workset))); + workset(set2(ind(1:from2))) = 1; + % Use the QPsize/2 lowest values for searchDir from set2 + end + worksetind = find(workset); + % Workaround for Matlab bug when indexing sparse arrays with logicals: + % use index set instead + + % Emergency exit: If we end up with the same work set in 2 subsequent + % iterations, something strange must have happened (for example, the + % accuracy of the QP solver is insufficient as compared to the required + % precision given by NET.alphatol and NET.kkttol) + % Exit immediately if 'loqo' is used, since loqo ignores the start + % values, so another iteration will not improve the results. + if all(workset==worksetOld), + sameWS = sameWS+1; + if ((sameWS==3) | strcmp(qpsolver, 'loqo')), + warnstr = 'Working set not changed - check accuracy. Exiting.'; + if dodisplay>0, + disp(warnstr); + end + %warning(warnstr); %PPD - this kept going off? + break; + end + else + sameWS = 0; + end + worksize = length(find(workset)); + nonworkset = ~workset; + if dodisplay>1, + disp('Working set consists of examples '); + fprintf(' %i', find(workset)); + fprintf('\n'); + end + + + % Step 7: Determine the linear part of the quadratic program. We have + % determined the working set already. The linear term of the quadratic + % program is made up of all the kernel evaluations K(Support Vectors + % outside of the working set, Support Vectors in the working set) + nonworkSV = find(nonworkset & SV); + % All Support Vectors outside of the working set + qBN = 0; + if length(nonworkSV)>0, + % The nonworkSV may be a very large matrix. Split up into smaller + % chunks. + chunks = ceil(length(nonworkSV)/chsize); + for ch = 1:chunks, + % Indices of the current chunk in NONWORKSV + ind = (1+(ch-1)*chsize):min(length(nonworkSV), ch*chsize); + % Evaluate kernel function for working set and the current chunk of + % non-working set + Ki = svmkernel(net, X(worksetind, :), X(nonworkSV(ind), :)); + % The linear term qBN for the quadratic program is a column vector + % given by summing up the kernel evaluations multiplied by the + % corresponding alpha's and the class labels. + qBN = qBN+Ki*(net.alpha(nonworkSV(ind)).*Y(nonworkSV(ind))); + end + qBN = qBN.*Y(workset); + end + % Second linear term is a vector of one's + f = qBN-ones(worksize, 1); + + + % Step 8: Solve the quadratic program. The quadratic term of the + % objective function is made of the examples in the working set, the + % linear term comes from examples outside of the working set. The so + % found values WORKALPHA replace the old values NET.alpha for the + % examples in the working set. + % Quadratic term H is given by the kernel evaluations for the working + % set + H = svmkernel(net, X(worksetind,:), X(worksetind,:)); + if net.use2norm, + % with 2norm of the slack variables: the quadratic program has values + % 1/C in the diagonal. Additionally, this makes H better conditioned. + H = H+diag(1./C(workset)); + else + % Suggested by Mathworks support for improving the condition + % number. Condition number should should not be much larger than + % 1/sqrt(eps) to avoid numerical problems. Condition number of H will + % now be < eps^(-2/3) + H = H+diag(ones(worksize, 1)*eps^(2/3)); + end + H = H.*(Y(workset)*Y(workset)'); + % Matrix A for the equality constraint + A = Y(workset)'; + % If there are Support Vectors outside of the working set, the equality + % constraint must give the weighted class labels of all these + % vectors. Otherwise the equality constraint gives zero. + if length(nonworkSV)>0, + eqconstr = -net.alpha(nonworkSV)'*Y(nonworkSV); + else + eqconstr = 0; + end + % Lower and upper bound for the coefficients alpha in the + % current working set + VLB = zeros(worksize, 1); + if net.use2norm, + % no upper bound in the 2norm case + VUB = []; + else + % normal 1norm SVM: error weights C are the upper bounds + VUB = C(workset); + end + tic; + % Solve the quadratic program with 1 equality constraint. + % Initial guess for the solution of the QP problem. + startVal = net.alpha(workset); + switch qpsolver + case 'quadprog' + workalpha = quadprog(H, f, [], [], A, eqconstr, VLB, VUB, startVal, ... + quadprogopt); + case 'qp' + workalpha = qp(H, f, A, eqconstr, VLB, VUB, startVal, 1); + case 'loqo' + if isempty(VUB), + % LOQO crashes if upper bound is missing + % Use a relatively low value (instead of Inf) for faster + % convergence + VUB = repmat(1e7, size(VLB)); + end + workalpha = loqo(H, f, A, eqconstr, VLB, VUB, startVal, 1); + end + t = toc; + if dodisplay>1, + fprintf('QP subproblem solved after %i minutes, %2.1f seconds.\n', ... + floor(t/60), mod(t, 60)); + end + % Sometime QUADPROG returns a solution with small imaginary part + % (usually with ill-posed problems, badly conditioned H) + if any(imag(workalpha)>0), + warning(['The QP solver returned a complex solution. '... + 'Check condition number cond(H).']); + workalpha = real(workalpha); + end + % Update the newly found coefficients in NET.alpha + alphaOld = net.alpha; + net.alpha(workset) = workalpha; + + iteration = iteration+1; +end + +% Finished! Store the Support Vectors and the coefficient given by +% NET.alpha and the corresponding label. +net.svcoeff = net.alpha(net.svind).*Y(net.svind); +net.sv = X(net.svind, :); + +if dodisplay>0, + fprintf('\n\n\nTraining finished.\n'); + disp('Information about the trained Support Vector Machine:'); + svmstat(net,1); + % output statistics over SVs and separating hyperplane +end + + + +function [net, SVthresh, SV, SVbound, SVnonbound] = findSV(net, C) +% FINDSV - Select the Support Vectors from the current coefficients NET.alpha + +% Threshold for selecting Support Vectors +maxalpha = max(net.alpha); +if maxalpha > net.alphatol, + % For most cases, net.alphatol is a reasonable choice (approx 1e-2) + SVthresh = net.alphatol; +else + % For complex kernel on small data sets: all alphas will be very small. + % Use the mean between the minimum and maximum logarithm of values + % NET.alpha as a threshold. + SVthresh = exp((log(max(eps,maxalpha))+log(eps))/2); +end +% All examples that have a value of NET.alpha above this threshold are +% assumed to be Support Vectors. +SV = logical(uint8(net.alpha>=SVthresh)); +% All Support Vectors that have a value at their upper bound C +if net.use2norm, + % There is no such thing in the 2norm case! + SVbound = logical(repmat(uint8(0), size(net.alpha))); +else + SVbound = logical(uint8(net.alpha>(C-net.alphatol))); +end +% The Support Vectors not at the upper bound +SVnonbound = SV & (~SVbound); +% The actual indices of the Support Vectors in the training set +net.svind = find(SV); diff --git a/external/toolbox_compile.m b/external/toolbox_compile.m new file mode 100644 index 00000000..a59bef23 --- /dev/null +++ b/external/toolbox_compile.m @@ -0,0 +1,13 @@ + +%%% assumes located in toolbox root directory + +dir = 'classify/private/'; +mex([dir 'meanshift1.c'],'-outdir',dir); + +dir = 'images/private/'; +mex([dir 'assign2binsc.c'],'-outdir',dir); +mex([dir 'histc_nD_c.c'],'-outdir',dir); +mex([dir 'mask_ellipse1.c'],'-outdir',dir); +mex([dir 'rnlfilt_max.c'],'-outdir',dir); +mex([dir 'rnlfilt_sum.c'],'-outdir',dir); +mex([dir 'rnlfiltblock_sum.c'],'-outdir',dir); diff --git a/external/toolbox_generatedoc.m b/external/toolbox_generatedoc.m new file mode 100644 index 00000000..ebe46dbc --- /dev/null +++ b/external/toolbox_generatedoc.m @@ -0,0 +1,21 @@ +% toolbox_generatedoc - Generate documentation. Must run from directory toolbox. + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +% The template frame-piotr is frame copied over, with a special start page +% (overview.html), and Contents.html given a link from every menu. Also, after generating +% the documentation, removed links to */private from main doc/menu.html. +% (Currently script simply copies over menu.html that is fixed). + +% After, make sure to update 1) date and 2) link to zip file in doc/Overview.html. +% Also history.txt get copied over + + +params = {'mfiles',{'classify','images','filters','matlab'}}; +params = {params{:},'htmldir','doc','recursive','on','source','off'}; +params = {params{:},'template','frame-piotr','index','menu','global','on'}; +m2html(params{:}); +copyfile('external\m2html\templates\menu-for-frame-piotr.html','doc/menu.html') +copyfile('external\history.txt','doc/history.txt') diff --git a/external/toolbox_updateallinfo.m b/external/toolbox_updateallinfo.m new file mode 100644 index 00000000..6fd827c4 --- /dev/null +++ b/external/toolbox_updateallinfo.m @@ -0,0 +1,100 @@ +function toolbox_updateallinfo + +toolbox_insertinfo('Contents.m'); +return + + % must start in /toolbox base directory + cd('classify/') + mfiles = dir('*.m'); + for i=1:size(mfiles,1) toolbox_removeinfo(mfiles(i).name); end; + for i=1:size(mfiles,1) toolbox_insertinfo(mfiles(i).name); end; + + cd('private/') + mfiles = dir('*.m'); + for i=1:size(mfiles,1) toolbox_removeinfo(mfiles(i).name); end; + for i=1:size(mfiles,1) toolbox_insertinfo(mfiles(i).name); end; + + cd('../../filters/') + mfiles = dir('*.m'); + for i=1:size(mfiles,1) toolbox_removeinfo(mfiles(i).name); end; + for i=1:size(mfiles,1) toolbox_insertinfo(mfiles(i).name); end; + + cd('../images/') + mfiles = dir('*.m'); + for i=1:size(mfiles,1) toolbox_removeinfo(mfiles(i).name); end; + for i=1:size(mfiles,1) toolbox_insertinfo(mfiles(i).name); end; + + cd('private/') + mfiles = dir('*.m'); + for i=1:size(mfiles,1) toolbox_removeinfo(mfiles(i).name); end; + for i=1:size(mfiles,1) toolbox_insertinfo(mfiles(i).name); end; + + cd('../../matlab/'); + mfiles = dir('*.m'); + for i=1:size(mfiles,1) toolbox_removeinfo(mfiles(i).name); end; + for i=1:size(mfiles,1) toolbox_insertinfo(mfiles(i).name); end; + + cd('../'); + + + +% Inserts toolbox data after main comment in an .m file. +% Does not affect files with no body (such as Contents.m) +% +% EXAMPLE +% mfiles = dir('*.m'); for i=1:size(mfiles,1) toolbox_insertinfo(mfiles(i).name); end; +function toolbox_insertinfo( fname ) + fid_in = fopen( fname, 'rt' ); + fid_out = fopen( [fname '2'] , 'wt' ); + + insert_str = ... + ['%% Piotr''s Image&Video Toolbox Version 1.03 \n' ... + '%% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu \n' ... + '%% Please email me if you find bugs, or have suggestions or questions! \n \n' ]; + + first_comment = true; + while 1 + tline = fgetl(fid_in); + if ~ischar(tline), break, end; + fprintf( fid_out, '%s\n', tline ); + if( length(strtrim(tline))==0 && first_comment ) + first_comment = false; + fprintf( fid_out, insert_str ); + end + end + + fclose(fid_in); + fclose(fid_out); + movefile( [fname '2'], [fname] ); + + + +% Removes toolbox data after main comment in an .m file. +% +% EXAMPLE +% mfiles = dir('*.m'); for i=1:size(mfiles,1) toolbox_removeinfo(mfiles(i).name); end; + +function toolbox_removeinfo( fname ) + fid_in = fopen( fname, 'rt' ); + fid_out = fopen( [fname '2'] , 'wt' ); + + nlines = 4; % number of lines to remove + removedinfo = -1; + while 1 + tline = fgetl(fid_in); + if ~ischar(tline), break, end; + if( length(strtrim(tline))==0 && removedinfo==-1 ) + fprintf( fid_out, '%s\n', tline ); + removedinfo = 0; + elseif( removedinfo>=0 && removedinfolength(tree.tree) + error('[XMLTree] Invalid UID.'); + end + if ~strcmp(tree.tree{uid(i)}.type,'element') + error('[XMLTree] Cannot add a child to a non-element node.'); + end + l = length(tree.tree); + switch type + case 'element' + tree.tree{l+1} = struct('type','element',... + 'name',parameter,... + 'attributes',[],... + 'contents',[],... + 'parent',[],... + 'uid',l+1); + case 'chardata' + tree.tree{l+1} = struct('type','chardata',... + 'value',parameter,... + 'parent',[],... + 'uid',l+1); + case 'cdata' + tree.tree{l+1} = struct('type','cdata',... + 'value',parameter,... + 'parent',[],... + 'uid',l+1); + case 'pi' + tree.tree{l+1} = struct('type','pi',... + 'target',parameter.target,... + 'value',parameter.value,... + 'parent',[],... + 'uid',l+1); + case 'comment' + tree.tree{l+1} = struct('type','comment',... + 'value',parameter,... + 'parent',[],... + 'uid',l+1); + otherwise + error(sprintf('[XMLTree] %s: unknown item type.',type)); + end + tree.tree{uid(i)}.contents = [tree.tree{uid(i)}.contents l+1]; + tree.tree{l+1}.parent = uid(i); +end + +varargout{1} = tree; diff --git a/external/xmltree/@xmltree/attributes.m b/external/xmltree/@xmltree/attributes.m new file mode 100644 index 00000000..11b3bf21 --- /dev/null +++ b/external/xmltree/@xmltree/attributes.m @@ -0,0 +1,103 @@ +function varargout = attributes(varargin) +% XMLTREE/ATTRIBUTES Method (handle attributes of an element node) +% FORMAT varargout = attributes(varargin) +% +% tree - XMLTree object +% method - 'set','get','add','del' or 'length' +% uid - the UID of an element node +% n - indice of the attribute +% key - string key="..." +% val - string ...="val" +% attr - cell array of struct(key,val) or just struct(key,val) +% l - number of attributes of the element node uid +% +% tree = attributes(tree,'set',uid,n,key,val) +% attr = attributes(tree,'get',uid[,n]) +% tree = attributes(tree,'add',uid,key,val) +% tree = attributes(tree,'del',uid[,n]) +% l = attributes(tree,'length',uid) +%_______________________________________________________________________ +% +% Handle attributes of an element node. +% The tree parameter must be in input AND in output for 'set', 'add' and +% 'del' methods. +%_______________________________________________________________________ +% @(#)attributes.m Guillaume Flandin 02/04/05 + +error(nargchk(3,6,nargin)); +tree = varargin{1}; +if ~ischar(varargin{2}) | ... + ~any(strcmp(varargin{2},{'set','get','add','del','length'})) + error('[XMLTree] Unknown method.'); +end +uid = varargin{3}; +if ~isa(uid,'double') | any(uid>length(tree)) | any(uid<1) + error('[XMLTree] UID must be a positive integer scalar.'); +end + +if ~strcmp(tree.tree{uid}.type,'element') + error('[XMLTree] This node has no attributes.'); +end + +switch varargin{2} + case 'set' + error(nargchk(6,6,nargin)); + if ~isa(varargin{4},'double') | ... + any(varargin{4}>length(tree.tree{uid}.attributes)) | ... + any(varargin{4}<1) + error('[XMLTree] Invalid attribute indice.'); + end + ind = varargin{4}; + tree.tree{uid}.attributes{ind} = struct('key',varargin{5},'val',varargin{6}); + varargout{1} = tree; + case 'get' + error(nargchk(3,4,nargin)); + if nargin == 4 + if ~isa(varargin{4},'double') | ... + any(varargin{4}>length(tree.tree{uid}.attributes)) | ... + any(varargin{4}<1) + error('[XMLTree] Invalid attribute indice.'); + end + if length(varargin{4}) == 1 + varargout{1} = tree.tree{uid}.attributes{varargin{4}(1)}; + else + varargout{1} = {}; + for i=1:length(varargin{4}) + varargout{1}{i} = tree.tree{uid}.attributes{varargin{4}(i)}; + end + end + else + if length(tree.tree{uid}.attributes) == 1 + varargout{1} = tree.tree{uid}.attributes{1}; + else + varargout{1} = {}; + for i=1:length(tree.tree{uid}.attributes) + varargout{1}{i} = tree.tree{uid}.attributes{i}; + end + end + end + case 'add' + error(nargchk(5,5,nargin)); + ind = length(tree.tree{uid}.attributes) + 1; + tree.tree{uid}.attributes{ind} = struct('key',varargin{4},'val',varargin{5}); + varargout{1} = tree; + case 'del' + error(nargchk(3,4,nargin)); + if nargin == 4 + if ~isa(varargin{4},'double') | ... + any(varargin{4}>length(tree.tree{uid}.attributes)) | ... + any(varargin{4}<1) + error('[XMLTree] Invalid attribute indice.'); + end + ind = varargin{4}; + tree.tree{uid}.attributes(ind) = []; + else + tree.tree{uid}.attributes = []; + end + varargout{1} = tree; + case 'length' + error(nargchk(3,3,nargin)); + varargout{1} = length(tree.tree{uid}.attributes); + otherwise + error('[XMLTree] Unknown method.'); +end diff --git a/external/xmltree/@xmltree/branch.m b/external/xmltree/@xmltree/branch.m new file mode 100644 index 00000000..43e7f36a --- /dev/null +++ b/external/xmltree/@xmltree/branch.m @@ -0,0 +1,56 @@ + +function subtree = branch(tree,uid) +% XMLTREE/BRANCH Branch Method +% FORMAT uid = parent(tree,uid) +% +% tree - XMLTree object +% uid - UID of the root element of the subtree +% subtree - XMLTree object (a subtree from tree) +%_______________________________________________________________________ +% +% Return a subtree from a tree. +%_______________________________________________________________________ +% @(#)branch.m Guillaume Flandin 02/04/17 +% +% NOTE: BUG FIXED BY PIOTR DOLLAR 09/17/04 + +error(nargchk(2,2,nargin)); + +if uid > length(tree) | ... + prod(size(uid))~=1 | ... + ~strcmp(tree.tree{uid}.type,'element') + error('[XMLTree] Invalid UID.'); +end + +subtree = xmltree; +subtree = set(subtree,root(subtree),'name',tree.tree{uid}.name); + +% added by Piotr Dollar 09/17/04 to copy attributes at top level! +subtree = set(subtree,root(subtree),'attributes',tree.tree{uid}.attributes); + + +child = children(tree,uid); + +for i=1:length(child) + l = length(subtree); + subtree = sub_branch(tree,subtree,child(i),root(subtree)); + subtree.tree{root(subtree)}.contents = [subtree.tree{root(subtree)}.contents l+1]; +end + +%======================================================================= +function tree = sub_branch(t,tree,uid,p) + + l = length(tree); + tree.tree{l+1} = t.tree{uid}; + tree.tree{l+1}.uid = l + 1; + tree.tree{l+1}.parent = p; + tree.tree{l+1}.contents = []; + if isfield(t.tree{uid},'contents') + contents = get(t,uid,'contents'); + m = length(tree); + for i=1:length(contents) + tree.tree{l+1}.contents = [tree.tree{l+1}.contents m+1]; + tree = sub_branch(t,tree,contents(i),l+1); + m = length(tree); + end + end diff --git a/external/xmltree/@xmltree/char.m b/external/xmltree/@xmltree/char.m new file mode 100644 index 00000000..f1a1989b --- /dev/null +++ b/external/xmltree/@xmltree/char.m @@ -0,0 +1,14 @@ +function s = char(tree) +% XMLTREE/CHAR Converter function from XMLTree to a description string +% FORMAT s = char(tree) +% +% tree - XMLTree object +% s - a description string of an XMLTree +%_______________________________________________________________________ +% +% Return a string describing the XMLTree: +% 'XMLTree object (x nodes) [filename]' +%_______________________________________________________________________ +% @(#)char.m Guillaume Flandin 02/04/04 + +s = strcat('XMLTree object (',num2str(length(tree)),' nodes) [',getfilename(tree),']'); diff --git a/external/xmltree/@xmltree/children.m b/external/xmltree/@xmltree/children.m new file mode 100644 index 00000000..e6713ac3 --- /dev/null +++ b/external/xmltree/@xmltree/children.m @@ -0,0 +1,28 @@ +function child = children(tree,uid) +% XMLTREE/CHILDREN Return children's UIDs of node uid +% FORMAT child = children(tree,uid) +% +% tree - a tree +% uid - uid of the element +% child - array of the UIDs of children of node uid +%_______________________________________________________________________ +% +% Return UID's of children of node uid +%_______________________________________________________________________ +% @(#)children.m Guillaume Flandin 02/04/09 + +error(nargchk(2,2,nargin)); + +child = []; +uid = uid(:); +l = length(tree); +for i=1:length(uid) + if uid(i) > 0 & uid(i) <= l + if strcmp(tree.tree{uid(i)}.type,'element') + child = [child tree.tree{uid(i)}.contents]; + end + else + error('[XMLTree] Invalid UID.'); + end +end +if isempty(child), child = []; end diff --git a/external/xmltree/@xmltree/convert.m b/external/xmltree/@xmltree/convert.m new file mode 100644 index 00000000..e29d6922 --- /dev/null +++ b/external/xmltree/@xmltree/convert.m @@ -0,0 +1,130 @@ +function s = convert(tree,uid) +% XMLTREE/CONVERT Converter an XML tree in a Matlab structure +% +% tree - XMLTree object +% uid - uid of the root of the subtree, if provided. +% Default is root +% s - converted structure +%_______________________________________________________________________ +% +% Convert an xmltree into a Matlab structure, when possible. +% When several identical tags are present, a cell array is used. +% The root tag is not saved in the structure. +% If provided, only the structure corresponding to the subtree defined +% by the uid UID is returned. +%_______________________________________________________________________ +% @(#)convert.m Guillaume Flandin 02/04/11 + +% Exemple: +% tree: field1field2field3 +% toto = convert(tree); +% <=> toto = struct('titi',{{'field1', 'field3'}},'tutu','field2') + +error(nargchk(1,2,nargin)); + +% Get the root uid of the output structure +if nargin == 1 + % Get the root uid of the XML tree + root_uid = root(tree); +else + % Uid provided by user + root_uid = uid; +end + +% Initialize the output structure +% struct([]) should be used but this only works with Matlab 6 +% So we create a field that we delete at the end +%s = struct(get(tree,root_uid,'name'),''); % struct([]) +s = struct('deletedummy',''); + +%s = sub_convert(tree,s,root_uid,{get(tree,root_uid,'name')}); +s = sub_convert(tree,s,root_uid,{}); + +s = rmfield(s,'deletedummy'); + +%======================================================================= +function s = sub_convert(tree,s,uid,arg) + type = get(tree,uid,'type'); + switch type + case 'element' + child = children(tree,uid); + l = {}; + ll = {}; + for i=1:length(child) + if isfield(tree,child(i),'name') + ll = { ll{:}, get(tree,child(i),'name') }; + end + end + for i=1:length(child) + if isfield(tree,child(i),'name') + name = get(tree,child(i),'name'); + nboccur = sum(ismember(l,name)); + nboccur2 = sum(ismember(ll,name)); + l = { l{:}, name }; + if nboccur | (nboccur2>1) + arg2 = { arg{:}, name, {nboccur+1} }; + else + arg2 = { arg{:}, name}; + end + else + arg2 = arg; + end + s = sub_convert(tree,s,child(i),arg2); + end + if isempty(child) + s = sub_setfield(s,arg{:},''); + end + case 'chardata' + s = sub_setfield(s,arg{:},get(tree,uid,'value')); + case 'cdata' + s = sub_setfield(s,arg{:},get(tree,uid,'value')); + case 'pi' + % Processing instructions are evaluated if possible + app = get(tree,uid,'target'); + switch app + case {'matlab',''} + s = sub_setfield(s,arg{:},eval(get(tree,uid,'value'))); + case 'unix' + s = sub_setfield(s,arg{:},unix(get(tree,uid,'value'))); + case 'dos' + s = sub_setfield(s,arg{:},dos(get(tree,uid,'value'))); + case 'system' + s = sub_setfield(s,arg{:},system(get(tree,uid,'value'))); + otherwise + try, + s = sub_setfield(s,arg{:},feval(app,get(tree,uid,'value'))); + catch, + warning('[Xmltree/convert] Unknown target application'); + end + end + case 'comment' + % Comments are forgotten + otherwise + warning(sprintf('Type %s unknown : not saved',get(tree,uid,'type'))); + end + +%======================================================================= +function s = sub_setfield(s,varargin) +% Same as setfield but using '{}' rather than '()' +%if (isempty(varargin) | length(varargin) < 2) +% error('Not enough input arguments.'); +%end + +subs = varargin(1:end-1); +for i = 1:length(varargin)-1 + if (isa(varargin{i}, 'cell')) + types{i} = '{}'; + elseif isstr(varargin{i}) + types{i} = '.'; + subs{i} = varargin{i}; %strrep(varargin{i},' ',''); % deblank field name + else + error('Inputs must be either cell arrays or strings.'); + end +end + +% Perform assignment +try + s = builtin('subsasgn', s, struct('type',types,'subs',subs), varargin{end}); +catch + error(lasterr) +end diff --git a/external/xmltree/@xmltree/copy.m b/external/xmltree/@xmltree/copy.m new file mode 100644 index 00000000..328d0aac --- /dev/null +++ b/external/xmltree/@xmltree/copy.m @@ -0,0 +1,45 @@ +function tree = copy(tree,subuid,uid) +% XMLTREE/COPY Copy Method (copy a subtree in another branch) +% FORMAT tree = copy(tree,subuid,uid) +% +% tree - XMLTree object +% subuid - UID of the subtree to copy +% uid - UID of the element where the subtree must be duplicated +%_______________________________________________________________________ +% +% Copy a subtree to another branch +% The tree parameter must be in input AND in output +%_______________________________________________________________________ +% @(#)copy.m Guillaume Flandin 02/04/08 + +error(nargchk(2,3,nargin)); +if nargin == 2 + uid = parent(tree,subuid); +end + +l = length(tree); +tree = sub_copy(tree,subuid,uid); +tree.tree{uid}.contents = [tree.tree{uid}.contents l+1]; + +% pour que la copie soit a cote de l'original et pas a la fin ? +% contents = get(tree,parent,'contents'); +% i = find(contents==uid); +% tree = set(tree,parent,'contents',[contents(1:i) l+1 contents(i+1:end)]); + +%======================================================================= +function tree = sub_copy(tree,uid,p) + + l = length(tree); + tree.tree{l+1} = tree.tree{uid}; + tree.tree{l+1}.uid = l+1; + tree.tree{l+1}.parent = p; + tree.tree{l+1}.contents = []; + if isfield(tree.tree{uid},'contents') + contents = get(tree,uid,'contents'); + m = length(tree); + for i=1:length(contents) + tree.tree{l+1}.contents = [tree.tree{l+1}.contents m+1]; + tree = sub_copy(tree,contents(i),l+1); + m = length(tree); + end + end diff --git a/external/xmltree/@xmltree/delete.m b/external/xmltree/@xmltree/delete.m new file mode 100644 index 00000000..43905029 --- /dev/null +++ b/external/xmltree/@xmltree/delete.m @@ -0,0 +1,33 @@ +function tree = delete(tree,uid) +% XMLTREE/DELETE Delete (delete a subtree given its UID) +% +% tree - XMLTree object +% uid - array of UID's of subtrees to be deleted +%_______________________________________________________________________ +% +% Delete a subtree given its UID +% The tree parameter must be in input AND in output +%_______________________________________________________________________ +% @(#)delete.m Guillaume Flandin 02/04/08 + +error(nargchk(2,2,nargin)); + +uid = uid(:); +for i=1:length(uid) + if uid(i)==1 + warning('[XMLTree] Cannot delete root element.'); + else + p = tree.tree{uid(i)}.parent; + tree = sub_delete(tree,uid(i)); + tree.tree{p}.contents(find(tree.tree{p}.contents==uid(i))) = []; + end +end + +%======================================================================= +function tree = sub_delete(tree,uid) + if isfield(tree.tree{uid},'contents') + for i=1:length(tree.tree{uid}.contents) + tree = sub_delete(tree,tree.tree{uid}.contents(i)); + end + end + tree.tree{uid} = struct('type','deleted'); diff --git a/external/xmltree/@xmltree/display.m b/external/xmltree/@xmltree/display.m new file mode 100644 index 00000000..d128f21c --- /dev/null +++ b/external/xmltree/@xmltree/display.m @@ -0,0 +1,19 @@ +function display(tree) +% XMLTREE/DISPLAY Command window display of an XMLTree +% FORMAT display(tree) +% +% tree - XMLTree object +%_______________________________________________________________________ +% +% This method is called when the semicolon is not used to terminate a +% statement which returns an XMLTree. +%_______________________________________________________________________ +% @(#)display.m Guillaume Flandin 02/04/04 + +disp(' '); +disp([inputname(1),' = ']); +disp(' '); +for i=1:prod(size(tree)) + disp([blanks(length(inputname(1))+3) char(tree(i))]); +end +disp(' '); diff --git a/external/xmltree/@xmltree/find.m b/external/xmltree/@xmltree/find.m new file mode 100644 index 00000000..82bf55ba --- /dev/null +++ b/external/xmltree/@xmltree/find.m @@ -0,0 +1,171 @@ +function list = find(varargin) +% XMLTREE/FIND Find elements in a tree with specified characteristics +% FORMAT list = find(varargin) +% +% tree - XMLTree object +% xpath - string path with specific grammar (XPath) +% uid - lists of root uid's +% parameter/value - pair of pattern +% list - list of uid's of matched elements +% +% list = find(tree,xpath) +% list = find(tree,parameter,value[,parameter,value]) +% list = find(tree,uid,parameter,value[,parameter,value]) +% +% Grammar for addressing parts of an XML document: +% XML Path Language XPath (http://www.w3.org/TR/xpath) +% Example: /element1//element2[1]/element3[5]/element4 +%_______________________________________________________________________ +% +% Find elements in an XML tree with specified characteristics or given +% a path (using a subset of XPath language). +%_______________________________________________________________________ +% @(#)find.m Guillaume Flandin 01/10/29 + +% TODO: +% - clean up subroutines +% - find should only be documented using XPath (other use is internal) +% - handle '*', 'last()' in [] and '@' +% - if a key is invalid, should rather return [] than error ? + +if nargin==0 + error('[XMLTree] A tree must be provided'); +elseif nargin==1 + list = 1:length(tree.tree); + return +elseif mod(nargin,2) + list = sub_find_subtree1(varargin{1}.tree,root(tree),varargin{2:end}); +elseif isa(varargin{2},'double') & ... + ndims(varargin{2}) == 2 & ... + min(size(varargin{2})) == 1 + list = unique(sub_find_subtree1(varargin{1}.tree,varargin{2:end})); +elseif nargin==2 & ischar(varargin{2}) + list = sub_pathfinder(varargin{:}); +else + error('[XMLTree] Arguments must be parameter/value pairs.'); +end + +%======================================================================= +function list = sub_find_subtree1(varargin) + list = []; + for i=1:length(varargin{2}) + res = sub_find_subtree2(varargin{1},... + varargin{2}(i),varargin{3:end}); + list = [list res]; + end + +%======================================================================= +function list = sub_find_subtree2(varargin) + uid = varargin{2}; + list = []; + if sub_comp_element(varargin{1}{uid},varargin{3:end}) + list = [list varargin{1}{uid}.uid]; + end + if isfield(varargin{1}{uid},'contents') + list = [list sub_find_subtree1(varargin{1},... + varargin{1}{uid}.contents,varargin{3:end})]; + end + +%======================================================================= +function match = sub_comp_element(varargin) +match = 0; +try, + % v = getfield(varargin{1}, varargin{2}); % slow... + for i=1:floor(nargin/2) + v = subsref(varargin{1}, struct('type','.','subs',varargin{i+1})); + if strcmp(v,varargin{i+2}) + match = 1; + end + end +catch, +end + +% More powerful but much slower +%match = 0; +%for i=1:length(floor(nargin/2)) % bug: remove length !!! +% if isfield(varargin{1},varargin{i+1}) +% if ischar(getfield(varargin{1},varargin{i+1})) & ischar(varargin{i+2}) +% if strcmp(getfield(varargin{1},varargin{i+1}),char(varargin{i+2})) +% match = 1; +% end +% elseif isa(getfield(varargin{1},varargin{i+1}),'double') & ... +% isa(varargin{i+2},'double') +% if getfield(varargin{1},varargin{i+1}) == varargin{i+2} +% match = 1; +% end +% else +% warning('Cannot compare different objects'); +% end +% end +%end + +%======================================================================= +function list = sub_pathfinder(tree,pth) + %- Search for the delimiter '/' in the path + i = findstr(pth,'/'); + %- Begin search by root + list = root(tree); + %- Walk through the tree + j = 1; + while j <= length(i) + %- Look for recursion '//' + if j length(list)+1 + error('[XMLTree] Bad key in the path.'); + elseif val == length(list)+1 + list = []; + return; + end + list = list(val); + end + if isempty(list), return; end + j = j + 1; + end + +%======================================================================= +function list = sub_findchild(tree,listt,elmt) + list = []; + for a=1:length(listt) + for b=1:length(tree.tree{listt(a)}.contents) + if sub_comp_element(tree.tree{tree.tree{listt(a)}.contents(b)},'name',elmt) + list = [list tree.tree{tree.tree{listt(a)}.contents(b)}.uid]; + end + end + end diff --git a/external/xmltree/@xmltree/flush.m b/external/xmltree/@xmltree/flush.m new file mode 100644 index 00000000..3dbefeee --- /dev/null +++ b/external/xmltree/@xmltree/flush.m @@ -0,0 +1,39 @@ +function tree = flush(tree,uid) +% XMLTREE/FLUSH Flush (Clear a subtree given its UID) +% +% tree - XMLTree object +% uid - array of UID's of subtrees to be cleared +% Default is root +%_______________________________________________________________________ +% +% Clear a subtree given its UID (remove all the leaves of the tree) +% The tree parameter must be in input AND in output +%_______________________________________________________________________ +% @(#)flush.m Guillaume Flandin 02/04/10 + +error(nargchk(1,2,nargin)); + +if nargin == 1, + uid = root(tree); +end + +uid = uid(:); +for i=1:length(uid) + tree = sub_flush(tree,uid(i)); +end + +%======================================================================= +function tree = sub_flush(tree,uid) + if isfield(tree.tree{uid},'contents') + % contents is parsed in reverse order because each child is + % deleted and the contents vector is then eventually reduced + for i=length(tree.tree{uid}.contents):-1:1 + tree = sub_flush(tree,tree.tree{uid}.contents(i)); + end + end + if strcmp(tree.tree{uid}.type,'chardata') |... + strcmp(tree.tree{uid}.type,'pi') |... + strcmp(tree.tree{uid}.type,'cdata') |... + strcmp(tree.tree{uid}.type,'comment') + tree = delete(tree,uid); + end diff --git a/external/xmltree/@xmltree/get.m b/external/xmltree/@xmltree/get.m new file mode 100644 index 00000000..73feacea --- /dev/null +++ b/external/xmltree/@xmltree/get.m @@ -0,0 +1,39 @@ +function value = get(tree,uid,parameter) +% XMLTREE/GET Get Method (get object properties) +% FORMAT value = get(tree,uid,parameter) +% +% tree - XMLTree object +% uid - array of uid's +% parameter - property name +% value - property value +%_______________________________________________________________________ +% +% Get object properties of a tree given their UIDs. +%_______________________________________________________________________ +% @(#)get.m Guillaume Flandin 02/03/27 + +error(nargchk(2,3,nargin)); + +value = cell(size(uid)); +uid = uid(:); +if nargin==2 + for i=1:length(uid) + if uid(i)<1 | uid(i)>length(tree.tree) + error('[XMLTree] Invalid UID.'); + end + % According to the type of the node, return only some parameters + % Need changes... + value{i} = tree.tree{uid(i)}; + end +else + for i=1:length(uid) + try, + value{i} = subsref(tree.tree{uid(i)}, struct('type','.','subs',parameter)); + catch, + error(sprintf('[XMLTree] Parameter %s not found.',parameter)); + end + end +end +if length(value)==1 + value = value{1}; +end diff --git a/external/xmltree/@xmltree/getfilename.m b/external/xmltree/@xmltree/getfilename.m new file mode 100644 index 00000000..d64a2a66 --- /dev/null +++ b/external/xmltree/@xmltree/getfilename.m @@ -0,0 +1,14 @@ +function filename = getfilename(tree) +% XMLTREE/GETFILENAME Get filename method +% FORMAT filename = getfilename(tree) +% +% tree - XMLTree object +% filename - XML filename +%_______________________________________________________________________ +% +% Return the filename of the XML tree if loaded from disk and an empty +% string otherwise. +%_______________________________________________________________________ +% @(#)getfilename.m Guillaume Flandin 02/03/27 + +filename = tree.filename; diff --git a/external/xmltree/@xmltree/isfield.m b/external/xmltree/@xmltree/isfield.m new file mode 100644 index 00000000..a0dcbddb --- /dev/null +++ b/external/xmltree/@xmltree/isfield.m @@ -0,0 +1,22 @@ +function F = isfield(tree,uid,parameter) +% XMLTREE/ISFIELD Is parameter a field of tree{uid} ? +% FORMAT F = isfield(tree,uid,parameter) +% +% tree - a tree +% uid - uid of the element +% parameter - a field of the root tree +% F - 1 if present, 0 otherwise +%_______________________________________________________________________ +% +% Is parameter a field of tree{uid} ? +%_______________________________________________________________________ +% @(#)isfield.m Guillaume Flandin 01/10/31 + +error(nargchk(3,3,nargin)); + +F = zeros(1,length(uid)); +for i=1:length(uid) + if isfield(tree.tree{uid(i)},parameter) + F(i) = 1; + end +end diff --git a/external/xmltree/@xmltree/length.m b/external/xmltree/@xmltree/length.m new file mode 100644 index 00000000..536c2251 --- /dev/null +++ b/external/xmltree/@xmltree/length.m @@ -0,0 +1,33 @@ +function l = length(tree,r) +% XMLTREE/LENGTH Length Method +% FORMAT l = length(tree,r) +% +% tree - XMLTree object +% r - 'real' if present, returns the real number of nodes in the +% tree (deleted nodes aren't populated) +% l - length of the XML tree (number of nodes) +%_______________________________________________________________________ +% +% Return the number of nodes of an XMLTree object. +%_______________________________________________________________________ +% @(#)length.m Guillaume Flandin 02/03/27 + +error(nargchk(1,2,nargin)); + +% Return the full number of nodes once allocated +l = length(tree.tree); + +% Substract the number of deleted nodes to the previous length +if nargin == 2 + if strcmp(r,'real') + ll = 0; + for i=1:l + if ~strcmp(tree.tree{i}.type,'deleted') + ll = ll + 1; + end + end + l = ll; + else + error('[XMLTree] Bad input argument.'); + end +end diff --git a/external/xmltree/@xmltree/move.m b/external/xmltree/@xmltree/move.m new file mode 100644 index 00000000..f3266035 --- /dev/null +++ b/external/xmltree/@xmltree/move.m @@ -0,0 +1,18 @@ +function tree = move(tree,uida, uidb) +% XMLTREE/MOVE Move (move a subtree inside a tree from A to B) +% +% tree - XMLTree object +% uida - initial position of the subtree +% uidb - parent of the final position of the subtree +%_______________________________________________________________________ +% +% Move a subtree inside a tree from A to B. +% The tree parameter must be in input AND in output +%_______________________________________________________________________ +% @(#)move.m Guillaume Flandin 02/04/08 + +error(nargchk(3,3,nargin)); + +p = tree.tree{uida}.parent; +tree.tree{p}.contents(find(tree.tree{p}.contents==uida)) = []; +tree.tree(uidb).contents = [tree.tree(uidb).contents uida]; diff --git a/external/xmltree/@xmltree/parent.m b/external/xmltree/@xmltree/parent.m new file mode 100644 index 00000000..8e4dc438 --- /dev/null +++ b/external/xmltree/@xmltree/parent.m @@ -0,0 +1,14 @@ +function p = parent(tree,uid) +% XMLTREE/PARENT Parent Method +% FORMAT uid = parent(tree,uid) +% +% tree - XMLTree object +% uid - UID of the lonely child +% p - UID of the parent ([] if root is the child) +%_______________________________________________________________________ +% +% Return the uid of the parent of a node. +%_______________________________________________________________________ +% @(#)parent.m Guillaume Flandin 02/04/08 + +p = tree.tree{uid}.parent; diff --git a/external/xmltree/@xmltree/private/xml_findstr.c b/external/xmltree/@xmltree/private/xml_findstr.c new file mode 100644 index 00000000..249db437 --- /dev/null +++ b/external/xmltree/@xmltree/private/xml_findstr.c @@ -0,0 +1,109 @@ +/********************************************************************* + * Piotr's Toolbox; Version 0.8 + * Code written by Piotr Dollar; pdollar-at-cs.ucsd.edu + * Please email me if you find bugs, or have suggestions or questions! + *********************************************************************/ + +#include "mex.h" + +/* + Differences with matlab built-in findstr: + - allows to search only the n first occurences of a pattern + - allows to search only in a substring (given an index of the beginning) + + Matlab hack: + - doesn't use mxGetString to prevent a copy of the string. + - assumes Matlab stores strings as unsigned short (Unicode 16 bits) + matrix.h: typedef uint16_T mxChar; + (that's the case for Matlab 5.* and 6.* but Matlab 4.* stores strings + as double) +*/ + +/* Comment the following line to use standard mxGetString (slower) */ +#define __HACK_MXCHAR__ + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { + + unsigned int i, j, stext, spattern, nbmatch = 0, ind = 1, occur = 0, nboccur = 0; +#ifdef __HACK_MXCHAR__ + unsigned short int *text = NULL, *pattern = NULL; +#else + char *text = NULL, *pattern = NULL; +#endif + unsigned int *k = NULL; + mxArray *out = NULL; + + /* Check for proper number of arguments. */ + if ((nrhs == 0) || (nrhs == 1)) + mexErrMsgTxt("Not enough input arguments."); + else if (nrhs > 4) + mexErrMsgTxt("Too many input arguments."); + else if (nlhs > 1) + mexErrMsgTxt("Too many output arguments."); + + /* The input TEXT must be a string */ + if (!mxIsChar(prhs[0])) + mexErrMsgTxt("Inputs must be character arrays."); + stext = mxGetM(prhs[0]) * mxGetN(prhs[0]); +#ifdef __HACK_MXCHAR__ + text = mxGetData(prhs[0]); +#else + text = mxCalloc(stext+1, sizeof(char)); + mxGetString(prhs[0], text, stext+1); +#endif + + /* The input PATTERN must be a string */ + if (!mxIsChar(prhs[1])) + mexErrMsgTxt("Inputs must be character arrays."); + spattern = mxGetM(prhs[1]) * mxGetN(prhs[1]); +#ifdef __HACK_MXCHAR__ + pattern = mxGetData(prhs[1]); +#else + pattern = mxCalloc(spattern+1, sizeof(char)); + mxGetString(prhs[1], pattern, spattern+1); +#endif + + /* The input INDEX must be an integer */ + if (nrhs > 2) { + if ((!mxIsNumeric(prhs[2]) || (mxGetM(prhs[2]) * mxGetN(prhs[2]) != 1))) + mexErrMsgTxt("Index input must be an integer."); + ind = (unsigned int)mxGetScalar(prhs[2]); + if (ind < 1) + mexErrMsgTxt("Index must be greater than 1."); + } + + /* The input OCCUR must be an integer */ + if (nrhs == 4) { + if ((!mxIsNumeric(prhs[3]) || (mxGetM(prhs[3]) * mxGetN(prhs[3]) != 1))) + mexErrMsgTxt("Index input must be an integer."); + nboccur = (unsigned int)mxGetScalar(prhs[3]); + } + + /* Find pattern in text */ + for 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 [contents] +% |_ type: 'element' +% |_ name: string +% |_ attributes: cell array of struct 'key' and 'value' or [] +% |_ contents: double array of uid's or [] if empty +% |_ parent: uid of the parent ([] if root) +% |_ uid: double +% +% chardata (a character array) +% |_ type: 'chardata' +% |_ value: string +% |_ parent: uid of the parent +% |_ uid: double +% +% cdata (a litteral string ) +% |_ type: 'cdata' +% |_ value: string +% |_ parent: uid of the parent +% |_ uid: double +% +% pi (a processing instruction ) +% |_ type: 'pi' +% |_ target: string (may be empty) +% |_ value: string +% |_ parent: uid of the parent +% |_ uid: double +% +% comment (a comment ) +% |_ type: 'comment' +% |_ value: string +% |_ parent: uid of the parent +% |_ uid: double +% +%----------------------------------------------------------------------- + +% TODO/BUG/FEATURES: +% - [compile] only a warning if TagStart is empty +% - [attribution] should look for " and ' rather than only " +% - [main] with normalize as a preprocessing, CDATA are modified +% - [prolog] look for a DOCTYPE in the whole string even if it occurs +% only in a far CDATA tag (for example)... +% - [tag_element] erode should replace normalize here +% - remove globals? uppercase globals rather persistent (clear mfile)? +% - xml_findst is in fact xml_strfind according to Mathworks vocabulary +% - problem with entity (don't know if the bug is here or in save fct.) +%----------------------------------------------------------------------- + +%- XML string to parse and number of tags read +global xmlstring Xparse_count xtree; + +%- Check input arguments +error(nargchk(1,1,nargin)); +if isempty(filename) + error('Not enough parameters.') +elseif ~isstr(filename) | sum(size(filename)>1)>1 + error('Input must be a string filename.') +end + +%- Read the entire XML file +fid = fopen(filename,'rt'); +if (fid==-1) + error(sprintf('Cannot open %s for reading.',filename)) +end +xmlstring = fscanf(fid,'%c'); +fclose(fid); + +%- Initialize number of tags (<=> uid) +Xparse_count = 0; + +%- Remove prolog and white space characters from the XML string +xmlstring = normalize(prolog(xmlstring)); + +%- Initialize the XML tree +xtree = {}; +tree = fragment; +tree.str = 1; +tree.parent = 0; + +%- Parse the XML string +tree = compile(tree); + +%- Return the XML tree +tree = xtree; + +%- Remove global variables from the workspace +clear global xmlstring Xparse_count xtree; + +%======================================================================= +% SUBFUNCTIONS + +%----------------------------------------------------------------------- +function frag = compile(frag) + global xmlstring xtree Xparse_count; + + while 1, + if length(xmlstring)<=frag.str | ... + (frag.str == length(xmlstring)-1 & strcmp(xmlstring(frag.str:end),' ')) + return + end + TagStart = xml_findstr(xmlstring,'<',frag.str,1); + if isempty(TagStart) + %- Character data (should be an error) + warning('[XML] Unknown data at the end of the XML file.'); + fprintf('Please send me your XML file at gflandin@sophia.inria.fr\n'); + %thisary = length(frag.ary) + 1; + xtree{Xparse_count+1} = chardata; + xtree{Xparse_count}.value = erode(entity(xmlstring(frag.str:end))); + xtree{Xparse_count}.parent = frag.parent; + xtree{frag.parent}.contents = [xtree{frag.parent}.contents Xparse_count]; + %frag.str = ''; + elseif TagStart > frag.str + if strcmp(xmlstring(frag.str:TagStart-1),' ') + %- A single white space before a tag (ignore) + frag.str = TagStart; + else + %- Character data + xtree{Xparse_count} = chardata; + xtree{Xparse_count}.value = erode(entity(xmlstring(frag.str:TagStart-1))); + xtree{Xparse_count}.parent = frag.parent; + xtree{frag.parent}.contents = [xtree{frag.parent}.contents Xparse_count]; + frag.str = TagStart; + end + else + if strcmp(xmlstring(frag.str+1),'?') + %- Processing instruction + frag = tag_pi(frag); + else + if length(xmlstring)-frag.str>4 & strcmp(xmlstring(frag.str+1:frag.str+3),'!--') + %- Comment + frag = tag_comment(frag); + else + if length(xmlstring)-frag.str>9 & strcmp(xmlstring(frag.str+1:frag.str+8),'![CDATA[') + %- Litteral data + frag = tag_cdata(frag); + else + %- A tag element (empty (<.../>) or not) + if ~isempty(frag.end) + endmk = ['/' frag.end '>']; + else + endmk = '/>'; + end + if strcmp(xmlstring(frag.str+1:frag.str+length(frag.end)+2),endmk) | ... + strcmp(strip(xmlstring(frag.str+1:frag.str+length(frag.end)+2)),endmk) + frag.str = frag.str + length(frag.end)+3; + return + else + frag = tag_element(frag); + end + end + end + end + end + end + +%----------------------------------------------------------------------- +function frag = tag_element(frag) + global xmlstring xtree Xparse_count; + close = xml_findstr(xmlstring,'>',frag.str,1); + if isempty(close) + error('[XML] Tag < opened but not closed.'); + else + empty = strcmp(xmlstring(close-1:close),'/>'); + if empty + close = close - 1; + end + starttag = normalize(xmlstring(frag.str+1:close-1)); + nextspace = xml_findstr(starttag,' ',1,1); + attribs = ''; + if isempty(nextspace) + name = starttag; + else + name = starttag(1:nextspace-1); + attribs = starttag(nextspace+1:end); + end + xtree{Xparse_count} = element; + xtree{Xparse_count}.name = strip(name); + if frag.parent + xtree{Xparse_count}.parent = frag.parent; + xtree{frag.parent}.contents = [xtree{frag.parent}.contents Xparse_count]; + end + if length(attribs) > 0 + xtree{Xparse_count}.attributes = attribution(attribs); + end + if ~empty + contents = fragment; + contents.str = close+1; + contents.end = name; + contents.parent = Xparse_count; + contents = compile(contents); + frag.str = contents.str; + else + frag.str = close+2; + end + end + +%----------------------------------------------------------------------- +function frag = tag_pi(frag) + global xmlstring xtree Xparse_count; + close = xml_findstr(xmlstring,'?>',frag.str,1); + if isempty(close) + warning('[XML] Tag close | nextspace == frag.str+2 + xtree{Xparse_count}.value = erode(xmlstring(frag.str+2:close-1)); + else + xtree{Xparse_count}.value = erode(xmlstring(nextspace+1:close-1)); + xtree{Xparse_count}.target = erode(xmlstring(frag.str+2:nextspace)); + end + if frag.parent + xtree{frag.parent}.contents = [xtree{frag.parent}.contents Xparse_count]; + xtree{Xparse_count}.parent = frag.parent; + end + frag.str = close+2; + end + +%----------------------------------------------------------------------- +function frag = tag_comment(frag) + global xmlstring xtree Xparse_count; + close = xml_findstr(xmlstring,'-->',frag.str,1); + if isempty(close) + warning('[XML] Tag blah blah +% Now root is the first element node of the tree. + +% Look for the first element in the XML Tree +for i=1:length(tree) + if strcmp(get(tree,i,'type'),'element') + uid = i; + break + end +end diff --git a/external/xmltree/@xmltree/save.m b/external/xmltree/@xmltree/save.m new file mode 100644 index 00000000..5364b258 --- /dev/null +++ b/external/xmltree/@xmltree/save.m @@ -0,0 +1,114 @@ +function save(tree, filename) +% XMLTREE/SAVE Save an XML tree in an XML file +% FORMAT save(tree,filename) +% +% tree - XMLTree +% filename - XML output filename +%_______________________________________________________________________ +% +% Convert an XML tree into a well-formed XML string and write it into +% a file or display it (send it to standard output) if no filename is +% given. +% +%----------------------------------------------------------------------- +% SUBFUNCTIONS: +% +% FORMAT print_subtree(tree,fid,order) +% Send tree entity XML formatted string to fid using 'order' blanks +% tree - XML tree +% fid - file identifier +% uid - uid of the current element +% order - order of recursivity +% +% FORMAT str = entity(str) +% Tool to replace input string in internal entities +% str - string to modify +%_______________________________________________________________________ +% @(#)save.m Guillaume Flandin 01/07/11 + +error(nargchk(1,2,nargin)); + +%prolog = '\n'; %PPD +prolog = ''; + + +%- Standard output +if nargin==1 + fid = 1; +%- Output specified +elseif nargin==2 + %- Filename provided + if isstr(filename) + [fid, msg] = fopen(filename,'w'); + if fid==-1, error(msg);end + if isempty(tree.filename), tree.filename = filename; end + %- File identifier provided + elseif isnumeric(filename) & prod(size(filename)) == 1 + fid = filename; + prolog = ''; %- In this option, do not write any prolog + %- Rubbish provided + else + error('[XMLTree] Invalid argument.'); + end +end + +fprintf(fid,prolog); +print_subtree(tree,fid); +fprintf(fid,'\n'); + +if nargin==2 & isstr(filename), fclose(fid); end + +if nargout==1, varargout{1} = tree; end + +%======================================================================= +function anyel = print_subtree(tree,fid,uid,order) + if nargin <3, uid = root(tree); end + if nargin < 4, order = 0; end + + anyel = 0; + switch tree.tree{uid}.type + case 'element' + anyel = 1; + fprintf(fid,'\n'); for i=1:order fprintf(fid,'\t'); end + %fprintf(fid,blanks(6*order)); %BLANKS + fprintf(fid,'<%s',tree.tree{uid}.name); + for i=1:length(tree.tree{uid}.attributes) + fprintf(fid,' %s="%s"',... + tree.tree{uid}.attributes{i}.key,... + tree.tree{uid}.attributes{i}.val); + end + if( ~isempty(tree.tree{uid}.contents) ... + || ~isempty( strfind( tree.tree{uid}.name,'.')) ) + fprintf(fid,'>'); + totalel = 0; + for i=1:length(tree.tree{uid}.contents) + totalel = totalel + ... + print_subtree(tree,fid,tree.tree{uid}.contents(i),order+1); + end + if( totalel>0 ) + fprintf(fid,'\n'); for i=1:order fprintf(fid,'\t'); end; + %fprintf(fid,blanks(6*order)); %BLANKS + end + fprintf(fid,'',tree.tree{uid}.name); + else + fprintf(fid,'/>'); + end + case 'chardata' + fprintf(fid,'%s',entity(tree.tree{uid}.value)); + case 'cdata' + fprintf(fid,'',tree.tree{uid}.value); + case 'pi' + fprintf(fid,'',tree.tree{uid}.target,tree.tree{uid}.value); + case 'comment' + fprintf(fid,'',tree.tree{uid}.value); + otherwise + warning(sprintf('Type %s unknown : not saved',tree.tree{uid}.type)); + end + +%======================================================================= +function str = entity(str) + str = strrep(str,'&','&'); + str = strrep(str,'<','<'); + str = strrep(str,'>','>'); + str = strrep(str,'"','"'); + %str = strrep(str,'\','''); %PPD (premiere likes \) diff --git a/external/xmltree/@xmltree/set.m b/external/xmltree/@xmltree/set.m new file mode 100644 index 00000000..60ef5360 --- /dev/null +++ b/external/xmltree/@xmltree/set.m @@ -0,0 +1,23 @@ +function tree = set(tree,uid, parameter, value) +% XMLTREE/SET Method (set object properties) +% FORMAT tree = set(tree,uid,parameter,value) +% +% tree - XMLTree object +% uid - array (or cell) of uid's +% parameter - property name +% value - property value +%_______________________________________________________________________ +% +% Set object properties given its uid and pairs parameter/value +% The tree parameter must be in input AND in output +%_______________________________________________________________________ +% @(#)set.m Guillaume Flandin 02/03/27 + +error(nargchk(4,4,nargin)); + +if iscell(uid), uid = [uid{:}]; else uid = uid(:); end + +for i=1:length(uid) + tree.tree{uid(i)} = builtin('subsasgn', tree.tree{uid(i)}, struct('type','.','subs',parameter), value); + %tree.tree{uid(i)} = setfield(tree.tree{uid(i)},parameter,value); +end diff --git a/external/xmltree/@xmltree/setfilename.m b/external/xmltree/@xmltree/setfilename.m new file mode 100644 index 00000000..7de4ab4a --- /dev/null +++ b/external/xmltree/@xmltree/setfilename.m @@ -0,0 +1,13 @@ +function tree = setfilename(tree,filename) +% XMLTREE/SETFILENAME Set filename method +% FORMAT tree = setfilename(tree,filename) +% +% tree - XMLTree object +% filename - XML filename +%_______________________________________________________________________ +% +% Set the filename linked to the XML tree as filename. +%_______________________________________________________________________ +% @(#)setfilename.m Guillaume Flandin 02/03/27 + +tree.filename = filename; diff --git a/external/xmltree/@xmltree/view.m b/external/xmltree/@xmltree/view.m new file mode 100644 index 00000000..a3ce033d --- /dev/null +++ b/external/xmltree/@xmltree/view.m @@ -0,0 +1,209 @@ +function view(tree) +% XMLTREE/VIEW View Method +% FORMAT view(tree) +% +% tree - XMLTree object +%_______________________________________________________________________ +% +% Display an XML tree in a graphical interface +%_______________________________________________________________________ +% @(#)view.m Guillaume Flandin 02/04/08 + +error(nargchk(1,1,nargin)); + +%-Build the Graphical User Interface +%----------------------------------------------------------------------- +figH = findobj('Tag','mlBatchFigure'); %this tag doesn't exist so a new +% window is created .... +if isempty(figH) + h = xmltree_build_ui; + figH = h.fig; +else + set(figH,'Visible','on'); + % recover all the handles + % h = struct(...); +end +drawnow; + +%-New title for the main window +%----------------------------------------------------------------------- +set(figH,'Name',['XML TreeViewer:' getfilename(tree)]); + + +%-Initialize batch listbox +%----------------------------------------------------------------------- +tree = set(tree,root(tree),'show',1); +builtin('set',figH,'UserData',tree); + +view_ui('update',figH); + +%======================================================================= +function handleStruct = xmltree_build_ui + +%- Create Figure +pixfactor = 72 / get(0,'screenpixelsperinch'); +%- Figure window size and position +oldRootUnits = get(0,'Units'); +set(0, 'Units', 'points'); +figurePos = get(0,'DefaultFigurePosition'); +figurePos(3:4) = [560 420]; +figurePos = figurePos * pixfactor; +rootScreenSize = get(0,'ScreenSize'); +if ((figurePos(1) < 1) ... + | (figurePos(1)+figurePos(3) > rootScreenSize(3))) + figurePos(1) = 30; +end +set(0, 'Units', oldRootUnits); +if ((figurePos(2)+figurePos(4)+60 > rootScreenSize(4)) ... + | (figurePos(2) < 1)) + figurePos(2) = rootScreenSize(4) - figurePos(4) - 60; +end +%- Create Figure Window +handleStruct.fig = figure(... + 'Name','XML TreeViewer', ... + 'Units', 'points', ... + 'NumberTitle','off', ... + 'Resize','on', ... + 'Color',[0.8 0.8 0.8],... + 'Position',figurePos, ... + 'MenuBar','none', ... + 'Tag', 'BatchFigure', ... + 'CloseRequestFcn','view_ui close'); + +%- Build batch listbox +batchListPos = [20 55 160 345] * pixfactor; +batchString = ' '; +handleStruct.batchList = uicontrol( ... + 'Parent',handleStruct.fig, ... + 'Style', 'listbox', ... + 'HorizontalAlignment','left', ... + 'Units','points', ... + 'Visible','on',... + 'BackgroundColor', [1 1 1], ... + 'Max', 1, ... + 'Value', 1 , ... + 'Enable', 'on', ... + 'Position', batchListPos, ... + 'Callback', 'view_ui batchlist', ... + 'String', batchString, ... + 'Tag', 'BatchListbox'); + +%- Build About listbox +aboutListPos = [200 220 340 180] * pixfactor; +aboutString = ' '; +handleStruct.aboutList = uicontrol( ... + 'Parent',handleStruct.fig, ... + 'Style', 'list', ... + 'HorizontalAlignment','left', ... + 'Units','points', ... + 'Visible','on',... + 'BackgroundColor', [0.8 0.8 0.8], ... + 'Min', 0, ... + 'Max', 2, ... + 'Value', [], ... + 'Enable', 'inactive', ... + 'Position', aboutListPos, ... + 'Callback', '', ... + 'String', aboutString, ... + 'Tag', 'AboutListbox'); + +%- The Add button +addBtnPos = [20 20 70 25] * pixfactor; +handleStruct.add = uicontrol( ... + 'Parent',handleStruct.fig, ... + 'Style', 'pushbutton', ... + 'Units', 'points', ... + 'Position', addBtnPos, ... + 'String', 'Add', ... + 'Visible', 'on', ... + 'Enable','on',... + 'Tag', 'Add', ... + 'Callback', 'view_ui add'); + %'TooltipString', 'Add batch', ... + +%- The modify button +modifyBtnPos = [95 20 70 25] * pixfactor; +handleStruct.modify = uicontrol( ... + 'Parent',handleStruct.fig, ... + 'Style', 'pushbutton', ... + 'Units', 'points', ... + 'Position', modifyBtnPos, ... + 'String', 'Modify', ... + 'Visible', 'on', ... + 'Enable','on',... + 'Tag', 'Modify', ... + 'Callback', 'view_ui modify'); + %'TooltipString', 'Modify batch', ... + +%- The Copy button +copyBtnPos = [170 20 70 25] * pixfactor; +handleStruct.copy = uicontrol( ... + 'Parent',handleStruct.fig, ... + 'Style', 'pushbutton', ... + 'Units', 'points', ... + 'Position', copyBtnPos, ... + 'String', 'Copy', ... + 'Visible', 'on', ... + 'Enable','on',... + 'Tag', 'Copy', ... + 'Callback', 'view_ui copy'); + %'TooltipString', 'Copy batch', ... + +%- The delete button +deleteBtnPos = [245 20 70 25] * pixfactor; +handleStruct.delete = uicontrol( ... + 'Parent',handleStruct.fig, ... + 'Style', 'pushbutton', ... + 'Units', 'points', ... + 'Position', deleteBtnPos, ... + 'String', 'Delete', ... + 'Visible', 'on', ... + 'Enable','on',... + 'Tag', 'Delete', ... + 'Callback', 'view_ui delete'); + %'TooltipString', 'Delete batch', ... + +%- The save button +saveBtnPos = [320 20 70 25] * pixfactor; +handleStruct.save = uicontrol( ... + 'Parent',handleStruct.fig, ... + 'Style', 'pushbutton', ... + 'Units', 'points', ... + 'Position', saveBtnPos, ... + 'String', 'Save', ... + 'Visible', 'on', ... + 'UserData',0,... + 'Tag', 'Save', ... + 'Callback', 'view_ui save'); + %'TooltipString', 'Save batch', ... + +%- The run button +runBtnPos = [395 20 70 25] * pixfactor; +handleStruct.run = uicontrol( ... + 'Parent',handleStruct.fig, ... + 'Style', 'pushbutton', ... + 'Units', 'points', ... + 'Position', runBtnPos, ... + 'String', 'Run', ... + 'Visible', 'on', ... + 'Enable', 'on', ... + 'Tag', 'Run', ... + 'Callback', 'view_ui run'); + %'TooltipString', 'Run batch', ... + +%- The close button +closeBtnPos = [470 20 70 25] * pixfactor; +handleStruct.close = uicontrol( ... + 'Parent',handleStruct.fig, ... + 'Style', 'pushbutton', ... + 'Units', 'points', ... + 'Position', closeBtnPos, ... + 'String', 'Close', ... + 'Visible', 'on', ... + 'Tag', 'Close', ... + 'Callback', 'view_ui close'); + %'TooltipString', 'Close window', ... + +handleArray = [handleStruct.fig handleStruct.batchList handleStruct.aboutList handleStruct.add handleStruct.modify handleStruct.copy handleStruct.delete handleStruct.save handleStruct.run handleStruct.close]; + +set(handleArray,'Units', 'normalized'); diff --git a/external/xmltree/@xmltree/xmltree.m b/external/xmltree/@xmltree/xmltree.m new file mode 100644 index 00000000..61bd7d55 --- /dev/null +++ b/external/xmltree/@xmltree/xmltree.m @@ -0,0 +1,42 @@ +function tree = xmltree(varargin) +% XMLTREE/XMLTREE Constructor of the XMLTree class +% FORMAT tree = xmltree(varargin) +% +% filename - XML filename +% tree - XMLTree Object +% +% tree = xmltree; % creates a minimal XML tree: +% tree = xmltree(filename); % creates a tree from an XML file +%_______________________________________________________________________ +% +% This is the constructor of the XMLTree class. +% It creates a tree of an XML 1.0 file (after parsing) that is stored +% using a Document Object Model (DOM) representation. +% See http://www.w3.org/TR/REC-xml for details about XML 1.0. +% See http://www.w3.org/DOM/ for details about DOM platform. +%_______________________________________________________________________ +% @(#)xmltree.m Guillaume Flandin 02/03/27 + +switch(nargin) + case 0 + tree.tree{1} = struct('type','element',... + 'name','tag',... + 'attributes',[],... + 'contents',[],... + 'parent',[],... + 'uid',1); + tree.filename = ''; + tree = class(tree,'xmltree'); + case 1 + if isa(varargin{1},'xmltree') + tree = varargin{1}; + elseif ischar(varargin{1}) + tree.tree = xml_parser(varargin{1}); + tree.filename = varargin{1}; + tree = class(tree,'xmltree'); + else + error('[XMLTree] Bad input argument'); + end + otherwise + error('[XMLTree] Bad number of arguments'); +end diff --git a/external/xmltree/GPL b/external/xmltree/GPL new file mode 100644 index 00000000..960fe746 --- /dev/null +++ b/external/xmltree/GPL @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/external/xmltree/INSTALL b/external/xmltree/INSTALL new file mode 100644 index 00000000..bf16df13 --- /dev/null +++ b/external/xmltree/INSTALL @@ -0,0 +1,45 @@ +INSTALLING XMLTree +------------------ + +This toolbox requires MATLAB 5.3 or later and should work on all +platforms. + +1) Extract the tar.gz file (you probably did this already): + +> tar xvfz xmltree.tar.gz + +or decompress the zip file: + +> unzip xmltree.zip + +2) Add the new path to Matlab (assuming you untared the toolbox +in '/home/flandin/matlab/'): + +> addpath('/home/flandin/matlab/xmltree/'); + +The folder @xmltree doesn't need to be added in Matlab path, since +it's a class folder. + +3) XMLTree package uses one mex-file for the parsing of XML data: +this mex-file is provided for Windows, Linux and Solaris platforms. +If you need to compile it for your architecture, the command is: + +> cd /home/flandin/matlab/@xmltree/private/ +> mex -O xml_findstr.c + +If never this compiled function doesn't work or behaves badly, +comment the line #define __HACK_MXCHAR__ at the beginning of the +file, and compile it again. + +4) You can now launch demonstration mfiles: + +> xmldemo1 +> xmldemo2 +> xmldemo3 + + +If you've got troubles when installing this XML toolbox, you can +send me an email (Guillaume.Flandin@sophia.inria.fr) explaining +precisely your problem. +Suggestions for improvement and fixes are always welcome, although +no guarantee is made whether and when they will be implemented. diff --git a/external/xmltree/LICENSE b/external/xmltree/LICENSE new file mode 100644 index 00000000..df032e19 --- /dev/null +++ b/external/xmltree/LICENSE @@ -0,0 +1,16 @@ +XMLTree: XML Toolbox for MATLAB (The Mathworks, Inc.). +Copyright (C) 2002-2003 Guillaume Flandin (Guillaume.Flandin@sophia.inria.fr) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA diff --git a/external/xmltree/README b/external/xmltree/README new file mode 100644 index 00000000..0dd3cb9d --- /dev/null +++ b/external/xmltree/README @@ -0,0 +1,90 @@ +XMLTree: XML Toolbox For Matlab +------------------------------- +Release 1.1, 2003/05/19 +Written by: Guillaume Flandin + INRIA Sophia Antipolis - Epidaure + 2004 route des Lucioles - BP 93 + 06902 Sophia Antipolis Cedex - France + email: Guillaume.Flandin@sophia.inria.fr + +About XMLTree +------------- +XMLTree is an XML toolbox for Matlab (version 5.3 or later). +This package consists of a class xmltree, of XML-files examples +and of 3 scripts of demonstrations. + +This toolbox contains an XML 1.0 processor (or parser), which aims +to be fully conforming. It is currently not a validating processor. +See http://www.w3.org/TR/REC-xml +for details on XML. + +This processor is encapsulated in a Matlab class allowing for the +manipulation of an XMLTree object through an object oriented way. +Several functions have been designed for this purpose. Look at the +examples scripts (xmldemo*.m) for a walkthrough of how to use the +xmltree class. + +If you do not wish to use the whole class but are solely interested +in the XML parser, then you can only use functions that are in the +private folder of the class @xmltree/private: xml_parser.m and a +compiled version of xml_findstr.m. + +Installation and Use +-------------------- +Please refer to the file "INSTALL" for details. + +Other Alternatives +------------------ +There are several ways to handle XML with Matlab. Here is a list of +them: + +1) Matlab: +You can, of course!, use this toolbox XMLTree, which is implemented +in Matlab with just one mexfile to overcome some limitations in +speed of the strfind.m function. +Peter Rydesäter also developped a toolbox called "XML Tools" that +imports XML strings and files to a Matlab struct array. +http://www.mathworks.com/matlabcentral/fileexchange/Files.jsp?fileId=1742 + +2) Java: +With the Java capabilities of the last versions of Matlab, you can +use Java's XML libraries. For example: +http://java.sun.com/xml/ +http://www.alphaworks.ibm.com/tech/xml4j/ +http://xml.apache.org/xerces-j/ + +3) ActiveX: +On Windows platforms, a solution is to use Microsoft's XML parser +through its ActiveX interface MSXML. More details: +http://msdn.microsoft.com/xml/ + +4) Mexfile gateway to a C/C++ library: +There are several C/C++ libraries available for free to parse XML +documents. A solution can be to write a mexfile calling routines +of the library. The most famous C libraries are: +Expat: http://www.jclark.com/xml/expat.html +libxml: http://xmlsoft.org/ +In C++, the main libraries are: +http://xml.apache.org/xerces-c/ +http://www.alphaworks.ibm.com/tech/xml4c/ + +5) Matlab 6.5: +The last release of Matlab (6.5 (R13)) comes with new functions to +parse XML files and working with the resulting Document Object Model +(DOM) representation: xmlread, xmlsave, ... +I do not have access to these functions however it seems that +Mathworks chose to use Java for this purpose with a Java class +called com.mathworks.xml.XMLUtils. + +License Terms +------------- +Please refer to the file "LICENSE" for the terms. + +Suggestions for improvement and fixes are always welcome, although no +guarantee is made whether and when they will be implemented. + +Guillaume Flandin +email: Guillaume.Flandin@sophia.inria.fr + +-------------------------------------------------------------------- +Matlab is a registered trademark of the Mathworks, Inc. diff --git a/external/xmltree/TODO b/external/xmltree/TODO new file mode 100644 index 00000000..d9e6d0ff --- /dev/null +++ b/external/xmltree/TODO @@ -0,0 +1,12 @@ +TODO LIST +--------- + +- Allow to parse an XML string rather than only an XML file +- Better compliance with DOM specifications. +- Better implementation of XPath +- Modify save to write hello without when content is short + Also save when content is empty ++ Add method should return the UID of the newly created node +- Save method should allow for the tree in output in order to save the filename +- Constructor should allow to take a struct in input (using struct2xml.m) ++ There should be an export.m methods to export XML to a simple struct when possible diff --git a/external/xmltree/struct2xml.m b/external/xmltree/struct2xml.m new file mode 100644 index 00000000..7c3bf67a --- /dev/null +++ b/external/xmltree/struct2xml.m @@ -0,0 +1,90 @@ +function tree = struct2xml(s,rootname) +%STRUCT2XML Convert structure to an XML tree object and specify its root name +% TREE = STRUCT2XML(S,ROOTNAME) converts the structure S into an XML +% representation TREE (an XMLTree object) with ROOTNAME as the root tag, if +% provided. Only conventional objects (char, double, sparse, *int*) are +% accepted in S's fields. +% +% Example +% report = struct('name','John','marks',... +% struct('maths',17,'physics',12)); +% tree = struct2xml(report); +% save(tree,'report.xml'); +% +% See also XMLTREE. + +% Copyright 2003 Guillaume Flandin. +% $Revision: 1.1 $ $Date: 2003/03/11 21:26: $ + +error(nargchk(1,2,nargin)); +if ~isstruct(s) + error('[STRUCT2XML] Input argument must be a struct.'); +end +if nargin == 1, + if ~isempty(inputname(1)), + rootname=inputname(1); + else + rootname='root'; + end +end +% Create an empty XML tree +tree = xmltree; + +% Root element is the input argument name +tree = set(tree,root(tree),'name',rootname); + +% Recursively walk inside the structure +tree = sub_struct2xml(tree,s,root(tree)); + +%======================================================================= +function tree = sub_struct2xml(tree,s,uid) + + if isstruct(s) + for k=1:length(s) + names = fieldnames(s(k)); + for i=1:length(names) + if iscell(getfield(s(k),names{i})) + for j=1:length(getfield(s(k),names{i})) + [tree, uid2] = add(tree,uid,'element',names{i}); + tree = sub_struct2xml(tree,getfield(s(k),names{i},{j}),uid2); + end + else + [tree, uid2] = add(tree,uid,'element',names{i}); + tree = sub_struct2xml(tree,getfield(s(k),names{i}),uid2); + end + end + end + else + switch class(s) + case 'char' + tree = add(tree,uid,'chardata',s); %need to handle char arrays... + case 'cell' + % if a cell is present here, it comes from: getfield(s(k),names{i},{j}) + tree = sub_struct2xml(tree,s{1},uid); + case {'double','sparse'} + tree = add(tree,uid,'chardata',sub_num2str(s)); + case {'int8','uint8','int16','uint16','int32','uint32'} + % need a specific function because num2str only works with double + otherwise + error(sprintf('[STRUCT2XML] Cannot convert from %s to char.',class(s))); + end + end + +%======================================================================= +function s = sub_num2str(n) % to be improved for ND arrays (code from Ph. Ciuciu) + [N,P] = size(n); + + if N>1 | P>1 + s=['[']; + w = ones(1,P);w(P)=0; + v = ones(N,1);v(N)=0; + for k=1:N + for i=1:P + s = [s num2str(n(k,i)) repmat(',',1,w(i))]; + end + s = [s repmat(';',1,v(k))]; + end + s = [s ']']; + else + s = num2str(n); + end diff --git a/external/xmltree/view_ui.m b/external/xmltree/view_ui.m new file mode 100644 index 00000000..f34045ae --- /dev/null +++ b/external/xmltree/view_ui.m @@ -0,0 +1,259 @@ +function varargout = view_ui(action,figHandle) +% Used by XMLTREE/VIEW +% FORMAT varargout = view_ui(action) +% +% action - string +%_______________________________________________________________________ +% +% Callback manager of xmltree-method view +%_______________________________________________________________________ +% @(#)view_ui.m Guillaume Flandin 02/04/08 + +if nargin < 2 + figHandle = gcbf; +end + +switch action + %- BATCHLIST -% + case 'batchlist' + seltype=get(gcbf,'SelectionType'); + tree = get(gcbf,'UserData'); + BatchListboxH = findobj(gcbf,'Tag','BatchListbox'); + uidList = get(BatchListboxH,'UserData'); + % Single mouse click + if strcmp(seltype,'normal') + ModifyButtonH = findobj(gcbf,'Tag', 'Modify'); + AboutListboxH = findobj(gcbf,'Tag', 'AboutListbox'); + uid = uidList(get(BatchListboxH,'value')); + contents = children(tree,uid); + if length(contents) > 0 & ... + strcmp(get(tree,contents(1),'type'),'chardata') + str = get(tree,contents(1),'value'); + set(findobj(gcbf,'Tag','Add'),'Enable','off'); + elseif length(contents) == 0 + % 18/02/02 : definition : une balise vide contient un chardata vide: pas d'accord !!! + str = ''; + tree = add(tree,uid,'chardata',str); + builtin('set',gcf,'UserData',tree); + set(findobj(gcbf,'Tag','Add'),'Enable','off'); + else + str = ['Tag ' get(tree,uid,'name')]; + set(findobj(gcbf,'Tag','Add'),'Enable','on'); + end + if get(BatchListboxH,'value') == 1 + set(findobj(gcbf,'Tag','Copy'),'Enable','off'); + set(findobj(gcbf,'Tag','Delete'),'Enable','off'); + else + set(findobj(gcbf,'Tag','Copy'),'Enable','on'); + set(findobj(gcbf,'Tag','Delete'),'Enable','on'); + end + %- Trying to keep the slider active + set(AboutListboxH,'Enable','on'); + set(AboutListboxH,'String',' '); + set(AboutListboxH,'Enable','Inactive'); + set(AboutListboxH,'String',str); + % Double mouse click + else + tree = sub_flip(tree,uidList(get(BatchListboxH,'value'))); + [batchString uidList] = sub_update(tree); + set(BatchListboxH,'String',batchString); + set(BatchListboxH,'UserData',uidList); + builtin('set',gcbf,'UserData',tree); + end + + %- UPDATE -% + case 'update' + % update is not always called from a callback + BatchListboxH = findobj(gcbf,'Tag','BatchListbox'); + if isempty(BatchListboxH) + BatchListboxH = findobj(gcf,'Tag','BatchListbox'); + end + tree = get(figHandle,'UserData'); + if isempty(tree) + tree = get(gcf,'UserData'); + end + [batchString uidList] = sub_update(tree); + set(BatchListboxH,'String',batchString); + set(BatchListboxH,'UserData',uidList); + + %- ADD -% + case 'add' + tree = get(gcbf,'UserData'); + BatchListboxH = findobj(gcbf,'Tag','BatchListbox'); + uidList = get(BatchListboxH,'UserData'); + AboutListboxH = findobj(gcbf,'Tag', 'AboutListbox'); + uid = uidList(get(BatchListboxH,'value')); + answer = questdlg('Which kind of element to add ?','Add an item','Node','Leaf','Node'); + switch answer + case 'Node' + tree = add(tree,uid,'element','New'); + case 'Leaf' + tree = add(tree,uid,'element','New'); + l = length(tree); + tree = add(tree,l,'chardata','Default'); + otherwise + warning('Bug !'); + end + tree = set(tree,uid,'show',1); + builtin('set',gcf,'UserData',tree); + set(findobj(gcbf,'Tag', 'Save'),'UserData',1); + view_ui update; + view_ui batchlist; + + %- MODIFY -% + case 'modify' + tree = get(gcbf,'UserData'); + BatchListboxH = findobj(gcbf,'Tag','BatchListbox'); + uidList = get(BatchListboxH,'UserData'); + AboutListboxH = findobj(gcbf,'Tag', 'AboutListbox'); + uid = uidList(get(BatchListboxH,'value')); + contents = children(tree,uid); + if length(contents) > 0 & ... + strcmp(get(tree,contents(1),'type'),'chardata') + str = get(tree,contents(1),'value'); + prompt = {'Name :','New value:'}; + def = {get(tree,uid,'name'),str}; + title = sprintf('Modify %s',get(tree,uid,'name')); + lineNo = 1; + answer = inputdlg(prompt,title,lineNo,def); + if ~isempty(answer) + tree = set(tree,uid,'name',answer{1}); + str = answer{2}; + tree = set(tree,contents(1),'value',str); + set(findobj(gcbf,'Tag', 'Save'),'UserData',1); + builtin('set',gcf,'UserData',tree); + end + else + str = ['Tag ' get(tree,uid,'name')]; + prompt = {'Name :'}; + def = {get(tree,uid,'name'),str}; + title = sprintf('Modify %s tag',get(tree,uid,'name')); + lineNo = 1; + answer = inputdlg(prompt,title,lineNo,def); + if ~isempty(answer) + tree = set(tree,uid,'name',answer{1}); + str = ['Tag ' get(tree,uid,'name')]; + set(findobj(gcbf,'Tag', 'Save'),'UserData',1); + builtin('set',gcf,'UserData',tree); + end + end + %- Trying to keep the slider active + set(AboutListboxH,'Enable','on'); + set(AboutListboxH,'String',' '); + set(AboutListboxH,'Enable','Inactive'); + set(AboutListboxH,'String',str); + view_ui update; + view_ui batchlist; + + %- COPY -% + case 'copy' + tree = get(gcbf,'UserData'); + BatchListboxH = findobj(gcbf,'Tag','BatchListbox'); + uidList = get(BatchListboxH,'UserData'); + AboutListboxH = findobj(gcbf,'Tag', 'AboutListbox'); + pos = get(BatchListboxH,'value'); + if pos ~= 1 + uid = uidList(pos); + tree = copy(tree,uid); + builtin('set',gcf,'UserData',tree); + set(findobj(gcbf,'Tag', 'Save'),'UserData',1); + view_ui update; + view_ui batchlist; + end + + %- DELETE -% + case 'delete' + tree = get(gcbf,'UserData'); + BatchListboxH = findobj(gcbf,'Tag','BatchListbox'); + uidList = get(BatchListboxH,'UserData'); + AboutListboxH = findobj(gcbf,'Tag', 'AboutListbox'); + uid = uidList(get(BatchListboxH,'value')); + pos = get(BatchListboxH,'value'); + if pos > 1 + tree = delete(tree,uid); + set(BatchListboxH,'value',pos-1); + set(findobj(gcbf,'Tag', 'Save'),'UserData',1); + end + builtin('set',gcf,'UserData',tree); + view_ui update; + view_ui batchlist; + + %- SAVE -% + case 'save' + tree = get(gcbf,'UserData'); + [filename pathname] = uiputfile('*.xml','Save Batch as'); + if ~(isequal(filename,0)|isequal(pathname,0)) + save(tree,fullfile(pathname,filename)); + set(findobj(gcbf,'Tag','Save'),'UserData',0); + end + + %- RUN -% + case 'run' + warndlg('Not implemented','XMLtree :: Run'); + + %- CLOSE -% + case 'close' + SaveButtonH = findobj(gcbf,'Tag','Save'); + if get(SaveButtonH,'UserData') + answer = questdlg('Save changes ?', ... + 'Quit XML Tree'); + switch(answer) + case 'Yes' + view_ui save; + delete(gcbf); + case 'No' + delete(gcbf); + case 'Cancel' + otherwise, + end + else + delete(gcbf); + end + + %- OTHERWISE -% + otherwise + error('[XMLTree] Unknown action.'); +end + +%======================================================================= +function [batchString, uidList] = sub_update(tree,uid,o) + if nargin < 2 + uid = root(tree); + end + if nargin < 3 | o == 0 + o = 0; + sep=' '; + else + sep = blanks(4*o); + end + batchString = {[sep get(tree,uid,'name')]}; + uidList = [get(tree,uid,'uid')]; + haselementchild = 0; + contents = get(tree,uid,'contents'); + if isfield(tree,uid,'show') & get(tree,uid,'show')==1 + for i=1:length(contents) + if strcmp(get(tree,contents(i),'type'),'element') + [subbatchString subuidList] = sub_update(tree,contents(i),o+1); + batchString = {batchString{:} subbatchString{:}}; + uidList = [uidList subuidList]; + haselementchild = 1; + end + end + if haselementchild==1, batchString{1}(length(sep)) = '-'; end + else + for i=1:length(contents) + if strcmp(get(tree,contents(i),'type'),'element') + haselementchild = 1; + end + end + if haselementchild==1, batchString{1}(length(sep)) = '+'; end + end + +%======================================================================= +function tree = sub_flip(tree,uid) + if isfield(tree,uid,'show') + show = get(tree,uid,'show'); + else + show = 0; + end + tree = set(tree,uid,'show',~show); diff --git a/external/xmltree/xmldemo1.m b/external/xmltree/xmldemo1.m new file mode 100644 index 00000000..e7572631 --- /dev/null +++ b/external/xmltree/xmldemo1.m @@ -0,0 +1,129 @@ +%XMLDEMO1 Demonstrate how to create an XML tree and save it +% +% Description +% This script demonstrates the use of the xmltree class to +% create an XML tree from scratch and save it in a file. + +% Copyright (C) 2003 Guillaume Flandin + +% Please note that this script is only a demonstration of how +% to use xmltree, set, add, view and save methods. +% Indeed in this example, the use of the struct2xml function +% would have been much more efficient: +% entry = struct(...); % cf line 51 +% addressBook = struct('entry',entry); +% tree = struct2xml(addressBook); + +clc; +disp('This demonstration illustrates the use of the xmltree class.') +disp(' ') +disp('Let''s build an address book in XML.') +disp(' ') +disp('Press any key to create an empty tree.') +disp(' ') +pause; + +disp('>> tree = xmltree;'); +tree = xmltree; + +% Modify the root element +disp(' ') +disp('Modify the root element.') +disp(' ') +disp('Press any key to continue.') +disp(' ') +pause; + +disp('>> tree = set(tree,root(tree),''name'',''addressBook'');'); +tree = set(tree,root(tree),'name','addressBook'); + +% Create a new entry in the address book +disp(' ') +disp('Create a new entry.') +disp(' ') +disp('Press any key to continue.') +disp(' ') +pause; + +disp('>> tree = add(tree,root(tree),''comment'',''This is the first entry of our Address Book'');'); +disp('>> [tree, entry_uid] = add(tree,root(tree),''element'',''entry'');'); +disp('>> tree = attributes(tree,''add'',entry_uid,''lastModified'',datestr(datenum(date),''dd-mmm-yyyy''));'); +tree = add(tree,root(tree),'comment','This is the first entry of our Address Book'); +[tree, entry_uid] = add(tree,root(tree),'element','entry'); +tree = attributes(tree,'add',entry_uid,'lastModified',datestr(datenum(date),'dd-mmm-yyyy')); + +% Here are the data for the new entry +entry = struct('firstName','Guillaume',... + 'lastName','Flandin',... + 'address',struct('institute','INRIA Sophia Antipolis',... + 'street','2004 Route des Lucioles',... + 'zipCode','06902',... + 'city','Sophia Antipolis',... + 'country','France'),... + 'phone','(+33) 4 92 38 71 52',... + 'email','Guillaume.Flandin@sophia.inria.fr'); + +% Fill in the fields with data +disp(' ') +disp('Create and fill in the fields with data.') +disp(' ') +disp('Press any key to continue.') +pause; +entry + +% Create the 'firstName' tag +[tree, uid] = add(tree,entry_uid,'element','firstName'); +tree = add(tree,uid,'chardata',entry.firstName); + +% Create the 'lastName' tag +[tree, uid] = add(tree,entry_uid,'element','lastName'); +tree = add(tree,uid,'chardata',entry.lastName); + +% Create the 'address' tag +[tree, address_uid] = add(tree,entry_uid,'element','address'); + + [tree, uid] = add(tree,address_uid,'element','institute'); + tree = add(tree,uid,'chardata',entry.address.institute); + + [tree, uid] = add(tree,address_uid,'element','street'); + tree = add(tree,uid,'chardata',entry.address.street); + + [tree, uid] = add(tree,address_uid,'element','zipCode'); + tree = add(tree,uid,'chardata',entry.address.zipCode); + + [tree, uid] = add(tree,address_uid,'element','city'); + tree = add(tree,uid,'chardata',entry.address.city); + + [tree, uid] = add(tree,address_uid,'element','country'); + tree = add(tree,uid,'chardata',entry.address.country); + +% Create the 'phone' tag +[tree, uid] = add(tree,entry_uid,'element','phone'); +tree = add(tree,uid,'chardata',entry.phone); + +% Create the 'email' tag +[tree, uid] = add(tree,entry_uid,'element','email'); +tree = add(tree,uid,'chardata',entry.email); + +% Graphical display and save +disp('Graphical display.') +disp(' ') +disp('Press any key to display the xmltree.') +disp(' ') +pause; + +disp('>> view(tree);') +view(tree); + +disp(' ') +disp('Press any key to save the xmltree in example.xml.') +disp(' ') +pause; + +disp('>> save(tree,''example.xml'');') +save(tree,'example.xml'); +disp(['Saved in:' fullfile(pwd,'example.xml')]); + +disp(' '); +disp('Press any key to end.') +pause; clc; close all; diff --git a/external/xmltree/xmldemo2.m b/external/xmltree/xmldemo2.m new file mode 100644 index 00000000..1dcde833 --- /dev/null +++ b/external/xmltree/xmldemo2.m @@ -0,0 +1,82 @@ +%XMLDEMO2 Demonstrate how to read an XML file, modify it and save it +% +% Description +% This script demonstrates the use of the xmltree class to +% open an XML file, access data stored in it, modify a value +% and save the new XML file. +% +% This demonstration script need the file 'example.xml' created +% in the first demonstration script xmldemo1. + +% Copyright (C) 2003 Guillaume Flandin + +clc; +disp('This demonstration illustrates the use of the xmltree class.') +disp(' ') +disp('Let''s open the address book previously created and modify an entry.') +disp(' ') +disp('Press any key to open the XML file ''example.xml''.') +disp(' ') +pause; + +disp('>> t = xmltree(''example.xml'')') +try, + t = xmltree('example.xml') +catch, + disp('Please first launch xmldemo1') +end + +disp(' ') +disp('Now you have several methods implemented to deal with the xmltree object:') +methods xmltree + +disp('Press any key to continue.') +pause; clc; + +% Extract the first name +disp('Extract the first name.') +disp(' ') +disp('Press any key to continue.') +disp(' ') +pause; + +disp('>> first_name = children(t,find(t,''/addressBook/entry[1]/firstName''))') +disp('>> get(t,first_name,''value'')') +firstname_tag = find(t,'/addressBook/entry[1]/firstName'); +first_name = children(t,firstname_tag); +get(t,first_name,'value') + +% Modify the first name +disp('Modify the first name.') +disp(' ') +disp('Press any key to continue.') +disp(' ') +pause; + +disp('t = set(t,first_name,''value'',''Joe'');') +t = set(t,first_name,'value','Joe'); + +% Modify the last name +disp(' ') +disp('Modify the last name.') +disp(' ') +disp('Press any key to modify the last name.') +disp(' ') +pause; + +disp('>> t = set(t,children(t,find(t,''//lastName'')),''value'',''Bloggs'');') +t = set(t,children(t,find(t,'//lastName')),'value','Bloggs'); + +% Save the modified XML file +disp(' ') +disp('Press any key to save the xmltree in example2.xml.') +disp(' ') +pause; + +disp('>> save(t,''example2.xml'');') +save(t,'example2.xml'); +disp(['Saved in:' fullfile(pwd,'example2.xml')]); + +disp(' '); +disp('Press any key to end.') +pause; clc; close all; diff --git a/external/xmltree/xmldemo3.m b/external/xmltree/xmldemo3.m new file mode 100644 index 00000000..eb835c9c --- /dev/null +++ b/external/xmltree/xmldemo3.m @@ -0,0 +1,57 @@ +%XMLDEMO3 Demonstrate how to convert an XMLtree in a simple structure +% +% Description +% This script demonstrates the use of the xmltree class to +% convert an XMLtree (when possible) in a simple structure. +% This can only be performed when the XML file is simple enough +% (one element cannot have more than one chardata child). + +% Copyright (C) 2003 Guillaume Flandin + +clc; +disp('This demonstration illustrates the use of the xmltree class') +disp('to convert an xmltree in a simple Matlab structure.') +disp(' ') +disp('Press any key to open the XML file ''example.xml''.') +pause; + +disp('>> t = xmltree(''example.xml'')') +try, + t = xmltree('example.xml'); +catch, + disp('Please first launch xmldemo1') +end + +disp(' ') +disp('Press any key to display the XML file.') +pause; + +save(t); + +disp(' ') +disp('Convert the xmltree in a Matlab structure.') +disp(' ') +disp('Press any key to continue.') +disp(' ') +pause; clc; + +disp('>> s = convert(tree);') +s = convert(t); + +disp(' ') +disp('Display the content of the structure.') +disp(' ') +disp('Press any key to continue.') +disp(' ') +pause; + +disp('>> s.entry'); +s.entry +disp('>> s.entry.address'); +s.entry.address +disp('>> s.entry.address.institute'); +s.entry.address.institute + +disp(' '); +disp('Press any key to end.') +pause; clc; close all; diff --git a/filters/Contents.m b/filters/Contents.m new file mode 100644 index 00000000..ff4d25f9 --- /dev/null +++ b/filters/Contents.m @@ -0,0 +1,27 @@ +% FILTERS +% See also +% +% Filters: +% filter_DOG_2D - Difference of Gaussian (Dog) Filter. +% filter_DOOG_1D - 1D difference of offset Gaussian (DooG) filters. +% filter_DOOG_2D - 2D difference of offset Gaussian (DooG) filters. +% filter_DOOG_3D - 3D difference of offset Gaussian (DooG) filters. +% filter_binomial_1D - 1D binomial filter (approximation to Gaussian filter) +% filter_gabor_1D - 1D Gabor Filters. +% filter_gabor_2D - 2D Gabor filters. +% filter_gauss_1D - 1D Gaussian filter. +% filter_gauss_nD - n-dimensional Gaussian filter. +% filter_steerable - Steerable Gaussian derivative filter. +% filter_visualize_1D - Used to help visualize the a 1D filter. +% filter_visualize_2D - Used to help visualize a 2D filter. +% filter_visualize_3D - Used to help visualize a 3D filter. +% +% Operations involving a set of filters (a filter bank or FB): +% FB_apply_2D - Applies each of the filters in the filterbank FB to the image I. +% FB_crop - Crop a 2D filterbank (adjusting filter norms). +% FB_make_1D - Various ways to make filterbanks. See inside of this file for details. +% FB_make_2D - Various ways to make filterbanks. See inside of this file for details. +% FB_make_3D - Various ways to make filterbanks. See inside of this file for details. +% FB_reconstruct_2D - Use to see how much image information is preserved in filter outputs. +% FB_visualize_1D - Used to visualize the Fourier spectra of a series of 1D filters. +% FB_visualize_2D - Used to visualize the Fourier spectra of a series of 2D filters. diff --git a/filters/FB_DoG.mat b/filters/FB_DoG.mat new file mode 100644 index 0000000000000000000000000000000000000000..93271b3f38f0fcdeb2a095830693d5cb3e5e3f21 GIT binary patch literal 276960 zcmeEvb$C@d_jPf1_u?&slv1?!B)Gd4*Wyy3xV2buYmotpyA~~S?+Gr06qlmK-CaL^ zWUc?aTCVZ|UjY#=cwE687bLbg(bw(Zk-kkbS|TC0v|JI2E&Z zc5-sD|LOniqE)Jv*v`(*t$0kk*k69*e);!*zyJ4NtS|o(e)*RL|8ji!{lEXB*+sW2 zU)s(t-k1Mx|K+`~`Y(Ix4yywW9CQte=WVSxC6VzwWaGIFSDza(M~_`rvd$1O@I|7K z%Xe3af$0OTe@UBO2}Zwe^uTH|&F9R|_gNmx53BZuRXOuwyi4+^>mAou&Iev@kCoSO z9JTjMjx)){Ylo7h3#|1Qr99sa&C&LdxIV8+|1W8?ZndcuhP1z6GR^1A&-Ym#%MYve zhE+LfrW|~7DRV5#o1_(vq%B_2SdcX^pg~0^@mI^3u`ey#DvrM1vOLGy+oFwc?;>B) zW}GBzH|AUS+GLu~nV;{oJeD6;?G3APD)zo`q03TxOQ*Ck#QJotjg1dSW?H(slE{A` zcE$kLQ=(PM7lHRyMVBk`mMHxtZKizaK4rw3qUYwKuHFNjj?6zVa`N zTD*48d{(&s0Ar4uQ=7(pTZ!QhUOa4-;h`vl8&6fm0v^VL>$$@sC*M3Q>DQ8xcIFO;9Vw%sHpYO9gmLFE_ z4XbkcPswi{djfcok@X4yq4SMPgyfp+?d$&;rdq&^7P91Z`Z|dAX~SXnsLJ` z2X%D6%e7Sr+bO2`ocZ}a%VYUr)!wiwr}c?>D`xZ=Zds{9T9@j#-^lF0dECAUYen>> z$=@xyR7^fO7;+v`b^24aPVOGq*xV=1!l-OuFT4mLhVCUCHj^tM=WOceCqBjVd znasDnJX2waVO=v#?o3$t;Fq*Yv(Hzq4OpU>=5yxf`z(*;hgpNesG#Z&=D<-!11+nv zrtUFg-aEtc;pn~;w?c%^ni>NxxpbE2M`wNUEbdI%>B^*lFKLyk&CJaO60A^6^EvbL zeU``a!>GAoR?Ond%Nl;JzQwYr>t~OQA@7ZYj_+2Cv|SSuKaShfdQ=zL#W~C5dZlN{ z9z|+A{E}8Fro1S%y6j5DG@mm+-)DI&Kg=2&Mg?&^I6fRNjvvR9fZA9H`^e*ItBzo}1AzoNcH{fqh- z^|SwqzDE6-`ZV=x>f6-6sgM6x^mE!vw4Z2C(Y~U+Mf>Z&Vvo^2roBx2nf5g8YuelY z75kh15c)^xFQNa0{uKIG{ww|#`oHK8qkoM4GWyTxPy4U<*XZx0|C9bu`bX(6rT_H5 z;!mZ2oBnS4zv&OBf1LjE|BC;d=NUZT;CTnnKX@L(^O66`c?r+2c%H@cEuMGr{EO#d z|CRGGo>%hxlINK`-{g5G&p#u{d8il6(SQ8gr)r00wteSa*R?O6D&eF|M$&HHcb%`q z5G_t5FMqA(L~+4uz@z3FqMCuK9GvRG{% zTgnu5Gc38Ax5!wbq^Mqee~kxA4vI9H?%!^;_I0S-NSkziTozsx1qd9 zFSq-MHz#^OuV5)0-Q!%=zGIC`moo;w?A=4;^-nplK)R1&TJzVNK3~ccDmT&!&rRev z@xBe^MS8i@%jC~;bZu@~G2Xp?+}I0@+(~k8OXNCA1T{^ca&?*%((l-d9=GO|3Y8ma zh35+SO}uYId68c3OqF_WI33i(@<;53iKXu*V_4g}k6TCc7iBxWdJ`0!OO8%|r&odW z^+M%FTH(1ueiQH8P+p{$``{U`Oe@9=w;YT!j zo5bf){C1&oBdzdUA-{?DZ746&%RRq-gIWoD`&kapPky3*pR-2Vb$zE({`x^26T(-&Ck7wC~=OzoS->YDpYwq0>p zq%1aNaoK70WuYd4b8iL@50x8fh35+SO}uYId68c3_(4rvmL6YYv6S*iQDxOrc(yuH_n1kxsg_Qu8`lv`zFeZ^m5PIb6Kq^ zw#QQcY2Nwi3dRvP3-_qKH{W9sdtdxpg(vrwaps>r|9Z`mP`Qy-c&?D&#QP@7i}Z5G zy}ji6zQX%0pDjs_`ptw5mX?%%(wzV^H7=fA5x_Pg5OzpKCHclEFRuKv{D)qnoG zo|pWt=VQOvc_@yn!vE*Wmcxf$G~ppAb&NLk=?T4P@%`^k5;hc9Cl>xpDza( zucn(HUuUi>Hf>#>YkrO+qVvmIrF%4dD1wURnRLjwCh}cAH1T+r< zaB7SFE%RPCw;H<-?-6I+o45zW-6Q5Ut#xa|_z7azizm7EoO@SGMIWLTK3%o-#5>n}i)10%%{pQ2M!%#A50HnC6mX-f{- zB%pgdr>!YufrtC%*GisTdCWLuU(7C@3bL$CAWH5uL#o$b;d17gxL7Tg$DnF|i7Hha zk8V0+iYT0TN1C7kpN(_No5y_YmCTrw#pjA$k{zz!G$-7Wt{c|xZQEq1W!9W3N$7F@&ib)i$`@1h zrZ%X)>yLEmabIB@dODWen)OqK57q2sh;O^#qUZLBz2&>)y1%`Uuxx6cpz+eu#^efb zt~lh2Zah!kdBPE|UEwZwbKAr7d8Z7wJgRZY&*w>?k-P7^;_fF#iIxvzU2nTFK)Ctc z$#wjhlg#_@?aFwsYfHDz*$WKXTtvPoF}CT*`{mUh&nG(%Juasf#eJIGC)InAtAf*? z%ZEG2Pw(B8{f5_KNsEbZ-*nk278W@2$mvKS(YkhE;IUbijLegMgFY= zTegtrx=cRWAVE3h(RJa$=Of+K?VTy=81F4Af6TK!?u$yu*&%z@f6SLpI#~zyeHrhi z5R+SMI8nW==#(YKgWB198&&V^8C-H~KFjS?i8J-=e?Q#i&Q+=Cm9tgnSsJY=e4y~_ zvxbp0zR~{uI^osi<;&-ja?2qnhV6V(ww6qMrRd?E7H2l_uU+`_83!LKC8AZ@af!ivi2ogsnKe@c=PsoOYbTRjP*Wg-Anm240n0i zzilQ4+$-a-))Kc>mb-0F-!rOb?{Imj%RzCz!Kqc&j}>H3``SknRq7!t)+n5La?go! zUKf{~!>i?$$r4rkBjKn?s+V8G7I__qs0^1{INwXvR_;lc$>Y6uSGhajgZ;2w7P;iW zz&1O3uMu@}cfR%K^-kjRh64@yrS>x%D>)U3cdKr=%RS#KWN~nGe@nT9EAEuNc*3ZZ zVfgtKZ~a88;Lq{mgj^A2yU+U+KYAOvY*B^FLt9Od=WBY8Pw3(;E3ez;Gke20H8)Mp zJ$e17t2aCB@Bh)ekeZ!#{qCBdhRJM2p03NhtCj40v_{Nwy$Z_3XPf=$XSYn$>o+#* zwo^Ner4?LXE$crZ+~wssH%>S@M{vybmb!NuoJQ^`e%Baqlir122}^K7HUQb+==}lpYO-$|G~L zzn^7z%Pr-4ro20(mTW)%X3Ec7_lonzl`DW3++{&_JyiXa~a`x;h&P)k+d3#+hoqou^j+Vv4d{T9Yw!)Gvh0P`9 zqKC%BcMaSpsuN=C{zTh~xi^xYi*LRS8tEf*zhB&;M5ZaS+U}d>5{(`niU;;Wx(J># z{|UU$@>u?K)W`byy@l5=``Zis&+*{+Jl?Lyi{r=fY=-gWc;9l>z9%cbukezS^)$kK3da0;iuu+V^UsR;cnS0KA?9me%-=GY&uKBgIp6nT{&PLx z`oQ&q>j&Er-oIQwxt{LC`pWf|>+fW&$6TMeUOQm@=6cTcy*Ac+uK(N*24R2Tei7dC zR>J*#G-N9|&)G zS>HkEL($%8{ireYrA*be{uJFq>r;cEU+sdv6%750`j{2^8TB>lZ;7GLQNN?US9z}1 z|JaW3`lY^0{g?VM^<(PG)SszOzkz;DeVh7sTIl1{&#A9BhyG4|p89=w$;o}}fLw8t~n)b=^;_3)CD_1uGh zVkrC-^k2}QLH`E*9rSuuZ@SltpxmU;VtjC^)-h-lKx5hE9t+a zKa>7V`a9|WyaInH{iF1k#u}&nr}U@Nzxr+c5uNseKbrpO)bLl+e@%aOLio4o@23BI zHvHlAkJDd1B75CO|K~raKRu%5{JZ+^;CzDT6+FLagY%4*IN#WV^NwUV|EP)c5MP{+ zSaDwRclAZq=RB|ai1RC+XYqV%63)AL{>AgK$STjzw#y6Wl{~-XdFH%M`h1h;ojm{i z+4BFZ`LjjyYS^IgS=ZjJMjp?d=7Z%@<`b!kl+9!eise49+Oa1_$vfTlU%H$=(w%$# z)A7ii@mk+T`4d_O^z?8Yl(D4I^7;A%jdvvxZ8F(cOi^)!cv1G&yTsS$h_n?GIJauP z=$DuORpt*xeFL*vs;*C&XJ)}_#?+%9L)LalA$FzpT)T2^ap4_j&h_bwHi%YFs(5E= za!iyQn8Lk@^Cod-(dS1Cn=UZRI6MDY;H;ndPy0Q*-YNOLt4ZRb3Jl`iKy2RdAvhy?1{Y>G74XY%PjeRrjSe5djXxME{l_c5j znWJl}0j{gAnMc!ZjNg9ZB6ISZ7qxwxr!aTlcr?&EPDWeSp)U1SXFX^A*>?R~`L{l7 z=jofiuI2jS18;7$=x@1l_j$IvPXde`&N*6~&pt-v%-(XjoE1~PY2?+oc8gqc_smq= zmu0e-zPVmq-tzgiS!2|@6PNoXQC<5NDfHO+syQca*3%WPFEIB8K3!67KpL}CNJ#mV z9dg?y1zxJOZP?}Q|CSs-TW*CF9XdA3G179obEPd^n^}!wcQ5S|gM3BhM;&YA`ZK;< z|0+?xa!2yZ(X(yq<@<7S`|wP$W6Ve)ov$AKu>FODa_;?Xt5?m`Dj-jT{W+6fHC@YJ zdC=-bRkL1@_uKLfo7x_4bXf0II;r*J1lQCL)&@nm+$EyN-Im7uunO+A6ZxW4iuROe9S|Mp0;ng5sng;UxgYG*Ejj1Rd*C%>;?VgKz=Co+n z-1H@t%Ye&m4%LpYJYDu4*;9JAS?gre7(MQkGcVNb*StlKrnXV#`i<;WJ9VV_zGo*X zw6j&Jr52ZiLPRqdFEWsZ!LAUo>O%1Zw>wHTlD${-)2gUV#&*O|rFlY&Y_A zl`@e=-cybw@`!|qR5@g?9 zyVxMPaP*>pEOFb(xw)q&%~`y)YFhr2%k3`iYSN}5PpdyEsCHKE(zwOo1!m$o^J*m+ z)zq{*|Hq)dnMc@e_o$j-!0yr!F8AaTRnw}ay)5GGv}k8bo0d2ew|FJ8y)}})h}P+` zI44eb%9-epOGEkKN;LD)J1^;6q*)HPOc1IgdGgduUVT zQ2vg~(AJLX#NB772f55Mv&Rm8d_41J+v2Pn0vBem8Gqh5;po3Hj_B60(ZIt^?~3yEy7fvpxvQM{;C(uC`ZReu zX^rRyjA^o#-|$-LUJX!vCbir8r~PzQw&tz0S$1?%W798s)K?W#F9z@F^f>lrb7HTg zIUb%nZd;tax%<&n6C+$+jGMG zOxaxXiZ2rNg5NEh*71p0yQJ}x)#H21_1XQatf;d;oKZKRWevwEYTL>U zX$}uspw!Iy;};C^RAc*H9)DLks1B~))4eL2X0@HW1_UJyv32eoch|`)^CMhdj&t_G zqc6%cTP-zu=ev0MOI+y77pJA1w&|)!QtrB&Qzds95Z~4Bb4Fj;)YW12^At;o2ezxB z(`tr(u8?0n)bE=p&xZ0NjlABv|1B5~1LGq~_5C_t65}T^o^pd8Uyip@di>P_{XHmr zA7<9FU%wYKwf=r=KKgr#aJgIP`DIC`=bI&=o`1$pJs(ATJwIh_JzwQYJ%8m!J)c!# zJ--#^yQ-(>zruQ8Vtue-y@+sm`CVf@wJg%>tAX`aVEvU7^m;6@K6Aa6cl7$Lu%0Wd z@5)=R_a@eV6Z?U!qTU}OTyE@_7VMu!6}_Jt*k1+qTe)2Czub?xKdbF}zg7qJ{;lku zf8EcOuioFy?s~tsIqUsD!sX>SZ`S&e#Zl`^#zUCpOeWhA!drQsL z_Lr)l?J?6y+h?|=+Fpw^@=nqAtmUP)Z;i&<-W5Z&{VRmFhvi3YAIpN;UY5tS{jBzA zds@N1Rzlm`ChTt;>~UKwZJ$TD+}E_f!WI4t3;Y=d{2K!P4gvoM{UP*^C|~U_QShHA z_)}CJ?O!qBZ?VDu65;alyM}+t75*v%{wo20mVkdtz~4pxmoT+IOnuh=F_lI8%hU$# zKQpgsf12%__ODqtYJXd#k=s@KBQ5Yx8t_*N_%8+gne=Z8_&ZJbKh>YwA8NusYQkS? zdT9Tt4gSn2-Z7HJ19)*o z$<-`(wIjJZLrGVcl>a`WW!ghkyrP0zCY<;yNBc<_kI= zLPU>iw9*=HwgGskslX$>06yn3@G9GY-^c+x!w%qKcK{Du5cj`rz=OvS8V|n_@c^nK z9)ca>K~yOlzVR@KhiM2r;bq{VhzC0jJX|Z_kwya#c?5XS6u@sJ0vIaR7&vr`3185C=P8P(2Xoq+hoq%UZg?K2zhzAoN_rGT$9#C7vL;9ZF=@DP1 z8RD&!0v=){;&GhrqvKPg1s*6D;urV;&tDICI6vUMj|2al3wU7SV~GbQev)`XukIRO z_Yioq7{Fgyfk&zXe9o(NIv&W!S2`ZbdBlT>g?Ko{uSb8df7oAF(0}Yt_Ald)u>Uz8&oDk5FODC_vm@}p#6RBv9(Xst z2jWGEpPYj4=SX864dgA-L+h51SDTnWq-|M&I%5*t=@AL8fb3Sl>*kitM z{%}4yV1Cudd^>=69G@^BV+a$e%1&3TOjtkoY?=aVn5{m$o=v@ z_Rr?nPr1KV#(o=w{g?YO_vbv=uepD7KW~Y65Zv#%|L2815C{6f;h|bz_?|pJ`gbez zm;BIYsNYcEX$Jj=`VjS_yU>^FL4Tq?)g1cON$6Y6pnnBHAIr5^$7@&teQhfAw=U4< zi1!`e1B@OJCy0B+x-_YKn{X=_bBkUvEOSGTX!k(giMSE*9>@V75 zw9o!&`~T_tv{z}r(w?P#OM930Z$;R{w2x^o2f==(Jx%+%80>A@-~Y6|Vf8-!6ZBWm ze?fl+{TuXmRDl13{*cG;k32y9AjX5J5<&50ezsrw!#_oT75!KAXVJga7yd5#zvvHZ z7(wxpepb$J^9R8nN&h7MmGocIpIHU|P5L{(E$3HF(;s~S{%QKF>A$8w`&X6k@7lc# z=Mg-g_`Cd3&!c)Est2NaAgTwVdf;bzAoirMcu3ck8V~Av3-`}{ri@=H?<(9MwcGR+ z4{Gt(cv$1A#seEAE`G&BM|fQ5f7+*6dVa+NT6$?bq$ORwuXs?Sug1d~3AcR31B+!E z4=u7ef5n6Ua&ZAlYdoA~74EyY)p$r_n#O|~>u^7~jm86uw;B&E?rS`_7=`0y88V@YX;r@3cjR%*VH6C8( z(eVJpxl>=`A&3P!9)wv&$HR!QI1s~uuOr^9ipIkkv4BTPJLD@KQViC3P*EB9jaeEG zEI(^Jw0w;F?)DlFFYD=e0HODTbK$;hIou!hzXgsL&)_7RC7kHK48V@alfM>Y7?kgT%798<49)P-v``-<9JO~xM=W9F+ zvmfru7Si!h%zio^Oqj>L@B{w2DDc3<#}Y4^MdRTF@PJ~p#zV^Pz?+=|{we@?q)ou* z^a5UG-%X9*cmh0w7w-2z!+rNjxc~iW>(_W7<_6pk&ZFbOmiTWO z=b(Mo1-iXIea{{JV?lpeiXxs4`qM!F3dSEn|4WRAyn%QP7%$>MiHDVc0`E=yGx5O0 z#}Y3}{A4Qq{g_W$e2s@;W(MBubEU8GP;5E$_h-%dllUB){@z_vA|4jzgMs;B%+d2j zVEzcqCs`ZuRw^U@$Wg@OsEqg&R}rt_jIWMgFbsJ9qrkTl?>!&*=lZ|{V?8jjKA7+I zdSS!*VZ(Z2P5%$^X0`SDX6c3aU%`6)6H5>u>YSU7my`kVgFF#WXA|Pf^h3Or9f&^y zJg7Q}_!NxSfc08!1D>DwcH+H>eL-XE-Cjh_rae7BT{ceVuazpm;1PXG@k zus=%dm+}+h>6m&ymDpd^R=wYKg#fOvlF=jH<)55h+LGxmS0uhs{C zdcOYM{?wlF>=54#`i+3TBibS!7W5(NNAjuGm(*^=(}6yvK5P9-jYIsAEE#k>j`N65 zk=ml;HT2Q?nynx3{7UO{*6_l6LthopUj_780sU5tMf@+u!(x1>+lZHR7x9A_PbVwl z%XC4!6~-Td{%tFd_!NxS0DV2o$Mf&To6n0Oe&1-sv#YG_858!6342Gu{!y@pRB^;h zg1uzIelp8yd&&m;$_9JOIw_LHE*tk-@@BP9*VZvWw!hd1HpJBqkVZz^Gjz>H!_(N<{wSUB#IFiH<`ktKM z`+H^WpEBXEGU2~6;m@+czh&!&_+RjUMcVQFo}AzQ-BJ4^ZSYUp;IFj7e`$q3^Ou+N zTe+ErKiWDK@e1Lu{$YED zXHH-Gcq>c)X*pvT8|P_hePZ5<8GVLZ?8X%sePYHG%iX;l3Vt{_$FlO_%q$P9FSQu= zp9a-S5nve@x0h#;5*sbm9n68FiUwL1UtZSmbM-BuX+CFuzR&VlKI>!sY!BPV_Okty zhw@S0pm^Taic=C9ubdCO+#V~h@g`}7BWa6QG&-e?A=amBZFudT`K)mN0mgxqAN#n+ znPS9f;qc+A-(ur_ygKsEq(Eb(3Ta)c-+n{-p3a-Q?rEcEuT352uMRO*&H1pW^Y(kj zq_Rbv&Ubre9IdkIO0e^5V^!AFJ!Z^%XDsUa*(2kZIIB$aIrH;Z#IU)}}IyQ)5~=q=y1 zdeT3C_AxTf!RT+##hxP1R2X7d*G!Y=M`wNUEbdI%#W~C5dZlNDrum%t`98~I`K*ui zvpsAd+spP-9?C~~2c{3W{$;$)>+`Dg|1#cY8{ghVzKplIB5#S(U&h<);C44h>kJRg zYs1~|eHm{x(C+ivFXOFRx0sr7!z%}M&@qocZ}a%VYVhkM*-XY#-ap z_ER3pM|r&xjDFqdfz_;AZEA%f?Jt;dlC0gBZ{2G%0yK1Y7O&+=G4>tp?F58KD~vi+2Y z@=;#O&;DTlu)o-U>`(SD`~{NDNfb3Sl>aK3Q zaXxZ>a=vo@Mwa=_^^NNt*FUa@Tpzh!a{c6b%Jr4&E!SVJ$6TMeUPqSoockH~H|}@b z|F|D=f8>72{geAC_gC(>+<&NC`DsP9n!p*}?Yi24%sC+btwuc&WP z|Drxd{VbyOHR`L>U#ZVhzoouQ{g?VM^<(PG)SszOQ@^IZP5nEv=;zQ={Seg;|JMUi-$B%O5cM5I&4Z|QAZi_m6zf2r zsvVly_MLbARC3v!lwIDqZu(s5N!d)PER{OsX!OStCyV=tHz#^OuV6_plRwMRwYeoz zrJfs32lcQVJmZyV#hBri`SlyrO4!@a661B-b{(fLu*45);n4 zRfu>SE!o;``|pUGg?rTAoA0q$n8Gv9)*Da7tU29wWw1UAP4hYP^L>`b@>w72XM5N_ zwwLXvJd}^}wm6Zz{I!}BMY-km7d~0FT2wE-zs7?l2gT(LNxD0fxFPcTryN)y-A57B zG=0j|X;R3tonE~O3eF{sn8^czUKEpurv=R4eW9XES!~MUveW9z#oHIV`EO|@y~jO! zm!n2!x%~2&@|8#Sl(F~4zg2j0UzwxHkv`j<2g)RC=EiauIVd#E=giOdSsu%0eXO7D zVf)x#wx9A)KFWK+Yrv&E_pGAhDUacu+g=c9GTp!3YVB+B*XVYKGptT7r!{}Q>GP#L z((l-d9=GO|lB3h#=~W_~kL_jqDG%kNyn1{2{q$|fZ=yd;^pA=DQs_U0{#58+h5lCPe}(Z-7$1f4QW!sl z@l+UZh4Bte^EvbLeU``aSs&|Xd)Pj!*qJ)WrH~V!bu7{+d{iO{~u*)@u{%xry~WG|lJC&-Ym#%V&M8 zpY37$*j~1u@=!j?i~Y=o{mq8`&W8QZhW*fn{n3W~(uV!hhW*rr{ndv3)`tDphW*&Y z{%m6ZHnD$)rum%t`98~I`K*uivpsAd+spP-9?C~~p}%a0KC>PAjTQQi75a}A`j8d+ zkrn!q75bAE`ji#=l@%I)i_AFZg&jf}gh&_)98+zjqt>d>wx={*uw)(@ni! z^XmqKZ+Ag8&A)rxSM%`>13zzm@YUo3e{ZyR&s%y|SzvtrhOeekBb zKeqcD{;|&B|2_W=|JZf#1vd_7{;?0>oAU(UTuboj27zDqgOldl%>(}3a^U0L4!*f( zJ2hXgV?)i~+ZlXwd(vg{c< z?_nMI1=oXLa1ZzeJA+^F3it&}fPZ)LUd_k*9{hqm!7uoxn&$7_7)|r}z6ZbHWbpl7 z0{`#h?TzA=KGR-q-JfV%G51Dt(UZk@%DlIi)M6?S#_FN2u@dNml!YPqNcr zNwjysGyx9dQzZF< z$sb%6e8T6!FC5)V^9>u|AD#<7;*2#f`T0BvG)jT5xWrY>U;Lx<;R^U-*MTqA7ks)o z!LJ)@+|HdlJzI)+uQmT}we^~hwfNTVsrP^{KS6XiyaUC;x^!mT?l^Tzw3vpZyipQwq!1D1)nbY zbq|4Wx6e2Hz%9Yg+u$31;Mm~vEmNa#=E*%LO7i{w9X~LiGk-89_ z+l>LDO0C;fyQJ_H(yqgU&sH3|NDFL z^Y6{Eo}T!I@15&!)o=LTxn7eGnEb$8-|v2h@16St_lwkBCm(H)pq$E${UkB?iplqW z75k4r_ap32+^_0l|DqiK>o51yT-aZ^-^RxN%l(-9^T?-qza~F$LGT41!TvrQ`+bH> zEu8PAYAf?WAGitqpg;5l>JOu#Pf)+0zR?W&2lWx^C)1#>{IBwU@4d?4^X&_Li+sP- z$C5%nqrOJ{Z42}{>UY%lsQ*zPq<%H>rQRK_7hp{q%e7539eE@0a>_ z2=sCC15;mb5B;5d!qo4{H%$KF{ICbePfWhzIi0?2F8>H)wy*9tkV?ezcrj zu)k)*9%~Q#>^$tX#jxLK&pm^EM|+R()B{tA~f&%~>4+FwBb!Artf}DoYFYmQ7W!-6fNz-o90C8%68L*U;Qu)Wf6!(4hoZq>)Cc~ff7-tAdY}He z_3+oxe@B1bLiqRS@00NVt%E<1{=x8S@4r(jTe|WbmyzArn%}AW*gm?W>^+okSR1ZY;z^~E+2fSVC ztyR%ivu-y6xr`fl^C6mVVpyhB|yKks_*^(LO9 z`FkC~=Nn_B=J#C;zTX!8HUDoU6W6W=_;WLWPq*J0&9B=Te7nWKzv~P>UIBjI6yWRK z3I5*m;PaK>_gw_O-*n*r^#&hsM9W_Xe7Tv+-Flb!`W&+o_;h1}U$?R5A2T-s!N0qGxaQ-{x?c11z6D=zQ}FkW1D~%a_;E=xCZ!v(}FM95B$O8 z6aKgR;S%_ATY^7#3;1+hw`qP|@C%xs!N2PZKHiPs=e>DN^YxAae=qn2<#O=*P5|F; zd+`63>U(+oUF9GzU!0b5+NP@_TA8xB<`rKg$RE5u`kZx*9h6ZR{KAvLHyqae@VV8< zMH``Ior@IOKx~|~c%>w@2^_ovoZPa{{s)Oc}R0}nqq-a>FKbU;NJ-{z4z&E_CVCRri*B4pBO8$}2G+%C2@aM|) znoqYe_;ur~(tNucz`tAhk>=xV1b*Ju;Oo5t{$6MB`7YP|p{f@6epiD3cN_SC$q!7v zVDbld1D|kH@C(P8sQHF{!9TnTe8jE5PaIbLa36fS68yRz;M=_h{@ps@;}ziNoeRF+ zxY>?8n%TdB`UF1T4dC}B-|t57|8CHHv6B42>%kWczE}yqSosnB!b!n5d=mV_F5n~f z0Y7mm@D*ip40rmR`T&0;ODKN`GL)mnjhFa4L;vJ+5KZxjN3hw?-%^Q zihRIqAJUTi!80GcPiIb_Cim(0CCZa1UvvN;@w|%d?cbg~XT0uQX-n5;R>OC}j<+{j z^tS|n&p7Y(-AP6?t5}@%{I9?0PiqD6@uI(NPT=dsc$gR;^Q|5)MZRD1|B?@w{J`LY zR*m)dAWtW)5&eKMO|H`4i+ljS;SZV*S}xPym&Erbs_E}f;CnRieH!`n_iDlS8)oYQ z=9hJ;o^RIudj8qc>G^2$)$`Nz*7Mb@2map$-~%Qp__=*dHzc@heKVmcZjeYd~B(Pr@PxSs3 zX5-I(zKpzp%PsB#>A+x>z)-U;fp^sTpgAW+`nhpA!X#;;S^g9K8 zPeK1v&<7RtLj`?NL4TCcCnfYt34K#Q{}jW(f9wN3HitfuXP4;%fcf zMm}Na_a^y<$v^xYe8l7@CSP%HZ9kZf;4^-{;O>UYz3z)T+TIYbKLqR%@xAti*WWvX zFF2;Q*Q^t@{bqwbXFH+oI}`Sv3HwjEXnRn>K2)W(y{KAg`_Y6wY32vtaUt*@hnHMG zT2Di5pIc$CTVcQ3vTJ+Z2K(NGy>EJI``?5=z-*)a1E#O`7ntxLn15-1g88HEi0FLq z*H{;WZy5d@n-BPiYiWOv>8kxd=2YzuGS6uLkXb?di_Fx{U;RhFjNIS$JN$Q6`17n6 zw13YAf1hoW_Wzmw+8=1bKlsba`>p&;H`M-I>lN+awK{2kuWgg||JrV7f3S`D|7*Y3 zv_F4)Kkyf49s1SZZ~d>y86{6t4@6`SOaeaVBJKkczYzoXLAT*PEbqHVWLv|c?kTtr z_ZWDjlDH4a`=ASe-&l$Jz`PIrVQL-sXN8meW4}OH$nYa&EWv%SSGW(?2=@VWqjyybs0uV7w2<`+&R;$@`$Z4@*4KCftW6UWNFL4Zs8N zet$&B_W!H1IqpLZ!+o&1xDR(0_W|$WKBN!sgA!lI`@m;`zak!q_u(Im)p!-+H;8BW z|Ft1J|27Htq0ZqxSmDGP|6B$40Wab{WC-qq2H`%e2kry&K6Gv1%|88a~<1swx0iQ#>3h^6ZCC|^6!~3wj56t_}ybsR%@WcZU4?#Q#@i4>#5f4Q?81Yxc z12zI4l6aM$ZEslTXZ!-<`H62Q-aER7W7ZyHs>?yZ1D60ECKz~8;-QEKBOZ=;GvXnM zM!H9<=9*}rQ;z5arP4Pu-TU~agA|9G}aOP(`0G7w{84rW?vpwPc zOFS6kQ!riw@sJ!p;$d$956tmyg7N3~!0&_c5cvHNU&nYL{NBP_-f!#U{NsG&{N#Kk z9+>kvL;mG|6du<>l>z>lcwpjVgRwpkKS?~{U92a>o7IlscsN{di3jC+%=MXgXs+K} z&lwMZ>pj3$L!2N>pV7Q-ffBAMC!aLm$cv!~cV0?<$z=Jb>0rC8dhrs=v`#s}< zP#>Uv5O`ou3Lf`8J{qKD@ ztq&%xuHyj_KS?~{4&dv;dz`wjK2H6d@i3^rQ=ex%80!1f|7j1uwq&}85zpGR;!$nx-?`60f{aKwX2 zf_OMX5D#b~{BdRBpDTcPSoGh~pGW^5{eATR(H}_vApM2mJga5B`{M~!J55@anybs6wfV>aM`=GoJ3p|q8gZt3Hs~Es%h4Asga8DDZWH_kkz6#NJl2^D_ZFQs{m7DjKh10KXCD z_rQNv&TsQi!hNt#xDU4%_W|eNK4e$i2d#nou)eqt%=^#}G~P@Ce-(-cIIr@K>@J@F2kF7{IGUx^bU^ z`;fqU+Zy9OEbzc4@UiNn#*3xD0LWs1|5E zu=)#lm^k^r;zbqlP{e}~4@W#8@sPxW{#$t1|Fs`@AD(ys;vt9!As&W!pesR#x^+)H zLTvyZY#s1$2Z0B)dmcNfXRmUyA@HEUUm3t7MY{ElcnIP_h=(B_hhb11Ecxd9m ziHHBuc7<0y;(>^VA|8x*IN||`hx}9Hfr*cm8-NEU9vXPUP&_>FW(M$Ak?y-E9*lT6 z;sJ?=Bp#G_SdI(v(8Pli56^f2jEBH@5PUDP{31Su74aHE@sPxW&IcZrcwpk8*8vYs zJUrt8FdhQqK`$6Gocvo!=Yr@Qeq*cnFLK!FU*q z2f}zLj0eMbIE)7bdq6NA6ysq<)_7ouKVn5Z4qG+E!$748VHUR|tmX~l z;V>Q$;~_B~6ysqr9vI`H!G9~@&lT|R3ix{k{J#e9v5{__Xa6xC65~OI#=}B9Fvde; zJUGU~V?02{Lu5Qi#=~U!k@fc#;z3nKJS-=~1KWjoXx@ki=Z1KAIG-_bUL%U?^P32d zQ}Ms{FV4@bT@VkA@!)XYX71PLZzj&;{xdj!oR@CD-crYdV>~>ZuiEk<9^(JnuVM9G zrM88icFgBz8G6ru`@soyjgtGH_$O)i%*fffakA#mI*a6`Z+xEqdAEpp?5cQ~_l?-$ zJ2c*i4soP|)A*iUUEi24L2+$9%hM{R`JDOrKFeeItdI4Fl{`OM&hgoC)JMx=i(}Tb z$pA#PqiSodw8!Q$G2l?iqwJS{TCNSDX0M?4wSrudNgi_*&D<@4tC z^Ny!doUK!%&r3(eG@mm+-)DI&pY^f+A8l_~<%?e>df(obO_t#0WyI43y^Q$7+H5P+ zEQPR3ys>oAJ`+R{%azxz32%z7=Ymsi?w(FA&QM`g%ta1z@1q-=o_eKIDbw73b^Jwf z#WbHYKi_A0EI+h9)E`#z{Af9)%uJo`{;|jMc|^LWCC3jpc9zKyEx9M59AxrrSvKu$S5!`m*WGh&aR=4$Xw{JcODig-`JDOrKFeeI ztdI5oXnVsdUxE75E=?|U!qPoS+NtfvPBFSPu$JBQr;~^q67T)0j4Q<3+gY}|#*Z!= zE=m{e>e0e-L#Zv@d^4Am1!9zF^5{Zg^(J`b@>w724=Z_ow44iR zZfDQya>eqY^N7G5f6X=OOkBNxL@$fjoBhG(S1mV-{0pp;t3OOE7dgaq8M&^s407o1 z-7bA?dARqWLV?!O%5H9p6z7w*R!s9b^YeX{$MRVp>;KXAhE=|gc7Amhx4&!Y@N~zS z($|+8Q{?uXgYs4ouV*Cfd!qO*k=lOUgD3gZ$>DSBuA9)ky6l^--?knDn#z-2<;ENs zR$Vzh9ooE0;%tp?4CC`tRvp>hA1Aa@NTbdO*7uY5CM&s_fiG@Bt zs3l^YNaoPY`LJjE-!oW=eP#4zE6wPC62b0GlrTD8)i08W#;)fK8w{? zG0o@9&-Ym#%V&M8|3}*!R{5@vo7W-W+6T*uqg7+1>S{B(Ke0Fpw?@Kk-}3IIwww|l zX3trbdVXHHGP=|7_tjd;i@PT#PP5BH7MMA0Sp&D0>Q(cYjdCsZR!s9b^YeX{$MRVp z>klh=ezcs-n`$ zzOuzPE^J-p5knp_y6$Tlbf9&6kuufokR|!A3*WmP%ei`&kQwhL%~~p!hfI~Ca;1TB zhR9U5yM4|j_E25c?n-mC!6d~rpEEz-XL&52^|Ai2lIKUu8F2ee&T;3G8Yfkt<*egz z!?Az*<(;;56<7ZlU;T8RJ0hFg?#z|fmy}zl-nf#wfT!&G$Z^vBvBPBM+Gncgb@f!Y z3#_}EX1bqZn$MY^@3TCX&-z&ZkG40g@;$GA%f6jsO5;MemSfkCIc20<6Q@Yq);+}a zJ8Jyw2M>hZ{3F%;-lwslg8>ZKz<$?Jo@8|F|uTpE$+R21}JNrm!rqToUNGVbLQv!ERW^0KGy%E z?G3AZnSvK*ez`NPk#R#g(Y5$_BaeOQ?!Enbi%yQEyOrAYRQMfSTz>oLin3vxWY^9t zA0&%6d)q7CwsA7~;-ij#ZXcvx=a}mmP$5}sKiu9h%ET#O z=NIQ2=O5=I=O^bY=P&2;uR6cEo^pNVddu~f>oM17uGd_@f7SJz`zQBP?yuZ$x&LxM z=Kjq6`d8h*sV`A~qCQ3aiuxAyFY05|&wf>XjruY5W$Mq=r>S34-=_Xeef(F|&uI_Q zKBB!u`-%1x?JL?_w7-5;dyMuk?P1!-w3lf=)1Ib%O?&%SwZG}_p#OvZ5c)^xFQNa0 z{uKIGepP=9{af^R(f>t%82w}Pm(hPlf7-9=U!y;h{!RKj>HnlZl>SlrOX)xTRsE^- zU(=sW|2F;I^ncSIPX9Rl<-e-`{C7Ps;rSHLt9X9J^DLfk@w|)YUpx={RnNzG9?A1b zo>%hxlINK`-{g5G&p#u{d8il6)1Uq=^4SvY=8%P!<@4Kj{&cCeu`XT=_ag_QiAJ&8 zslIOqh!*W%cFa@vr0~pMV_UpVapcA$l_sqX%wVvV}$pE`|}O=-3O*Wi(gXA zn-|wFmu0J%ow7ji^lr)IgFf+-KFd;0`aEcwiXw@LVCk!uux5Gf}<`^+mYc z#;5C-Pvm}NNxNrZKew%G4Db2P*6jDHBD|h#-Q+!guQ)q2?=I&XndFcQnG^eEs4b87 z?|I~WmsX*2BdzdUA-}@=CdxBWz76$7xZIg4Pj}8X;f*CE+Eds0F}E6n%G!rGyVn=R zgV&1;{>MeNeJP40Yv3UF*I8Gv$)Kh(fhGASw-{YR%qI?_bi*UKi zJqS86{!?^gqkpzkMH}rl5{-+s=}hgGqGRSb2k*%X;?%D6m0zB8ma8v(+PE>Ot!!;t z+BYoPCsb~v6`m{PS9sq^E z4fRF1+(R-qI5T8m3S*Yd@ye*+lg5w|iPmh~+g&{AH}S-uFYb$upNd>MT(gXPzHr&i zmu>sVUTbHbsC3*XRBogdo-5>6c;7^MCd#*=z6h7wr`N-_AI_#TP7aw`cthP_Bg3$* zz2Z&jBZ`%4IAHVWXQE2>nj7QHsU(L5kL@-j-Vk}?-I>F~rcDf$8)=2-3i%b@H&LF6 z@@=Ru!sUKMNZczD?C@oukgN!@=TO(Lwyl0_nM-g17i%#ZoJHQu|xde>&Aef z+5OAx^%my&p1W>8e=nk2i=3`ivyL49XXZ04+WJU`BS$l>KQ=v7Zlo2SE96&r-$Z#P z%D17u2$$P;n&+idxpNtRHI0Aq!{l4W!5XWJmUI~|mbP>%5xoDisCX)aL;IKYWcmiV zG6l{YBR7tBoiRPdtWdd;R(P(EU*UZd<(VkohWa90?)X=W4@&Sbx3T;F3J32NcZ~ia zNv2ddF+$9pwyOFB$7r%$i*-9%2R4ugbNtcj*7k97Z@0vEdkX(hxsg_Qu8?2heTDK& zly5_Q5ia+cyEWrf8|PqnJIpAyJNjLt@T}SIMz$U)0fJK*Y*5&-M@cVeeHME z&wp2Y?02=le^-CY@9JOsUHz%QtN;9WJumrP&&Pi8^H8{z|NWn|+iN-8S+K#AL2#(~IHaV$%_R z>->(3#BUw0ZQlGwjL1K&^$_>ivc`vo@jo57Ghf7}V%) z-BcN6z?ECS1oJim#19d@<`VYGZW_NaCF{jORvtY zR(ntMF%sNfRPB>{QgLMClA{xj78NaGjeJ|W`7&|zV!4FT-o6wKJsz#;f7o8yWvEr^ zs%u`Ee)O^>hu@}`br(6=z3ptT_RU&SUA6l|H9C!Dw{Ohovf1NP}%0+(ae1#^JkN7+T>f>VN_B1aO99;N%lyYy67K&c8!r%%}p`8;qFlu zHN0)Ut+~DPDYxjo=XEdoT)azODucthlybq-OabM`d=?86*wV##yG!)Ry4x#bt6||T zf02W`Poy-HM{r8Gj`5PQ{8I@96 zy>?HnXelLYHNIJ*bg?QjcFSG61|=vU*Or|7?rpcSD%BY2_*hl`f9!pATvkgLHQ04k z6kAcT5L-kSkZr`$F`~CZwWbIQO=PmyIy*TdZ zH@NTiJtAj)kB*UEexhpd=D0zR?-&DrZ6+!ef4s;^b$c4m zv-D3l^8GHub8)HAQa5W0$B*k)%>Cn_h?^wwl}YE*Nc-R3WGGeKQ(migZT0inK62C% zv(+r&D>r0`^uP7kQ+24E@yV6^jZ{#rBD>F*DzEMzTt8#pd?#tR6&}@OzN-uhU(mSI zJO}y7W7wAIiEoRR`H<-@%)viQKed=)jbpT zv3zU$C+yukrNyLp#_~swEwAkQ4_$jjp>VRoz>t=RM!nX|}Mi zvc1%>_Uj9krDc1j#vi+vkXh!PoWHn+y$nxRbmwfFKg8>}_X8@t8zO8YKI}|jpIBVH zs@!+Gw>9Q0jyrPB!ZNQt-Z!ET-Cf4$8wA?6s^w1xlA7>YD zr>*H4(ce$JpR+q%vgB7p{=#q8HuNnZALmLv^lG8{^3}tm%MX=pC*!$1c~PZ&E4ko9 zuF2Lx%~iTl{w>d63Q{eP_I1p3u%SAp_PLITTTPa#Qs(O6u@mH$L?`P`~FxtFbSzmdmK;m4)@j+35quE)umTTlRO_d|wnT zSn-^PyCGc`C)s#4L3^3`W6fKK<^)SQ?)mDbVeMs!TeVxwDBDxD%4~naNIP65zP9Vb zn?`=>T`s?!mq+`{evN1MpL3&ybQ_p6@LGuq^3K%vE>q&zOZ&dVB3|bY6*kqU_kH-j zv@k!<>^&~~e8ch}bJlJv+ZcOCZOeCW$Hs4F_kh`t?Is<%Y$;yRKH}=JbjIR4K_}af zJ7d`FTiQTX3J@O?1^24d?S|+*_EEYKkBdqV&)=UFKh;dmdfB7f*qXs|&x8Tf)yyH% zvB9iOfmS~?d`fuZlv~EAfcMAZRLC??bvm*7)5YOFGW+cjaX;SdA|I5$dh%+8W^!oJ zqf;h&<&&#V&FtlO zoxNRV=Nvtf8d)cm?>H&<0b^)^L(ir^Z6MlI8DuW1d|12)l-r8lN+6FEIDV#L0&khQ zYG|bzU4rDyH_e+=oKkU;ueHxaRoG#7@3f-5>YMjv z%>^#~Ws&|V+n3JTS?)U9sC9>tK5~1wXPhkqvddeA%FI4C;i$;cZm}gSUQJQ5?W_^% z<3{7fZI>&7J)c<$F7un#dee??X7{o3+b4QwjkNTb_wiB2q%(|hO~w}VsTOV=Sdn_| zsH2_4(E{V#CVjdqJogXF>s70itX*Jz!h9*)%jSoUZOE~9plqA?vQLh_L*;<+pDWCD z=&j0cb(j?xJWV;Db*ld4+EC>azTsrVm`>7n$c^$L_xs7Z>%%f;PSH;K#F><$^8MoS zN!<>%S6*Ke3np$XFH0^IjXZjmDbU&?-tRFjb+RupI?tNn(APKOo7v0vyt>~SkNbTR z8-bUr`!#%bz*zd^vGdx;O~tq|7dx%Gaau&4xRTs&adz3d3zWnMIKHEK{w`aP@=@AoE)gIw>r&OD)QYYASrQxAw%4rRU+FN5QMzR^&0KK1PA>wde9k=I%~ z=UHX@&HWO~V^`aQ`JP!yFTS@m{(sgfFQ@7iKiw`O5-c10?&;D%QLJ^zi7m_B70LUA z|2E{IMLI9E-(53tM_K${hrth*4U+ZqW(e7rbbt)M{%A=Lk0H@`;Kw-bi1Yk?aa_;# z*#66<`hL7W`;!g*meenG_<9+e{@qL!X`{nzd=dIuWI(!fO zKEm+5Ji+(F?`a~wuMYU$mf`#RR(7(TAdHu+d-eEfj`6evx)e8Kr+5atukFPv}K-+%fy59UM8kKULsIe&6KJ%;&} z^DXD!j+l?5=V#2<^DuvNKIi=IjQO7PKi7lxSRc4v#K-#Kj`if9+8OhDu76w)n_+$A zddc;3GS*YBuUu~(u>NvA=K9-9dY-*d2@*TwoCjP;)Dzdif``UiR8FI1bO{fC(S z{=3JI;NQ^S*$4mUH~2%D;U7i7U-E_jG!XujO>XU96@x|#$BA$=g?|*t+0{Msh z$VaqCe!@h)g82*PGnn6CzJvJ>=0lhtIfZ-)^C!%wI3d5nd<*k0HIR>Ceunv)?#SQ# zQ#-$OJ@Ze@M=?Led=>Lo%x5vb#e5g@U#pN0ThUbK$0{RVwgvgKkI1K`Kz{8S@@0Rjd?oXj%x5yc$$TgCpD&OPWqy?T(*4MvGM~!)>Jj8y znSW(IHn!~hTDytT>wGlx(f75;{F%+!?Jkk{W0#BasTY^_TxugcL)2G+`r_0=Azenf0O&2 z-2beE{ZQ_Y{-}O`@B4PEGG=X+jhie@%jSAr#G#GRt5wTQ>1Re7?x%-%ws=}YI8GV2 zB~_VV@ud97?lu9tM1~HjZ(e#E^4<4+zSVP?vv|$UKCUY*)*&mW4XJy|GWt>FG&@TU zH?lOnndkH73}V8p8V~YU9WIWQecyXu=2N0Z^P9W!2E7wA99}pbT$xC=$?cx_;Sn3w zuYap<#d2uu0^YYum;dE_-gx+?hM8n5=#eDd;pzEZJGMV)~v3MP&5` z9n++b6uDX*ty4KNgWNL0V@jdgj`BkL2O)DiC6Pxm+({PU{mHD5CX;=Ysn379ePBMw z`kyYkRjD0ru|2yZzR%17M$#0Su1(vx+-RLIJkO^`hG@K~(wihB*N8-UiW-CZy%o7^ z%KCmhmO~yY&@Efn97W}Y&96p}b}cNQtr)j0#o`C%<_|Mp2lR1N<%Ns?r^6}K(*BdX zt#Z3-&db@k*x3Bzf12ko*s1vG0p@GVotG1hK5f<->Do;gHt&ju*jLiUZ`IVb;`aE} zC-RqnErN_hHIhHfDqlX1Te^NFDW|2ck+o1iFF7kq&dp1#xnz%hA6HgBn@<&OY16a$ z{rt*f?9-9SZriC=ds;lcd-l9pE2v-SqoKXbEQyyrs(!%jhuI%d=w5N3iZ3l*uTNcb zwOeKk3R~_wU||tab$?FVu(9=p{fxGQ#xFW1oO;&lRR2ImS;KqBw#Ku)WMH*)xl;w! zl6D#EBza?2l!H9x#48b&NBQOJw!UpmFZCi$+GcGl6j9b&W3H`8mqaD@bg$RH_Gz=* z@XdpgukUFNU(#qvz^;$h?)NfvIjrhh{RSl;QK8tdP=0^0_4n@Q!)Yxy4_fN9XBhS9$Ba_v9naHPp1Dn?6roRZ-=;zaajHu)^wG(%q->YtAH7VI7%#WGT1z6Jp)&^+!JbUfC^~ zVVyL*Yxl@KMl$yk8@i6EB}NoG67q-hPI1TSp1eNwmheiH@!H1S#pL5jrRsf(XeRqM z%-X(H-9Y*LbBQJ;wlJ+it=n$gnL>f21^+hJFzK>Et6L%BESGw;u$?gXFf za#lu|H(U!Y=~gMkd^0`e;)6FcnmcX%I_6CgY~2;yp!T_kTVvhc4~`Yf+)4Px;=a>z zul(bQhNa2;(}TNQG~(HKmkT=6Nz@Ig*)eJLTjFV)s+0WNxX9fFKfJ&4rm4&`reuzh zO}ok?Cq|cFFM7)UuPeN)l*UI?sq4Mtdz4x|N7%DRqys#ka_F5{HSG7&YPYhN?f2+B1RN`*x;G*@5Y=--)`m^&M zom<0Ez3y=^|Im3y&2k6&x;HIf!*rUOe`=B18>|l9w|gFyPeTJjGNsJtwF2HJsO;vA8sZXLra%#y(7c&NPsY|VW#jKMzDKKh z_bl03j=S%fH+~~mVL`!K0U655>W|iTYIv=S z{E+u`=e+jgWk_gdkFv{V%7A2Ra?EmVFKx^POD?6FsO(cc^51=RoVxt7MoRlcJye{U z$&L;_Syly(Ty{SE{u9$PEO%MA^IgqUfmMbL98}y~G~v~u^yAi82Osla<^KLftiR_~ z@rxInbR>;&yks1kv7V=lcQxWBu35rQgoF*t>9a3f%vePCg0nHM*dNFnoKo3IO*`ZV`Q&k8&VxPJy>m7c`D$h<1}TvA>ZAwBEwYfQSLp8 zh1FC38 zXG#3Vl6L>^8Qx@GXe3(k>8wlI>&E4d8{z7Ck2RF3&TuzoNmab5; zWj$q|!^8Xo>ra%o7y3Oimrjq4r^5BI3ex8ley?2h^$P8oXy5#_JnDW{+~11+#QJ;2 z^EL3ijgtEL3%n13_annbM!heI_b2f_<#hdi`My;=+o<=in(OaD;rmbx7e{?BYJ&cL zOngt~7X5u$SL*LA*5C6|J$@`J^>{Mu_4pFi^mr3p^!O9;^>~z#dVI?Cdc4Zd)~N9- zFX-{CCh765Fy57`9{&pSfx`S?V!kjje^}G#`NWF(CDz~b2R&aJm_H57ry@|#uLAR} z#QZDY==oS;e&&2FN9*}pVLn%w-&I*X-z&`jCe{P9#;d6H!NhuD&8pXrSbxu04=u&? z`eLTU#`bopH+3eUaQ=C{Z={kdaefP^%G}hum7f@ z{Q;}D_77s+UidqfoZA1fxN3jMsHFWP@lN|oqOncgwDF5ArKX1anx1Q7feyrPz_{D;F#z1^yAl?y( ze+1$oiTFq&UXrVH{3H{ctZq7< zvwGx+itl25{zANJLHugi%!rC-#eE&$ipM(M6+LzQD~sxQ_&<4(sQ6eO(($sqr{iZe zSjW=}@wKY1<86ib+eAEW7SZv!iFn1o9aI`3-@5 zheZB^`4Hwu)J>f)QOKVt1{{!BUOe41Ha=hw{sI^Sjn>inDa zw$8`Jy1ictT#D;_q(FXBAYUnvzm&*lGQY`ur$YWy#eEW$4^_yID&$Mer#gRXBA;p^ zziJK9`PLt1Z_MYgPUoWq^3$TE&R0w1ubIylH+6nnA>XZ#|5nd)N9Ds!|dz$dOt&D)cYIiq2BK>-Sz&5IZp3~m`-|s z#N4me{kZ%q4njQuJ#R_|Xa>}Q$S-!l8?{Vo&xUncg$tV-vsi^%;6Z@T3?0;ID>iy7vt-ZASd;c8~uJKTvVhIoSz3uth z{i*;DH4k{Orl>#b70YLLg1mwpiZMk(RiQ;;GvG9 z9=ZkaaD9OX%ob1MA^QRk`W$%JEx-fUME%*{?N4l7=LuQfoYT2HT}MP0R4a`B);zce2q7o z1U!sKUX4de_DbWS=1tOgF#Ez94;OG+;{oGM(|E|76Ez<67Vxl@P!C-Jc<6<|gZHx4 zc=#FM14#F~=0o_i@8|FSt~T%hp1?!60}nC{c$n?L1EmB0$`yDdn|c}#cMW)zS-@{J z1D@d#@UWi111CiNcQEka8-Ryj1wMc~;6um^K8TUum=B`?@Xy2p5D!5-2=Oq)1C0T` zj(D)uz{Ax59_c*rkk5bz9R&Qw3E+We01utJm&SvS03JR&_yAZRoD=o3i(cyb(bcG@ zJpVWOQ0!0-J_PmfTRv*M_X^-44gn8r3p@<*qL+c6bU3N;ggJn(dk;LIAMjTtfCtS1 zJnR+Vfo;My9(o?|3>{J5UkiKylTrUYy13?pXb(ONFVxHS1|Q03@WFiTd*0bX^HVsX z9z3M2<}a86Jiq%9jc?Bmyte}WnRp=Lp@;`N20R?`fUdyTwFcg-1@Kn~!ZaSZD)2c~ zfmcZm{6+)d8785=zcKhAo}m8waYoGt(hBv#58h}#7&q|Ye97(>sE3{bK8~ZPhbJDO z8~6)80uMqwOnuP#?So^|G{k68LnIq8>UU_*S-{9^MXk09W84PJyrC5%>#s1J9oe zcqnJ!!R&yCBOaLeSmH%n0}pEfo^UAeb^gGECkGzhvP|;FOt##7;LB~)JKK730mk9#jN*~}MQh<+R9QY|R0uR&( z`~^9I=bs2XTnO;q{eXW?2|O_IvBU!tKS?~{t@;`d-vfBF!N6ZV10HEE@Hw`?t2_aI zV+`;NWx$9Ofw$J;O!~NMG_RkspC7!_z_GCxBdu`ae5BA3e zKNO!2pVve@KR!=B-$i)deExhNz3_hczWDz5KC1%{O#JgQ;DP<{JrFNS{A4kFKUwfS z#mD#Mh41at2h9hQ65nHee4qSY`TZ`z_xu^(cW!*|;rRYJ9ymTqW4v(ua6BEt_;SE_ zJAm<*8{@Gj#^*SU*XkI*+cBPr_a^?i0r0?_4>&*Mz4TE&ja&e3(SwzF<;IFpHAkfnqOu(@PM7bKSDgHKjvf3&z!G0 ze{(+P{7(Ec=YOsTb+A5gz2N%M1?$Nx@BwkXnS%A_Yxo>jtY??8zBRylcN^>9Tdap% zAGuyO!}^&7>nYdQ8dz`lVEyHK%=Nhl)@!ccT+cng2f_88>%R$qASL_*kHgwu=nntE z#ZUVa>EK`FYp(qbzSl4P?E(K~DEt}vH}rQV!vCQ^ME|HO{G}Q2pXg5=hJTd{{#I%D zUp?TDu-L-f7|QWd3i2c;HL#@vr{> z62vQc5WhS{Jj3{g@ebo3#zO+}5#uGsPg4+2F}`BFRSfYL<1xl(jMo^yF`i?5_gC%t ztG{Qw%J`M>EaO|oyNrLYARcCX%y`)!@iXIT#@C4uZ!`X8JRX7gocskefh9UpKe8_Lej~oGi5cweLBcIX%`4#eyEJgn12=Xys>tAf2?}hvn z^Ht1WF`vc!mWg~9^Iyz|bw_@T`7-9urXiok{90_=@mJgTKt7WBN#-k=zhpi$2>DIs zJDLByiF_#Yqs*87)qeb_-!mWWhWs@1)y!WrpIsUGZ5QOb-H`t#AIgvF|3AHNN9;#% ze}elJ+`sU}entcAZ~W8y{Vdnl#{LucqqslC{i>g(pRv^s?mu!rGPdsXtKDBu;Q#gn zHlqHlnZ^TJ{%^neU--Xit)uW@mZusIXKB(g3J++k)Obkaf5FE8+HgYSp)8wFFPqyp z3J+(5X*{5jcXt#X(paVOpvD>0pZ#0yAFT0EmVBs(-mdX*#%qlSG@MaC+Fav7#Y&Bb z6#*I#EFw{V_OsisfM-aQKMD_JR7bsgNz{L5?;nK+6umSaQlu#!g$EU#H6B(-jRzJ3 zH6B{L(0K5lju)XO@HwW&0~wEi-#D!CV8&vNhZ9v%?_RNa6dqDk)_71+rFRq_R=m-8 zV3GWG6dqdE)p&5(9QB2@QE&I7-ut0q8gF(2_^aFpG#+WU#zPquJ4WHbgrV_p;!?IK zJfO(lGYStWN`*z?LB$)5hm{G+N8y2G8I6aQ@#99}!DU&EhnMp;AAlUB`4GPQd#?^W zVP4?tt^sdm2mDn{;E{ZR&lv^0iV6HiKj0Y#YCNo*tnt87p#FQc#)Hew8V@hMH6MWV zT^7ZMAZm4p;)775G#`eFt@pkj_*mdUqVbc&6TSw%j(D?U8V@Jh0gv=i;~}Mk#)HZ~ zfZw>P@xXGp#zV^_sCPf7@$k}1^8rNH2fs$W>=M+E_C!79^Y&4EDF2xMU<>fx>wte= z3p}t3@Ug^;&IEq)H1LE;BQ(Bly~YE|l)zv0)p$@@S>s`)1$dPv8V@bU1J5u4_5B5c zqxb;Se}q~8%ZH#QYCZ_HP4i(Wd(_Kj(R?W8L(K>Cm+hYTN%I%X1)jg)4vlZ`3cPoF z;Gc;HCO&p6@S+Vg9!>%eD068%r2GWDneB)uJgl4#JkrOqQFv&%7kHHyZ!~@*j*a_& z`2f^;)b|IV-u=1e!%%TFABeh*`rwtC55{~uIf@VGPuu+n{1oJC*aQB8(!lc*-`*N{ z??J#n6Aw&$Eb*emPkvq>g$I?XfUhIotbxWu6AvDZ&jBBR0v|#&p1~LO{k=6Gh&qD$ z@6kJ=_+ZRos1Lr2df6|H^LXG}=@0&q%;4iV2!4vkB{W~d`_Eoc`~_=)=N}1tdr{!M z3jqI2JTURG#EXV%Jgj^MJYhzShnDL#9$Y1u5QT?Vwwez>r3XIevgU(O(=;E3N(?;1 zc+H1mx@bNavjpnDZ8RT{Swiz6MdMbkF4Fu#FPCaQonB`&zsx!Ct&{=(h(Gu^3V@%Y z68IW|!C%k}c>cFlHNO2W@ZK+hfBpbGF!8a#1IvrRPZCe)4Sd~o;LR!kf3*R4Bm?-I zbD9rCB?5k94)6?RG#`$6Z+8?Qkl91?AzAZiJ}7G?@I#><+_DM$L60;Zz{m!E86WVi zkbmR}_&A<{pMrc1Rl#2XJYY1w9e7aUVWaWDz(XtG!K3k$#1mH0?M36wa6ffl-`^xY z2mLcM>HbFJ8P1@-eDzBk;V$V({tUc?vvVSsMH!c>WUaL*4>k z1Kt<$pv1$<-oSek|4ckE@v+2<5{+^Ttc(Z*jQG6(-kN*Bl8{l(x=4~+RhVSZ4UFHFoICgv0KzMfx9%r{odKi1yB=U{${wln5D zHeAndqBr=z?(6waT-EcTa06dbIq(N{1D{SW@XMSA-^yU{j{py<>Vltwd<~ed73S|~ zd^_>p=QSTfG#(i1K{Q^J_(`lER;AYyYdy^eWW{>(MLT2K{aUYQVh;GuE`$H;+2=A* zd|2h+ZCtFi(A$Q@B>W>e8T>)R zz^4O$N>u{iN-gk@YylsK1NbT4fUhBg_Sej`C!+Wu%(dE|i^h8k;GYu{4-9-P{KLO& zC++25_^Sf`tAsx*;onLH{x9-jksm67_K#Ix@CT7kXD|3=5`%Ar{3Gzc&4b{lAYTLg zb#u4o1F;g{PP{k#{pj_U{r*;e2ZFz^n2uj$=cSt84e^aayrU5RD8xf*EclWTFDb-N zY6tjb5MP;yx6B&g<3K!SMSNyOyk3JbuH4(om#Ip+VtwOx35dW$d;D@BAzx8Uz=9&k0AcGA|AIM)baU0{(iq?*Vq0Z`3V#G3WfZILOw$wzhNTZ zVS0fN3;7V!6MRX&;1437&V2C8tOMW5_u?P953X!iek-svL&oYtUGP{ER z3;8b-`7moG@FgK%W<~z&hrQ33_I>I2I`|oppEQxLG?BkFk7hyS=bNr!@ zrOz!lN6%}!?#2g8`@*}%-OU@%cs;-7=~vbyM)2J?xkjH)X*~D6ldVl&d!ygO5l7t~ zrZuu$T)b^vhrcz^bX{bPUGf7(O)Xm9C*PiLoS z^UN6E&pnfB99JY6)N)6e#;L{bGMQ}GwQ>|4>V%fvJiV}}HE#96A>AxuqTHFQPyTWu zV*NOm&kt*ePERd)Mcw+M?&gzqFSTec0uD4faj1o#$lEL9@^(7{M20m9i??pkS&W$Z zVpo!TU4?Tt&rU%hLBj87$0mE6yGI}MJb%yY*&f^H{dj-&hy7!J*?-zY`)F^j_6_Ws zJZmp*|8dyoZTG&yCix~$x9(#_^-eQCx;~vH5?xRHepTibVt<@F5o*b^yw%$`;%sKm4AW1i>lc|F@>`@A3T&;GD~>@WLIduSi+P33v( z^VH9K#f=3klkQ1&Rus2feO)TqZQU;%0EJ+c~ieIDgT8OQ#HS{)4JMdGa~QdW$mHUJG-Ti=5&W8@k?84xa0? zer%_z(&LY1FQ$*KBUi>LJotT;W^!Y$flHK=pUfPQGP_6oj&l3tTUXN->MCoVn!hiX zQxEya^P4H-cMq2J658DeU*1O+|HCO>g}}bi$2`y9^Ln<&_IW?vpZ#I~*kAUa_Rv1s zyKBi zq34dy!HuNvu%>BChP9TL_l`@RZcj&CO;3nIO5~9kjFt;ZFKj1!j)^|zdH$Z)vpu%Y`|$biIZ|KnSmBl~AiQxbRTI@jGv6^dK3;p0oL>R3=8m#v|m z>U4jvk%tCVRnrEVP8(;`QH5qqSyrcRGv%8gnQw77Kb6KB(fxe#j>@5Cc-8!+x~lt) zlct|lyoV}XXlc|F@>`@A3T&;GD~>@WLI zduSi+Ep{T2b=dOsD)qTq)w;jTtL)R=ef9ebcjX^edFZ;O<<*-6UOlArRW@^*roLd; zLgkGd*rY@9Kvibmu)NRW_fW5z#H*is=>X+;JwaE?;^C^p+CAyQ>Wo)+3$4GFZfc0y zGtIr{+(pw=Xv>!)M#h_^Ugw)9UL=lytp_J{prf7yT9L;Gki z?dS90^WpR2^W*d6^X2pA^XL2E`{DcI`{VokS>89lcYgmI4;&vHFC0G{PaIzyZybLd zj~t&IuN=QW%lPK}#`%u(ALm2PkDM<#e{w$M{L1;3^DpOP&d;2$f0p^2>lxQKu6JDj zxE^wSOHVtmAS>E9BMF&<@n%6OIWE8|(lw~Tig|1utCe9U;6@iXIT#@9bf{QdJ}Kz{Y) z*Aw{l1b#h%Ur*rI6ZqRtpg*qs^;bWLU(ey!bNKHQ`1Kw9`VM}52fxO_Pdg73|7@|n z-EW~~{lLA|>JHsx*)}P2$k`$LEXCr@2TyyV}^iduoJfeESDx;mEk9nTI=k;ul?el)TKl{V}vA^s;?V)|N zclmt3_Mfh_Fp73_Hd;n>HF9@dkmTyU!NzT$^QQ-1o@BfnDF!@zFyBbOZ(+~6+t(P^ zZ6iy~kGI{}G}|$aTm8Mpq2Tb#A37d0W?J)J9e(k&ak}4R*Nr|GjV-mt?zK$0X1pwL zxowh*H;p5Wl3e~U;f}HQ!3w7VP45{4oTio78z&UeET}KJUl-vp?(~`^)~* z9@i8jBvG7j9aOZ8Q#DaDuXKdW+DB3K0H?`-%BBIsaLsOq6DJ=%fZ@lJU z|4O1y*=*N~w(=FfjgG%Lyk;}uZF~RKnr>}HzmmVL*|fit$TVnsx5N{>i(DhCJkPtK zj|e_7t5=!*1H|EKtKCW$8!UQVPcgCFsUgC3=B#%^TMUgp=6U{}*Rwsg&-?NI><|0L z{<8nHhxXCl`U%>o9&dxi;#LkeA3Kc^@n-Mt?9pkqIP#>5Z2o$sm^Uv`NN&q^(f{f8 z%>(A|7w#7~h)lD87yb?j58s!U#D!Cj=cP~ZA6@I7<4#R~@j#UDsu#Rv#53_R>+m@V z8@v|gg)V#UK7TKkHY;56;=#{i?vzzk$L6(_>u!$TbY!NjF?}wT6B2P+POyETf+bI!$~LVybv#b3(vH@W?VVTzR<;~fp+rT z!2ElP-pV4Y97tWLO$p~zkd+5F z8|$2-x{MQA{A`WtwPg7-nVkGy)|PFWuHV&SYaQ9K%G2DXYuAlF=6U{}*Rwsg&-?NI z><|0L{<8nHhxXClt~sjhNZc-=933%uZpkI-<*;=v=geO0Bz-ePl&{#C>i7CtAw_%OboB?CmI@FI;x}W$W&8(8W=K{Sx<+ zJ-bavU3knOIcB;;c+=Ly{sY6xon`Bck@9fPe9iCd94!yGsbx9^kBL6!dH$Z)vpu%Y z`|Ak3my?e=y6kj0IqYGh z6p#AVmSMfR9KX<^xlC$FwYhHG0NKK{_|7wD_hNAiJ%dajL@a!{n`Z;l~C| z87H6jy_Ylook`N^cvzMVC#T9yV@ge%ntG<(ADBF%i*go&a`?EjnAN$Mx(;nJKd-1(1eE$mLL1BC-j2DIR zqcENn#+Sl)Qy6~=<56LJDvVc!@vAVt6~=e;G0*e&yq@i`ecq4vXMfl~_Lu#qJ+zPZ zVtz9*-IOw5N0^P|FisW5*k%%=+TtHOM%F#jsd#|rba!hEeTpDWDg(Z@W`-}8F5 z$M$(Y-k<$p|JYylpZ3r`+Kctf#QJ7py)&`?nOF}^tdAzvOB3s-iS^XP`f6gmHL?Dh zSdUGt&nDJuh4owUnCJO>UeET}KJUl-vp?(~`^)~*9@*c|YEt{bB#uU-qB&&_3FW_#_nZN+{x&P{cE#h;Kp>?}Q@$2}L|)MSNsM zyktfEWJNq>MSNvNyk$i^W<@*}ea!RxJ+EhbY@hez{n;P(kNsu;X%FqAz5l>pA@Q3H;l>1O3+i#J`!K$6M@(*5~~bm;9@L(iQyY z_R!;<2z}mbJFa;jxIf48uQu-g(Rml}-M1g0^>{B{)%v_2LbYCRPVn9D9i{br{~t~L zD^8V$-tPN)9vvgS{6v>GT95bPy$?GR*e4d7OKZJeXXqPPpl?v-U#f4A2znN)p|`sh z`nz?Y#~Tq>>+?2+o<&LM_wIw9?@s7hytu9PeuJR@`?J67#?UX>2EAPm=~1Uei)1`w}Ar`Xv_V1OF_~AzLG@r+X6mx}Q^N zz1=y`-)#Xs-Z;?b4TN4zN9gxvhF;CN7qUpK9r*4teL{oM}GJErw}UqNp! zJM`v?KyR)A^ybb$4>&pW<|0pMz2KwJo1>oar@c!Xs7e81AM}Ppp+Ecydc+f;H`n=Z z>dpB;UoiPwt)JT-`hqr@w7%{O=nJlBx@S+Hq=n=u=jZs4hZ9=g zw z*NFapVkq<^-$PIG8uW{2Lr*dU`o>=x4-Pjvr4NnYNW=?V^SSVg!NL!Ex?#}Q^@o1w z7U=I@gC6e@=!e=uKeXm@==VZDbO7{2`$9j|3HqU_p&v?pVCn@^KR7e=ggu}yTon4D zH=sY9V(#vA$&z0Yi3>Z=oM^vGRDoV`Bj^_&fqrO5=o>pg@Az~K{ZQNXS}*rE=*5nN zo^Dg<>+XkM>__PDIzf+jGxTCVK(BW^^m~&-FScO=t?wICFSac7VyO?D9(uuTW9Y@s zg1)c|^kU~gFE&5)V#A;p>j1stYtV}w1ije!ceTFp9q1ij%d7Q|9d~Ly%S0`cZhYUQaqhuh<9cO#s%PnplsHVSVCyH5%(zOnYM< zb3Nqx$n}!zC)ZOKtgl>ex&Bh`m+NyF)@$km7sq<;i}k%P*85Ia{}aF;aD{)64gLcC zhhy+3=wHy^cmsW7`XlsD%EMoYY3J9D=^xF7zf|$l#9F?MmK&$xPi2IjuRZjAsrO5N z>cXF+e@B0h{+|u}LHdXE7wJFJpQL|Df0O>_X!xVk;h%oZ&aa)X1Am$N zz0~uizAyc4`rq`&sSiwl-3R_V^@Qo)Q*W61!^aR0P@kB3#qmb!_+d5ljC~Ma%zLBb z4aOggN4{p)Up>$G$r+}iH~*?VfA#m(pzm9G9N$Okb$6pDONkH$KG^sVgpr|slGer+W3 zZ6EjO{F_8Rj`=wo?u3%lxLb-n7HQ{Cf%HMpY4AG=`OUpVzy#*6W=H{oVlR`Tkq%i`mb0 z(ARASz1_;t-z^F~-rLhtE-Z9Yc%?UlkzY5m=U(Bs`4to3=bL$CK%Gp*lS33|RQwO);YUX8I5`oEi@2MoQMpQbKmKJ;`q zLtobmdb@YxX#L%M(Bth{PV4htgT@S72dmyXU_st5uU;99<|2qzPz-jku zec)Bl3-))>`oZ7(dzcLU+}-UTgv{-fL_J%f^>v3qZ?_@zcc(#*w^J3_CwHS~KM zL(g|L^nC-N_gfA6za^muoCx~B$DtRT4f?@u&=Zbr`*U~DdbtaspG!U6o6y&trS-?u zM(FQ8g&wah^m+S0uNV4b68dA(4*I^(ACq06{~HE9VCneqI7hVay;oZ<5eg{3`fBGC8r)a(0W6;li2tD0g z(ASOoByQ>Ym89wj{oR|;*!)mZCEsx$>JEXcaO zmV}<9q~0&}e{DBtJz(ks_invq_`=1tCG~@;Cp-Z9!Y!aToOV@_Oz(W#ib~KUJ_~)~ z##&F(uqk}6xKG8Ge|mk`54~Io{oHZT(`^iW-P_RH%?kb9GtlFG41M05(CbYO{ocD; zKUB4ZzOOg*em_J1cMJ4@sSixOVCn~#fSzze=nIEHZ}s#^=o$M$-}p=4K~w1Ej)s1&(;ls-+Zy`1PocN#0R7#}6(jrCT9H9jhd%E~==C;* ze(zK0`BsL$FZF&eK>v5T){B+Y2YwH|VCcn4=*7w$)wI5F0Q818K!3O{^oU15pSTb7 ziu*&q_zv`pKS19&*)pwn{CTm~Kjw270li$0G^?f!se3APKlF6pX?({)LY`on(f0=CkhjfPUN%=8(UxGg`RQz6q&9~+qm4g4ZUO7 zXXyt$WZvIzN!0TQ#q$ZZJsYJ5ZN>Am;(3|_p~s8oZPtcfFW!g3`%&5T`%={VrT#DV zfT<4*J!sWle-EhDF~gWj;O{+{F+{e4M%Z!*39{v^Iff$vi^(BG@T z_bc!{8}*=vOuJ+Lt*^&ND8@@D#*g)m9#2+`FEhCwZ)TFT_l9+?d){22$D=t&k55%r zk5@(gU+Mu<9~k3Z*_aEKTuL=jVLni;p)ZX2LSp`qd7wv(`9+55`9@;?k(iH!ub!U- z<||PM`o~kChaA)1FCE|3dhemod$(Gl&+D$|S1a{y;R)*RQ{vU&eYF ziuKcq_0&2H`n_0h&6dwjCcQc%C|d6q>$BN#anyRPs1KYQdcl|V`mP@9^&U;rG&pJ;eX2Z&_8|)J>-~n{L^Fj(^l&HQtuc3w-x@lNqu1W>t>+#-%aWX z!@pP58>as7VCWH3pO|{ZU3L7RxiEi< zM#o#$Z94w4eqR3RtV`PK)-2Eq_SEs3>7(N}6Y-o`U&nU}@t#8br}F7|P$524O?AAe z`s?_S@uYcN$Ct7%^pC&R-*0^$@pUNTZEJcRe_IicTT|)y+(f)?B7Qet>v-Nod~YJ& zR~>ZxuaFN=k92-OmD2eFh5UiqqVoynx3=f+wwG?jIr}V$--IInVnsg2YSugQJa^~4 zR^)5Ua?l$_KF2HyJ>ok$-(#NB`5$w$&Ic)PogY%=b-qYBq>0KO{WNyRd|tzJ{w?&S z&c|7ipR+pYe4Q2fI}`al^M=mvnaKB`A{>)!L%-V63;LbvJtno#WDSldFs_-ohyubi)`_v=EdLcjQb#jc;-j>o{~ zj72>l@f+Du54sTbu&j4)hI;7qsE7X9?TgvJ_boO4sv7V}Lr@RNdeFJ#@_Wf0pBAs0VwGdboC~QWIZJ7L0Jz=JW@T>Lldt;{Kj$M0a)M9diNP$!NbJ%a~XwtsD-EpTY!4F zcfgC*MLpzT)PoXV$9mvLz+VxM#CrIpz^f3yK|I5D;9*$r&ie1zwsRorfvTb&Dkti} zj-wu~HtGSlqaN}M>Olih51R({z^sRU3%nWeSHuH613rg%72-FF0uRLce%8Ckmffre z$`Aem)`PJgt|jULSr5s2P}ak;9+>setOwtKdU)c^h`+K29waXCFvP2P0>AMbc(C`t z!gf>p2<^_X>Cw;x~u~WqtqOweM@!u^y83psa^wJuvH`Sr5*7 zc;W$whaet=co^b=h=(E`jQA_!0nY*tNxX^zeuH?1ul4`$o+lp%`6h;a`H62Q z-g{u<+5P9-Xd!KK`|Z3u+FvFG9;PkuqQpZH4@Nv3@n*zB5|2cD4)MUmZw#Gh&3bUw!xIlcJOuF|#KRB|6!897oC=u+s^P$c5f8Tyc)&Tp*Odm|jQA_!k%)&T zUd0vojo9J?$b))l@^O?zJ$x460f>hn9)x%p;(>^VD(tYkcUsY25f4W^An}mI6A}-5 zq`>hr6%%+%;;)DYCq9RK0OUj9d-~RYSr1P<0PzsyYj_4c4DtNLx7P(8%olh#;(>{W zBp#IbN#cQtuOr@!_^W6<67V_1s}R5Ot?g!e#6u7dLOcxdK*U244@Nv3@qolbRtFx~ z+cRC{^oWTnCGfyoL$fcMm3pKko{)HW;?0P^S^_*$2k>Dm10M+c`K|wE10JL_@G#`# zcnLfd@nFQmMdJbQbr}3`*&s`!d- z!4MBbJQVR@d>`a%ARdzMk9gQ+zytGrd*c1`d*Js$J_LS0{GP}M!tagWANg>;_4{Uf z98Vly#KUp?aXfN-a=a1`%<(*6{O1aD9eOJR_-EpQiH~iH`GNRJ;tAhiJ|W($5%_R2 zgAb^4Eb}3`0}mG;ctFm##Dj7^=KM@NH0N*5=i~$6e9!rxd>C9GxL%MChU*E}7xE!- z{UJVw@9SIrB_5D?NUpDGfQRM!OMZ%aSf9yXKsk*22a~~vL;r#P zL^JR~Mf)4z1N&C?#%w1${3rTT!~@gcqW?uaJpD8JYvhBVKi3NWU4Hm`@4yGs5B^{^ z;6;g_B%Uw{@O8wS(cgR&%Y1P3pNWU2e@%azd;rn@c+i0s+xiAb@?p?_r$0|V82bD4 z{}~T3K484S_<`|6A@IRDgAXs}`}$VLjF&0{4_+AjGH(%Ik$;4I9FM_=LB0m^7c2mt zpZNBci0>HhG5%vb$oP=)BI8HKlZ-DJZ+jV9+>!8;zeI0U%>nU^9jr^Fy9cf-~aTuJMtsUmoR@qJ`Cnpm~SB; z4D&I}&yWv^`5WeQnBQT(hxs4ogP0%M5By{h_#j=8PpT5jc(dZ*OF9TXj26hB-3Gsm zJ@{a33)KlLHr!r@f)A($_$js`KerZqSj^uspU3u~NKWGy8pgMpLYc}{+I)e|b z9Qfdtfe(-SGu*Ek4L->4WyfE=5BI;gAC|>S?~if6jQeNDv7g5MHSV_sVE>K#aewvx zKl=CF|Ez@lQ0|X%zjV=S%?HQ*RPL|d!G7zH?tjetXVCZ@@dWjNz;6h5)PwdyJuK?o zjczgOp<}l9vmduXJ=_e9N0K#A56ODa2^zm4vY;NA_0ZNKEB{;XZkZFK9{y*ww*uft<44_FlSkUdZj3VdC3 zJ@CuNQTQtfJW_N${639W5x{Q<;z0%j4-;GVe5qYO)B|-#J=Ad2gLOkaTw>G%T2T-A z0`;JNsD~YddSKQ=x7Bzv3H((w9w3Fr=Lq0c1o1GXfd@i;|95-u15ppfdN9_*d7>VW z^^mLwWj!qGfmsjDdT`dm18*jQzmjh&MB$O-IpAS{R}p7{hXS6#xcfKpa9?__U;BUX z7liIaJ)q5uD15sKytnxn^{~JLE8t_5oyLo*LmEG+UTZv|91J`J@gQCremhHU9+dU4tOsU2H0!}x55G#|MOB~IQTRy-JfQ@>PMW|2 z0e>ZdM-p*>hXY>4ARh8t;X(iG^I<(G>tR_B%z9|ngR>r%$4@*2S@zBJB6Aw>50P-PxZ$1d(L5PPT9*B4-;=zcABOZ`=$le+c zOnj{T06Z}9(7+Q${W4hhZdQFhr(brE=Y z;DIIZvGNJ{Ab_8gz!Qop;6nl4Oe_K)&Z6(k2Shv|@sPxWVm^+>0}~HTJUHfaMLq!X zA&?J(d>G^dAs-6)V919Kg?upN!yz9K`H;v5MLsO@fsqewHu&ITewVRzTo!n6cg-(jwSW%*{39m#ILxQu z!vJ4{0)K%z0zMev+tp_90U_R#zTm^T2|l2G;6q9ZJ}BUyCGfx!_*enFsCWZDJme1y@*&37dyd&I@+HxH5ah!k z9|-a-Ci!5_usp#B z7D+xd@WHLu`!NdpGYb1PqO9J(`Qh*NOZM{ru^$$?^x=vqJ}B~GVgJnR13onJ!C}A6 z91A``?8hm#_iy{#6nt3Z1H*o)_4+Bz2S+|U?5~>1z=!y)>~yUWtd>{4WU2pVbCtlC zC5+0IPh<-0HQwm-B*Ei7ZLb>Pe$|rs&deoRzT9%6Z(u8tJ5J>({T9p-pDG<4@vhqm zF|bGR+nX}I7B^N|9ai=1hKIY^OQK5M(rMOqjVEtytrK{)LN4hYF>O}u-9i>#T{@pjy()4^t}2sqkF6#*ogC@= zph0TskfMz>$f2$Z&UWq6_NC1gk9nTI=k;ul?el)TKl{V}vA^s;?V)|N_g#Ir-v<<|0L{<8nHhxXClpu8{J zShha5+*y)uagPKwje2`UJICWo4OhEl0}ro#W#k$)aBn|XDc1bf_lR z=Sz>;zp>;#nKR;$kFRm;O!j`OdapLlHSiyrH`52B?4rQ4@oSe6^Q(-@cC5f4Q6f&Q zcGvuNiX@>kuBOZVP|T>{wfWI1d-;3*Qx?C$u5wt=shhXcRFio=^eAlc|F@>`@A3T&;GD~>@WLIduSi+ zUGX$->S9YiT9TJ;xVcrP21fqCy$6TgUT@U=^gh+wy4*0a zwNF^0eG7Jp`};Bk&rB03R-`Py=T`a*azUYh(On%%${cC09lvv>rW`ga-0q!CbGfH~ zn($E#TF5fNcWSoZl}Emh)9UL=lytp_J{prf7yT9 zL;Gm&&5gkiHqEy+lGX3vzRsbk(K1`v(@86AHtez{+H$!)9UL=lytp z_J{prf7yT9L;GlNt9zltZTBZL3RkhOG_Z=lF}g(Wa?=~_HV&1kU&3!pN-;I*yrC}p zeZ_*slOjG(nIf{-)lA+t=Si`ySX;~aNj7rD#g|3B>N`nQV`!~Zbt}k_KQ5h~UbVSg zJH$C-sUDr=v;_G^4nEXb?z$b4JAN`ZIVE9-b{n?zR<*9G`2AgnDjxGZf6wdL9^2>r zcz^bX{bPUGf7(O)Xs=4MV~fL`%mgLdM5!GpIJ zb*(G*b-DOQ{4&$Th6o}XZdRDwl@CxyUMbKr#0HNtArf6uW+wj;eFMty-B85y*NzqnCJO>UeET} zKJUl-vp?(~`^)~*9@wxCQfVP9+{V z4m(*Yw4SIYn`VqRe7Xp$kR?HXaY_`m9dx);XdG$t%)LOeq50(4wl}BTUQ}5Y9u{8b z;<}b{SDXFj1hb30dN`fk;*#B@ceNFc-pNWzuQPAzJaq4`(sZrmcq+pP#bci5?|D7j zWBa@x@6Z0Qf9x;&PkU$|?e%IOShLRFl!kk$!G#Vk2`~yxtMGBUWuIYx)UD9R3aQ1; z_&Ynj9A01ey?W*AP-}*W*U2v4f)l4i-vy^u_Nft9w(@GX^K;YuvRJvUN%jt}A{P~E z{;6~AR>hW1Nm+k0hxdGltCY30JJ z$T_#)4C^$el^oUb4wAcX^!I<4y_6hfGq>~oJN?zf`o3d3`FemS0h^!Vod#`%u(ALm2PkDM<# ze{w$M{L1;3^DpOP&d;2$Ie-7?`JC$+*EgrQpa((1_$@P=#Dc4u7w_Ja@9&>%> zdi|rOHVtmASiSZNTDaKcf zw-|r@=y;6rDC1MctBhY6&oaJcyvz8P@i60K#>%;cV}6nOM&=)xk7Rz5`AX(5|Lyry=98IUX17(rqWl%*vnans`7X+TQ9kVdb$*QUgOo3%{2}ENDZfbhM#?`@ zK9cg2l&_@xCFL_Ize)K{%76a9&WFBFNnG}N(Rj_1%A+f;?2w~5*LQRNqcw`6nQQ2` zGk%Hkz52DNZ<}(Jws9i4!uFPI=>8&`$5Vn>)sfo*j`m4nYYvS*J^S8Ob~vle!mw{& z*~*@AU$fF1@IIpwr>X{-9^SPG}o6K$L#G8MwxoDz}Ek_=E3bqCI3;bT- zc!Bc?oL|NDR9s)hcvOr}#dx(CzZUjrVP7Wf&2$ghWU{nftY$@B`>P4ZpJ==$xs1O1 zthds#M)B!tcB_=kDm%_w8@^EH>pXtkuxAJMY{A+`jhcqB`PEwHy;`t^bvQPqTcXz; zR;}}y7q*v5bJw=3k39R>gr9mmZOjLK#>-UxX}=-Fk*7`>)-mhQfM5C2M^~?2a4NAI z+XDLqelKvm!1)BuFK|5-*HNA~`zGpST%QPK=euV?IX?6y~$ z{;4jZiCydzhYFtOemZVYp6}l=sZ3mfk{{2@>^Nl3CK;dej$RVUo}HUn|9YFaaJ5?SH!0zShYKT&%sAexz?JKI_zhprdDd^8@OWq3(NKIj@;Gl&|sTcc)!>c)77# ziQU*1*e~#Vf#U_vCvbj&>#4ZDit(rzpNjEnF@7!V(ZW8mH#0r)^?YGAUt?B&SXjp7 zcbbvL9m*uUbW%EBF?R5EPf_&jH_cw;P^?(zb$-9dMPV0K+l{m}p2U^}wAz^bFpZV+ zn{zF9?h|%xP0c{ZPgS_v#yVZPeQM7;Y9i*(m}ASC@yD%0)4lkyt2-;rj2y;mpP18q z#yRj{>U*Puw#|xZK;QRvDQ*nJ2<54j_730-n{94$fg?(giX76dv$0m(itTDB6 zdH&k>qvprza~4~D2PivUjH$beZ&yY|PJFTC?H9%6X_}44oL~NB!)j zei`gVi1m~qET2t39UI)vyaw-6&F{+da5J7duf1Vs7muvu4Q8?^jn#d0#oM=ZE9gMD+d zSnc3>gdKhU(#brhfL)ll#i6s_AG~m@%cH8xy7B5|b1$|j<;s1Z7R=`Pe!SYACR<+R z2Xn1`Sje`)!%OVOw!nUY-wPZsa6W@q4lF^vsQW@Hyjs;{t6w_|Az(XU*{o;wP>L z2JM(1#?P3x3i5A0vczs|3+xy8y}IKMF~9Adw>2L0i9PAJI$l%Vn6LJESYX+{H?RBhFq`zqo6l+D&^x%( zD1LABx4ihAaNe)dwY;m%LQCw%w!nUY-wPZsa6WxCWUGh+l_&7U8+@P7hX(R;P33h zmKYk;ecfRR``)nK4)54=tbf-<4g>tYF`JAAMt!O_;}=~+7KC_PaXtN6{d z%iLNK#(Q~qo3(e1;>zZp+pVvRDX|;d0{aDiFL1oT`2@}{a6J{*S1}$H<5MwS730^! z9xd$C!rsh9mJw~eKX209^0B$u?nWiW%3yHM^<#sSX0!D6EWLO{8I@nzBC%XmcIm{x zq35c&u_pDGbUFBP8EX{&!tz?cCH8RY!}v*NI{fYSm64Atx8S;m&P+6!Wy_!T%jkZ= z+?Q*TkNjL$JDfMD*h$CZ)I{DZ@M6T^=!g=#u`RG);P(Q@3!G2j`~ue#xW0<DW^C4whA!|}aIXrqyvBUUarFeHM&j}ZfDd__aw9R^L z$l^C|Iu*RrgW1=7x#r!p6|B~QEl1g+D=Z^r-%>N<(tQ5X(BYq-wc?&JTWVS^?8}wZ z2=zgXKR?)Z;||{mk-XJ1^M1#wPv(oe_YaAw7*%37wgvVJ{9fRAf%6HRU*LKI*H|#$sjbaND?e}DFtSfPt~A(K zV}Rl2>TJAjL|%dZKz6Qj_p{@3R z(UFhrS7ySe1p&OgclPk@$x+7uME!dvo)b#!#G@O zd{P!0uM|$ze*S z61djY{*=k59z$f-)Ai|Q;j;uXWd}=WfB^jj4Q{_AC8XL zliHr2cAwLK+MfRW#fIXy0UJi}Zu4hZl)f{O*Ii>7+OWq|J}fmMee9`8C3a(5V86ic z1&$XupTPMAuJ`Nzqx^k+72{DcJ{99tF@7!V(ZW70?9GfjmEY*&@Lie-)h6jQ&#SJ? zD;ylXs@)jHZgl^K$z@L~Q|`5E@Zf1J_PN6N$>nAaVIxL|SFhx}jy0)qj}ukir0JHnaUl`%$V(w z7E@w3wgvVJ{9fRAf%6HRU*LKI*H2kHUf_HJ=NGu1!1Yy(N5%M5j910@wXjDE`?Rq4Z~MIeuHX0H zbw2;QuHS!Gf9>z;pZ{&+vA=2j{dd({{;vAk-&IfjyXxnE*L=y}H9z)u&4>QGT=9($ zLwHW%2hDclWnKp1j>^$8cNaB`U8Bqz+`840;kint-_v#(h7DNpyLA=^zgx2d4SWx6 z?mnLRbU*X@*ye3)#g*zlJNMjR7u$Q^{Gs!SO}E~wSsq!PUoFZx+Sa)_*VZ{!zLa9l zkK9;X{-;L|Zd825&Fy^$K76$Pk{JWV|2p3upeVY3jLO$+e2}GEvl3G-RERuX(08(O zv(aOl$))xxV+WXw$f@{Mc|2r);l$M%*7ipAaULxq*qqY?L)$*v#GLFG6ZB#;nS2Gy&wD0|DXkb5tdLpZi5xC^`^LKezGHf+O?truHsk_vy)g6=&KB51&aBdv!AYuipo|clqm%H2kco;8>?l?PgAj z$BOLbwT`b;jQg0!PS&}htSaa~ciK)jQCXVMs&WW$) z<;q9;H@qCvr4NtD*}Q+z6h$P@%orhSnv`?+`Dc<5*yWCb=jrt3d+kV|@95oiV zClsW8I^32&zw%`5)1~^PWBuEYId)>LTe+L>Xr8w_Z~ppSCFSX5-Of5q{FTKSU(Z&b zzF(Q}qS<4QG#$3&eaO|5COz4M*bWg!@5Zt7>ziHNZJok$9MX$--aE^7yM{bDJLw%; zvvJEG`Za6uwkiEiCLZs|!z*d}@6@yA`#0^I%~reehKD;3@Gu(4Pwf2o^n#5$Kh}6x zx`EeuL-B(9?ifuhIx3I!tB4x$mZi~_eiJa9&oiCVLi`*N&)kiLE&+G8a#{(x@ za=XiAZ+*$(ypCmAZIYq!ziq#l2p#BOzl;*KG2YdP^f{kAG@^;%EU_I{(> z&UwD(b$kZof~=9NFj;&%l-zaH?K8M@y4G^(NDFMd?# zi+RJgJhp}7-Hji6@ql;>*EKaGfyX~S>db3fF%dsS{55U@+My!S8X#be3dqZd{w&=fbk8=x1WC_!cK z75A7Otn}y|wEy`9p+wBz(O2YGU^}fE-6`j0&!+4DtZ#9B8k=qG^ZM=cbT&UZ!05%1 zhb;Hp%kgLW=UX+5hv^x=by`eYyYJ~dI)d3EMWZ11I0%qvY@s|Sh=LlzX~_UtG0>RMLI zw6x@UMmHLKUhB-~4%=>gKcg=notSU_rly7;D=4U!aj+?`T4QSOg>Du32$!W-hu(R{ z?uXB~+s@|DKiNNaU>DmPr7J2wHoTd?`t~rz-|m(Fz~Ft#*P|KtX4L(vL|+^A4(O~)#EMJ?0(szrUmCK z_9Qp-cjR89)?K@vK7^ND{_s{gvmoBop`Yja4}pBv!I%!LQ$HSb=fJn(_rt`uyN|~m zzA#4AeD5>)=k75g_pXDX(`H{W@8?SQC%*0YgR|qVcO2`%w_FQ3^G6dmKE=FQbVQ^b zFOI3BOqVlzt5l;2-tq8m2G zkRP!)88f|3AuFHiS#I8`)6Bb}eyYifm25%K(u42zCu=G-d~&7Vrpn6mp%2)REyI-r zpC{T_-9w7i#iZ|%)ypsg{RZ>*o$k%XoC}%VRCgkqajkFj6S*nOdwOEaIzz6oa;Dq$ zFYW)qcGY$5b=a;6KNq~+)^u1;KEG=@zdPsL_`DGnlDZBV&I8jc+J-F(<^3->%?~&g z%Fk~8c=uSSE#GC;e&@^)p`yM?eqmGJXwjxY>E<&|jTfJaw*M?{7AOo}o-%#@(~7TC zcMN(k)Q>ashL;YEAIg8+DtmJ8CKtYFwCkZie)iy_t^3Vy?QOziPYxTMoS@5RCiPlB zq3i?pvCf0li#P9JEp)tea}P$c{qr6ze$nu!#?|#p_gbCZlzEn>H@2B=RPMfSR(vh( zu~K!bYwXQ^)mY2TO^fX2yRqHAX63crmaty^xqj0cr&z8-)*0Ou?^*5%+oWEHYx8nl z=UpFXX~v&!Nl80Uvmf^><#BZO!eP9(cb$P_9Ygu7v_Z4oW{u$$oBC@!lYRN@c}GsD z=Z1=#sUHrRM@Nfk22&oLx)Cd`<%~RL^(0cb&N(%y&fGr2;!U1Wso}$T&c-g0rrO~= zc(cLz*CsxEQ^M)DUBVst`IyvS@2?rJ8t!7as<;NfSbk!x(;r1Fqv*8zmSvY%ZjW=N z1{~VJ9$sjA``wn2?7_#1>AU*WQfmJ(IWgu@fKp0CwrY6ouu{#me)hDL<=BpqhsQfD zvSnL-)L(u6$W%7q;>4|byVDpevPkc~=N|h$#;aFSSZSXAZPb*!yykpG)VYNr##Vg& zksYBM90u`#w@Z9$TL*JJ2g3^^c8uj&1;N9s?+@et>9-$M{LqEZ^sQE{k2Xs9clJ;Q z+D;X|t3LZRsW3&{E6BHvniV9L@A}cZ!FYF`-oJaFM^V9igNf6GD7Qd9=Y9VaCtWXo zu)X=D*L(YL?>RL(?A+dl|Gc-}%z9j9zNTr4(~O0WS*d4lw&d4KXT|GoH8aSLVX+tI zX9s=n$+E_MA6Kr9r!wo?*V%VkrYe_jR(Kb9vQQ}>b5v0~wqf^HoA|!`;Ld!T-FIHx zdl~DpdPT*nC(g1l-==Kvzx|XP+Y>zIyk~k>Ze8hm`4Y3=x9?o_rW@JX`t1(2vkhYwTMc@2Xxo{6 zGI-OX?wL`_*W|?1i2E)NfgyeZ6|2oyiq@b}HWXj=B9zCfvuq4K+B-K56`B zRJibj4K}u~GN8Bu?;XyJciFY#Ln=41E%nBRfBsouw(YnNf9_e&c2x0bZm02Z7}+F( z=TsT9=IpdkKKS*eq=>3EBB;a2wQ=54#7^hdwJs;k6y9-(vz%VXiiEqh4CX8zE}p&( z+I`Q)r?uN>MtyT@l1Fy!dj z&1sGJmdb+lrnQH|Me+q*J9WTxG3eC~g9w`$LbG7X^s$?wM9M(}o19#G-auJp#5RuQX?Y=@ zdDF-6ZAJTLY+N3|=QXQ(&@9M}TaH+`Eqo>Cn>Sq@dcH{`z9T7O=*g8InYLX{mEswv znftC@fob6z*h1@$o5Iq=*!XAt9GmNRVUa18O%~TGQhaw*YqVyWRvGO5_Vv>9Wm(ik ztL7IKJ63Aj*_MfYXR>dD4>Zd9p2^1Rja>9C=mq<_!3%SyaI^gb=b`$g~DWxRhi z@IEHv{iOHxFy3E!pXvRk_nqEVuU{9%Flgyt8TZ`NV{q4|jBCv%#wFn`f})&=w1 z8q9ZrnE%RSKBW1vVq-a9()>yDY3U=A=HDDUIUm#fO!IYr%-=Mh)BHXO^F7V~ zv>q(N`atW29oCPjSWjqu@xXdR>kq9*yRbgZ!FqK9>ldwOw7%(My`%My*2A$_A8Ea$ z^>Z`UQ(9kXz5R&wm)2uipA)cN56Aj_9P2r)@58a))B3*w{s8$0MerAhOPVz#mG5e-r|L=`sALuJES@z`wc+e``AY zFY?Dy;GdDdM*f=({5kUP$lq%K|Bw8^EAS6p;V+W^*Z}?{`IqEx`osSuf0X>wrtnwa z!+(u~KRX5fE&03T|B^pU{xSK>_fv@HDZZz8KMwIf=>enO&^so`o$2vnVn-Bdg4tknD^tCC_+ipOA zBRy^&^tlx1b)?^sp4aA))b~j5BmIx`K+*^Q(at~HZVf%MM4yCSN%|$}nWS%$-bwmr zF!WH;M@cVLp`VhTO8ROl^j6YeNss*qeU|iE(r;%&&n11A^j^|`Ne})rJO9;w(xXYA zetApk)udmOp1lV8HtF4@f4_kqPWm|Mr~ht;`~>AID1R{+`HUpwH*%2gsEYi@Q{+SHB0usJ`I7UBzUZA^&2Jd<^AhC|?tR{0-%E{!_dD-Qy@*Z%Fhi(zK-&D|L*wzr@vo_d?n>CDWACy`Ay1qQvNd&`B2J_ zQoeL6@~4zfrTl6L@~xDArF`rOvea^j%0z88lGu>cnfP& zKk=#kiL31P)H{Vsw-&LUbw;~b{%Xj%vqgp1y`DAYtFKtyEBC~VU(Zb1L7+w$!A9%sgsBohx(mSly^|eFnLg<6A7= z*BrOnnAdD@%AAFE;qUs-9DRR`HGfv&-F;EXg^zg>;Sz1<#@AP?lW??Fe?I;~>qjT{ zcj0BLKAL_0SUX|X_@bA8k5>QnJaGKnE7pByE!WuB)ZXrwRis(($}`f}SSfcaculGH zZKkq2y{TD^>Y0jd^5M%F6Li_5HpA~kHLzx%mbaQ#Cp?z@TzI;wf!|)nR#vOju~Rm4 z4arY_wc{IG>sXN8uUTzw)cZ?ulcSw@o4|k-?cHs7&^z}yc*fRHoSS>>`}Qh*#rmg9V=fgtibIZe@5>nU5Rqm0h3^*n z|M7iz^rXVUi{+yxT8S+UDDcPLJn3ndWOIEL%_3Dc8{O z-?qQU`F-~yo^H@IiFy&18CXhr^`u#am62{r*>{_4Zudx1;ujfpOR|2Tq>M@R^j=t% z&29B!P}pW?c0T@R>alI}89y}Htn%6;?AY##A={l_GOvthJuM#T^I>%ys|>Yj$p7?rDe5*uyaVQMuc*LQLAZF7T_ ztv^4GuliC|>K)%&exgr#W_4`toCU!)tjp&{%{C5;Wr5FzGXI#}?BM#OvvsVmv*;R? zHpI^P#wxm$$vPL)nAcm`y!ib+#z*xuSupUi%P&3M)4yYHU+$6Ebi|ND!Tg&+|51ik zq1h_}-|&raRS9JZ)R1x88!WeD{xIsgjNtiWs zn2=I7P)wXXW|>-jgy_}r#pk)3hKh>A&eu4p<19{IdTsvk4@DekGsDHq)mWGnmC_%k zS4!-*I8zX3a!Vcjhu`_yeNxnnJ|o(8I3HSKw;eaDHG1`O&D;vTt4^$0q#0AK^W#qj zy%eX5g{f)h!jy)&`3ZRz$CY(e77TN$SCt(~pZ@l^t~1MaPW9YhIG3Hg)%fzu@+!-j zUe2;^$EU3Hv8@A!^(oJnpR^jV@JLHOa#Fi}?(WvSSKo4tM$8?|JL+63(?2SN>vaG5 zJ+fZ}f79}c_u<=-{OZg~Y4MuTJY0WplLLc{x#m#~%Qu06V(r#-oo2QQ6+RoU=B!H} zAv`LXwo9+nQ4-KfK9kjG;)Vf2UxBWr3>6-WpZA-Wm1F z%6L=1pw+*4=^t}W{o$`J-SKY*?e$bm(uv~(o_XmjN>tc-d%xjI*zg*) ztfwDPVz2%&A$YeA3%9)JxpX;WD_X6;_{cnzU39gz56ekpZ?$ux1NK~DHXHJjtr8swV+&t@H6~vdq8%Nq2JyKK6Ki)preUJLgWZ{o)tD@A( zUsAKXTWM7DW!o&8HeaLRQ@0s(U;a(AvVLDX-OK%zxI?D~81`79^lDJMsI$!}<$Hsc z%^r=Y&dzkUc^-G)ja}KA&@%PWVs@y!%l%1tC)mvn8_LYRP{_7S&@nMRR)c#y-qS48 zp(7u)d&%=BLmjz!>DAkcpZu!l80GKx-87tUdO!c|iYd{&=BOs;dwh)MkBuIV_k)e!|l-?ungvrt{%BBn(}t8;2k<3-xh&)2Kg3$Mmbj|f%^PQIKJ z+qb>CW&GI7&LfpM&oLl`jKdUJCefSecnUuGQodx=g2_f4!Y= zt(XbB-X~FK3OgHiXH$pxZLFqM7rQP#H`v;rp87Ma%J62>X3R}3Y{6Z9b=EXBx8`fl z>Zdg=DU`2BPTOVla3X*I^tOpZdMr=<(#vOT_(VRf=+ogwwFh#)XXA`s z-3b=MKG(0BSUg^Y*4s7O&U3tI+9$&C$B)ooebYDWsA29S-g&h;ZuiVuXmZcG)ps=& z+xvf>x3;5!xO3y~mfo$Os!3a}mWOQQySQlsDx6Q6hc_5Ztfy!9&Cg&$h8Z%p{I zARaT&?&*h9QG8G7s@0?y-JjX@2l5U>v(@=CPowWC` z^9MEKnNDr@9VgYr@w4jA+q+KnoUlBmFm|-+Z`o)`So6;69P8o1g=U3Xy*Jj%K=WG4 z-m7a3yln!Nc7x9OMT<=3LpPse&R5E_qTDUvR=)O(8C%#iTs@s-H>$e!ZutXjX=d{D zkFGgv@WY>aRsD3ieV>$i7!2O zp=GK$Ce)wG?aP~ly)GBSFUBvNGIgFKw{Eu7a!siS@pil18I0#(Aq2UR6TG zo5s&hEg0u1{9U#;+-KcWOmVYqlsK=kDCnMau*&Vv>LIsf4}NIQsqPm(nVkt(sygNG z>3=6FNZr}<%Ga9RJFAs+Zq}X=`(A50IHks;^INoIn%3L);B~N)`61#~#Qj6c$)dyM zZ_X>n@|W3-k63BXOq*4FT7LFS7W(dv!>Rnk?Bet3>jH|NGLyOCIrH-Mc->vCzGv&S zjqdLm*sTi;NT8>{mB<)dEX`eP++DrB;xF5_?&^8HltzN%^R{ng@qruSQm_g%sJ&vwf1 zf#LgLI?H~4FYJr_eps~po_IO=eeo6Yd*dtR_s7f0?~$LD-zWbfzgKQ0zh7>%;P>|| z?Bw??@V$!^`TYyb2LkhhzUuiLa(R`+z zE$27ISI&2Aj-3D4LOCBY%#W;(oG%&XPmcMN&yw>i$9&5%|MFULKIWL8X};#Ea{d;W z&jsdpF+7Gv#{9vA%Mww|uZ%e`!6Y^;x9I^;#6k z^;@iz>$xb9>$|{uFI?pMFFHzpK)^o`m88F*HX8HWe^8rAe?ooq_P2kb&XE3w3jagf zMfxLJ_$ONUE1B?L82lMFQ2I9v{tkOD{U3Hp`a@i2@o)c#!(ZYjr2oW6Nq>sZmi`rA zCH*ZPEd4L?$3!*hp9%PD0{)xe(w`IX?*#lkaYFik0{)=7QTm5!j`SB*_>by4=})Tg zFSYPDwUN^Q)WRRlgnyb@LHeugvGiZrX6etekJ7(o@OL@e6^8hQA)aA~Z#d!|j`)Wo9^#0PIN~L4A>$_=Qu%j0C9cT$ zO1zfwmMAUbFVR89V}i^0Ohn3fO(e+pO(32VWoG=2?^MKlD&jx&l#B;e#D^;4MJ?h- zE#gTn;>%3Lo0+6LARc9iPZ{D>hWM2qlJP7*C*xbLC*xgiCF5TnE#qNsA>(6iA>(C! zR>sc)@w7mEEe^_fTOj@xh{wfC8J`Qp>jLq+x?jfgD&l(;@xH1z;dlJ6LJ!bFAJ9TC z&_X}ZLQg2Mm+XEZ^#^uR>JiLG>Jx0Q)GIjj3l2SlL*L-gJ2>MH_zi-7(js!KgaK%Y^e*Qhh4expLqQK9ds?WEqLLjTc157I&((n2rFgnsl- zc9Z?kpBVHg27QV{uj0_JIP@$IeTzfyBK?a8NIguXNqtPzl6slwEA=x`SL$iPOX_Q4 zsMOm;l+@qEQK`qNOzLy$1F6@k(C<{}d8+Z^-};^wdY=~hpB8$c7W&}7w3qDu$G`4U zkL1uNIrK^n{gOk^Bz=?gP67Q>JeGQ>fIcdqmx|+3KNZkZ1@u+XS?aAS^j8&ntQslx zSrvM%3jJ1_CG}h_^j$6VUM=+BOz6S?w%v3eVx=C)Z10)?<(|oRgwC<3cX$n{aza^^?WV#{mji$ z@BfeOCAl zqvRQ!P~Sfm_24^D5B~`~z%kSZS6wf85Z#`VhcWm=@<1KIL(K#a7LWR~Zhyi9{!i`C z0#8WwaCYF$o`Ju*iF(i`;B%_nlDx_g)I+zpBYB1usE2=ydiP z;F{!BGQn>cf(Mua9-=;Y5G&MwZw3$a3Ov+u)XSD$D|xtG-~n?`U)TsdX!ZY)hb4Q7 ze=gr%^1yq*$4&LI^@7o~bwss}bhJ@gUOgNLFX{sDM^cHkkFfCo7NexojUhB~P4pM`q&`>6lk1Riib zc*uCv%dP|u>j@sXF6s*t!GqIt{Kvm%P!HsXdZ>}82cvqprQp3i!9P!$i5KmO zdUy?Z0OIR1z?(&bzuFBR$satF7kHK3;NjMR2MkAje-H4WZ@|MIM?G}zACiY|wL|jY zl@lcoe-HftGSCmVa#3f36Q6nCjt+zys)x zmHcEhc#wYJVGe@_@&pgH5j@gr@HrL1tE7V8cm$q->ichi2j2EW^3a9g!JB}GPeVU| z?dXSKjD8U1|Dhj7=wR7@WH{;p9Z(NR^`N=vUr-l3Kh;AI1@CS2@6k7FtNQ%pcTxIq7cx#0QtfNwtv-uoH&XX1f~haw(q z0eCp#0f~n^3f`=nwdAi13ndSn13t$byow(9jZf$Yumbh{JyGvo-&pp;h(|w=r>GC^ zg?=!5(GMpP^`Jvh58D~_!0k~ForZoK)zP1Vcz{;uU*H5Dgm{?Y;JpLELlF-~JRI?& z#6xZb4@x{N@n*xoLlX~9d=B*kpneF%Gjv0J|0(nXd5!w-+Ng)#hx*|CsF&@5{z2u? zPbUxc&>HkxS&n-6E#Lv3qd$cyc#uBeVWxox>H!|AB6x4&pNR)1K9+dVzTjbpfG2bV z4?PGx_!;o<%h3;DQj+Y4@EH9dTA&}sLhuY!-@gp~VD6&+`v~;|LO-Nv^h^5TF8c?i zp&tC|UD;oz8TDHM53vOOIGoX+Vl8-}0Q4^)9_%7`xDVjHFTRreGx5O0#}W@r{3P*& zQQ+%Ffj29+MfOAJ3m&N%`e9H%kZAB5yTLOYKtG%^sCOTQen=zG4=NS)(6Oioe}H=U zqu>F?qrXfLco5=YDxe=nZ}3pWgXy7v0r7yuLlO^4JS_eHz{Eon4^F?QJ3hD=f_iY~DKYzTBb@6`E`%3TcSG>=Y@qX{c`+f}X zKYb7MeHf#E5Pd)NJw3zsbq(KJGQPjd_#TJh`}D&1>WlAp2)<|Hy@`J&9+>6>njdJs zp!tL5lQx)NXuhHOCjs*j%}+F6mBswk8}r##%x}9e-_iU>Jj@NukM5W+m8G(ujwg7y z+Ta0eqyGr;pfn%T{7m!pCd}V7pVRzqgMJ7!|I>OvyeO>~w0_WfLhB2yH~X;u5TDZ% z>r({QtL<37(y*RcVtu3jU+b{`HN<*I>m#j~U$A~w#Cl5WE3LOxu>R6|OzU$!@bI*L z(|S(pJFWM${u3X&AO67{_zRKnAJ)L1@PmJ034db|{Ezc*Wj{21_$PYsR~o>7af3fY z{tfv%Tj2kYKSchK5&WgC@Sn(^syJ8nTk(XyH5&dG`D5wm*ANDOZ3q0fayo^-`(Y68 zoeY1^2>u`WgXABQzvu=3k^IRd_?P5wlK*)G{-`{yq8o#fl<6j@#9p)ll2f^o5Qq5P1@S!b-d7RtPec5F3Vf_7c+ok~ z3rIg8J%RKE(i_NL`b+u*=@q13ke)&M2I(CGpns4ak_>$$4SEUngP{I0DbQD_{|NQt zC`LaV>eoR1kcj6eJ%{ui(tF0C9~|jHqz{o^MEViwNu)24z5n=kCiE%Nt4O~hJ&W|M zbPHe)x}e{^Ry5=#ivPl3q#rCFz-ap>LAjN&2TT^ia}ANiV$u{gm`n(pL+hx03!! zdMxR)q}P&uOM31M=)0u%lK%TYYt`B{h^lH+tNzYydefu2r?p4sgsUM0S^l?|{ z<i$H#i@@14iqkJ0W*C^jc`8UeP{n>c` z+xsd1Ncl+0PkuqZlJb|7&-6xqlk%OE|I|f3l=7pLFD*j;l=7*RU!8({>wnvx|LOU3 z4@*906nK@ZlO(_42%f>bP}cWPL%q9bF6+NNWIedj&iQveys{bfvXjRA<{?PIsr55^uy z9*$i{y&ac4_%3W#BD&q}GL!&neek@+v9dH-3O; zSRr``W-fUU_5k(YJ0%aqZb%-A8NB<=gRzs6hhu#t56Iu6zOY#Gpu8XI&;HZzmiXt@ z;DK$x$9@7Yx)J>3Fz|#Mz}IiaKA9*BLD zJQVwZdg!;3hvO|I56CZ|esrMZLHQ5K!}4B|2j<&RfA(kg9|X^z0lwW7y!Tr0&#%D) z6CYa#yeRRL#1ob`l6+kQ@MgQgUwMK@>Ipt)A$XM=;5Vwa`OO2d{;2QIL%sWD)PH}G zJRm-o0V=X`KwIuNCn_?en=jOtp~p`UGiYuL-KIE9O~U|BoE2! zN*XHZNPLhY`+hsoheyGatehB~c+?S#s#~bvg@JGLfB=j$M1)hHk z_;%vGlfggV0}o7m>}Bwx4Z%+qfF}$DUpE81S#$7L6Tu^`2cMGwUgaqGjkDkxT1Xz2 z50^YJk3s$SM#+QoF_MSpGi5&jK61?OehB=j><1x^%6=Fn{C_C=kF-HQjo@JN}GhvdyA56VNqZyc9A zFi(^`G&e=Pd%EP|c{AA$prk&yChBE3qkgmk>M5V2zVNJ$?6+cz{v)pk%YGck(4V3m z`ZZ*re}N5n{si#t8Q{Imz(1#g2Q~p8OT6es@RJR|6IKIX*H-d?yb}1UostJF;d7>f zSE(a;Xl?|ap$zK#zsi09Vm|7>2grU9Vw~)UQBp5EM)pGy_hmmAp^yGDdFZ#|f&L>e z(2rvk`crg5zlLb^FIWYh|H@Ixx1Ry;?Fs&wcwpjVb&gA3v@7^Y@PHgVWC?Fp6a1A2 zc%*pnIa=^46AUE3@eMqK1?u}%)Vt@P{yRhV0}(l>53VTt!H78759b$mDf{VEL4TPT z^jo=u{v$upk0T5HDX3pV3i=nU1kX==dnkBs;-85J{sKOhcv0dfjU*3R!q*XR<|}z< z;=xP!9P|Sy;Wvn9sEhi36WI?$xS;;~8tS3zqCR*n>SY_Ef6#LD(=kVXnNKTZzm=xw zKcYcDj#B7PaRU7se9^za5fPgIKO~VR z`$4G&=nv(Geo5cP$^Jp3&`)PQ`pXPLzZL2~@)P|yI-@@Y^=sIS{srIxOZay1pv1$L ztf%0i1$gihev){?6nVZ9-VE0hKjigG_#BK+td-*};TbBUzJCPj-5a6)doTK7Ekb`N z+#inn#do5g4(=z%{pCB+e+2iR<9YD<=+}VfMLa0+u-pK=H}TKJ1CN&PLkTZR{3P*& z{_=eiEx?;a$@fisTk*RejA#Wu=c;@^1>RQ`@2{#S-)GfczTc`b`hUHX??1=)!0~a7*ccJ9rOL$<+2Lkhh zz(nt(U6kp706E&UJmUE|;V(A2ZiKT%_nfA_;vPotk*6#Bb?2jcK|xEuOm!5`xA zkGL-S2i24QlYl=ZrlH@;81x_6hkhJY(Vs$tehq&}e@(Op&wo$)b0xfYC-Be21H&Iw z;UB8-7ghL=D*Q>+6ucSyO%?v9Y9;+q?M3OIYT>Uk_^%xPEQf!~?a}|s5B;#HKU7Eb zOM<^#(oZKC{bh{NZ-x4g!2cF6(Vv3)HBkQoTiFk!gl{L_oA_tqfe{a=h!0c?*$+!a z{GcM9DB;ZzZ)g#JXc3QSDK0&T{(WcB&+cBB?C*y7Mj+l1h<^m)A>oUDNr;yO;wNzg z{bdke3B+3>8vQsBj|s$Q0`Zza{H7wFQxV^l@Xv_A&$KMDOn3q3&#eL<@u^@e}q zuAol{=oJF`g@B&%>;D~*{m!6wh}!6f1wBN3M!zI;^bewbI#K8^^A`P9sQ(D{b?$I-74dX<2FC7@>s z=vyKU{lB1p3Fu)W2mO+um#NUt)GJa?Q=zY^(A!iG^y7dYr$V1oq1To0{KU6I-z(vt zq5o;22WqQIeK2#k)C)5gN&WC&+DmqCKz~N)lLC6BfPN{UXNqR%cLu#vK>t*~pg$D! zQ5AZr8i;;6&{I|Dt19$X75b|RJywN2tA$>xg?_7ro~wnvtA*aHh5q|L=3}8pivsj3 zgkCM6Ukm8jD)enN5&gf`q8}Fep{OS4m(&;igU}C1wUK(d`d;>fD(OG+N%jNNPLX1O3(Mt{+gjbBk~g}@)aub7wTp7cS}OQvpDqsYC2K& z!@7h1P+etyM16<;L7ip(MC*_KGWxTA_XE?8NB2EY5kmGq~eeht*W;LmveKeOx4 z_76ZmO5~$dSRoY&9n*TJ7OsRd=KcTV}P$=f$EKW#%P<=e#Fj-Te1RhmpZWOyT@ymHOK zrq&mxr}#h5oK@;XWkuA?*l+aIK3np4x*lDh#zW(y@zVIo9A4kMJ&N3Iy<@?fPy_2`QB86is7?$g?xN*See+_5CI+s9EQ+q9p4 zPsh{w==^j&x;~AE#z*6&@smAdAKBZt@1=U9CoEJ}aOo>^?9@rBLG`Rk1*Z;#%gv>BasYUYzYieDqkYn5!%m4|Onta*Ropz=O-dh8JA zOeH!irflC`LYZd~ZM|~PQRTv#nfsDbjwxryo^KJgK1*r0!uI=0&2goi(`3H`VaH3h zX+Qm*j;Hg{`RRIeeHssqkH$;mCws^~vN!B)xi`mx9x5AcV%ithf1<2i_N95+#e8Lt z`_ICjg@uZlVdc0pyFMtl29B7~vfekv`N!94pAAYe!-f_1-?J^t>J5!Mw`5~^Hls|+ zsp~)V*pQpEUySZ#z)tt}vIv}Cm1W$i^P<8jL)LD68PnG3)mV*lUD|!Ott}R2;l{q2o_f47+=JyC&%E3{(~}+6Jseg%%Zpuk6`i%} zqF2c_?Wf<<@pL{qKV6TmPvfES(RgY6WDnU#_WBj?zZ5gtpEdHIGS%;LFw?Ama%A1- zG0b3p^~sx}qu5UU!MEFdh+!KX7Bo8Fb}IAOc&PR@>zS3va?pQzz-kXj9gZ+5jwLx z%vY=`*{1#Udpe%ZN9U*O(e-IOG(H+Hji2lx`^a9C(tQ&qC#_{Vm$&~YvwR~H2Qw-= z8Es=aJKU#+P2R&|YUUN@G~CZDO1q5A2|UaWOuAU%c+wGOe$XJY)tM|-)lesVmBA@? zx2oD_xyxC$qtHC#oU+H`SD zsZ!TUwrM~8o{p#U(fR3mbbT5RjgQ7l<1euX_L03m?9a{q5^;&$e6z=F7P#Dh@mK|B?Ph%rbD-@e?~f zvT?&t&2_E#mAO>techD*V7og9X>Kpk;b$HGc=ql>Dc-Tv)H7k3rFl%!)oqjdm*KBZ zwffd!TA7k<+E2fy7J--j_4u}Bt?#+-uF6;0_DO%ey#`OMYIE#yoj>@|1^X9{z0-gj4R4q{ z!mly^cx%p@!Cg#v>fPdweY{%mmlrE+-qXAl*Ll~qZRHuQxqqLLhkyFC z;hB?bmx|ujrevG;)9>kcIv<^%u1D9W@zD5ayfl8YhwLMJa})hP&#qjDAKcj~=YGpZ z{P6+z(GP8#@iV#iAH0rg&6T_Z`F#d=;8)sQ)dWs6<4NsC%?mf`_Ur%i?yC9q-%s#z zwt0a&{^-R=6h5&%oNCFP8nsIQU}Vij{~0dTJZyQ-4PI&17WOb+}&E zEC-&K*MEieO^1?g+E2fy>XsYt75|;9e8G$kCmQz zcHvepRwNEM%J|pwFK4v5-J8eF&)+(>wk@9-c{T4zO-J6OR?dZ|_no<6+qQ0FLfv?c z1S6deCSE+F%b7|c*@Jk&xZG25`+WG)2iezF_8Z1uX$Ec`ztxwwpLx^$?ruN6vE8sA zV+Q#1wNF0H44dy?vQ7Kx_jEj+kIqlmqwCXnXnZtY8b8@X_L03umMol?wxkCS9Jwrh zoQ)N4zoSR%PM!|Dok#1o7v4Jax-V+HN-A{c&A&x;f3kHDpP6{m@Qcnc-mbdgyxl?m ze0NaSFW=t>a_hj=Sr;b-^N(TXTJTyKUFO8q~_2t9HVSGio)^nzv9>YHzI2bUZO*nserncdxZV|k7 zKZoq;c@f;K^hUeS^&?BRX+Qm*j;Hg{`RRIeeHssqkH$;mCws^~vbXR0!F^^w(B%O< zD|fTMK2N(m$1Q(gb)Fd!9~1Mn4qsLAx%t9`hPcj+$kfzH11xqP5bHhbUdAp&QI5)>(h8>d^BDfKiNa}k-Y_}qc7Lw_M%Z4 zW7vi#)%$T{cT@$m>?3$hm732KU&N=-hRT7n=zu#^-u1vx=s=6 zzg~K$b9joFtFvy*%cuWmoA%T1>3BLHou95p*QfE&_-MQ|ezJ$`BYV$iqTIh!8z8>U ziVQ06>MbTV%E>;od6*dgx$3myYJtMAaO%xDp`*m|!hw}_v&RUpOGafp@*+i0t@@KL zTTJ}bhg~`J?ciilx~yK0KK0{7n4PZQ*L0U3 zvG2O9$&Y52{QtnTP5bHhbUdAp&QI5)>(h8>d^BDfKiNa}k-cO;-4D7ybie5S(fy?R zOZS`ZKRpk6KJ>ik`O)+It2}Rd-|79Q?}5G#`d;Y!q3?;lFZ$l-`=jrXzEApI>HGbw zeBU&`(R@eqAI*m}Khk_j^C!)xG{4e(OY<+y$233FeEnCM&uKlQ^^Mj$TK{N0r1g>3 zOIkl^J*D-P)>~SCX+5U(`LD8mlm9~g4EZ`f{Aco~$-gFloBZ#;ihoY=3B@ZEzfe3w@eRd0 z6#q~>MDY>DOB6p*JVo&p#an-sc#PsviccwCrTCTNS&DBd-lh1L;$e!9DPE@dnc``R zum39XH|Y<5H@$`QCeoisk0O1F^eWP?NY5gDi}Wtizeo=weT?)n($D@X`Woqrq&JfO zNO~mclcZOYeo1;J>6@f?lKx40DCwi5m;P1sRML}4Unaeo^k>qeNuMUYn)GYZvq|43 zy_@uJ(!)s~|EuWdls}++0_7Jd-$3~X%12Osg7OuVzo2{uC-ZPJ&of2l%=3^TL&nT=$ZX&D zWsD~gQIyg#mZ8W@dEnQheofP@yi%nd`xuN!PU3-eQ!ea zubuDA+7~}Ldg;|AmE(3zj~?I5JG*_*oak=~t@+4$^P#=7+w5{rd>9_ ze+bf@|+*^WNbEY!18 zz3<+s*fLZuZNt)Y-f0us(y8n9Dm~kW&hGzc>5EaFLg(_moqhNA&Y>x_Ru!l;uS;n3 zZw>o=RJdzsZko8uwHkGeJl6Aiz22|m>G(RI&ad@oeOj;9ul;C$+Hdrz^vzd}ofyiW z>H3}w6+a49NnUU7{c0bFiXF^drCFVYp%v%4X8Xh}50zP#_T;qpSBIt)zHx7MXkBPd z$ukAKvYSHR{uW!MZ)ZQ0XL!ohllE^7U0+q8Uax)IL-&t-owL%6ouL%Zz8!TS_h+GS zsP(Lxm3D_Jc6uwx}xl!$YVXP*X#W{o{q2c>HJ!c)~EGq{o0TAr~Tf` zc&NwS1t&w{Cs%wClm1-j=k+W4K0ferC}pJuBgR*`9_rY=_qmCe?u6zoe4}`)Pag9c zjJvq>?CVLqp(!`SEzOeLt1!Ryz!Di!dmS&NE;%DvI&WRA4TX06lHSWPKU1yri!yp| z7cFzQQ})bWnaXoo6^zQ__5Z$bj^k&uczb$p^6uo$8hNbe^?JQu$J6n3KAm6d(fYJr ztzY}m{*c&Q z;qfBv272+~p54YB9O`v{FLwH|HKV+W2To_(-s1yrV*0e%eknT9d+zCpB{rV_(5saB z{LCwZr+Rx+zxH|0_>a6otB9wAc@tX| zm_P5wwcf&)(;S=Be6x2qw&e6G^|pGOhUR#&+0h-|{2@tK$9=ThyO*o*insxLy=UG% z_r{@CUwT-BoSj;G`6d^*3@qxEUMTEF(A{b|25H+9-G;`^_>qTBnIno<8-FW+46 zt14^ay+qAN9y&SdjCZa>O#epS1#jEW=VPPdFMB&jcS@GG&o!_4@?y)LefyU8)~n;I z)M|d$`*F~ZWBV3=%xqrx>7?Sh6PuO;=d2tX|F~)QyEo^hdP&WN$0t9V_q}B1ixkN= zeV_jcv+%vR)r(s`5qYfV^?JQu$J6n3KAm6d(fYJrtzY}m{ah)wx=(eqeV`0rt0*u z(HV1_@|$zyd^24hb7}ds?x$0~V8%@9-17EM1x%Jo{b#)1uaIeS@Y0TqD+-%0w)E+? zdT9|8x|}y(OyQy?S)*BBH;F46d93I4dc9xA)A4maonPzG`m|oHU;EMiwBKo^2mZce zT@F*T(Dbc8-F(j2S^L**tz5v=p8r&dQn!kjH#0Op`18BP&2LL;oJjX!Df9h+D=DLL zziy^C{_*k~Mar7}H9L&!5LeD5-SqF?d52dp_4+N&{Kf~B&CQtT+qJ7zGx^?$DPHM7 ztl3j%-GH$;tf%6V)^$ zdo~-`x_n)e?fe$6?}<2*GEMxoONSbpvsE|0wlAug2`%jw9Pih{w5$4fuUq3z7)6+}4agn0x-~-P)Phl^gO^_uEAt>v_Fi@7M8ke4S6{*Lt)*tyk;U zezZUB_v^PWoNCY{#yp<-ex;8)R5KfbGfnEOscF32H)A_X? ztxxOK`n4bJPx~G9<(9mo^2eH`{hPkLV^b|-GS6sYX2zNAU#(0vtb0>)E#;oImFl)K z8CE~H_~M23X4m1?ZB~rwV!rQm_te<|t`Gc;&IWyL+1gA4XN(p7DM2 zQqJN<>L(vyema}6#h(+KCfm$6I_G+QkQulp#o;pF4l?a?t?1Vv&EUvmJ+Ig6{W_kG zuk-2rT94MJ^=kdvkM^hi=DU}9eDB99{5juo;;XOr#hUL1AN=vav$ajuT_azcHZIQ0 zopJTmchWXBex)uQmNjf?{{2#cHZAhCGgVU^I`vha&L*^|^zxX4T}_$R`@1#l)6GnH z?X3>|QuHt%?0Wk9y!CpSXNPpG*sO9N({$LppQq*XwS3-| z&)@R*u>5^2e=p15&+_-Q{JkxI@5p04uh;ASI-ZWN^XdFrkJhL4YW>=e_NV>weYbr7 zEx!lL@5AzYvHX54zbDJ@%kq1({QfMzN6YWi@_V)Xel5Rm%kMk#SkLSAdcTgRL%k|fCJ+@q*E!S(y z_1tnjk381%dcEGSeB3+`l7_^}JrM_v?5%zRsufYdu<@)~oevKiZ%6OZ;Mq zXDsoJCEl^bKbCmN5+7OOB}@EdiKi^_l_lP?#9x+p%o49z;(_p?Kkb+LLqI(upgs{$uL!7L1k^JE>Kg&|j)3|{Ks_X&J`zwb38HJ!c)~EGq{o0TAr~OiI3aCE?)T09GQvvm=fcjNHJu9HT z6;SUAsDB02!vgAK0rj$g`dL7IEug*@d93I4dc9xA)A4maonPzG`m|oHU;EMiv|s9r zKJ`YQ`lC-h(x*P@Q?CrDUk21O1L~Ur_0E9$XFxqPpgtNulMVC zI=;@Q^J_g?pVq7OYd_kb_Den4r@rh{Z}zD_`_!X->eD{;YM=VGPd(eGzU@=*_NjmS z)Wd!1<39CspZa;^v7XoK^?n^s$JhCEeyvCA(|Waj?MM65e(4|h^b>sg3qJh@pZ0kKtGkp3RKK%}#{)bOL#HU~4(=UlU*7JJ3-ml~7_&T4?uk~nsTCdix z{b+yMFa4r0{i87bq%i%ZF#V=5{iiVfD4+h6Pru5if92E9^678+^t*ieUq1aYpZ-|n zv7XoK^?n^s$JhCEeyvCA(|Waj?MM65e(4W}=@*9SABO2ChUqVc={JVyKZfathUrg+ z=~ss7Uxw*thUssH>34?dhlc5gMjq>Vy(%3mA?7! z{<|I?ZzlM>G4Ohy#}E6*eU9flV87%0mcS1?*y;Gcz2E`2Ug7w_w+=X7@ZGeIAN(19 z*vD@=zVJqP!{gdG{_x*j=RftjX#CILg2&qxKJTR^^^%R=y~n%yl;iiFeBJSUug`XT z-<|jIg zdzX17w>^KPd8tg>a@)J`b`AX9l<;_$z~_yDSM$da$M0PVuV!NcUQKiOzl##^Y7WB- zz6GzQBs}2<@oH|tBVK-}> z_a6;U_Yi#Dv(p`K_k$&lzne0f<@Vj> z__=lA>CS|&E8cEA{N1(icn`rJ8}tDF*t!J#u{Q93#RC?9Y#6*?@q-`6A3Fk%xD$Nh zdGN>b!7u&;o^i!dIbNM~qrBGw-ti##$Ft!f=Ylu)IJ~*JsU1(Z8+_fJ@aDS0-~9s~ zZzgzibK%Y1y5{)3HQ@P9fj2i6-dsNTzv2P6fj9RNyt&)(gT)h`3U4kMytz-{51)ib zyt%{8TXBnTcmce*h471S!kZfl-?;X5$2&d^Z*D!jxvlU8OT!n8ho{>PzF_-j9dEZS z{M|M1c>jPem>#}h5%|4F;rZUY4Bxk+v`j)fl@2S0QOyx6|*Vza^1-2-1YfEPOu{%)h3ZywultGRg|UhGTo zddDns{N9D|d?&&8O~{L_3ollDVDW+z@?v+u7ZxwJHN4mb@M7!3i=7THwm-bsLhxcU z9dmr+FW?=Qsq6U1^WnuFhnIT;CIvhsQ9^V8=!gU?r=_gp@I{XO*e(ceqFU;RDB0~Q}xJm{6xU(9k~?l4;`)$unc zH5q7!@qHP=_vdrIPeu5C>HF4@@1MSp`hM=>`>OA+zRv^semCa(uJ6Bo56$^~==Y-E zPf~tQ`hC^m_cn>&UwM9y`hE8OqQUKwdAb?#f5ih9A6UQlIDY@S9<<>4pzDRMANjeS z==$;)*Bf1bbUm8I^-0&OV_d(EaXs6~^-b5i*SP+Pue*xtWBLTV_ZPUHR!zWr*Y&sM z19u@rB}zHpCx_M--ogiB}ZAD4tP#qj*R0kK!T4 zN4tra($1V3e!t?AW)tyL4&tkiiMPc2RXjG0_)PJd;lp3e2REf@u}if#jll!XI~?}Jx;uvnfP}&@o*#J z<#qBGRlYlr z{P!UFu=u?-;rR|Ge-`go`L*)xrsUts$6qEtSH7H7@_Xg`$I1Uy512rG;579D z)emM-Ptbn#uj&s!QjcgweIgt6iVvt?)TW;CF7=I`)H^Ov{}8`-b+h76_@yR#s+XvK zqI!zzE4L?QypwXQSmsou*#Zk@}VDS$C*!sotgfm+E03P#>#Dy=*r1vrN>} z8c|UsUC@2TEbgZkgo)B{x?Ot{a7 zJ#J1tGI0@CpIk+~auD^)(bO|{Q{Pm*Q}s{PLscJDy;Swnd(=}^Usb(zKJ{1CW7AQe zRlRl;_1hn)=e|vScP#bZiqwBq4}RD_AN2eH>e2P7PhZdF>eb@&)}@}U`nGt!s(*|3 ztNOU=&gs;{R!c;w)#2fp-Ff8R$vUiJAOsMk-Res8JgKLNk^DeC6^=DqAU!(rbe)>88?YbKpb|Mm_2xYqRNqUqNarhoUS>;Ip=Uj0h-FV)XffAbdoPW3<45A8vJRQ=MD^iS1K zRe$vb`mJ&FU+dD3{ha>n|8)Hid;jhNj>p^TO~>c$0v12=#docdSC4=xH%cyUk17cL2J_`^>ffB0eR`=_7p0e^QLJl^W? zd5=$Xyx!CBdt>1F9)j=N4Bl@&_`hl40dIv5e5|kI1+Rl2+!LPgrSXn0{5rhhn(&9) zz$5;r_xGUVrG>xS7#{B`_`K2ZdKba(Ee+4N6@1^3@P1dq|2Bi0;vE)6w;q}M{UTY$K63x>LHpGImxs5z7yj;ec)Tyd z=j{!z_vUYo-#Z7M?_Bu4@D02d;Qz+L1BP$lRe%?K!|@HgW0xII_>SWnga*JH7JqmP zJmRn66JPnH;CGiho{Wx#UtIHS@{RkS=<#2F4g=upmWH?c1N>bBk9Q?}-c0a%_rmYJ z3eWdj_`aLr{XPc&w+=kum*4{*hZlV9q~iyVg(o}=zHnK1!(HGH*Mmnq0Y33B@QRDU zFCGccc+{waF_ni;dF1_Xg0K5MyxlDDcPGN*-3y<0F}&Wd;P?9Qe3!%beG}gAofjSd zcQ-uX&hUYw;01e*U*gS$C;S+E;pFg!#UB=rI4gYO6U`>%TQ;hF=mPxW>F|szz&G9w z@AxSEV||Yk{`>he`|G!Oy?~hyU$-{A-O})PYs2GB44?P+7C$7}xumiw2*39+c)ro_ zec{!ZKJb4p!vls_4om|Hq{< zzvsIa+H(J9&vfU5P(k>`CEyv)s%bW_n^`WD3*K>-!xu`Fdf`;`3-FK=?)zJKx_ja4 zz720TJ^bAR@OaC?=dBB`cNP5J)9`$+)OUQ}p74H?!T;?K4>&J;;Lh-ZCxzz?xmh#b z6Hi!tVey8=AKoM$F?`~e9G}R0#_@?lJKz}~N$&W@G4PJ#FFO8lc6i9z_g?t9UEt}a zdDroEH^STP4u5wsJl;O=c^kv)%?7_W49|B1eBa^ley76!?E()t8+_oN@PZq{4?YG@ zI5T`<@rL)+tWc>-{0#3HJmQbx6PMXOYUH@~<-G;)i_gL{UIE{@7rf&u@Q)Y5L%s?x z_xFiEluVPllAQ%lHxYc@ryPIG&Vs*t3?6S3eBL?mdbh&wg+FGVhwlr2%uIv-`zt(P z@qxt)7C%@#Vey5<8y0`~B0S8Cz-)G?gr+^Qf z8eZ^@#Kl_MI+aYHXWHNB{c|ak2fpxPc*8O9hmXS}UI3qXD7@n1@Qb^{Gd>RAxIrVw zJ8l90*h}Pi$kXBFW`&=78lLV>_`0Xz?XHEtTLd2O4*0wsQafJn0r%trU2L5p3?T$yh7(VfOc*P$4;%o4X zZ@@R+1n)S-oh8*X+%DqR#$yOX(-J#_!?=F1f@$inz!ax3(<4Jmr;pJv(<@mW7ayXuD zLHN3R;O$n1zgrg`?^^i0zrgEl3%~a?Jl_HEeN*mryx($;A8Ka70~Q}xykPNz`@s`F z2VXb}-f%7W!|%Z(J`bNbJ-p%`@QaIyXFSdEjjO^t-U1U%%U@N(zE&s_jdHz$1E zo$z+E^|)TVL!Vl<6+GUJ@Ocxz=6JnB;P+;L=Q|(1uXw-Z;r|wLyjUYXuz10p;RmmV zCp;CtFuYjP5B_i&c*INL6aNcdaTEB(=inK~c5r;-SKu8Ffq(oSJmgaFa`(f}O%6}D zhvNg=necY&J3erP$9oq(Z&Akwj_`XI!1KLw_GsQJ>jp%4zwm*rc)+@U^4N$U+%Iul z`CH@qo2%~qhT|FWhePm)lVuz>XYc*SrhDnU;~Jc~zc<^${r;?Rzeju7{XXqb_j`@- zfB8LI@qzih+Zgxzw_FeGAo#*uFAUcY^D8`Jt}mvhyWSYCKZfg(Dd4V8hU=9{<*r|* z3OwW-@N&7{1w-NKUUb*P;4Zw~ZSHy*zl!{|vaFTJEnAo^Oq2kIj5OD#nWU%l+Aw za`$U1KJW~8KeyWst!+Lgrk{Pv-S2HvcmKEZ;0>R2@qz8=;srzeU<$c-!Vq5=;tjJE zzA^ELAwDrv;2{&g_{1|l@l8Oy6A=Fd#6tn`QLx^{OTptqlf9Ac<+DLO7f%J^`MwO_ z_ahg7S>iF95*{$|nk9a-N#O?*-&x{4OZ;bv2QBfTC0?||kA`^C5MLVNO(WiMKlsPr z!9ylq^+PUx^*?j*tpBQuZ-aI&-VH{%_%|pHkGG_}hvH zEIu&tx}ECccPpMS@x2vqnE2n$a`}K2pIE%&hVY9|d*f~f(>!ytV7hFvPsf_+F5fWZ zABKFyBR}yk!_VyvPnUegKjZQnf1%5F0`i|=uFHo4@}q!!Dfse<8b9H%JMecQ?FV@q6Rp z`HJs5a?z~ocM|Ol$gczP?I54azb*N=P3rPJi~gu0G+nb@dAW1y{fDlel_@zsS`${9E__s(1L} z^->QBJ}*}O=Yc=e4yczzc)!$B0_rP)_`uX(0_rjLz0kU-b&Ydb>NWNrykY7&HW@tP z6t3Q5*ieCk;~^(|k# zUg}>Fp6|&^Z)IP3sa!DG)ysnCT>UI4;Oc2XtgEjDo8Sfi=<095Ypxy_P@l6~T)oax zzq8cy>}RgNXQ}tuY_9%ikGOiEr9Sw;{c7I{|DEsZk>M$>J{gX2^-BMyt6%!_Ts!sf5Q~&g-hX!L@eKeq68c;tC3cGr0Kz%i!-Wr5m{WYK-8(env*?@YjO%0EDj;rU| zC|BRLU%Ps*E$r&QwmW>|g!}rtk58QWs~#PG9sce-SFa9lbM6_`TG-ed^yn z^>Cm1ctE{8_~pZjJ-bb-6i`nOsILbT#tzRmdd=*B`g<@N-Z1s~V6v;%2d}vLy0gEEXNBo+`SiQ| zPhJ1Zryu6iAM;bYewk1IENB5wnEqNozb*I){_s}Uj|*a4e=eBk`gK8j_{IO!zW(lU z=vRj6Uxw*thUstmDP6zQr~m2G5A}<>{-{sC)E@~?n0{(Ne>F($`mKNZEBrBX_rF>M zn_WLPIPUth!QWlyKmEFv=yP(SSCM|hXCCw`=3zDOzMpyMsmw!bK6nH3ve&OTJwzBi z$Z+&9+t33oM-TP&1N313^!^eaFDLVGPoqaFz&xbpLD!?-ILJJ(=Alg0t^Jfpy114Peqdu<7JlHDc;fgX3*oApW&4X$lR`bA` zht@o}=HWH(uK922K{Ow%d0FY9G*7Ad!d}eVY5wd{_w%6FYaUATV48>1JfP+wH4mzJ zSm}{2F%K=hiu4=bqX*D@zvkUz(ZgsSdOUilD$L7%gdQ$8dceBO7bZs!TJgWs!)pI8 zG7qJBu&0=ZJIOp?JoAtXnFp1=PV>Oq(O*fAqCdKk^SYySHS^kA9~ zp2)mxFXl%lFi&}w`NE&k18e?F`+3m66_^J)$~;sm=E0^j4_AkIz$oS+r!o(kWWUo- zUSu9v^UyWXn@N8qJwQM7Int|0zY#_cr1^f$yH7_Cr+H}22Oo|9dFC%;pYt?7s(H#D z%ol3j?m_$2JWzAyp)?PsdALr@18N>p^PrlC)jY7~p*0V_ka>9N&7{A28$C!K^f1z^ zTn{@vR0s56CzNr1aiPnTM4gSo+x0=tZ-lpOhY;EqVy)L8OO~9!dHfgC0!!4e1%Aht#~g=D(!} z?!$br^x!R+AN}KF=Lhf(eh3Not$DB~mO6h5%>!y4avt-bnupaqu;!sP53YImIp{^x zpofs2Q2M%3=z*lak{+ot`W)$1q~DMpRP+6scb6Vo^U#_P{*-xH&5vrH@|6UB81f&H zABW~4H4mzJSj_`#9$NF@nunJjKza!2L8OO~9!Pp9>A|GGk{)o(tI3*wySKKHUPXFX z=@~TNFFm;CztiFeP!2x?&C6nPdQs`2qz988PI@!xA*Dx>K1X_B={HVR+41kBQ?GhunD1Z3ynBB9 z5YpiXq50s^_93?mk{()m73tyS2T*%|?sR^5eM2Jp5qv0MbK94Ne?DHob-UwLrPC5J*@P=(qBmr zEb0OW^I0zZgm%=dqfABg6^4=@j{`QTmn0cjpq^T3*i);zf8;iU(V9zuQ%!_mV? z4?1|&4X(mUU~rOA*2V99!7c~>7k?tlO9fbK%)=)_4+IR(t}A4Cq1C_kkW%n4?CfL?Xey5jI`22OAoHs>-{>OjxRq9onPyb zAB@&3JwtEy)0q9WOyGy5&qI0ueO}UoNDm`DkUnqe!Swf#UxW0J4bX#14=X+JJpSI& zgX{aC?}z*l^!?HINq!*uzUliXKOB8O^?j8el)lgUe(U?L@4xgA`hDp4B0Z3PPx^gH z52xRsevkTn>h~%=uzt^Ning0I@X!9|67sq4o$t|!u)HO3DoHGV+V z@I%t|Nq$(me(8F)gX`OH{J*3J(e+T*$GTiEb^VkcPI^FHZ>0y-^;p+u>7jM~*7aO| z0J`4m`X7%UhVBo#U&s$e_Y>V;*^dqz9KCUV8oyxu5I)uKT_GKok!sK3Iewj^YQ!6Yt;$rFcW}hy2hK zpD12Y{GxcK1@VpI9mPL6h=&v(Ne_9D_(}1U^uUU@6n{w%ulP*yn*1OX&kZKN`<8gG zCh=cM;=z;XMWvsVp71dGI_b?6Z=ObvqEsp3_|uZm|U<9DWbSMjgnVd+5?FDrhQ z9$N9W;%)f>C>~dQE?CNcclkbKCJv$dU)l}%BSTAp?q8UxAJl2 z=WWQ>A3JvXy)FB?+RWthC&}-nf0iCt`dH~juTw8j{Xq2u)fZH6(0=u=>J!pKs(zt* zhUyzTsduRUp?b)6>LaR`sD2_p4AoauZ;>C2>M^R%MEsEOgHk<5^&QoFRR2*uNcExZ z=qJOo2fpfdX?%|s%J?Lu6md1U-Cm3i(iuJWk;!>4ZvTf6@Dx79~p-q zPzn4gI#8c`7e6f3?^MrIeNXj1)&EovRDDqOLe&rT_kGa6sz<6msd}aAmm{cWs=ldu zr~DvP4^@3sekiJ+s-7yp71di+f0aLl>a(iXs(!0_uIjt0_eSc!|3iIj3+mCTPv@Xs zt@^d<*@pVI>fNe;%MV5Man;M^2c&ws>g)2uQvF@^c=^GpUa$JS{18>&SH1s1f6qt# zfAu5e2cUk1`WN!UsE6O#di=jU{9tb35A`K}Nk8KsloLOwbNFFp#&6{`erOBvgKJ1X zM*SJ}YbriO&;O|VO!)d%^q(5ik5Ye1{i{f9oCkUFv_SA2y8snEGYvpRJ;w zrv94xZEJTrKS1^460Yxm`|&RNkLpLNKiPqPrTUlZXD*??seY&WpJDo;>W`{l`YHWW z^;6Yf{eXV!|MvbK_4t>aKF2%6JRtfFvyyqx(#*p$@9q_39=f&W!I_6ogC1bke5Z#f zgC1lodYI+tfpVaS%JBd_*rTrhQC~lUdAL8E9?A4#9#Zq5xt)H)BxW91^U$;0yt~(s zd3fmoilT?OdfVwiq=$JKJ|29u$3DWFGj0(_b0% zNRfH?^-iy1&~F&&K?ydIoPJdbrl;0ZX8VEQcO6 zJ9^k9=z&k7hdzTIocY4&wh!?4FJlGxP;WQ7ZdC2U{gK8dD^T3*i);zf8;Y&KbsC_5RU;0Udp3tDL zGxtjUr8hI^uMB!5(-u7(dKDu*r1YT7_eb==(nB*3?MV+Giyr{(49#-?fnupdrxaQ%d2ap~@dJy!J5j~LfP||}*4<|h!`Wz!YXnFLo(gW{D z4=p|TyXfKN2OvKL`9a7JqZWQ3lkh{)JfP+w@#6^arwH(C2=Fhk==me_@aVm5$JopM zwT)fv2&V_O^U=e!cY0APJ(Tod(!)s)C_SX~pwh!i4=g?OCZ}ic4!Ze%PksRRa^%l* zqHRX641N#;@xz#gABe#ZB?>0!|$MfA|pgG&!DKY%>=A;=G6D1I371Cbw!{9xpV zgP)F%zf4evd0_lU0{l3FQq05S*AUS|NDm@CjPyX#LrD)NJ)HD_(nCrQDm|?9z|uqa zMGr1Ly!-&;Cksd~RAnBo`2a_I7dO+zR(>gt{^sz>I;A@@B z{xU%|^dQp1;KyOppofwkOnNx!0i}nO9#nc*-AAQ|mL6Psc=-Xy4?%tq^23lHi2P9G z2O~cm^bFo^{E!0tpx*tz{jehQ@X`ZF4^f1x`Ne?AGnDlV?HP~0tL!#%mzq!9> zL=P-IwDjQ8!^;mqehBh|kROKpK;(xaKN$Jp$PY+gMGNb~S~|08+`=|QB2 zkse5TDCxnZhm#&qdPwO(rH5TuGF{#`gZHiU(3PIZ+vS&J{cH?+c=W&qeXRM+T^|hk zNrRryOvVody_xBWAI>fOfbLGZ((T0jEfGH``C-WqOnzuZoZp%Mp7a0m+oA`N9!7eg z579$${S2gslO9ldNa;bPhm{^!dT6fS5k0*80OW@tKM46@$PYw*DDs1mACCNh4Ne?DHob-UwLrM=SJuH44R(fdZ!SOG!==rVu z5V*fv?)OH1Ao4?zA50iO9Qgss59xFKpyY=oKQQ^B$q!C`c*HMZ;+b%F7vK2AJ3jG` zf5pW^0r62FJ>-1!pwh!i4@|ser3aTDUVZ@bLy#YY{4mWd`N4E>@u1m`ACUZz z&=Zcr~I2k{*iq)|VbmdO+ggKzdN(<%k|wdT8mvrH7Xv zfcy}M&#nA0D&d2PQwXJNUsZ#SafXl7~LW)BS{eC87tD z9*+DbqKA|oRC-wHfu)B|f*xFY_$l}S;6GyVDmKQ!`3Lq6%r50HG*Bma!-Tl*(pjpzZ%XCr!0@?BqgVCkWy2bUgRegN`A zkROEnFysd!KNR`FkgwZa_yI-Xhg2LtDD=+;J+MI^YtW0D4fx?vKQQt`q`u%$Z}^XW zQ=bS+4@v#Pr=HQ0i3?J+So9(t}G6FFyeJ zAsFYE6l}*2qnE3n*{054#x}qY=4t$Js^JIp)YF|~3!ZCjsn6Ng_+e4MGt~18^*uwq z&rts})B_FmK|{UJqki}wf9HhzmL8V+WSDxTPyN!z-_57K>B|p6eh~7*kROQrP~-Q1Zi)ADH~msNWjuxrX|#q26n#{~GkMCgHyR?&C%1p{Y-Y+oOl4e(h7w z_CxqVQ16cTfyfUry$q!9_aPq^GAE5jYN9!w)9b`9lR!&MzrQi67Ep{Gc-9hjkV|u%GZl>w2bJ zjXo7?+j;om(VtPj#=PqKH~;nD^LAnLO zfH{GR5pw_)Fkry~|4?boVB6T@~BJcdp37-2Zhr;TARKOe)k zz7q^BTN+xLx3RKr)7(RW#J zloI_e$IfkJnIJwX&o0oebwy{Bnk+nBFYWQWzO2cZUWL0>_GeF5K>e#zW~{c}xI)l1 z-KXcNKD9^fQ-9Py+4D#3|Fh4@D6o6nW}&- zd;Y9HzgN#2zl$=j!0wHXeR8yZPive$X}YF7+;K!&uu-nvIEMj;QdJ)@Av%p+4~dG z?;F{z)%V?_P(tA$8h=L*c-#A;ru;IvLyv_r*RDuzvw9~3>#?3yLxR(-0$5_RX5kAW zPO=S459XIF$Yc`^wp8`+6&sW7?*2*8HQlG@sXnzw?Nfi$KiNa}{j6WV_xu9%+jN4R zvU|w!+by(yJGcH^_x0NxJL8~~*#&n$*u8maJb6JjXD-pfE2o#)z%G}VI(d8AJ!YA{ zWoT~6!aQ??wW{C7^;^Z*uazZT(|vlL>Qj5vKJ`calRaeL@A>hw_s^l<`aXp*tGcCkB!{5)?)gR7&huz+UbsYpIB(!@Rqv< z>hpwwW~%-yH@l(pZkbEEru+0f)u;BTed>?;Cws`gpY`kap7#%hacMf&L)qx7OodgOGX(WJSPq-(lQ&r^MBkJ_jHsDHAD?E5`Ge)fLDHQ@IGqrJ-RJ|%jd)XwAc zb|yBjUMbfuu*|zteGIFz*b#Sk^-Bw8Iu?4mmZhJt)`x;UUesy8-Cvvdq_%hFx|Oru zXy?PaMXtCEsXau}HQlG@sXnzw?Nfi$KiNa}{j6WV_x$no;P=F74r=}KuxcCOqp^S6 zvbLokION(r+qQc}_|OJyt=#Ncz{6Mzzs2@W*mV5BNQ=tLb~K-N!FHnH8q>|LmiJ zw`O^EOU70oRy?E~yE85zzf5K_(K=MNWef2FOz zw_KoQ>n|%LUDJJfp6XM3)IRk`{gXXp-|zYHv-dON!0+18$8xoHM-A?6oTw=ykLUM) zT99X_Q*+JACy%h@>u{L7!NbvW;$GA?w)qlTCZ=!PhRe5(07nG-!2<8wM$;Xn=JhBOk2O3 zMXf#A+ao1i(|vlL>Qj5vKJ`calRaeL@A>gZ?~lcG+vXwoZISsPUu*Zcn{91sYvPsI zVzCu2c8_8}gyv%6fntz>DGfVoMu*`zn^}W+AXxK!)b$oQ|)kbT$Zri*k z+WH~2Tn#5W?2&X$_vv}6Pwi3r)F1Uv_K>s6`aS9QrQe%= ze|jJEe&~JC`=j?s@AvQWzG?i>c%tz|n*Lnv>wy?OzZXEW&Ngjh~guP zmneRsc#7gHinl2KqIitrv%gEcM)5Dj!xSG=yiD;k#nTjDQ@l;_H^t+Bm-w9W9m;EreeYo<;Z;;a!A(5gtbP7~y4vpAnw+cfr>PuO$4E z@Jzxt3GXEQlkiZ&M+q+_{PgdFrxHF*cs1eIgl7}JO?Wrq--L$~K2CV~-vvLX{RrBh zp#2Kkzo7jL+TWo44%+{q{Sew8`Md0wP~1lQQM5lr`&G1mMf+K_zeW39wEso>VSktX zG4h-CA89|5_9tn-lJ+lYKa=)1X}^>9KmVuqLzf4>owI#veYU3Q!+5t|#-dwdQ~#)5 z^;y%0C;W#rF%jtvJ6c;DsLzU@Ic2tbQzKD!ZrzaH`o`>?N6RHE!pud1Q>C;c2kNou z1Nxqt+pd++ueLt4k#D|T^`pMU8W?mHvsS&n{PlvXu(hdR>w367)7|&>OOc-Q*~XRC z2HS?*iywJJU5kilbzk)8r=Dj?T-9f*AMVh$m+-*5kG6g0WmHAmpJ+F&g|>edG`ODD z9#JzpQEMNoQp8DXuQ*UFUTZ(=vZ0yQA5pvaeXW12;(+&Bf5qOa4E~9LvXU?qRus!LUcXbzs<99Zn=G}?)=+=CE&D7rF zoonEJvnVH4e?Y-}&tYz2NGGqCX}9aJVs}JO=Q|U`l*`$ZUUv2uz9)xvb$C6Bo$Y)f zvxwC`7Bs4hbJ&!7@ewZSTA18d_r?B`>Um~$Ue#xYUq)-&6NT%j_L;*4)t~56S@qA1 zEO%+`5e3G|KDKeLvR6b8RrWL2d&(bC>G1-sf2{OU<*&%}n=|<1v9avY_D%BQD{qmL zx9v#zxntSe{g-pi+WLyIJNE7HFY3)^d&OVvyk~+KZFc%uvyI+tbdT?+3w53%{IW}I z*4sRW)qPt$=v&d*V$G5Z#t+ilvgQR(R!pz6T2$&=KWNnI&7xm^#)(d)ma>;_<0DrO zyuyw)%-y|k>)rTzL)5j%Ds)$SU-a#zo@a}{sQRo);fvb#MDlahKKov}q_#hC%t7_f z+I3O(h#&owee6fFvR9aeEBje~#Yn9`!eN2(k6m1){1s2D^nOtO{1RreDqJRNwMcdPN zwvRiwn5C8f+PG_l2$9{RS%rkh!Z|PU8*SinO~stN5r*P{;|~t%3tB~qN#P+o4c5Qqx4f{U+xxb4)@F&9JPy0 zFZ}W08@qkt$FmE29@W^*3_uG1h=aLD1b1lZF*AK9TPoYM zX|h>}8a3))Ib9}@eeK*k`p1uJ!gJQyM{|NQgil_N&iZvynOBRfgJZnQ^6o~au|>b! zj2{QrG9T^>b9kP`Lw%NBTeT;43e`UA-d^=5N}(Nq{cQf7Dj!9wN(bKue}2Ng=e3#laf=C$-FDHiApSypp%3a>j)MDQB0SIP zKz(*PP_-w#pndiL`V+UTRR3(jR%MSE2KKR!V6RAhsD!Hs_Y|SA-v4 z=~3vyJ=QmDY4yRS9*DLFn>}c-<{o=HC~w!8dk;n3sdg3~`uCZ2$4Mf=?Xei!=gGSB zvG>`k{FS|)G=wl=~h?A7O&+AxG$!|^E?CU^OGK`JuwQ}XGJ4be_{{x z&o+TQ!W`^lHNjr-4(w--z#k#jEC1M_Bg$VDp2$Nh^?e^=>&Uv}wi+=faI=Z=R z#g;(%VE+ek*(}p>&wyN(YT2jF=;xosx%Fwo?#Ns=W8=r3z7>Cn*jh)jH;&0+sc9y& z^o|sh+fLNGFzn(P=9U^1xY&nc(kA-jyM#x&e8+Cv=oUF8WZKq}{?6@-@zGEG7Ntd% zksb8qfkUyyc%=m%mg0e)^qV8+wzbgZDXIF|M{C!V%XJ=K88keDjWF-j&(GRic54x9 z`F=`Ed177hFyYjI^In;~;%koLr&l{h4t;KHYX{fzHQbjj@H`&^^?53^C+g2vG3iZJ{=UkYBW-3GNY^{h>bZ=l#>+pgFyw@%k$isn(WY)!tMEN* z^-RA#ZX~~1hq#+rykQkvv@iPbfW6#3<493+Qzsc+Ztwik?^|$}Rg+7*-kQc&wmWk% zc5n+@yp}iNzT5@Rb3Lff)2&o{;ykp^FGGK_D)i6I!5&$$sc^$CwOgR?%wW#(TpaI zWd*%vF*}wR^R+`K^gEhsE=@vDM|jn!&%J9kF+HEsN^Yp`WFbH2vo?Va!)}VMvTvnD zsU;lx$m^s zKfVF{mBZq;R2wso)wB$Ig*Do7+q4-Ok1@#<$`DZRhv>Y}i#U^c^v@)0*-;*J$QtmqWwl z%knm1x)sOBI&GZ?bUMKP@lW{sP^PE zXrGsb{$zPi)jwYj_Q>L`lzn^=*eheee!d6%kt@JI9tr-+)2AMPop;8b*IzrR_QmOK zrBMx+LRP!%dEp~Ni~|cCq}$Y+9yWRQe0RykZ_ZumAm?2!+~R(hwmdEOqbz9IS@u7< zXV5hxdwzCUnIxCTz2x8@Q!V0eSLU_#JtVYV2}I;_Hh%iSAIII z?B}lFkL(2gah+u4uWV-C=D_l6?Reyz=EDX=wU_bPmoJ{!-;S?X>AY#MZ%0}3b!Pg| z;_dn7E2Y0~PjQx(n@t~7^=;3OB;4wgQK`FJFsG6I_wt(OZPP2Vbiq%Zi#`-8u-LY=-_{qoxL z&W@X6``_pwH`xcLuesEoJG`&gc7Cj*Jkma^b>}7>xY0eA@MWyCT=&Lf%eSx&{MpCh z^S%{ym)(yAM5Z)o&u4wfO>dvpPu|(OsiDvjCr@3-?`^*cDAzj@EV-?<6H zJ+=NezkOk}w(MrS!NXBgp6OyxV^3HNi?K^Myj8?7|Hd_z9vX9$*}Q5}%4Op**6{V} zOUKV1Wnl~NewY~e-|K&E^tbyt_?|{pTc_UhH2<&}T7R8x-<{T5Q+fva)$-81S6R`$ z+`P{*tYU$Uck%dR%%W4#eO155Gn4T;8(%I+Wa$>ozaNe`#$J3H+vI!UXf{WG&;8eF zhgprpun8}Z{rCJ1`KjRVyu(|SzgN5sLbU#7bkKj@UsI-f`sg3flzw^Mm7B%IFl+C! z)67hdGsl)D`_n(4Vb_nZ>C-sp2CElgcJRcC^DODc%>kP(Mz9w5hgX@C6e@<>==O41 zb%a?D-`6)_&M_7@a@$a&>PJ}#gRE&oG{57&>U;g8?OZ{Bw;8Wi{`Q~tR+SUKlwYGA z$9#Z%&{gw2uQ*?6;rWj-tcWGwb#`+CI~ia4d{xUdcIUaA)bA>?PEH1_EFYo%=-ME z8owuFpP9Vk6RW*hv#YR zs@(DYyw1m%gMG^}RcBpgF9v^o@N!iFbG~`t!>%6{_(!kxrzb}g;xp`Y?^mq(Nz4sf z?AI=@ki0vzR*_0i64>Uc*?Ifxr!&`f$Neu>PGtG+=PU-*KE|p{TRJs3GKR%>S~zxu zreE7V`~0=vneT>B_51%>|9)MM{Eb0>*PgAZ{9P{7GPM0&Pq}l*SySE^#JjBD8pA@p z>WR&I$608*1}-I!b-a>!wk&_Tw3TJ0clEi=*Yq1#6Pxh7A8RXauam(XjJG_P zTcv?C-u~+TthB;%{Iw-_7L0ty7B^-ymluD=3ROz)=wC0HU}8%UDF^vwGGYMx{hmE?^2t}3)=7OklRT09=>J3ci0f^{aHWhdGgn%GWgrSguU|j{<1-4 zPMZEc)emd2LbDD(bic6FFh#?EuV`F)Yo%n?_|VjY4&!xsbd!WPrZ?K~`ISqTDK*KJ z7wO?|6gkJ0?>O=G_Ky-)(tK#@lC0B%WcE0hF(nr?mi26Wj&2>?h+CLfnP+TWiw`Ng z$KmPcEY{dZ7{-;5>_q$8!=FUQu<+prXAaWze|louMD2Vsdg(mnH-8F#)Avb!{Lzx? z?Yjl-WGx53J)1{+Yv1$NyCw}hG-Yt$hc#=?#IThX%S!C&oXmQ8?0ovLw+`RiXTy+r z7S`Nmc4DWD99N#bFaK25d0+ngUgfR2*Shf1Q&L7mw;3yA-Zq@Rp~x_KA~oS!X1A7n z^5Ap(+TV2G-==K-e5Yk~UO#l|_M~->Sj7g1>wMQsU?ppnD6;ry3=62~xztnB|FS-l z#%t}VF@1&lzH9u&_goh1$GL*PhkB)|_@hvoY1h7*eqM(R7?ZqT`-5VtEmV{m%8sr+<6fv>yUMBa~0=(+FUXgRP-RLgD z3tipFO*5|hKOdQ@_4iy$t1;TLemC&D&Y$$VG}e3a8Q$}z)$7&wbLw^A1a12!SF73v zYRZ-29TG0&$FS{FHdYR4dX>%DdeD5;I0N2lc$m{#2UouC?)vn&=YD*5FDL2mw}j`0 zTlzSOe%w;8T-P5lE98aZx<&Qw`OCG%p0D0&ID+4_)qC+G-IIGCj=q)DPIE5CE#sE! z=}&A%PMM+s=T5Va|i>Rsw;9%%>d6?8PIb)Zd@+-6&(iIoi^E-)Xkdw~0(?Uxp7pvB0dKojotR-DB^r#(uoiiHurFW7hC?Bb~}DJ3oip zkKfnd**sjfv`Sxav-LK)({}r=vW5Nl^t{sfH&%!6(YwoTtzkEwKl4sp9O2iI_pQ_| z`SQaO{MIYi{W-x&>|?Rwt8N^OVa7Gz)pya@5oI-Ay${{T;BO_28-LbcdcN2LXh&b~ zni|jV${S~N)byhhqaTx@`JEd?ojxfZ#jwQbeV5xWy~@gY#uXWsU!PAin|t)lNe>=V zug9b%dlzz(_{eH?YOdnZ2E(1^#>|#2hPQLh_?Qkuwxr*Sen0v>>G!4II}?9@dLQ(DT=0F-`=j^S5Z^Do??(9k3*+}d-^XG6Ue@FH zQw6^#`o8FUqwkNtNBTa0)?a#_#s`fT8b36i1dgv~INrwL_#1`e@idOlvp8Ni=Q(9kXy$!_mm)2uipTlsyK7i}@MqJPP;QBrb*Lzz3DITEsfZ_#; zA1I#qv)?zxGZf!YyhHI1#Y1@*A9-NB6p8UubBw3bFuvM37UC^;jK3%zi^cei;x&rj zvM`>b_>SVeER6ps9;En?;zf!dfBpXc=rzT!6wgw8OYttnzZ4Hsd`$5&#m^K^r(k?d z@ixWZc^HpVd`|KDWQ^Y_o~QVp;(dz$DIcKx;Lna{sz><>HVAbf-H4#GbO4Av}k^PqP27mV`eM9!2;R;Z=lR5uQc(7U5lle~m{x>@MPC?GZ1#iTGIu#M34s zzD9T(;ctY;5k5zF-M`x3-}=1>k0gAO@Jhlj3C|>alkiT$KOZ3;O86+@rDYI5B|Mez zRl-{de*1ZY%HsRfbf7>A*PWU+C<%FLTo=*5W z;q8RK|GWJ9*>-7vg7zzD|KbkrXVk&{4Kv*DD1rMQv>!tIBeY*a`zN%YLi;PU-}1Be z{imL%{i;T|e?|LQw7*6BU9|s2`(d;{M*C&7e@6Rh|0(_V*W$`#r7DEVQZkXg=HO(%|mGrm^Q*zlR+~hE73Ha^^a_ zKWgW{>bWX=JJs-Lo6Wv=Xy4%Jr}wP-#-Y$&86jAytvNZFUWp$(=(pcI+mYWUBfTb5LRY94a;Cn z-}Vmj9r{ol$cXJ^*CCai>Ug-~hV4mW+q1kN$9Jx*=$V_nFI5c}W45o^|9SXUF=545 z9pSxP%zjw7=j20?qD8&+@>TmV(I+LhL*-c`*~x*fdzK7B$=0A*~p%KB4I1Dv1^3bidtk2Nzc0c@B<~ zj_oZa^A;9UfhTdpC)7T^;**bV_8N z<38=Hd;b)>W-<2G#KV5#@WF!quFWGw<(!E_uNzJfmPS?GedBFe-SO2cdsVIbr@x1_ zM;dDw_BuT3`^6)vr7ZdG{zvv%w=|aD%r-bBN9*x^+k+2vi!2a(Qkrfa^B_lTIPf&2 zZ_|%##l2~LJ$mcP`%{gJul4`Iob}=oH$M3)cCOw0(Qo1nwsgRE{X*R{MTLeRT~{wl z7xT(~TkDXJCL)6Z>P>ZhF5c8FWOcF1ZE>S}`hZoPB+ISbr^;B@EY@Cbt#Gq>D)Wzu z-|}eHDY0Yx-O?r{jtkRSA!#$dSchWdww|>1?tFeX$d3gKG$ws_Nvu{BL z88xMK?Jc9H?EJ)ZO7aTWO0UI ze#O$Go{uOZceb8q6H&2 zb^5$HS>km{LQ(hlXz|){!A^(vp{)7HHc_=sEo6R6Cxk5;JCq%BirwLmYt1^ioa=tX zstL=s?{WCZK%L(l5Bg>GUYveZkGtm#JH8~yjt3q-HTHX)y=3itr@C*o;z!D@J#xIS zsf@FzzWC_c0_NfsGs0_#=KO)J#oHxQYfEphdSNrKRORkEmkYnF-9XMVD>zVcTUpJ1 z*wUI=ovO(#hj!UlJz5}cx5~NK{%J*7#n&Xbl#PKjEGT^UnNB%5{!*vUhP(9m6M6Gm zpqT~lP^oyGvsb?|nYEz8XNwBbJ*-YzjfhX8`Zx1a^^1hFqo*6RtGoUft61So|CDlD z*k)S?zm;_@#6H7A6VFs0#YXNeYvH%8rf`UA(Ejy=Mr^ZN!$X;-|NnOo-)Q}vVYBS{ z+Qb!U1~=+Ut3G;h%PW?YEsyJ3pVO_+&n@qiYLu@@7vS+lMZ+kM+-HqS5gi;Q^n(6 zuBE(rc23nN!IrYxlMcOi-Opz2-Z?wR#CG5l$4B2c|6$D=UvwYvdTCvm6nAmbkvJ3C zYW%4$X4$vJv|@&9FMYnxc$bU)Yc;;iT-Fc0vwCd=YuRf^g>!Efus%_TYPmL@#A+X? z{&dr9Ct+}UR@==1eb|=CwHHN>bok}HZ;YHWZLys>pM3gip*F!S_`I%1J{#|GkhM>Z zJY7w+=UF$s0*++b%W==PMUQ;llrN2tyCZuxkax#?fBY$|u5>8XwKDHto%ehI`0h0JNP z-eu>jF8oCLck}SGL;0FDhiBDkUW(s(w`OKcy0aYdFrfPwyN0q_m3GeW^0Haq73cHM zWNG-=33uz3AAFZZ$(plwoLt1R3v{mcEpwQC+IXhW`!BOaW^Ans#-)Q;_Ogw`-}EsQ z&(cPV*9)4lQ|rf`oqzrYo7*O6MDzlCz9j9S(cn7PviFV87216=|5Ci^!CM_} z_q3Kj4t)r4E@dZAw9&PR?$}z+SvThLN=sKccUbWa6N>hc9SaTCj9W`SWv9)RZg(f} zisu3vnSL9@V;$$(_L|d2KCAcUWn6L}S!!Cr*=D)l#Dkf39YViW=iZC#n&ytv<(BUj zn|igm&MJPY5EwH3BHPnp$GPUYds%vk;TIfBk6>#zP5(6BEQ}eh>*(13^c-=4#b;Vn zox`5WAqANm8}Yhd9d?;at;LV^@hV=|#!8-Ql6I%_0z2L>B-PSyRYy7A!)MT8M?3C! z*8bwU?>2JGGH)N(nV*L#as^3JXx&o8ivyLqiHf7>%@QO8wnrCs;h zmhV?PaDL(SpxkBM<)u^WH=MC(&TlMechPukXSrkT>?FN@?d7-z;alu)_m-?xW0#9N zN6USSt?$-+=p}pXj`-L)u`ge9+r%$8CxmbN!k76Tn82^>ANQcfo>_9)+2|b&pH7yC zN1y&U;_VZ5!rH5BztavpCM9vdFtFhB*BmH3bk}3n;Z|3(wx&gSmtp2nS9&M2*t)f| zZ`+<{D+8Xp@32p0^>Pzl#e^RbBY%vxnOt77$#Zx2c>HdkFnYGOceU;hH1V_j()Ba- z}UPo=WlGX3G zc-6JNwG0Uw8nLog5!s_(P@Ns$TxI=gM=tK)t1BzC*mSm&-dO3fVEQ zxOigy(p8=LjJ5{F)9N{mc7B`2Pcb?xnjaBcQDJ=?=9cU^6J@tM$JY8b87sY;rcFH5W;Sg9NJbcF5y9>>^{>RU;k3W49^Ss}DKKZB^A3Hv~p5^&WR@~5}+g;OCF+FU! zRc4)+Z0xK!qa=ezq7`2r>%Zted-`C0oay{f(Q(U^9%UZAXC($s3#fdhk}OfJ(2aw( zhP;M%K;?s@E#zsJ$}cQ?n((!8tIk%RWhryYWqg>{5z zRrXw-WiKtin$B6jV4R%vV{$>an91_kfC7ha!Onc{?SiqHTf=!y_n8x}A795?K8%~v zFmHv-&e;=rbz``+Yw`T+(7}D>sZ`7L7t4C{sO2T!Nhfz+rdYRY_mA82F|pOV%xK@7 z`%klpU((rx=QQr?sXMJe1X$jix_FEsZ)aBYdhd~yg6NPwUYR%mXN9jnz(6a3| zjsGe}kGNTQ_0mu5_=l@Yygbe2iQ*?5YL#uw_daK3Hdb(!WBWwRZ=Gr+?`Inr&2BVA z`t%I4XA!=#=lOW3 z&tF1&{1LRzL!duiv4rYh9s+y#4i9CYI0*K#yI?<`0shEQ;2#eJf2H0h<-ceIzlWF$ zzYiM(znAO_zaL)#zo$%s-NXB%NWh+=ir_+arcUc@*UKXM|BC-!lR8eh_)vl?&W z5sW|S3*%9?hw&-xV7&5{Fn;-57|*f;jBhy+#=G=^@y|EHe8A_x{J?8&Qu77x3-brB z5A%sU3G)kI3GF3FcdA2lKD|2JQxyTke; ztzkXllL?upw=&DHCwG`EV9rT?fNF%-mCSFHJ_!{KVf5})#$DdqO@t?c~@gR?{ zq~b$^!;_*R%Yt9Vx&hxk`ahIm*^hWJ=Mfp}R)PgU_Vdk*n5-v;qDF9Y$moC@)` zTnq6y#pgT-;&oomM#b;E^kEgxb4!Tt`7wz1<|MPIj2V@lF2fP^M3(|I+${%>6 zdMck_hi|IxfVri-M+I)rGJgxEttk9#Y;gx#`{2i z#)m+@#`Pe7+CU=GKreb05f`r3>WK@;c<#A`S9wJ`nP6ZV&l5FM#}<*K48jbS8z)R$O zz)xfuz*Be)z*qP!z+3onz+adb;4$16@EJJ>@EYD2@Ef@p@EksDufliON5Ff;0Kk8E z6yQN}Ip9P53gAVu7vM+#pWo!ak###Q{>1dJT+rfCBCBMa7M~KEQxsk$>?bSyN__3A z@GPO9tne-NK}X?TtUTafY!u*O(jM?JnP{%?GPV-%Gd>aUG@f`_;cKEV;B9>IYK6av z0f5J`(tyvgDuCAsYryY#Q^51&IKcP#X2AR8fvXDt*=fTZ85!@ z!n=jv5`}-WTm2Ls&U67EXYHOVyqxI(e$I+-S9rR}a8>v^a|%*;J4=aB_&XZ}cs$z+ z_`G-ocs;)c_`NI&cs}>gRrtQ#40!*a_Luzrbs2hG?N6}L0cyX3d3I3y7ox=wwVxpl zeOLP%qE;=n-@!iKRr??8Opw|SVObGse}wTxtw5v5?i zg`I@`7hwkbG3@bDwLc^3rmOuL@ok~nzhTL+pYt#G_t*Z@b+;t7UnQ0gQTtcoQFFDQ z#cKcX)$VVxhX>Vu7dxJ$quu{vx;xc=7`wbe?T?8sAJu*tdofh)pNWl?)qWZqoT&EK z*p}^TzfHKq{u_&d{Wwt+_UD*;N3~xkJYoOt7o3#r`*)WkGj$ee_A3(tI(caKFIm{h zK<$1edwcVdc7KyqFRAuB*-g(`+Wk)^2de#0wk&U{c7K$$4^;c5V*5k2f68vRQ2VK( zX0X~{WrwZQeyf-`(i9{XCqr{=1Yn(B2#@jqrT^-^KnvYUfMz z?=hAoU&4DjjpyRa*a9D}%@*JT{?T^-+n)2g0Di5*GP@`6fgaCh0PrFI+x+=0d+y~Hn=pZ<3mmpAcyy^;xjUVaAU%)%cPA7HH{Wcy;k2YoOD_^`P?zz4o+2z==Ow4dZ(8v5z_75sBW9_iD{z*q5Y34EC5 zPk;~f{R{A+_Jsl;tlc``!(Fcfe86BQ;6rvc1U{&60Y2;*FW>{8ya#;fd1HYO{_pmi z-e)@cx&IsZ`F;@akTPO`f5n>sA1SU9@N?c803WD%Jn*3&ya7H~q95?#5<-9v_}vuv zkYC3GA9QDH;KRPF41C~@9e@uVB7 z_;vRt0N?E0F5q8XdINm0i|>IC_YwIjF38`AMm|HmslbQrk9^?Pc>a48^1%&803SZ7 z4(I`#xD0v-r@n$7gx6Bg!}wYM$=`rS@Lo$BfuHrt0RP#%74U&mZv#K}{SDxY4q6WU z$+H6Zg!v)BuRG!oe6#V$hns|aq&>)ooQQl-8{}`yMm}(P?KZKZJ7F1>p17=nee#ogu*YPJRgd=a@CX z2Oby+{MZ?7fG_Gf0r-4#$p$@?Tb)1;=GT6|zJGX?~!G zLw=XR_^2kv5#5e~{z$!#C!!wDGxdO%O`{fbvGUaj;&UnXok=&jflfd0tr1)#^VX(;GZj2H@f z4V@~3enAi913f`Lls@voa*_W`eBjc^hir&^(5c9Wy@-6m^7Vlat&e>0S9ZXM?{^>c z02-hkLK^BpB%>Zic{k7l2|59KC|`U*4`zN<(8F2T9rS=YMu8rZUN`W!Ya-|ewVMTc zI@_H=U#6rR=&kIv0sWCdV?d8XXFBLp*drfkD(V;9KtBI$>W4oEpeiv1|)^D9P5K2g5#t9*+53&;zPr z3VKL^`k)8(p%Umr72E~Aq>A@IKPYrG=;;i&4Ei#>I_Ry;Zx8w->8Qsckq>2udJT@K zUvLolfLX|I_h}3BVq4-rBOjQq={`MA_1j^4)IRl>iv5#4WFOf}_LD#4ANfoE)9*pQ z5B*-J@%N+OlYZY+{JrV-r}yy~-w(YndVj=+ZH@2uBfjs3`2NH2dq~6YV-tQanfU#* z#qY@izpulnhtdzfzdiUp()UT*9F*isQEnj%RBe-^70|fqY<^4`_bK#QB2e51LQhaekrshUOodk7$0P z`HJQ*n$Ku{qxtSK&VMyb4`#rd=q&aZisL4RZf@iwD#fo9&r*CF ziSe!{#=pfe9*)HLxF*KSQ!#!v#dvxI#@CB5-lq6_EXLy$pHsX}@jJ!y6yH<4Pw_wH z1C$?7zCiiIZ~6IK|L%$Tip2coGv+gt-%!3o`48nooiIP5e2Ma>wwO;*ent7#1j}dDZizBm-63tm=9BaO!;yq=FgN* zQ+|CC^KHt%DIcf&obq+b-zlG`{GR;%wcUU9n(zt2D+s?JJcIBJ!aF`9{y}&M;Ufa^ z62eaiPa%AT@D{>f2#+CrhVUA~Z~j&9_4j_CV8o{guOj@4@GQc&2=5~Ni|{bQ#|SSY z{EYB4!q*6IBm9ltC*gCyXXn5AKH-ssPZC~9_$A?)gl`hwN%$w>p@feTUP|~W;i=@` zf9iey(cg*iXu_unuO|GO@NB}j3GXKSoA7YL#|bb0qy7I+KS%o!v_C=n6|{dr`x&&q zLHixF|M5R<|DWxj_Md1!iuR{yzl!#+Xg}-E_VeFbkMjDD?e)`?8yABw z+WggW_*UTOl!5brJQVpGH(vvvAqLLF%BRQSyn7iu|6S-aoQJ;2)OmRE1NZ>qK@glD zt-J=#Q!Z!+=L;Qbk5%XG#@17OD3-9KsXCAKSMC4V`lpb8wG#PA`d@&bGaC6SiEtiP zPC`Dzyv=aFe-)m0e{xKnhZhle9{M$&58eZO5MgWp=SNLf!FkHkb{o|BLg%-N4<;VJ zGg0TyHdpGR&SU+o{eSfN+Q=u2MSk5lnR6e9^_dfIsPke8R15fM4g2e6!dj;9p%sKGM}_;O8_#zDisO@HYaH&)_jZ z@nJ+Ro_Bv_2*w)AweTDqVN605!kNmok$Tt(nzk2-|_()HY zpA+N`e3iAx->8p#hK_i?|0AAvuZZWrb3ZCRplFc<=YvDS;Joavig13^!yC?1b`FB` zg(J>XRp;%ff=J}^cSnAEDDu6N zk^kHU`M`^iA3GKKqEnDR*%JALxyY~Efqb)FWq^Ox68T6G$j`Zke3g#K-zc$8@c~5) zp6{Q4=iLY5`R{hX2Nv&v4=oaa56+B$56`+Dfb*2!m&5tOU;CXhAM`ldqCQ2jC7{=E z2K5UzBcHzy^4o6@2fnu@@}D!14?G3=vBp(^FY1i^$@F``Ck#Y>-3#QK9Y_9^De{qC z>j6J!Kk`*1@;7Xd&+rh>_s3UOd|=TL_|Pl}&qJF5AD$HjJpdMD4ChCm+QNCtBM0Gp zA^AVV0`x~_q8^7S>Qmf8y@oi{FQ|oleplqTzd^pYBl4e%BOiDZ@?%qxFFF_bllI6b zoPzv1Pvo1uL;lrSnk`RzW) z_qGWE{_`Z{17AjdY-i+)?nM5iKJdZhTjbYmK)%^X6Px;sy^ktr(1ih77s6X-* z^*GGoJT%)>0`wYuP`{wzB;fPkL4NzU1HkugjQr9{Mebu7d1ovB=HHOkzbeR zr}&_9(on^R6%xyV;}xfb{vfyigLjpzI8;Cc5cJ>dMe=Snyay~YsE2d7t1 zdN6EWaixdDPCf!Xor+aKU*-$ytuzb-{gJk)#}SPB6oIJM5Rdu=#OMEn{Pso2_a2M< z=aR?=UW@!#ALNVbB7d?b@(G(EzwR~i%}yf!>IU+WiXuPfDDqV}@;3sI&oCJDFxYuK z@7^EuP*{fta2|SZ5}XfSTK0)LFYD_E`awh7Ku@Ox>dWY%-bxJWkJzpQJ&qcvPf_9} z=rznl{eoG@=f8#gc5CE&cSQcP6Y_x%B0u&y@V7g;~;&CS*X`wjQRy#kwtXGBFLYdgnUBc*J1m-Jo2wl59Akqj<^JTl}ez8 z!#W_JAt(jT_vg)r^X?b6!ufCCSmnPk-Us?nL$-llQtdaOAJhQ#bVi`QOcB&uxr6#6 zW~j$e5%nodQLkY!>K7D;_s4^g-`*Vg-u03HybSrkO59@XU*e5|EueLHUEiPs1J1p^^(q@eo$-F(`kYFGRIMG#SG?Keg^e84x>KBOVn$y zLj3}B~SXW8J@pXdX&WVKN*DIN8LLQqdfcOB@< z1ft%`D_CzO@_}U_tjF>ptk3)q>KAw;pT8lj=R5%U-f75xPDVbk74l=#AwJ+9p-K-& zIzarugOOi13*rmrhy1G@JAseniu|1GNx)b6)*Sd7oi?fXMWnfbzMI_(&^yaR{VyHh zgRzCE5A_-Kl0HJbBzK~o&JWa=NkYAqOG80_q$=uhj75ElZK&5!{;kqO;FFNgzYXF! z?u2~r>d1e-i+tb~D^)xww;^A26!IrSkWXj>@uVnnU+IDIGRVKmM?TWCZNSg*2R%SG z(#U(hR=;mnC(yIIJXpoEtP=3S*hkd=YJhrJM^PUt3iXn@pnlMM-~)@Ms4uez^;Q__ zkDNh0jvo+@^ZTgR5Qh2%-H^|J75VKwknepN`OgoL54;lju`$ROU4{I~j>spRi2Sa7?I1^tm0kbm*Rs83POUg?4GX{cY|k9_{l$ZuZ-`5oVg{O4lG2kwge z*i__;HbeeoDDnw+BfoCZ3gDZKL;jUD8O{KiuyraAb)1-QD5d2W?gh{98tY9txk2dJQd5zrYFk{E5hK z4@bUt5#&GLM?UZkSIegK{#uAtt^0n{HkhNQkF{eq>)=l@Y#>0!xuLP!#HsD8WF!Jl}Bj1et{dMVV zr}&_3|3ZaVv8v-i&n}`e=(}y-0D5PA&Vc@x7wTcv1U!s&cUO84Yz*oLnW3J}YSfpB z0(?zGp#DfM;BUO;Jf(-k8=zjpH`Fg^jePzs$ZsdU_cr7|pFlqF9OTEoMZV|(JeZijjeU7CS@!G7fPckB-Q_Jhdx zE^-n0&&`kzybAfTERo9-S}`izxE99MdU&)b21U-ekfvx`^-`fkG;Dtw#WMg1=w z&;wzafQO4-pa&yXp?*+0;OG1X>dWMoRQS4ViuxlfQIEq3^(mrIuVFsw7hFU>|3&1t zry<|_1M;7L*3aL1zVW>CN}n;hRY|2+c-jc``y3NN&u;cs(040Q1oX}X?01McsE5^P z1L#9-xCMGi#gmjCl3WS^y8|ra%Kz)j%sMnB&`UTyP&;MI? z|J8p#INV9;Q99mhsPq{>mQi{T%(Z8j((jwF9Q5oS)dqbx)PrFI9YO!g9rdu>VnH8j zHR>e=fF72ZjCwkQQD4Ry^;S$k4^N&$J&vcSPw`j%`Pupbb{0yHa@-50hanP6dn>&{ zKS$8-+q)g~?4m&rM+BV#y)$Ff|0)N1P|Okap)A&dUeZ?74_f&Y^mIy~zRY0MTUiGC zt-m`j{ZW7Pml|fdW#`!aZ~4E!!~cE<|2q!;>^x8l=aJtl|7`nzwVnamR}afpSWd&T z@iG|yx0XXWY88}K!=Nm-9m>T=pzL%8%GbA{yz?B&l3D-nHQlG@sXnzw?Nfi$KiNa} zk-cO;`Sa`F<w#EslQFmX9*d1@{Zaq7 z(Vk!ILwm`7@`wB*e*>NkQ1;h3*IwD*r7g?R+Ew^VWZ@y2vi#x17TU68`;gn(^7Ho< zp~Ey~u_A3wdT7cjO-&^crH$gX5bNRon={`MA^{G8-pZcTz$sV$g>?QljAM%gA!Dw!QBsb_pVOrb-mv=JL_g2vSt<(W3NiRI@QOp zD%0P#V@3GT2CPkC*S&YoTC;w8s|_n2(vDr~zk219N8Q*c=lwycL;JG%iPs+7NOofe zpUMrnW;~o3xNI9)p{e^X*L0trr~1?$wNL#~|6~u@NA{BaE6vQmkc8lX@ou>#@0`>Q7#f%~`pW`8F-S_G1fg9WuIfX}m_K?C!39 zX~8V?_-4-n9>$KPwev~P*~9w#1mu^=jAd61BCg#GN@k0v+d9nDaLrhm(ZV(VI%~9e ziPN@q>1@W}ZZl)v-}>d6?$h&BpW37LsXywU>>>NeUb3J3A^*tV*EUuaolR=8)swHA z78J5&kxmhAQT^Olr-GHi=~e-()1Kg!)5~mN&v&e~n0`d_|4;uWcMLSU%&wX1=~|Y4 z!VLTt+dGy2#O9>AZSYJe&Z`t}dm#3H74F;bSm{BF!WW&O)F-KXcNKD9^fQ-9Py*+ce`y<|W6L;jJ!^QP#fJ$~1h>2~W@ zqWu1uY|}71Gskt|tWdLN;R_;8vauzmPTrn&k9B{RcDiHUCl;s|*t);99&dgq*yBZ= z20YuU`WX93t@&oJg0Pv*JMn6|9dFdG-;bYuawm2BGk2bFxuZefLEhZ9@11Tz!zS{a zf{bOopHAlU9UPOJG@ts*HQlG@sXnzw?Nfi$KiNa}k-cO;`9uDZzx8|dD%`cQKP$6k z^9#RM;mjxRrGMu8B+dUX{9t~`f=t#Reaq0?l7;z_y5TK%4bHzWO`bRUFLM9f~WsmgUWTC%H{@3-Raqk20+yFa{2~9y-_?s?y`CNjWl(P@ zjds^j>syGMfhxUStEw{DTt}5LWpBRGu6M0(PEcjvdvUL|*DK~NeWfig7Cd^PE$;^1 zd!{X8+T4Bef7pBPs4SAL?c0os0To3>F)L)Q3bk}baEj`?h&_E_V|7%H;403azH_{N@0jiUx=1&)FBJ7`^(q}&s728MHKX*fq%_W%3vSWz zVKaAyWZe4W80T?4?nikjAN8Sr*aQ1uFYJdu@DKjNfBYW!eeiqX_rvdr-xt3(et$d< zJRdwSJU=|ozsvK+`;PY?-vho6d@uNZ@IB%C!uN*n58orcPkgWVe*Z4tH`+I}cWD36 z9-@6jdx`cF?J3$Ll_@nyoB)+##0zyVZ4R$7sg|Mm+>0Ls~EpxJd5!y z#=98*VmyrTF~-XnKVv+N@ioTV7=Qm=#^;!yV7`L+3+6MJ-(bFj`48qpm>*%jg!vQZ zQ=F6BrV?K@f_1|UwjrarN5r|J9 zUhzLQ-tz0X6XH>bPa$4~_!Z(=h;Jd@h4>fZVTg|*UWWMD-zC2GYrp?f$G;ax#rgkK z{r_7o&Aa~hclh7mA$4B-Km9!jIQTMTbx=uRyQYsr!U`{8wlJjqyIsA+D;w_{Igd>f z;g2giWKUctW?wv)BhS8g@qBxzZ<^!RMA@LoSu4uC7KOXJObX4CNm@o#ZJu^ZKKVBO zPNkXmOG>*AZQ31mv6udPmRSV^ILo7PcRr6#s3EJ`xon zew2suQ6K7uJ+Ke?J3ih zv`vc3{%F05IM%W2nuUi{zJ=5Cx6gV*Wxe#|gV&qa%4_k6_L<&h()CL%>f;|_rAJM7 zJaGL`DeZncFvqP|_WEIzbH?<;U9|1Ib~Y!5x$Ctd)jGG0^w3S}E{SP#zV?q}oX7RJ zALXHZ)Q9?E5A1`zupj=wKlocdz1{H0<|W0wcP{e=4)7BB3apCGIj)x|H74D*O!KCR z>pPkyw~t&WPSk$rGk;#Zn6;(yjnZ?kiCl$p&QG85weZ^d?!~@a8Re+3^smxP%qJhG zd>i}A{*rQ-=x?#c+FsUg^>ybkH)mP8K*Kau*VT~wpPf1pyQ!9ps4*dF?n#dy$2gDc zaX-pK`KS-|!yecNdtpEPfq(GVXX&2d9V?Vkqv~{TeLH`?su)eYBty;O>wAJxdW_|lnyzkOY1@z98 zI)#s|Eu+)iJ>&m5xT?N7J)(P?!zP_Ex?`!}l$ts`)N4umzIC+c%M$JrW9t4m#(7+i z`%xasM}4Rt_P{>a3;W>@{DZ&SdwM$9Z!Re+ExVFE&wVcudTisG;TZx&ovyR9AF-M) z>O49gb*sR7(J^^ho)&N7Mc*JddtdA8;(n#ub)(w87WX2u4EOTLBnv+2rUpLEC+AN7 z8Y^u|$x?G0J=o@NFB1pP$zOW2v+NR-=G ze6B{lKDtF+zmy|r+PkAFZ=Hc^UxzztUzL_FJs*5f-R};Xav?ICev>yL+GTWM?O*G7 z@eviu>*#K7DUp7T`mNLA&Ylx$=*?NCKKRuCSWnDscKCkf#erhSqq6q5Hc$V~ zl|B{KGGe`G6A|;^R_8-vZ_B&$kHuUUHy2#!d|AI1-qw2awwO$^a9A-uZPprAEK5H2%a*k?L2j2 zcbyemUPr65Rj)3#ID1+R`WV{$Zn=l5-{N=8`sV(o@=WrrqHg5Ux$aqXjP)z77k293 zdgp69-O9@I;>TC6`kL=r|MW{e^wrnzbc$1b9kcIZ%PV=B=*RE6jQ^6-yb$NB4EmOrr z4=3M|Noz&Ygsu}l!<`-+*?cVO=PXj#kc=w5|J``=Fk9W>?u;HENI{bX4vg=2+(&In9PV%_W`o}TO<9ghW z@=!kNL;bMlhka}>?1w+_5B^>(6*Z?^-;Zv2PX;`?aH)u}D14&SjU;zrF}SkDzB`>o z$>JqXAI=smc8-1SVtx1cJDozd3Fmz!j(0whAg-mqbGluZE24~JSl3GSPsR59 zp7#2~N8wy(b>8>>8Rde$-8$8qn^SiG7G%HolBM*$_~zJ=75U}8h$R^^W-a*R80T?4 z?nikjAN8Sr*aQ1uFYJdu@DKj3E7dns>B5cF=LFTv>vDg!XKJrwUUbLyH6p1-v8E2*11##DJZ#7S=%5uL%Vtfy|5 zXUfscHCyUhjiVe*ZMx{^Ib9cK%pIUh+O``z{CYnfwEOI_LWKtD*Vz`gxX@(qk7Jz2 z^|&A9p?uVb`e6_3gT1gH{=h%@yX%;Rsl|2=G3RclMm3-G5Ps>d#@5R^T?A!1_-$d~ zjUvO_ruD6h92K4OYjtvvdUpmT* zrR}~AEnZs=Ia)DKW4kB5B9=-_yhmoZ?2usKc#CnQRHfL{C2vk8%4E_{Z@thoEDkq9b7fo z?}ZrRn7kz*FuTm~)@A&=Wo2aFHRWthf2biJy-B~w>TC;HyZP-B7|g#(H{axLIc=w;xur>;|aF3A#Qo6Tfd@Ji>^(=wQ%W?micRMyrsVSlLe zs!>j+FBaan))kbd@~bZ;>_};8TK;xXpS=q^n0l_ORHM_OMy5LTXLaoQ$nVGhag6i0 z9`~a>l#lvQKkR{huow2jANU7<{i2NLt^Dd6&s$yZU_5X2Vy^MLRUkcY&A+GS-&a4R z=dEkf^Va-4G(R70L(f~cq35mnd1`*%`T#xeAICV4>v2EIL;0u=^}`<62YX>Z{DFV) z*RGiHeXE>%jPF||zrT|DeJh&`#`mpyzcIdVRgb=JwUxeab%nlf{fxeEeUZLzeUH9x zJ%zq+-JHH}?MvUcHXmqw-`ZlC@qPa|#(7+i`%xasM}4Rt_P{>a3;W>@{DZ%t%Z>J2 z#GN(Tb8)+s(VmMlAC2~0jH32jOr`c*Or`c*dQy8Xy{SEyo2WgP-2O^WYR~0IYR_dU zYR}~`YR~0oYR`Wh<2@mMPSK%c9hOOAqS50v>V+{r z7t+EQpNliv7@vzBG(H!>G(Hz!Xng)XkD4()m*;4FF6YwtTuz|zxeTW9xx7N-a~VnF zb2*j9=Rb~d9@pc3l!x+BAL@raun+dae)#jlKlXRd&D^Q;F?Gh(n2)LZ4>G6D$JC8@ zV?L%VYZ~)0)tu&IDsH7QA5%OZQmbe_rccp)OqZegn4U}XF`bL%W4as7$8=YkkLm0* zANz5P^SB=Oqdb)VqduAs{;&u3!Cu%8f8ZbdwO{CzI{y~a+8Oh2am?G8e~WxWjrq5z zyw{k2i;~rh`L{@<`L`HM^KVg@=HIdq&A;VXnt#haH2;=){EYdxjG+0qd`9zc`IP40 zKaO!8*W-Sahw@P$>W4kB5B9=-_yhmo?`G>_sqq%IZN=Kuc#A4;Ys6brnj1#EMcwIb z#9P$Y6-K;8wWoNC%C*plx2Q%GZ_)M?Z_()~-l9K88}SxBo8m2cE5%!McZ#>@^AvCS zag6i09`~a>l#lvQKkR{huow2jANU7)oElG650@M9RJEYB5l>Y;?i=w` z74X!Er>aXsjCiVAMe$U%h2p8&mg1?}m*S~9BgIqo42q}fauiS18y_3-RP9gk)E~z< zkLz(i%0v065B0+y*av%IKm37z@OPT$zSQ`+sQA)|p9}YGM*LiyFJQ#aMb~uiQsd_$ zaFh{07x~*8@pG}1;^$&B#n0t)il56J6hD{gD1I*YQT$wf-fqOtWpj$3%Rq{s|2W2Z zT#x%v9?D03s2}#gKG+NU;Scm|Akt(WL3&yDpG{g~EEejMXG zuE+f-59Omi)DL@LAMAzw@CW|E-%sH;Q`g7D%mI^A*T+Qn4aWMIIMUEq9}^eK8S7)B z+;L-lOk}6^F;Ruq$3#O~ACq3RJ|=x>eN4L2`k0(g>tnJJt&hn;v_2-g(E8YqW1PqJ zxF6-AeAI{fVGrzsy|5qtz(4pa^FL2r4^@l4^iEw5RXh3^>!B*#(pV2w=^h&Eq3V5- zu^y_dqmA`YRPlOs%;M$>!ErHt%vHhv>vL>;*IrC-GSCawG*v}{y4^Y zT#x%v9?D03s2}#gKG+NU;Sc-H@m{_adi z;_-T2CjY11p}&6Yf3N>xzr*Bp#NVyZo_M_9+7X|3*Hq&5`UMfcw_ij0Yt8S)hyO=^ zhXZ?vw`=A_{M~Vh#N)N9Kz!cZ{fXCm#hduO`5cMo>l#aZ-|i;j{R-yzbvp9rzN`QC z`|fQ`eBHr4h_~Bi2=R9l(h!e#-6G=iCU+uU@3H*E?~S}iJm1>aiSPSl4Do)`e0ghd z3Y#&9v-vghzcs%Pf0uT`tUK{_Yh5JXu16Q*@7C}n9`DJ5#OKXYi+H^)3lhKga2WA? z?Pe0+H~1~_es^6b{_ksh;sN{TBtGy(=B{3ROTR-K{vGgp{I{OBuO^;uNGIa!mTp44 z-M%%6zgs*v@pxk$iO)Nr7x8*Kl_Y+z`*h;@*6K@q-!2b`_q%Hc@qhd0Cmyg{4&nnJ zEKR)N4qJ#HJg^n<4(;F5@6h(Y^gf&|Ks?>e&cxR(K8Sd`1%rsc+qyjQc#AWiw-WP- zUd|?d@7Jls^IiRt_`Vem6YtkNf%w0*G7=BC$#&uccd{W~aI`t`g9|4UPx$d{;tQL3 z)9>)k(r1`Jfjf# zpO!h)f7XAW+QiG9_K^6wo_&d@+h95Ib=|uYZ#UG9_`CI(#~Z`Exs1%4+t2)7&Ad7A zeLa{r*PD5Bj{=DYoRfKTbNUi5_*-A%2k&KX>~m;^`iEMSNW!JL2tLmc-w6Vjk~t z=Ea6HulEDIfxHDCW-jK;Yq{? zw(=!D@U>rv54=A&@qsJWB0g{c^LaNjAGikdfon3)cRllgUoao|r7N{J9?S=JVLmX9 zaUR!i=KE0|%0J2ViHzYBqO3m&7q;gm+Xs7LKm37z@E88$_rULi-wVGVe$QL{`{MU5 z$iF|H2cFMDeqMNfc%GH``F`Z*?aI$TP2DnuHoHXX3;ce3;P>Shet%x_`?QqbFT8J+ z`TfKDi1!okE8btc&v?J_zT^GJ_kiyM-wVDUd{6kk!ufma#ou2te~)eX`^=K;l9b1> zuQccHHzR+~PW*l2dtb}nKiUI(ZXeKIp#3o8_5|(AC2nuf{-8Y?!|fB=E3{u|&(P1I zy+iwl_7LqO+Do*bXiw3;?&kIu?e8dVkI_D(z0Sq$H`;Tw??<@3NBjQ^_Xp@7&|g^W z`+VtJ=Bj!!_b0`{6lg7FIc{jI+k|6n|X@e#&L7(Zb=<;>%&>pb4N#N#iF$3l60hVdH4 zZ#{WDhw&Z8dl>&=Jc#ij#)}v~VmyiQCB~Z=e@^D{D8{G1|1m$td>Qj+%%?HG#(W#|Z_LND^86h0 zbT&JI6TQW6SZMVH^)C!||c994|ur=+FA|uU?P%7~TiO&k#>T zd=2q7#NQB)LwpYLI>he~&pW~KJ;eKJbNmnSK*R_CRr`O|eRv=6dmx^Q_$uP9h`%Bp zi})d}k}or>D%uapm49b&%l3*9m0_TqB#$pYdJ|4}=C z)^)iz);0LMmgZ#*9`EqnM*eg4x}1^!T!hXbe(&ib#PiLYCct%YPOVzkGxDE{!OZ_H zzngf#6POR&nDU0p~zQ>sNJB9hb)0qc6m-)aMe25p^ocX~~%oEPd zeBrsw8=lGh;la!!-phRA0?aG^J^TOc`Np$$8NA&G!wkNGx>bjGyxzNs&)c5(2Exyd z_`R9>opo63m!O_9-**f1ej5_sK(uBa@IK}PXSPanev7H7oR^jO!L^wuoR9g!3CtUA z&ivut%p*=_KCv_NiX)j{{DFDKf7VZ2pYwvjvrx+-h_}0BJMni5XCof($#%r&wIH5_ z%1S&7HJf?9uZd@&PB8CxZ9n4wwq+i0zB$AP&dEekm?8Cg_=t{&N zuEsp#3*N*hp2580*@uZ=ypegvWtndbfBxv-ZQcgIL{*$hyxk?lFHy0?FHuW~U!o2W zzeM#Teu=VRo^MQNgI}WZG4Ho0^M7YB4|qT~;sYOMUau}p71f|3r8?-_%8E@ zpE8fwiTT9UnOEGJ`Nb=lXS^pvrNy-`WRi23cU*Xb!7mZN<$sxD#M4c{dc@m3 zNW2<#nR&don9sX`dA-e;-+PUDzQu@FqdPF~cf>p5{~je?jo8I};Be*z7bRYetj;{) z=gb!##Ju6{%pX3)JmO`{C%(?S;wsE9wq>5N8S{<1Gw=9XZI9CT-oF&nnTPyq|2-xW zPq#7giNqY@6Nzc@`!aOhyH!M{7AB@M7O-e z>%GPN-bT#x-OYU8Q0D!<_9XsqUFHEtF&}su^MczjKR6%psI+9ha0TWK4`co?c*M5M zC(hZGc*PBvU%cp0#iao^Ua3Up8~aTr-f<=7AAevTa`@GRRQ}k$bd89go2diwbh8qF zOr2)lZZqcZ9%3Hv0_O8NF|T(w@yCQ4^L%5O?+f1VP3Hf8WFBw;^MS`PFSs`IgQqi3 z_!RSnmoslTEAxk=vox}lZSqUY*hgoQol46*%qw(!e0xo4jcPq#|rx~+Zd9Z;6Un^WDGzuSU&yroYNpZ6Z~dLIyPPL^e!uS;*@ z`?@jjw=eU5S1=Fw8uNkgd0P6-Os=6HF+aF5^MubcUw9Dnh6m0j{&0Qf5szj*u^sb@ zm)a1&xDWG;KQrI>Eb-=qCG(Fhi8rU(-Zl7wB1dN8=e8!kpx8Qt_`2PjCAFPhPb*jE z?>=K5Zv*D@rVS@vZv^vupE1vO8S{NVcO>3#t--|qJ;OX;<_l_j<^_*oesEFd39n(k za5?4;+ioHLa5(dbR}COOaWm!>zhHjx{h(52^M-#DyH^{0L6w(z$2*8GsQMCLP)vS% z+u-GX+fDpjOX5k2BFxua$-G@N=I@SU9xKH<@|B$;=1d$-Ll3%nxqJJYhHH3qN4q@E+z5=U^W3rH8~PuEV_Ib#sVc zoOk}xcY_9;7tdQbOnlh=f*QoU<9R;BKei4e9&(FK#LFGIf%v)R#ETVspAcWSC-ZiP zFn`yYdAt{x&wJA;|Kt7@?d4qN_qJx9?>y%FW@X;*IOhL0Wgc)f<^zvoUT`4ugA<7t zt2Z)V_%ZW_$1;Do6Z42um`^-qo571!uFNkU&OGCZD~WGhA}jHZU5OW~mYNy7Sao$2 z@p9i2A6T^~KCmdmeBFn{2Nw3Hh`)Q8_`tFq@quL)=Jk#vKClGOw-57uGcoVCHuHa9 zFb{b4TF2deM|U#4WL_|zml>ER+=ThU#hEwEHX4) z%qPytyyC&kFCNQ0<1EjKZ!Cxhtrl%1{_)9g#6xaAgm}5@iT|x~GEX;!z7Nrjz86(1 z-1vS}Pv-Ha(Dx-fGp{$NYev_tb)2PHOS3*(*ZD|y`aWe-`d(!q^M4024>+Frz|WW$ zY+`Eav1z?)wu=n zke?FoU3la*c<;iQdAj4q5ntDadAnVhzZ<|j-qOtH&BeT4bLRJ6Wu7nizFC>~yNLO} zLCgbAPwlxhF)!Ga`N7G|6F$Uz;TYx(=VJcwHs%r6XFl;7<`rjTe(_f388h!)H6h-+ zDiKfo;~B07?_C8s5HHs$j`+FO%+tLcL3~{s=I!Rm(x%7w0Ut#p=JD2~{!>1r{!~|? z{#80K&o_bjzTo|iW&SVs*Rn73fe$h-xDWO3ax(SzdOG$0`V;epcQJpsB#jqjBjyv| zWL~j7^NSZS&$x9c@r|DpCEl@TZsH&3%|52;$@Wdu%n5carYG+d7Brqwi3odzjv&B+3nTC154{5w6BbgW6 zoB6>e<_RC_Nqpfd%p1PX{NcOIBQ8$kMcs&b#qF72oPl}9*O_l@lSI5@pE1NgR(FVp zJdb&~3Cz!}!93mB%-8MByxr=|-yOj`-Yv}MoyEM~yUg!B!#v*>%=bObyx*40|6R#E z;9JZG&X%e1+3UM&$Ry?mdoWLUFY|@%nKztfXv&ewufM1+%p=~weBxN<6_;gxaR=rZ zZ|L)WW3lUT;%GbK9fvs+|9EpQm+`4Q7HP|?ns*7hziW# zU9{eq|A>0b=gq*p-lfd%oy$C5d*=JTWZrLa=KnUJ`Inr>eBfTp3l2R@{NNGH6W+mm z;hHqRled{aY)kV$k%#%jZJ1Y_nfb-0$i2&M&5l#IY>98Y&y{$`?wg5!jQMAp8^(N8 zq-B2YmkZN#IzBw7;+U^1nYY`A`MXz{$9skOyqTES8^QeEQ_S;i$b4TH=KX5s|K7B? z@^{*_Zjl9hpbGnEAwx%qwon z{9@aF#510=nfS)zLy30`fARMz^K#9ZpPPYsx}W-Gn40&1g-oINg_qOOFSaJal#Ga9mC&W|8=MMlRCgW-R8{K?a#d3t<2wD z$~@ku6yMS-nAhvd{N9Wd57T#;@B5bGWpXgZ&t!Y%0Wa}2;%jOY^Mb>eA6%Y!!eJDj z6UkTn8kcGDK(uE5uuVMihyxZ9pSV$O;uX*9Mf~C?!NfDJwl!bZzI#o-8BhDQ|2Uq; zeBDya+s(rK-HpuS1)p~-^LkAsh~I0?Jl_oz50%ZC_d8(=@qddj4>+FUsiFq+g2z$3 zRqSJ)a0>Hm;ujxnLOkO#GYc4eWBBuD z|Gr?}?iuFq9$_BuDdzJ|W?t_`=J&Q_p6?>&`#Lc1HzUQz^$q3$-()`U7Ul(O<_D*p zu%_Xe&39B1#oxth<_&KyNc`bZ^NB}Xb~Evb`&A)c@#>@)gI_#u&^Ci-{Ad0Az3Uq> zkM|<;dG|1{w?6ZGBbevAj@CPL_N=o`Uj3!GKC(M`%$6VFXkS`CQPXHW zMSNtQ@Eqm~zs^X!;r+{qKiqa7@rY-2CqA)fUvq<3>=R6WOtfWw@JBD=3BUc;Gj)AUlr2oW z;We{~KYVo1B7;Y~<ZWXe=>75rF)s8UY4cDqg{NX2W0t_Cp zO=X)YtNd%K)fXxlyy8DdlkE6+{rIEzdrc<&RnlY9BRzUV`kb=mNw3n?jr1FX8jzkLr6ld| zzkQMRyI0vq`{5(*lm9ROrv4}FCq1FPHRTST}p(FZO?DA=1bC`;%VuPG{0jTDX#)aO4fr*A+QW zdb3ZgztX%PxQG+!bME#cy-JBUq~8egBR#|9+N6gV9Y}hRYTHQ!1mGrO!Z1v5I3p8wtj(zn~DBfWQo7wMmqct2<`>tlPdUbGDFhpxqX z!kgbnU+2PlfV-@RD9Cz{VAjLb>`r>1vF%6?HTDqc!Q3?I;c6ctJz!VXi~lVDFYxcU zo^^(uJ5c_Dpo*mDH(x^fcDq8P_YQU<{c}Cu4_txwLr>%V;73?LY0rAXc-BK)X1&=# z)?bZaJ(BZK(nB?9M|!Xuo}`C+_J;I;DUC@F`MfZ-_j`ZRbI0%Z>@Kw<`KMF9hJgbp ze?g-zr04JHLHhQKfu#5LX8p4r>w$~&e)!vc8U|#UR9=^6J;btD(t~_$GQ9YzkQOqS z^*~Xqhk_o=EjQ`mW^^Sz;OdgBhnzurP_xXWhb?URbNx@?-!Wk*<)v_IN%&-T>9>ew4q!`xWW= zQ&`^~$a?QYQ?7>(llU?KefPiVe_QtZh#Tb}X%IsBIBvhA{1kByDPP0X1j=79f%PEcS>IlR z_1@1|57mtIz~4$l2ale*K%Ztk;8WI5CbAy%3+rL?vL5&~>#zD$Cq20PRMNxOSwi^$ zMn9u`2#KwK?)Sdz1pSVkzf%5@{5L5dNB&)upCa%GD*j@4c4w&(&EET7&hm zbyzQI&icvhtS4*-Jv{5pk~ts3f!>r4;y@9~hf%_o@_{%Pr04$czVB!sqpy?SzgSSd zm1Q|8|H#&8%Eyton(|X@;Cv0)Ie)=a)&uTfeS0<5gT7@wtRw4zxAJirK9B2%^8F|e z<)c2-4|`xA?1laR>R!m%U7DXi-UqxN z4f%b+`-AssH@{za-|+t7eZ>2T_w`@(8{Z4QAAC>vzVN-_`@{E$?-So^CjNf$J>&a+ z!QVUb0mQRD_8_+pzT95;bNjJ}+mirpU(nv5{Xu(#_UT{s8~0&+i1rihDcV=Gx0AX3 zMSG0)ITP!l(SD;nkL30p?LFH6d)yzOe?Wh+g!>QlC+J_$-=P0Ne}w)Ce*D?Lc;C@q zqW?sHivAV-E&AVJ)FG5 zUdQ+y z^C`@)>hOH4Ea!vR%JZ=WJU>gv`3u(Y{7v$F?gh{9FyF)c5A#9H4>4cF{1Nj>%r7zD z#B=*Czy9d|;Xmfbm@i}gjQO-T&#y7x#{Byz&&M%8-_7%NXP&?B+t&_9)kD?;w6ZmAfAHw3gRtp9DhMP2JxBo zoWB6^8^m)E-$A?w@gKy45FbLk2=ODtlMr9}Er0&(|KUI4VTg|*UWWJ?;%UV>zUIL3 zwmTeu^W=EkU5?L<<#-+9cZla9zK3`p;(v$-B0h+CA>xOB)~`Q$J>s9uI39}lDB`7v zpCX>Rm*cC5w<7*}h2yb^&mvxn_$}hOi0>lai})|%!GF~5pLHGL--w4JK8|=f;^&B` zBff6Q@pi=D5s&Y}@p;7S5x>97@qEPh5%2$5e*D>Tu-<|753Gk^eFW-z3n2ezhOP@ zKW+EVDj(~eSpUR&DAq@@UW)Zotfyjq73-}(%N|#k4c4PuJlgy3{h=KI59?zJc29g>OJzPx`=Kpz(thxrzO*0yE9(JtRb&6C zSj&2lxJsmlF`sPgw^R9UlOAe3>%snA`~U3yi`US8xF+RjKj4vNv>)Xg_$Z?+sVX=9Owk8`1-WTN(R))95ABCce}wjfo-a=OVe8yX+idW* zRciZ8L%*S_uAaN;Lzf73=5V6-$$ZPz<0o&%)_u`JM6(_uiuE96SP!#{^+49Fhcah9 zSWu#|zfg>1J>WvtL;g`ee(ySuCHam0P<5))ey|-cXg}QKEwmqSpdIap9KicQSMz?@ zX0vHOa1`lt)Fs{z{^S+yhi|}ofU>NIux?3ukOfmn52GVV4^)o!2dfXP2YbhQxRI;} zEXaDuL#zjNVm<8d`Sn}pGjG~t?1%ERr2SychSGjG>mFejMtrKG=J0;V0lXiy8SjVv zWZ5!ruNKMTSrbElB_8vB@KwAYK7{oEIc(px2%nLprn4So^E}eS)Mq`=9o9pIvL0+1 z>)|%A9)!FKkWys<4OA=FYtX#_51i#F>7f^~9vuGt`fu)>WsUtno@YxN z`=PA7vm5)tT9u&vaI;F+928p2UiG%1{g9^)m#$T8!7fqfi=mGdzPulJKktXG$NRzW z^M3e2tOqE;dI&4lgRnkFN3b5qjrC9=tOxUBJzPK51NyQa@`E4gK{f3U7Q0vvT!Zz{ zV_6R#z@xI?Fa3^`(c;!e&AZX zANn%y2Y2B8@Z(tz(3tfQg;@`h#Cn)+tOv?S`W*d&^(RAO1A!0Yc{*`boKq^&rWthcT~i=*@I?)`x2_JdxjP5WVs@qSUe<%;Wj)L= z)&qI59%>@#&GZD;!)ew7rXzihwqrf$NY=yVU_J0i)Vqv{dwht9$K!8ek=T{dMs zfCuX#ny?-utG_-FF>J6t!+M~rq@R?6^hm zmhpbz!@M854etl{;{EW`SP!s^^$?2nAiG%)6Uus^^Q?zj&3dpUtcPpGdcbJbLqZSQ zm-Vn~Sr2@X_0VTn5AM!-c**$ykPqPm=YvRzqkI?zIUh(~&WBQu^T8x=KAf|$v>)^a z<(E-OydO9#?}y&b`@t*oe)vJG2YADJh|#PE@nk)WU_H=u)CNv_PMi-YALm2*_?q?u7vcTTeR)6lR^AU^oAm&}tcQ5ZdXQ19hw06Fpd74+TE}{@ z1lGez)&ss^J){fkLEo_+b^_~xV_6S9g!SMKtcOQFfC-!rVHW3uKt2rQ1BvH+D0w*_ zOjgc^lZEpEd2v3ZnKvjO)G*!;-I@1;V?TTn>j9!!53!E*AknOc$;*16aMnZJVLjMW z*24{8Jzz%GL;k{g&p?oR9%eu5 zfo`!LstN1CqF4`?k@bMp>3PW!tOpHZJ?tFT1HWNCbaU2&KW9CBDb5FQf%74(;(QRF zIUhy?&Ii(w^PwbgKA14hhvUQffI4zMq)D6)sx0TjO5uE9UmhCyzoZB20gkdBA{*;L z#d3Sq~M*dayFAhik)nKpWOWj%PjSQr5%vV?FR-)04C0d zfP4^voDbs~=L1<(kMg0s=6o=LoDavJ^8xMTd`NjYAJh`ght-4gfeqq(XwIw$xXpTq zY^(=?9>$yXK<`)&)s*#MCf38fW<4PEkWE+*nv_5K#HI}yWe(N@d$S&TGwZ>#upT}; z=L6`#`4C=lK8SCe4?}W3koweL=((H^W-I5z@#B0zxi}xvWzGk+ne$=2<$PfMNWUT8 zpP_tkCe}mbVLiwu*264eJtTp^O;9_A72f!eShsu1hJHg@aXZhKuf zJ&*N(S6C0J^BChNd7kyK4_Oafo%PVySPyQ_diYnI55StnYto1FLGXA^U*~)vA2}b2 zGv|ZxHoDXLw=L34c`H+TiKB$454{Iyu154{=%qP@DN%`PhRvGgRl{kg+ z0e-7b`4BNbImmh_&3dqDtcRPxdcakzhdgj^D^7AIKNZhq90J!B}uUoNJs9s2%4+8p8RY25>&Cdz=q!`Y~g^ zs1|TOxb8EJ`J^a)nDPN`aa@o(-xOmi^iI_yDfo@QS6L5thV_6Cn;G+2`HJMtcTvgdT_;h_*$F~z?SnNqBe0UiTP(Hwom#pqB8RIF=+EG5p>&q!0 zCj7;rutnb}A6nZZM*K%b<}>0!%4$xH)cBCd z*^=@hntjV;!JIz9^8)g@GhJW zpfKk{u;zRazMKzZ3g-jq%=u6h=Ytu^`EWS?CNJChHrrD=UU+jpsD7Le%Zl@Xec^m) zRgn*_krD4xVS|kLpSpgK@*&=QP5B^GRvu4{7plm6wTyhA@b9<&eq=ptVb%kWVm)+r zJ0pIno3I{!6z2mN%J~qG528Hh!zjr4KqhiNl=_?x<~ZlWY0UY625>&4Nt_SrF6YCt z<$Pck`y(t8s~uGvI3HX}A4A_RvYnfi8s8Ob!zdqO_8XKB(!2FuBOm5(`S*MOU(R}H zKh}eD{yuq*^8wuBdb=6q21 zTerUbV9h~sW*X%K>&N-f>Ty0eS1Zbg*Kwl}zZWh^ln-(33CaigF2OoA-v68L@$dQj z>+^?M51)qf0oWu_K7`Yp527mP!#K|QKsf)Gn8x{FuGQY2d(rBHVr(nQ2Q(p*1LdJTF$o!e|!DZ`6`S5mm80$0Y_-M+9*gBT-LH^p_pLN`w z^8s|@dC*eqjxOzl}q`LNuN zP(Cn^ZIlmfOd84u=kG%K@J_X(e1I?aQ$EC><<}oA=QZbp*m#}tVMK*cK9H$ZjrB@Z zmGi-Dain}W=WZJL&cuUJln?3UTgnGjr!(cly3vpFfi25H`OxyDqkM2h4^uw8$t@@! zVE%}x$*K7e|EQh6ciq0sL;729axl59$QN$&{qL&#vs&Biaxm3geQo0Ec{NSdGkkW> znR$z8YR>sn2TU*Fw!cl)G~WhKb6dWmck!V?58XcZJmTXLSzQdx`!pek8X-axt(LY( zw_SWWRR77#epf_8Ti5L`_PrLLGOf6kviY?*UF7Pu#0ziKfjo}~SRBl%ag6i09`~a> zl#lvQKkR{huow2jANU7LH8s;u7iQX>{$*i}W1PqJxF6-A zeAI{fVGrzsy|5qtz(4rAam3?+seX@mKCW@O?|)}M9d`HlMF-Q$0d4*CkyfUt@!uZq zczD*-^3(7l{cY>I%}73PHRQ?`w+54A7oPi^O%$k}xnRaB?M0mb%uCZUt`HXWeFvTo zxgfq=s4TA6NF$qh3@w$ViD_Qs?Py z)8dw&j@#I^a!bG2yi~4R``sSpR?P-wEG)Xa>^mRh8YqSaK25G>zEx%CIr80T?4?nikjAN8Sr z*aQ1uFYJdu@DKhr_L)C2)$il+{z=Wh|BYGlxJ2$Ij;7&reflgo)ZbLT@2HF}PhOga zj;Qx|(K}za87FS`j`?`XtxZJc2l+;p7s0P$;zn#4E=rlK>m4q+U-;cWwK$~hTQNI( z$P~0qmjlj&f|LAkMdAH>O=jo z2ll~U*bjf;AN*bSDS1Mw-#d<_9~=Dr@8rb^QLRrqnvUn|9W&4~*fh@lTK8qy)3}*8 z%60n6#sO{_Eb8y*5qZ^Z{Ec;a+*VWO=jo z2ll~U*bjf;AN;K|cX4>C-%aPYk30PR@34TXDb@>}Oe@V-%#0{D)pWLZe3vwi=5D1u z&Q<@qG1zV0S<69VJRiE9@x4F0%1sZkdgnANSF>uANIgL z*bDpN5B!6_V|!GOO7(kEuLET(ZFVr7i>_^xGp@SH&!<_PvD3m$NotG#$J2S;LW`YL zW%Lxc$~_BP)(Cp-_IAzXxtC*`h`AFA`jo!9T$oi$nsa6C9dYMj{_J_u7L*eXUU|0l zP)+$cAjNlAS|9lfJzr_>5RmWFn0ES+|H-6o4f|^x<2mzyq3EOF@E)S_;$Vj|}`dd+d0 zH=xO#d6T}n)hRHo-KMT>#E|46UCPW}C(eBy;@A9avRIw1Wyx&2OUS;{MN>7jfxP)X z$B=EqyUEE9t}J#5>?ZA}h0G|i%vZNr+pTfUxZxVdIFIXbKgvV-s1NnS9@qzaVL$wV zfADv7#Gz-Yes{VT)4kso2a|o8j`Vs*KyCuiML9wO-qc-S5&fCl{={)xk7APwBjQei5dIhYCNO8ob$5A!eyh_QG~<=f`|mJo>;& zH$B-BQ^_IEq^^tD5 zTpq4_H9&egyuBE9cYv%iHOg&djzKypY(l>YS*B_n<2g(|(;> z?n#jerH14dhn-Am*Xlk(oqw8=;j%wm}O@;55SR7>=YkE56)Yi;5O>RNHUGI$FzSS+R)Z|Rd?ODTX_Kh)eW4kB5B9=-_yhmoug}-Yv8jF! zomi!nXS9P!MqbEgy`z@t(lp-~xj>nY=5kottBZ7d-~4u@x7&8NfUSwm=BFzp?l0fo z)88^klzMZ0T5tCwLazBzX@X}q`Nr9)^1|qv^1ac21;{?XoU?We43SP|FB^~S7$UPC zufB5Wm~lF^+>?^4y%%a6<2PY#R^kS5Rd$@M;lNPlX-rH}D`kJpn+ zWeXdddy&R5&f|LAkMdAH>O=jo2ll~U*bjf;AN+;?_&xCZ;P=Ashu;&wFMe#$y6A0<714MF@DB)8slq>w=w?4c>J#(pJRT4`3mMQn9pE-gZU2T zKbQ|;euViF=1-VUVSa`A7Uo}n^?VHTQOr*1xybJL!#KRCDL%a;}GsM&W>i8Psi-Z8S!SspAnBnd>Zj;#IF(0MtmFbZp6P44@Z0)@$$bq zevb76tS4Z70qYG|f53VK)+exDf%OZlXJCB;>m6ACzjy3OgWBKx#;=n&ptWqqHwR+#%(Rex!x z>OJmFP~JV_ZdF_sre=D$CIn4dpa$>v-__v2DmCW)*RkIYZBZV2OucQL_N(PP;<7pP zI-{)ee48WcUQ=RwM8!6Zh6t}Iqi3$Yn<7q*@tED^teK3d)#XUqz`c7<(Xnnu=hcxt z#`WrRZsUFtLgk6hU(m#;H+e`D4NZ=cpz5PMz7ebb%_cDc;lj z!YWlZ&zLHO!#1d91)JRuaNea3dbXH%IsTwp?p~!}aPzb3Y1d(<3#0C+fv)3D4ek6w z^=LHma9PVKqFwOWriVRq$tkU#ggjhRP!4L~IQ*v1Y1gTAtUJ(oJ zmDyw+@y$9+*=O);9G`BkS}@W!C1lxZWp+JoYM@P&8eH~_L)RQTRXgX2UB0?0bvbjF zsV?D1R73k?RxhrdQ_hc~GrsY?qkQ^h$#^2-jr!^+njCAHRxfDepDt$MB5`ZA!+~Y> zi%aMJwL4ooRgg!r?oFC&cVaIeYd)__H#M$TU+8|>mdX?PseF-(>J!_kesQt7VUKuA z_K7Li410wK*)L+#82*T;iH3ioTUEtutrDznMk`zE?gc)LiC0%9G|td8<`-2Z zrJr-LC+F4lgBkipY`UskN7uZvu*m}z_wDYNxk<0oo0hFxAM;J8?N8tGY7mx3yM-k@ zIM=VJt{0ibu1cjnqWOT1jm+A*%aTJQdW<_*PwuR6ZnRamjHcprtXt4|{e`YqCc0mi zpz`D^DqpUm`oy_WM*U(0*&`gk8TN?;vR8~D`^D5OhCgETdBZ<(Kd<4hut*-4a3jY^ z_55xH_eu#$9SNT>ym|CNHN42|7oR(xRatxP+Bw}kNtK^z6I@l@R*u81E~nl8NPUWQ zDSY$J8r*Qk+_zA+0*yYq^0A&x=XJ$*#`S6u-7oV{d9neOFTb`j>XXga81;(< zWRHj=`$S)|SF|r`*e~*vKVsr_!#}ZVmf^2R4zZnJzG9M^vEj^Ew|qyH?d`tLKS!TZ z@7o+Wny&N>bzfgN+IrF*)vcXqvHQ?-HOuyXF1I6Z)uxbG?*q|k^~e4B&vaRuO^;Yn zsF zs61Ji%9pFDJ{e2(%Z6l+%%5!7CyJIa>=k*)evvND@JHk$|3uKK8L9q?NA_da)OoW+ z9a=T6eAzuW)U~+8c3Q8z<|d^CUgN>%ZEUw6cT_bR}?K&$f2((AHs_Xge_nN`=` z-N*mfq`cZWRGq2by_imROSoS+#ZIShxbt~bo|^j1$I@rlb!w!yPB?q3U8RR2qH4N* z$20YnwLO%t&#s^!&$|{K>y>m~Crvc2R~P7h$>qr>RK6@i^+|iGU*;owWXmdseR7DG zVXvr2_KT+4@JHNOZTKh58yo(L8}V<%){(1~TdSSkE#vO1x$$1HaqFKbhhozUq^tB< znYZ8M>}sA?ua7-csN-&P-F;?s7M(Vac1mv8rO$mEz1rnKOZNn5I4x{*Ed^FG5qdAx&RuiQ)aiyZq6f5fZihJPa4 z1jAo(%h_+{t@0aH|J%hvAKZJU9McAN{&x74a+>vgRrCJo^wg3iZqF!grY8)V>;C9; zZe2WNRNZyQ3+UFDSIpk?p`?CyFv|YeD?2?PqIjP^(`x8JNt2hvE^Mmf(>7V$C%nBb zpT3~gylL-6ax0JZWt~RLcgqi3r_DV{ZoU^iwa4g6ruTHLpVN6gldf04(ET!q%9A~* ze0i4Ylf|iinLzf)C4&w7;o&GfuS*7sFcs9AZ7#5w2_u^o2qtYG=TTPO^ADS$x9SV~t^O>4_zR<`NNXL3Po!43D zdOd^gm#wKh8B68M6I7q(B_gL!Ko4sGWxl&ZuoZPb6 zk-}y4LujkPHaz2$Ow^RA@0o5n3QT;Lp*&}P- zGVGIS$X1i>!!ASSF*F7U%@=h_*1=fQssbI=Fc<9?yHjedHc)mQ(`Pg@!y!P$(ib=Mu zOnj{QyiQZqxL(hp`{g4lPadQ4C5mb20`vZwo6 zHmSHSIeVtHDY2}cT7UKCZQrWtBkmou27aiaZFfAY^*pqRwohD8d+zei`i#}mP9Dnw zbz`qO!+Xv#lR+!C$;s|BWx(U4#54ux|7g#9(y<;+=XJ*V#`XFN-7mR3S%J!zE2uuX zi0YS($R1fKhhd*ww8^knCXxN}?jge;DF+z-35N*7-+%1${-=K5|J3&UpW1)_Q^#xn z)baU0bw2h_oqzvR<1PQx_}V`;p88LXpZ`!_e(b8#cpl+HM`kV@vL3#OmT!Gxi6Z6$xopdhP1ffNVj>g}bFPF;HDEqc%Mz38)Y`z*IpS!JmC-noue`DFKWsb@;Sz4TUM1Q$)$jSSu048u|69w+ z;X>;!AtF9w)1l+ijuTUIJZL{EafS$T}Gug1k zv({Lxj4WMbH#Km<_5ZT*z`*ac1KjV#5Es$k^Qmj*{`R-^Ng0I&&BtAq#+sIM{mFvE zHFers{K@9bAU5{J8e>C4vs3_7Vd=acYc zNT2sdXSbmdi_=ce_WMP?_PP4l>e*{D=!{Oxn^PD6w*S|_-~3SSZ=~A@(O=mYt;uhH zr3+&(|2}pccBXE7^D%P5tC4>0{v<|4XX5+FW`9jP(1eNV@Fs(>~XB)sm{g#i`F6t=N^0 zt0mSujbvwCt#%Ey@5^TV8nJIjt~xc`c_+uGMuqAvZPWSKS}7WJQ(o)bk0P=?3=@_0qn{L{O-QN65#y>cu} z>6D$qbV;9yG-k3?VRFAI^z8GxaHCmcXl(rGLeDR@%x!$(W3Tno*zoRcWlydd#Zp|d zLp|QNq8;Tn`Jb#COh>D^w_k&b6dhqd?9<^{Pf0>j%mg;!G z+HbDAhL1maay-D#D>Il3*4SZQ-r*9NF1zx8@5GO!>f&rtSEfXN8K0P{z1x7Qujwb_ zR3iRB#nYN%oVWz!9r-?KA&Ek4a-ch=EsE+;zODLgIO)FLVz37D)um3Rdf^x*Z~o+sf2kAQ*1on((|HOl?704Hsl6#(^~xe*L6R!n+cfRf z#OoDg+^=}e{E};=+b~nb8H(G;rbjPUe%a?wboRSRjcAS|F2%kc^gE8i_k9KYwGHC_ z=BAj6{?LhM-tefvQv7hB0Xkzz{Y<(rR@}^tog9endU|JieD4Gn&vHZNbl{xo>KoUgNmA_ z((M%!7e2My$Tl8y%k$F@WTW;xaQd)e89O%n#_@3<=Fo2!qJHg~=t6hg7`D*!p#xoV zShGyHX-K=?(OM?s+MX&n&)VPV>JxG$&d@s{Gn&l3XnSc@cp%v}r1n?MW`DA8LR_wV zv)`-Y26UhLzxkaGeveP%ewXY!EBbxH&;88r_dGE5(93Pj#}4J+PbDsCjz^CArk8{V zkP%A@CPnJ(Bmu>tZ`J%V$cmnmqc`Wt(EC}J+OD5zNMAeNDP1>cCT;C{$ulH&1^qI- z{`$A|zBEW`R_fX3K2*hEW@CEbYBqH7tMi6E!&qsdpNrIdfA-!;Y4Kb&3#J*JWm>R* z8I{z%+Vt>{D?KLP>Cnrw6R7peM*Cmi`q3x(6ZK9ew4(2hs76S8J|OvTngpAbQ6&7m zc_>v0AV&*(&U0>FS2s@`oA12Q0lV9oBq|w+%}v@$e@eFcw0Y}S}j!X(w%IgJ-YtT@U&Y+ z``)kF0BTxkPRlZ8yx)Zt$?yv}T5m?z2nJ$f9*)KHQ#mh&*ny?sHsa0D1lC z-s+Do{>1A}y|-(#{hMu-?SA{S{rpDJzquQ^zb9^t6wj5CH%$C}eOdph`Lmjj4}P8- zdb#-+{k7&xyXJN3Qdl4Jl7XS5OYn0gW7F$o?TSljuX@*$4?S;sR@M)s0k1yCA8N3p zb(3wCmb~+%ZIWh`o(c`1H&ufzmJAQ1wBy4*sU=HT;E#^0&ILuXk5xx|>kr+{R0ccl*$fP8$5yOmkQ@ z={$L+vDM-$q;YXU-R%4z@<`g#_4#st@?vCl`rPJq`fJy$hTncvj?c6H?bmCY;i8`n zs(hWAv1GP*e({Cus^8a>8WKKvHy^Fu*jij|9?y&KtT>#QxrIdkESYHObCeiQo^b5S zn$t8LmB$De{qQUc2oMRVvDm(u`^Y1{b}E+z?;64UKO(cNdWDeF>Y|A#|k>5 zb9ME{p4-^PkLM&uS|4O?aBc_J@%~=$Jhq4J4}$)%f3#--*oXF_{pb(+hyJ4f_(`o{E-0j3C=G#-{Aa%^AXNZIA7uXh4UHC zZ#duK{D<=)&W~j3FJZmE2kXBN!~+-~P>2_zAb!Aj0^4e``Dh_9wVytNtPFO0_u{djza z@fyZ&T_B#r_zvT}`w;(OJm>=PA;yasKVm$I@g>Ha7=L0sihg6fit#JPvt1#+#dsIv zUyO$_KE`+%<7bSgT_L{4cpKyIScu0lKF4@{F~si}&trVw7vg=4|1lrH`~dR>%pWkH z!2AO94fGd}n4e(2g82*PGnn6CzJvJ>=0lhtVZL+=@~2IZPc4A_>H_3j<&b~nLq663 z`Pn4M*8(Abvxj`n2J$=1_b~s%d=T?P%oj0##C#I-OY|3yn2%z9iuo$$ueTwewSxRs z5%OJU$bTImAHEFv@jb|wcS8RB2J&gluLa1rG5^MVywfF~pJTp``FkGZ^O)abzK{7o z;sJ;cAYOp@0s8sJBjOK;M-%}*aSHGX#4ixfKzsx74#YnY4?%n+3GfocPY_RW1$+hZ z7Q|o903L(*4B|COfZrgVgZK{OJ&6Ax9)$Q1;zfV-_mAg@KOr84_!Qz*h+iR|h4>cY zU5I~G03J3wmg8d`0WTW}_?ZvjX(52GMFZaU3h=jHfXD3vd=BwC#P1N#LwpbMKE(eJ z5B#HlfAyRI9*OuQ;+2SBBA(fTZvx(l_$T6_h>s#(ItB1k#8VMp)d9Q}@mIuS5uZi8 z7V%rea}nP~y!WsA_pk0-2Y58%)2$YByc+Rq#IrvDzKwV{;@??-ha*0Yc=`7#j-Ml* zj`;d5z}pdjM?4an3iS!BS77}@3hEitp}w&d>K)^u{xJpW zA^K1sxdHW(QmCIaKs^QPD_C#A`U}=$us(zJ8m!;^U4Q=Wb6BskhWZuOv#`E(1L|E^ z|H69MN~n)vy$tJTSWmzYWKj#0Fh12GdxI;osXyg2Qb6*I76_b=Njd&wGk*#PO=u|8y-1l!~HL+B% zxlngC;9jYa;kDt~qsQgK&PSVH68c#%>Q{PPui&c?I;`!$nNzBSOFq|R^1QwaMeBM+ zcwcVCz8=_}n*2hVIrMmVcdnZhQzNH-Os$9$OcTdOm9hcD?wDHM&##D*s`fkC`-QmoOJjh91qbo8``l^7&+1I`dxbort9o= zVu80byPpxJ+tsEWTa~r7$|AKhV}WWVJ3p$hrR=U;S;r>9{bC z5x8Uhl~z6JlxaP`u1R?PWNGw*@~7E?6lbC+haQnI^K?UXdRGyW}q?Mu7BHkqPYomn`8NwOj4!4?kUb2 zGD(9SuCcLb=b*)MHwHJ2=-P(qDXlsvm4BUF^wixw#WbHR^@&S6fBoja?Y~~){dDEd zX9c%m*WEl%eh?;?Pl?OPuNCe^58BYNq(R6wEs0)yK$^X{`nbJoi3}TJte&;?wmh4V zG9W3gnHPMss9#WxT^ClhdQ!v_cU6{?QM17PnxT94u*3Ms?2O-DByC^h-mMqb#WX(OV6LpS!d5frC!GTxQHt zynkx=`u1nEgQA=K#|9zARH~}~+0W$QYMoOC0UwCBY>bynY%b|FL!~gi<25pS`j*+1 z*Q5UQcPJga{_*_0eS+QleO{APa)h2^Mr_&GR4**`lwP;Su~8_k{eJh0qby4?`4u$E zQJ$S}sIFa@*ol?f-&k>KurjM$(f)g_V>fnSz@|Y8-!)m#y!89#pZc&3@y==~ONTI* z!Tom{5)*c;{jJjM^OnrBl}pU@Wd`igwF}fc)0AfFwe6$4bUMBG+`#Uqk`tYsXSy+b zjt-rcuQ_1ed24p}@r+>$e684za+O4dxBZx6?|1&A%f1pxiG)ixBBW^Ar^nF;hF6lx z-sSm$<6e-&xmDNh%(z9&>8rDq@)w9w$0NmU?(g|O{5R0HEv)cJ5a#t-HuH^KmGD|l zwT+H!D>lZu%ZxWZt=asOmcE0QE3mL-F0Gd-c4nU>dMkF_+>OokT;v{Gq`_|Xx;T`L z>%;E1O;4G%Nr$}~eRbB$tl_Mn@8EfQ<1E0N2@ZQ zmm|6xcb-eb9^BMEw`mbw&>^ImJwKIRDtDOjy7wrimgKuHYSlE>?cLQm`loG}jeFa1 zG4Ev9SPh$_P4~OdH>p=#hO4%tQT5I@FDj;a@`S?c_@L<&w-!*Z;!1=I=LO zB?3dI&2}`%s@`XuyUxjt>jI zZpmzurK_UlTQZ8KS%9@vY@?hHwt zw6GJ+dT8dQp74W=p4w`|Tagss?(m3e6yUcj$P77g!<{%YHKc$4^OP753HOZ zge%-?y>r}EA!?yc{8&;e#N5(LZqkroAy%bEy@$4Ak(;hceX8%w8a@qrHtnn`lPFmA z;$v{LzX}4IJ42i0#~Q8GZ05&)^N0Qf)QuU$ZLGu(>YOvrWc?8~zKabHmP)2Rs(AlRJXC z4m!7t$dYRpdbWm2s=d+>N@-BT$#xZr- z#xv$|UNj!>T1>4->%~V(C=hGou$FtiGx=xQCY+~xFz2XeAyciq4JSo!6 zj-5%I7UXJUMAJ4-JZvXpPL;o_jrY1Rke)NvoqKPLGA+0scYFF3Nm`IFu+4;aRiv`I zC}b~tONvbjxB2#ZLS}4CdO!NaZSwHto9^l>5`>YlBimcsR0$2rQ8^tl8w9f-FQz%a zYQsGBCXfE%rO1NrnB)!{+>OnOoUY(~z8BlRwDoP1*a6Kd8!7v5ZyL@VHgB@*+lI0| z=id}&s*Gi&4OwIQl}%?4XV<~{WOqTwm)ODpxXr6 z7{Bqw$0|y#rdNK`?X5!%Pad5(UqzKl7cA7;?;=a%51#6MaMt(c?_Kq^-?B;RU0EXOG+`A@W}4@jZ%!ZM}B%EeNX;ii^BMikzE-C%z_K?s>Ok$7+A&IvOjo z8%hgTw3qI|LVZ-aO0Vz38p)HVc7a3KkPu~~hq5MY*UiMTlkwK9)0I)v_9WP|`gs#J zPt2Id)~BWw?_cM}POAkqbzf%7Hl1F&etvU3_`K!0A-fmvq&^Mjyi;6*=&T3J1}G2p zWDN>iJtB<4SUmMqi4=UE@a2`Q_Q?j+ZQAgH4D>n|1S8 zlUw58`#YA=wnKjE4wK$V!z-*F{Z!sf6MCtc<}F)DU%l4p-n4HUllkb>q`PVxvrX*v za&+cu7I*4n@M{Abdcc3X@wzFqsE=3EtDs*K>BiUHHhYztQ8#I43$4t7)NE*kUmG=b zYCZW#b>PX4bZYMLJ}>S`(9dn)jJ~?+hBFvFVddbJ|Eb$RL7aUNw1G6*yzR-e>CNuB*R%<-o7W zE$mpb@=Ut;%)$~oz425|J)G$bH>LDo-kHuu1L=>Q{jGa1?m;zET|f5ARG`l%C|``X zm7&8PJiT?hwvMdnPkX0Gu(th+es6@m`feUW9##spyd>uR(gq=u z4D_G1U6xrL&d9rK(wRx=`dS+`$A?igz^kv+KsNOJva=c1hOFK;{o{aVqgdq4*@fR@ zr?X2>y*i!Pw17>Vuxr(4>*?&>j7{55MXjOU-b0=pao!7} zjGwdB{5pHj?`OmK^Yk)rkB0O1=}+Dt{dG?4p9XS!s3o_LW^;R~jfH4Gt^F+eL(U8r z{Ugb1MSsbj2crMNO8$EYqcg?dN08*d7bE=lW8HU&zb9M8e_z&%|K7}#|NbnUzYiA0 z-w*qeExs>$lfOTDn7>cj?yC5HsTP0VY!rY0tc-sTEWKX*K4=#IUg#M9{m>iyd!n-Z z`=TfL_eMkc_eUf6_ekfA62DLS^p^O&(h08O_e-z(i{CR@ep&p!$>~(_dlx$J?_coX z<3Z5iDM%_(vIq0f@V`G|V+`H9N% z`HCK5;`~J{e8u^U`1AQqh|3b^J0XV8e?knO4+Xg;;{3?Q^ZAlh^ZAp(e9E%;{EG7} z%j5GeJ;Uc?+Q{c;I-k$ibO)cm8O-N6zq7e~zNc&W{7+jsi|YZ^;Ohfj!`BP?Iapjj zXaiqQ=q|p#&=<<$dP7gtiR%xQ@DtY~+O|+!pU4L-alIlIZN>GAJmBk@VD2QYZ$j-9 zalI3K`1&W5zZTa+X2RD;X2{n|*1*?K2J0z%%GX!6hp)GE8ef0u489)IMSOi`d3?QQ zntc6c)A@SN-t+aHX7cr(mh<(WM)G)ocI5E^-O1wx8p`7b8W1JM6Vx|dj4x=>P%+-1 zH@}PV2Ysg?#v?@gfEb^U!MxnM@RAa zkIv-rAeH9vAr0p7B3-yZj34Q~c49n9{jP}dCB1)3j5letx)^^Fl>{*!CH*do@hLgZ z<5eMs$FG7xS23Oy`e}*rt?-z~yKEzme;MKNFq^~UW7f#yWuYyPpJ_agr|EbeU(+5u z-fq@6660?sc|wfG*$W<@3-@@uPUQ^6_?^1&c%J^?@jd;;<9#Z7NR0n!8qWu)WucfK z&@JU+zCbH^{y=B(e1cY`iTMR}brJIo^73ig@BD+zmlyL9vZ{xep9m|>#e7AW&GQ#w zE6-(sk=t-W>(K?>r(O91EQCpt>(Q!s%K1jdv{E+S#Ear>!7|$Q6{u42u zBuCGP`6aOo5%bNK{8K$&%twU{+r|7;a6KyKtHMK`zX}OFpB29I{FY7O`7Sf(`7c%H z`7qVu`7yo9^JO}f=g({x&!;iJW}A4vO%r+kO(7qrB|JZ;k9fXLxAOd*KI8d3UCZ-( zI!{W>_vwY@V*XDxIUYbAM~L_URpxjBtpF}0gRs;>#3O`J z^F(|?Fzh4Z6+#ZjF9cbRXRsa|-w0pW`nS@EE$7<1;jr<29756!9DS(m}*?sQVNV-=PCdMZAah;P?;Swphf2h{R|S zA0nfliFgqS&Rh2zKl(rXM*sC@iTIP?;3(oz!hMcU2^k!(65ewBN*KWLEOL$GThyE5 zUDT1|U-Svb!&m{w$CwMp%h-I5pV9XmPotF_U!%nwZ=-;}(MKGQqsKWuM;CFtj;5Q4 z_#Kr^67f8m!tp&?6(!<*_BI3K`@oN$9C80_p{!8XYhUx1;^vbq*M`~C(9R!cs&UZ5b=A`>Ya$^lg{l$e4qU2AmaUh z+h6qik4GI|pCG}!UO}9A{X+Q3>lw_L*Eg80saWqIlX?AvzTx!{`heF*XfUsr5GP(g zAx^xWLQeDg3Q1cb)>}veufGsUUXLLITZ{D>;`mvt*AN+Azac{{#d^+vxxat(AJ6M~ zy-HZf>sLZIXR)3oWbpbHsrMG^U1SQce~|&a9!5^``WP9)>t#fp*Uw1Dv0^=q>@^na zYb1-;+X&q)*58O$y;zSUwb#Y^9Fg@A>vhEDr&z!HAM+dimy8hWmBQ2*v3^P3$cpt$ zk~CMWZxRz;?H_n~!KmYGKCPMqOJa|9zxA0?=7T^E}#`2dGh zIUi!}InD=3IKlZaMX8(*)J~4`p}Jq^e6as6`~PaYSHaJFa17kZ{j5I6kEibN{rxk& z_FbWVRVmiK2WS3=R@te#Q9)J7dRg-{08R({#85w z)BCP~e~;ieb_e%w(tUnh*_-oK7LDWljjm~&&v2!P@9(eD=#=^H9zQiTl9$ zFguMnAIR?+=R^A3L zeLTYXNI|lbMShO6Jm;&d7|Qt@H>46pK12RE&WCvOjq^dW95^3l_h-%rTAIZ9Q2k6f zAMAN1=fm}0!TEs7DVz@(8p8RYCw+ z-|SQ<=U)k4oR1W=n)7oWOP?3{Dx*p{e0?r3i+rasdyMYgy4Sd+KeK{ZayesEJ|GR#k2mjLGSQyUzjD5+E*G_Q0sAM$f zPu7NUKH;=aoL@KiF6W!6MsWVsnMs_F6!V?)b37k%zKXOL=WlHB=6s;<4>=#|IP7YNX24}9Ph;6on(KKQ@#J0ASI1jo>I+`l`=`Ekz*&VROk z!1=(hCUbsl!voG2^GSp-9e; zUEPoKMQyz}e^PxE=Yx!w;rzN--~){VKGX)_BP9So#{>8($-v(@419+Dz=zcUKJZxB z|2=y?=YtmlA3hTF0D6KRf+OfbsDT~^`mb@nx5yh?*oymWUC;F?6im2YL)!~nzo4@z z=kx0y=KOZqP|o*ODChj=iq)JCeBm_b$F_dY`Jy|4Ke-3^gvf`g0=`*y;KTI;KGJ;P zL&^akv;z1W?ST)h4}9n>*zazMe0b0USO@!qZ^3@q*jTQIkqG-KWpcS5ikuSHTM21B zNz@;4y3F-BVs3MNipbGiuVK$ru3wOFmh<_ap5^@ZUo$!1I|BF+iNFWh0DPEdzz3QD z{K**L6Sn)x`E?TeI3G|O_*dq@2UQ0?>~i3%!~-9?7WfP~u)lv6=mC_#{_owO2hnB% z*TdKh`(;;v9!eJI!QAM}^<}d4xZX;iNnC$q6y>lgIZ5oYUceVcK3pH*10ui90{CX$z`yEe!ud$^fSa$PXZsbE%59503Y}R z@S!&WAE^xZ@b17@K|O@?pa-D}`}-3?4cAz5*ZMH1Hwbf?mT2;KK|AK9CIXp&Ax(zPBFm;m!dc82OOezz4Mg zK5R7b2@`-1tqy!}FW|%PNZ@(^NT# z*F$REnd>E~RdD^FqP<*C=jV2=FVp!X*IU^Pe27%g~}Bh$MukgWph2Ko3FS&)S3*gmy|e&>jy0bJ)N< z!wdL6@Oyay-%kvDPi63Z-GuM$0(^ht;CqyU?-RdQ{C>N^_l)1S4t(#=;rqw&faAjv z#tV)g98dNzzTN{LE(gY60E|a%7@yZ+yvD)!b%*h6599k5@Skz~<9vYg1I`yXf8c!b z8s-piaj7!RmGd~hI$>)|Lv{6HX{*az{23&a~3e_%X<@d?H&DGk( zj0Z73d;;-eBE*jvPhxzD@g~Nf7>{Cnit#GOuNco_e7hXt-2{k#^&uWU1o81Yh?g;b z#(276FxOj|2Jtq=-`yY{$M_uM^(ctnF`mcx9^-wC|1lrH`~dR>%pWkH!2AO94a`3< zAHn>jKjbSekiTd{K7;uU<~x}GU_PV*`4Q$zm_J>Hd(2I3otcbEhIfp|zaz(<|}UNQpkli`4;C;+~)5Ac>NfWLSG9)tJ{;x&lh zAfAKx4&ptC{~#WO_z>bnh#w)Igns_n@gU$+h*u$gg?JX?TQPulA^wGU*df5j5HCag z4DmF?*AQ<*{0;Fq#ODyNL;Mc$JjC}9??e0#@j%1}|IEKX`}<+QBN3lOyb|$C#4}X^ z-$c9<@y`mtLlGZEycF?M#8VMpMZ6X9SHxoxpGCYD@ms`m5#L3;_s{(KcmIxf^k%@P z5wAx48u9D_fNwhk-W>(__hZ1r5g$jq9Px9+(-B`sydCj(#N!d4N4y^Kd&KkqUBCY7 z{nwx#f%OTjS77}D>ls+zzHx^%1O>VEqK^DOg{@dJEQHupWc;nZIiHe|jI* zpRgW<^(m}ZVg2d=)U&X@)l%<*`WM#2us(+MGOV9rJq_z?Sa17J?f*}o$ND4IBe6b- z^-8Q?Vm%YJuy z`cLiucc1T-!}(X$z(+a>{G6%4SJ@8yjfuc#=nVV&55azSPuTz64)#M|g#E$RuwV8Z z>>o{m{glzLzc2yz+uelyXLhsseyo4j{=a&^))3Ao^Z|ZdJK&o|0RIa4NXXBr0lrEy z@HcXS&w%^;$HRVici8`Z5cWfVh5f-wuwQlp>>phP`zg1>{=y*GZ+8mzpZ!%o{?&ai z&T@Wi4)8_i1Ao#P_=GyZuiFQFvt_`)BEUz=27Znv@KrVge*^gpKgNrE2&Mx2-S@%% z@71s$Ivw^0>%o56XxKlB`zhzZ{=x#-Z`Tv{pZzPp{_OhRF`WM#41C~2z>hTnzUUj^ zPkskJVKngT9D#4<0sJfEBYgsXjxq36tbxB_3Vepeu)kjc_PbZW{_pRwANnQi5B>oA zWv{{h(O0ma@;U4;?7U3m0}JnA|Jk4Uhktke!TJ0P7jb^O4e-77f&V-W_`vSKj~xqq z(TTvH+zEWb{lKq7zF8{puT}sb$rboHvcOkS1OCQ*;4@5s{r$$U-#rQTe}}?;XjRxB zTn77P+r$3RtFWK41MDyS2K(*Mzds&B-*df&Z=he$2z>sXz;Bnl#`)flfdBj+_`uG< zk9`Sz(OTe7BA;+3@auwrZ?*yWSH8eU+5`NYWx!Vn1pY=X@ELG_e|y;PZVUUrJvkqg z4S@Z@?|O-RVBsk2A1#9Yl*X{Xus`g#`=j5?-iDtbmU+0Qfmkz*iZ}`EX3?l*k8Uw_$(3 z73_Dnf&Jfh9wHx@cKa;yp=m1YmpuggM_0gp$|117@Q;4`f*!{r(5J`;y@o!ZU%-IR z{~Gx1$AIsR{Ac6?zXN`3PvDCN0)G7dBT?YGuhr)i@ zhg=Uu7zz6+wLxE|Gv5y?JOKTX_sLw3!v*vyQb4aE3iJyyfY1LJ`0ZuD_r3xA=eNKI zt^s~*F7QP&fj_AWe8LT!4@q5tZ*~s&SHK6R`+=V`6!4pAboPS2Ocdy?M1cOt5zyoK2Kp5Kpx00g`UOLP&p#9R z?a24O2mI$1zy}@x{Mh!u7kv%<$t2(t{wx*wu(S^NW)pyaH4^wps=&{w2EIxV@HaAm z&)^FC`**>9_Xn{5dpYcfu7mx-@vvVu81#d7fS!&a=*t*`-bzo8OFe%yrOP$p-xq z2hiiNdCT=FZh&6HW6&>f0zUs&GtO^!1HQK;@SjbA4{Qef*e{$9OeKIn83KI5bl}%* z2fo=mu7|)Lb3F)V|3K8kpzDFJQUv^s55Q-b2K)Q(z~|jp`@c~S%N_Kg zo`YV}LeLNT40<}npf9r#^j2K?@6GOm9>-hIr`QR44R=AmAPo5Yz=x%uf$u#S_|L!x zXRZ17z}EBcgG~nhqz>>2-vPhwI`GX*`S(W00Uzlh@N-TBU*-EeQ4fhu1wMm1?C+O? z{qDY?|Fr=0uu4E5>Ky1LX@P#webCdH0Qxc>pto`t^hbJt9>*-ur#Jw54G%N9enC9& z`Hup>-3$5Nz<+)NeBeyr$2J0Av;*)btN8puDe&u_0pHA%&o?xK&p%WP_&F1SuVN4U zjXGsf4~)pc{(gDTJ5vJvFPQ&W66izK-{N{nQ$at7fu0V`r}PKttr&y;$RN<;7z6qg z)u7kV$meU8%;#@b2>kY&!1spvo-PMIFsujk9`Hry0e`YT@Ch@4U$+4GX4$~MS`B=p zFyQB$2fj)ZU$4kdzJ8HDpzk&$itC-ZjpX`Y?LiN#9q2>72E8O$FX;x*(>cl4Q#u&* zR$#ql_Mpdc0rV-{K(E0W^a}<9pZ_lK+w*|${gbcv6!bu-z~cc5@d1qh{^SPW6K({4 z-9g}+O$PpzHt>-y0Y7Ig@KwBlzma>8>)9OueYgIgclH7FzqWxM);G|Hl6=nfl0135 z#KwT04#ZPT8}wGLg8s;49)GbZpii+L^coUDzhDyZ`MUwXy&LeocLM*}3i!Ykz>ob5 ze9`;BpVR?9;e6oNT>`$@9pGPm1U^y{@N?3DuaXwX_4|x?{7One->nw(&cZU!S<6xjq5e9k%W&tJ$vd#>+x z3-r!5g8moeKddk4L-ho`q!I(JAG8wmbPPaW2J$N!1o|T@L61Xnw5W$cJAz&V>KD`i zpFaZl?Q+2PP67V24e){I06%sy@I_^SKe-b4gtLKPrviMlPQbtVxr+0V&~H4>1O2}B zpl5d+^xbar{FZ6*e3!ZM{Fmv0K9mLMC82)MFVNG`1$~)aptm9q`XdTF|E8xvpTY|C z8tOp5z!&)ZzQAuc1HSht;6I-OKCm|MW0Qa{8V>x)#lR<=2>iMt;G3xd{|f!Zqci9g z+Jb)HH_)?71AVtFj&G3Op#QZH^sq*QK2#gfOBx9JLGL(zLT7`%j4tS{_<;V%X3*mp z0{RqNL9byG=oicbKK~}*x0eIoy9e-}Re%rt1^BT(z!$A}%lVVFA)+265jJst-I(K? zZ-)N<@wl^`>lJqI!u9($f}S1fyS)OvGbxUD(aoTTh5Ar{k5LoQ4>AWmol4M`84Y?X z+d+TC3iLQ$fj&hb=r!yC{em*!^KS!wy94mO1Aza07WlyFz>mEx&-tQ$7Mwr1x1RF} z|LEr*&#%AX`izG`uW&!;_uT?LyC~3iO9j2No1p*o9Q3g2IUY*OKrhJ#^n<#Co=y(v z%b?y0>W{>M9>*Kdrw9POhJ~PCa0vMPO2BVd1itr6;6G0QKJc~noFDr~zy9jE3FtG< z0lmUv(C_mDJv&R#ce@9AXAeRDD-!gud_f<|2K18BK|ja@^mNieU&aIUR%$ukP7^?n z<0j}+l!IPFKhQ5I2R^?Z@Y`JvbH4ZIot*#tSN;1}_dS@-^%;+VUg1vA?`s8mc8@{d z?IY-&8G!y*tK(b`s~q&9%s?-x3iN}ueLX?X?jGp7ec|;jG7$8?JV6g@Cg?+* z1ihq0&<~0NJ)I)Zm(c~i6@Abji3L557r|Vg;_v$Lcb|LQp6gMjJ?Hw2hM-rd4*GrC zpl7EC`fkra@9Y-ne}#Y^)>Y7lngx1EI-nmk4)k<9u5f*s^Ov~Z%DPI+-}Tm(c;oNd zkIzL7Tx&a^kG@$!gU#sQ$1SmCV}2h$OUh07ebnBx*Z%j>SG{89?_-ao18%>Mj@yiV ze;>#Bl^pzioOUPu_V44$jh>aik4G~0YYl8ZUeTO6>GyF(O8T1L$6=a7!+#%lEb)o? z-_P+n-jB~?d)Pkqhy9~HXdl{(_M<=OANs3!Tg7cqvmGAwo5v4rKH4h=_Azcgo-|c& zZ`*u4_F?f^=jLPB7wPFcnveaj&))mA`8an++Ap)d`eqf+<{}#d(b|#7wt!X&_DFoTP}R?puzfPfiqYAbTHO8Thehu@~esZW_LC8!s6HK zo9#?3tJloXH=D=q`Yy6DFtgu2{Kq~*#OH;F1 z2HIs>7Q{^ZmTZBFn}u0;c;n1*XDrPY`*(=bx^885)-cca$g&Y;lUL-rL|hora*o&W zetaI=!}hU1>>uqx`_NvrAN@i9(BJb01>bb+t<08ISlcv|jWwH<@>0z|Zkk#0X2b5^ zWfz#8IeC3%+Z$eHB^o_+2aVipcB6}3YbW)sW;Jt8`OXfFGArI)G~CzXklDk*@2&RJ z6J~od?#Zn8Id3*l%G3IV-W9VF%?hRd0oTk%eyBgyvtLT{cVL>47%i9yjXm6im8|6) zujBprJhq4JV}IB`+Jp9?y=XuBgZ`nvvt+U-1v;T6uUQbx(71qn#MpAx7-Wz>$#|2WamiMzU z*N_)Z^%yeEoJ`Ys5mURse5t8l#;da{%%3N39o~3$v$=J2V6rv~H6LH?7iBOy(%jm3 zXP8arRmDtax*$caCi`AD=UywDRTKEtfBvXF1P^b1=VbzA`sN zU*YcMmUFz0_v7=}9=6}oAM}s*pnYgB+K>LAf9UVZtg?ot)!WR&R=w}@`9-Yx!k=SR z*1Wo4zRVz_cc-FM^CpM=ORv>GHWzaHB`l81HxIrdwaVAF)Li3Lmo64-tIR`+ZQkt( zZZx+$udMAkM247HxeS%MB~K=~9LwmlMv=rAm~Xu0p-iMCgF218qe{+%`p$I zcWD#;pnJxkVH?7?`(e9h|JU~iO_p9l3d^Na`(%WNu)#F)|uz# z&mi9EgRQL%oyk5{yv=Yji8CVI)@zwpM~)>$N^QEy z=*=P%`rmkR&D4X`e7tsR!v$~heoJ`pn8(4*x{?Q(^5A8+!(I4~={jHEM&*&g*AUJj^7+ERMr=ioqFdFnW|qUYK! z?OV?AI^K`ZV|&;>_J{qWJ!l`=i}s^G=pXvq?y1VbDUz4Tz3D!mY^?8)Z(|m$eB%F% zTvAEMpSZPz%qw}k-`}x@nA&%7Yt>VV9`rh~bcLY;EiUcazOzI(dP06`Z~3HN)Mo88 zm!@$#)V!_F16BQD^r?#6g>&&nlzEmf&8;@4nr-4w_OUh5UG?OA0Jn(ZRh& z*Nz;eKzFx~d$#UL4|>qfe$lDefwVT;eZix}hBP?s)t8HRtmw)xVkfK{M@RR{>Ct_u z1I<4+Cf5AA6HR-%()Z!Rd9?oVSxd!33#e89D_uW7ccl$(O$)9{xY5I}wmw>U+pXms zujBprJhq4JV}IB`+Jp9?y=XuBgZ`nvw*5>mf4xyfHd?H`JzS+Vbr`v>kDRj#mCyO@ zpEm8fubqt5AOm`2pG})51taL(dX>IDd6Vcb(S9fTuCBwHOWrOt`C@;C@h%?JqLWE! z{I?Z!(xC2A$_LibGaE}J*LC-ydzV;@jwtk{UiWg<3_ScPwLSHDOuc{0IbO&6@p)_y z+sFQ}f3yefLwnJF^auSze`{JFE^0boMUo67=swxj^jvM+w*Wg8x^KB(!pIrgbW?bI z`5tuxDm^Bp;eOT#YLlyyx;JwYeK^4C>(MWcblZnl`%OGt=!Hp2lS3zZ&~f@T&%=vX z(2DXaE1N>sQLl%_PCl)D=!KF^PE|R+)I_#&;>J1t)Xny)u5Ous%Q;@h`|){f58KE7 zuz$1%?L&Lfe)I?ZLw{dsB^^V};VG&Ag&fxesa58s(gf1CgIUa86cmA|OA+0U@wy$-PRHZtjDMNlOxv0y0HT3kWu2WW5R7E~?n85Dy_sbGv z(x%_aUC7E^ALY4>_hPe8x=ggX<;|Az_s8-@f48y+Pjh4voOZEUqJL3LY4Eo>7mcG? z)PSuus-tPeu^{?Q(^5A8+!(I4~={YC%r_rTu=e=q#~ z@b|>u7k}^nU*9)=@A&=Wc);<2;|0eLjwc*nINosl;dsRHiQ^T=?>}XHuG!}So?M_ey){lxVY*H>I` zas9>h7}w{2%KDA*3&t}T-(b9h@ejsB7$0H0gz*!`Qy5=iyoK=>#$*4Kcn#xKj9)RH z#rPKEU5tM*9>(|><7JGWF`mZw8slw@zyB%mIp!yruVDUy`3&YanD1czgZU8VN0={R z{)G7y=2w_+{ZsNW%ttXl#e5a>SIlQIzr}nP^Iyz|F+aw98S`h%r!l|&r{v#=KOi1~ z_ypn=h+iO{f%pdE9f*G*9)kD?;w6ZmAfED1!CMe-Li`EwD8#1_uR{C^@vQ&f@ioL3 z5pP8N5%EaGClRki{1Wj@#5WP|MEn!+P{ceGBVdSpUL$*#GPL7}f`|UWoNWtS4f9 z5$lauf5dtu)+e!EiSz)6Udg!9rWdRulI>P6@>1$=RErdOC8_s_2YA1|r z<*K*8$2?)aot&|@;WELsC?KP-!$zU&rhb9#4hIWcrFZC?vk2kmV80Wist*XRx2nm- zjmL$>MhkZo4LmDMKWwydUGgO%JlA|*C`%NMC(U1G(kofG7ynQ_$u&hNN-dxf`Zrq6 z@jBj*&trSoKK6(GqdjOJ+Kcw1KjF>YuKM&uh&UE7uzzx)&}&+v!_-?P z!qm4~yFR@CBHW`Yv#p+037-aB*lO1GyD&vFQ{DD_gV1&4k-DKOO@go{v5(Hzrj~QO zj`!p9*dDfz{bB!T588+JqW$O(`iK7hn(wGTJIYJwS3K;&jLZPRT4LeE+mgG5i4yg> zUE0P8%iB%MPBI=KV_lCbZdWuzy1L@4}M{r%lyHHwyatU0QX{ZN<*iY?wKBv?Tj}XKl9GL&=tN zypH$d^VlA?kNsi)Xb;+l_M-jh5Bi7x8dNHc2)FbTBBZ-si}HvRdT!{~* z2|2h-`?}yAI8oZ}+CAaL;;V^a?ec_&?AiV4!S96Jz6xsglPiQ?wskfeZq^A>v(6ct zwv%A~y?edg-cy!s|EQ*X^-6noP+j=BzO5pgFlt7ZgUMZ3?Q^HAcY~DKjk85^bbw0B zIbO&6@p)_y+sFQ}f3yefLwnJF^auSze-|&jRWv9zTsVB@wyndnV?uJjZ2kEi5{2YP zO}nour3(^G%Z;_lo(PINdTbshycKL`k|{}dDg=k}8*7)Ys~6@ERh>3)vJ^X=SFiu_}Nc; zKwH~Kf>WCGvLom6h3?)eFC{L26ny)YbTYqNBWTAy)+$*o!8B{GdlYYM%ba&ykz*2_ znY#ZboA?K+tW@geol!eASz(Wi)h<1HGa52=@?CXpmYY2|tD|OrrWvtA&FpFamUFz0 z_v7=}9=4DDVgG0k+K2X{{pb(+hyMN&T(6G1c}&=?I=RHn_^ROD#(Aqr)Lmgtw+=-M z4m=mMe5_vWoAf~_k26t!^R8Nm^G|WOc}0RfAC@vGz(t-}Bzd}K1}ibW&*PmvOL{Pe zmxm*gzxQT(r%&&S`aFPb>itA+uj3FFcrH5A`Mw@|wq!t3AJofncOTUJY*OW1^1b>0 zTc@2Kn%VsSa?hRKsibjBpFJ3AvG(m!6L$MVp1tNA!ZL^Xu6OmdVCj}~+IoDqXgSC0 zct1Xm?P2@aANG&-pnYgB+K>LAf9P+C;5+8h+*HBSQm@-)`y4^z;}x0e1@DB%&Ho8@ zp?j53K6U!^%mtFnVYX28qxt_LuRg4iwzX1?$@$f3Z(G!teKOA|QEwW;s@>AtC^;Lk zznXpM8&R2E$4V0 z@5kq{J!~KQ!~W48v=8k?`_Uituf^YlTk`tu*+TC8^=8jDy%WYQmy>yTq*}Nz@k{v0 zcxg5;t7!DN=Kn}7|4L!BX-M;X?HlL&J!ufjDbC*I^VE<@j8CjM-PwwbZk*fI@#|=| zA}{1X%04@m+Uafbt$kD3jBTniSu34b^ycpex@?=n^5eHU*7lyqbf50E-hF6Z%Q;@h z`|){f58KE7uz$1%?L&Lfe)I?Z^8|m36@Nt%o7ciZ(}2h8=6w}v49KL+sS<3_Q|hvP zW+!G6p79}fxh9K{yjCE+b`V=GIp}l$A4bgj(&LdATaRQ9>-*-!&z-=gdmg>LGII*M zDKTlkXVfeDUiPUveP2A^YvDvN4`r~luo-=TOPZ!hbjl>j*RtaImhdG zKR(~m9<-1BVgG0k+K2X{{pb(+hyK11jtrVHVGS{I*qGkGODOTNbCtZdFNRoet#B?r zdYZI4AvZ*Ca58yU<+DL&RR-BLaDziZQ7&1Ux;N%cQ6WhW%qf~VxReAZmED*=qmt-L zbyL~1t&XHAbpM)f)%4!vTh zN9|V3nIP+ENka?0!!){1q)~pK*FSf3q%(B$D^_bQpofM@-gwY@8Qrm@RnV|stLevS zBTw}=^r7}@`jH-O18B_0z9aWd3#Q)&CTA&s-%95n%UkZSa64Uj_!14V+|hE5*YSRQ z9^1qAu|Mn|?Lqs{UbG+mLI2R-Y~PU)&N;F)bXu8z>4|RC(93$BnxPJLs?bjMwlJew z>y9iANE<`5dS1@!^kW+JxVw6w-((k>rs!&5F?JcX8YwJry1JISwUyp*OSe<^QZt3&cfx7gz**D#?~0-)%q`^Vm+hg8Kjl4b)h)W^9Ixa3_&m0U z?PGt~KiY%#p}lB7`h)(Vzo`x<7RA1LXS(dxgaX|)6{hVHLY@x$QD{17YI*6AwRNTv zU0S&=GH7SERl{`Y%ym*`cs;_vApFBR&6e}{?~4<=tfXceHBz@UR_V6HK}OE&P2meg3}LH2%Js z27liSeoqF!FT2U#H?!dHn=Rq*n^p7o%~JULW^Vj_vo`#FGkD)@5r5w;=Xf3O$LFy< zY#;l>{?Q(^5A8+!(I4~={T<22x8TUfH+#*;H-quP?D_a+JNfu#FrJtrAK&aSAKxsT zk8f7S$2XhC$2U8`$2WuV%V2!7wS0WHoa1%8AD_qeuzli^jGV= zIG+p0Cy4X8U@}3R&xLKl;(RX9IB`A~9@U8RxnQd!&gVk1AkODPN{~383!jq3`CQn{ z=X0U2qBx%ml1Acu&X(}`oYm=x^EqoABhKe7=Xf3O$LFy{?Q(^5A8+!(I4~= z{q5UXT))X`zJ8NmeEp`&`1(yv`T9+x`T9-0`1(yp@b#PK^7Wg};Oi^B!`E->#Mf`S zm9O7)7hk{WF1~)#=Y0KcImhdGKR%D`Vf)x0_K)_UeP}P*kN%*4=cHbQ8p-1|`hmx56ymj( zbG(lC}&*?oLpVI+6K5se4>v%stkL_Xm*dO+f z_Mm-eFWQg(pnvG^jXE(OBcFIaM$CCWMq2ZHjGW{77?I%l7?rsx=413Y&&OyFo{v#q zo{!ONo{v#)o{!N?o{!ODo{!N3JRhU6JRfU0$Ln}MK9B8T``91$kM^K_XfN82{-A&8 zZ(XXGe-oc>V*X9q%Zd3nxyYZVo_|w4o`2K6JU^zIJpZQa zdHzk^c>YcEdHzkW@cf(ZyRnG3kO%!myoH?Pcndkl@fNax<1NIF<1JK`<1LhMyoF|PyoEmFcnb~Wcng*1 zcndwq@fJFc<1H=ccpdM@=dnF(AN#}p(H^u9?M3_1AM_9XZSN-HYvkv75nm%`28j3? zx&Bzh*NF2k5nm(EIle|7%o6c6qV-wC*NCH@h_BJ68zR0&53CmPHM)P0h_6vYBN1Pt zmPI1IM$b(V@inT`LB!Wu&ha|lkI!R!*gp1${r@lW&ND2kWDD1d0W$*Tte68LC?e8T ziU@)cj3_85!3^erSyaRTWK+`d)MmTyK2>{`o5Rj!|mhta{DX~M>Z#)UBV9dJG=8V6r;6GO zboEpbK3rE%757f+>Zzh-16@5;%y!h(Q$^xHT|HH5>*?yLvh539JyqVWp{u9Lf>ckH z0rzzERJlG%S5N)@HNVft^XK_|e15(jU!U8m{-$t(V9wS}*ziHNVft^XK_|e15(jU!U8)VOSe8I9IbWhV`6!*ZhcI&q4hD*n%2jJ=CN*lOx)b9TOSi0XnjnS*sfb26GeOJ z*2l!UG~N1`*h1@LBDlV8eM}_L`j`l{)vb>ShjF^~vEN_w`+Piqp3leU=j-wHxjo!I zZZEf=!Csv)~$z%?E$*=P|@vyZaq}2o26S16{VeY>!IT1X5D(|@2~lN zKAu0%=i~G9_4xYS9&R7Em)pbo7frn0XKRSx zyJsWue6JTLzOU6-;{Bf8LHyrx?T825!icz|t0&O)L*41`^Z&3tzuNAc`d+0pzd(Si^p6}h;#P_XLhj_m`PZ0mN zz9I2|vyzDq+~pwgg2QZxAH1U+@r38b)AulACjBjl`yuQ9)A!I~5Ak-r77%|o_z3ZM zP5g+@yZj9CdV4k@e(#!H#PhxMkodlO9f|jAoI(6w0}b(j-+er+;{$K6O}yY$-%Z1N z0K_`ikoMi0F+X0DighxovH*-<)PaJ&!k zgWnG(p75io#20R|n0Uj>gNQ$D^OfQc2FJEI?t?e~qxgNmFWCX!Zf)>)-&P|YZ+q~0 zCxTxx{|E7VA9%Wl8y>kK{5Mx#QP}T__<4zVzrmA;|J!;n@qi;w5Fhy3GvWoOwj+LU zm$}3f_B={_;oy738*Vg%_`|J&h)4W#4e^Onz}q&SOW#K};!pn%zlV|F>AnPCHv_y~ zQ}A~?g2!7NeBNf@)l3Dy*95$p6!2(3KmH5B4orwp$`y26rU(6$3@YYP?2m5s) zp0Hge@rAp;Cf;zYC-H|(PY{o|Ob6l_)`VmlF^*s>+@iZ#i^FMc(fc*c*)6W@3r zIKbxy()aN25Ak0Ck17y6sw#irQSAeNH{OeQysqH$HUp1pCHTGJ;Q2;@N976LFY~B| zgGXfrKJZxZg1Z$aesEbk;t6{WC%*9RO2iw!9!UJ*rz40*T(~mviKRF3imh)Gzxc^f z;u(+BBfjyT1mgd0@~5~T52n8+mx-7A_|}*MM;)_7=}6+~W`nOg8~m}I;E$PsKQfZq0#Dc=lla2Nb`fv5 zo-gr-9Ul;n*m^4QiH9yDUa@@>;umWoiD%rQG4YKjKPTStx_7N~9AuYx;vq+XH#Zo( zIXCch7jz}QZW4HNIpFV(2aopxcyo`yn==8wcQ<%*^}(C718=SgcypiE5f8X1cyqzv z&DnuBcNe_5vEa=GfH${wpV^AK+fNE}SK<+u+DLrjcN>UToM2D<;tOqvXMF7t@r{>m zA>Q%vobEdQu}u-;Ax{NgkombG;0wlsFL(=l!M+j1-#rZ;?_%%;=YcQi4}NcN@C8HK z5Z^Z(yx$(+|9XKhSQ~s`y`G)Q56|$Elfe%j1)gvU_`(ap8*T=^U>f*>)-{MvTyr(? zijxh9U%Y-D@rQ=N2T!soc)y0=|26{;_yzdDhTsKHWqvSt!dc)8?*mWL4E*6x z@QB^PlMHnyUUB<2#4ld|hy6r<<0^>v>SN3 zdIKJREuK|gjsQQ@9Q@ra;PG|_KlCX0p;cpv-@6w4Pz&%w4}l*V3Vvu!@I#w{A9@k| z(8J&dYrqpOJ(T#uhTskN0)MzKc*Nxo4iukXmY2)GE8Yx#u^2}@{kxj?StU2?V zrTyq5tt^S}`vAP(XW+#?0}przc(I+p3vLBo>?81EKY=g&7`)h1;KdfYIQaRkkuI{R z^^QIbR$Iy>@M4#N7rSW(@r;))BEGRnF!7Gv9~1xBx)AY@b1xGg*y1ShfiE>7KJdJc z<)?l8a9Pv?Z+8j!z-_??HUXbE1AO3}-~*?D=erDi;D?sOs~$0Lp>~7+y99jTJszKeJ`zHf+^;~#?WgTJ3O_`dl2n_3-`k@4>&%2mD_A`|yACIrr}d=jGG zg7XW`Hx42H;CzJh6K~`zoWF2B!}$&8JDmS;KE(Nv0rDkRXP+{C_d#1A8z( z&|tn0h55rm%qR4XH{SPISxvRYe1qp7zt2Z7KjHZb&tG^x!}A-S@9_MG=R-U{;`tKK zpWHE@%I-k(tM-_0^~3zj4D&H(%+GdCDG>9txP|P7`5VvY)?j|e^F5yb^~QXV=Z6O| zUks@d+j7L4`ike1D=@!2fcYlZRe3(j^HZL$^8A(Ovpm1$`7Y0Yc|OeZW1cTx!Tk9S z=F`@bDppB{CzCu^E|)j`Mw9{|6C8~iTc1^)C;(N@D=q0j`xp$ zxgNpw39eUg{etTmT;Je&2iHHi9>Vnzu9tBAgzG6>U)hU#3)f$`9#b0i8Lrn^0Y?xL(EeE3Rj8eT(Z|T>s*F7}v+R zUdHt^uBUB4eXSMhZBtQy`+|BL*XQn{UdQ!2uIIHueUIyXjZyy#Lp_k|gMSv^ul}Fw zm0Z8%dM4L5x!%e3Pp*e@eU$5^TtDS{D%V%J-pch?uE*X)eU|IB`l#OyK|S}2i^Ypg z?l*-S>b)_j|IR=?_*dimtK+y{&Gl=pXLEg<>)l-c=6X2S$GKk4^>ePLbA6rb?OcCf zje0!S=VMW?Z-Dx}LOnkK_5C)e_y1KK|Lyy{e!=S*yuQKf9lZX*>mj^8!s{ixe!}Z1 zyuQNgExi81>oL4OlZN#gUcb4A^_>4Up1=EfUeDt7Ene^9^)FrzQp59ReyUN7bKQ(jNy^;KSP<@Hxy zkLC5*|Fqq5UqRINF9!N%YRPX|x9?>*uR-#kRT;mmMb9e?;&+xfpbZrA|g@8(FI|GBmx z_`EH_>vadecMf>IRlxUM1>SG&A-|jqlc(Cz-~q1zANXfr)j2IIf6#UYKX@K^!fn78 z9tPfU4e*B-B@vJKe-+nXo#&LR&hK7Z96a7e;PYz0>oo?yH<$eGwHe_1E(7n^6Z~Hd zc);ebp00l~I#-(rUT_rn!4JU`ep6vpN}0>K+L|@y}=t^3I1?h@QA&@C-w!ec*tQL-#}}zlX%Ae zX`Fn#^AjD%@1S;#1M!VH zo?rcY5PaQw;O!m;fA?pB!v{~SD5Tzi&uai)??mu>4}s^~5PaW`;Qe}m|7#2$@Hf-h z9j$uQRLlz=34ZWV@Puccv%YR&T1Bk~Z+J2I!=1q+ZVx`O8+gTb;1?T$XWSHg<5%9q zJD%~0_{V=1|HBbyk2vhk6lUP-o&j(7c4?y#rJm;s^SZ?2bqAl<7rb68@OzEH^KDMN z8uc2y-`U{*jsg#ODfqz53!Vsm@O3yFJmb^g8;=3+xH$O7#lS=6xT}GmYXP3FOJCya>L(a^n)RqDhl0O*20Y%1 z;PVy$ulK!`jz^{43!ZOF@O`g>_sjg>q2K|31RuCCc)>sBcRFh1AXKA;6|Ao6TdUdN z3)cp3I1T(^J>pTR)Pi-5D$S~*Hh@=r75w5I;2Bo{-}nT0$4$ULE(sp;rV!%g`hcGc z{+LPwU)Kk`-6i1fdVL4_+|ygPAAH zd|@x}hHrsC%sk@$;1g$nSKJKz;uYW-9|hkykN9KS8Q>q+2M;+8yxf6Y; zJl!1db%Vg$O#*+{89d&d;Pd){*Sih;-g3m7lOf>yrf7)wy94~+Q1F2Ffe+k)cysD| zslpCzXSpfn35S3$Yzf}*3-E`TM|=!?;uqi*JAz;QV{KB@`9XzMQ}B&V!8>jR{&6Yr zkh8(dO$I;L#74eGdctpwigZSZ#wfXCYbeBQvr#Ov(@e(z53e8Cr#JHh+y1O9JT z@__$~Oux4FLnjb_zw8S`@lQS zuqw4{MvaHs%fuJdJ_awh5b-31GkCg7!PgB0Z`T9-UFPx51)ui~c)iT;mEie0g73?` zU*`WF2M?I}zy{z2Ge4Ml!WY38P9UD7>JR>K3-E}UPt3gHH{chq2G4jY_{QVFJN5zp z*aAFcAMkQL!OwjRp6(&=b@P&p+IMrVEj_^By#yZbH1K)B4^?%*@9hqrZ$I#T-N5_3 z0se0|c)-jDW?nG!gSUYv{1$v+<_&`%s=9(loC-ei6!3}@!7r{!{7_{DzHt-qj=jJ? zHUSU0QF-F!nuDKv1w37E@O9sVx6Az9zTojrxlDXs!_279Z!5d0Jn(y0f#-V(d|&4M z76AWO|Hv@=k$Y!J<^wY?7`)hgJHCuS{^Vouciq9`#rG|bgV%eS zeh=9QJl}5M`!esB`M>Rn2d$V7{0h9_{U%l0-uCyAQ@|6x48AaU(DE(#!^U)f$=P(j zsh;2!<9<}kGxi1F_&RvUUBN%Lr~6y$1zxTh-Tz`Bc)EkY*KI)0i^TII@jS_N@Od4< z>n+r}%95&UTxA9DeAB@9?GN5B^M9X!2h4on_232L`B#0YKTsav3!}e~=s)CT@Q4Gz zCq4;Yu^;%w=#SI^@Qu^JJ4XMd9Sk1wpvvL*^*>(|%{mWSW^46W90X5yE%>^Vz}rm# zf0uc@3E=bA1+SO+y%)gqJx~4d@4Vk8#Cw;g!2@PK@CopOe}Es%JmK!(3!8v9Tpj%3 zm*5dIpZGj@#lyibE`E-9#xCF+ccAe}6$AhH9gSbw58&k<2S4{Bc)Hf$>kbBQcQg3A zv%%w?2R`ps@OpD-e3d7_^L?6|6; zK)HiIyp{3=iTpwCpnO8!0>8Kdc*cXkH*TgO-f8b&rF$>ka;H3-EYTz~}u0Uhg;Xdzt6E1bkoS{gwp(wFsL3zr9Pcq`?D3i+WzzNlO&f0W7K7cT_QI2(N97T_J%qI^_r3MU@2HRY?q z3;f*T3B=QN0$(>4yxlX_)sq&TEhUq{;~hu&u?z#Rw=np<%=2Zw?>O*&kAeSt6g*(& z1783ycn$c$%oC0UUzmBr%pd*=9x?NYnOAHHez6UB#<##XehJ>OC-}!jmJkoQ(?sIs znt`8d0iNy%@O4Lnx6AxpZ}52C!RPG=UhgsRdzt6E1bp8Y;Qba@pqp<=%)jJUnvcoB z-~~?xKll>O-=sD8!aKklen9g*Q5Zbpa^MqVeyB!*U;Gn1V{@8MYHh(gE=coD!Sl~& z;N|KcPjm_Ia6=3MPd5~N-KF5|#)H3G7d&3(^E!an%lzKC;Q7u2-xu>~X$}7GHt>M+ zqWt$==-65o0xx(n_`#U3%WUw4kJEf!Vty|Jz#|qk|5qQW9-wxEU%Ul8`db4R-^ia_yNA|9PoBOg1=h*N^lhl_wm{1ANNf(3Q;J{b#s@s9GuGftrTp!Sb( z{?+R}Wr?p_q=K$KDPDoUTM0bgO5pQu2d{Sk_`S2i^JTs-^M0?#*Bd=cQ%*7uI2nB4 z8dP7Ej^GEs0#8`)kx%V#FMatCyy4^E51$2(cs}^V$H6OJ4u0_^@QkZx65sf*;{3Ds z@2@7_?xW4b-yH-VZ#MY6t-$O32!8J+@O%~czCWlQE~kM1dmTJrd+>p8gBRQf{NNSf z3Gb%*yLbTJ@OAKqoxvks13qysc*TprFWv&4@t?)>cmFT$5|4M`H{$c|1+RAm_`RFJ z^UVO?w0R$&V;6U(#mx3QG!4t0K zwzua1?+4;Lc*AqSAJ(V!II(gG@rlD|y-pbPCw}p-w)=l|+#oyMdZo~(^-ED2eBaLC z{W^jFI|V%8^WXzVf*1S+{NN({2bx4bzAn~+FT5DM;RoOk{{)ZN_8#$xPn0EI@qZe} zXdlwo{I`FfC6Yd8KlTG2!+uD+HKb<<{Yv}$n_Z**?u&2I{_n(6v>$xnGujUyw}SKl z^JpT%dF=2TPw_ip zKUg;Q!!5ynz^2#_*&lkOMbPK)eqdMVH#$JiP^1~{??1GH^Z*x*kRHM{k@O(19Z3&k zvXAsYr9P4#s@)CJgV|1_xTpR0{?WFM0#};W|Q3SQh%auh5$XLw|J``+@Ib zKlD%R2VaH#@av!l__&1h5Piy$9wbEHS*M37(}wgwgSDiGx@|#vumYt>4>ztR=>c8F zQT&tsNAXYGOZw-Z*blZE`{8b3Kj2vGhn#`^pp&p4_5$=~DbQc-$9`~M=yPnKS7{18 zL>BZQt0#~i#`GEKftqh2J(ODq(t{=MB0b!c)1(KSwTSePOQ4qz{+n_4KSFx`G0RBb zzCVcc-r?8}*An{yt*{@mKlX#Ne)16Z1HXm7uJ_ez$7-P$ZHfKRBcLaYz<&6B&;zW8{;D_hAQsTWupTH9 z`iN*bh4d`+<95KXeTCgI|Jvav}7DkD;$?2fbMw^jFoP z2PyzP)W>MjgAIg!!?z~s0XOa-J!Ils(u1z6LweZGE~E$E(uMTUvo?_)yvBZtKlCr+ z-W5-N96p`NpW>E1`87WxX7SL&IYE!q4Eh`^=vCT8ksdbIpY*^(my#a( z#yZl2JB=VcymkTk0W?@nehA|)P~5BkB<^-Q$#2EG2lM;Z@(&L-%=8~KqQzTYINXH%R@QVQ|B-<+$&aJw74oNO2tB}J_!l@p57Gzvb{puu_dyR; z7kc0*=wnl%2fPXWvq18jHbEn#FZ5T}p$DG>J$##vq*w8pOMVE2`j8() z+G6s}Kdi8$%Df4|-sK=%L3z4{ifJ zd?@??9z&n=_&xbSw0=W=7~`GD52U+4`Jpr}+Fa)c)7+l?aE|Y!xa;}S-<^)+mvp>4 z`3D`VLVh}1?a5zeT~R-s-^#@iU+@Zg{(;c9*N5J_BJ|JC zp$DB0eXN9D^c3`y#h@qr>_U3@K==V}uR)j!A&rfn1Q z!%00xen4ZCozCZ=G5mkdSEYX6WF+||O}kJ2L4kSXr&Bte{AJ88kl#v)Jn|oLfF7th z^ic2N*YNZ0yun2>2TK#^0W+X)cZMEx1oW`c&;z^Tb$z_g$5+JX`FwnSYg~`7&+Tc6 z_Hlc;{TvU+$MJIf{C)8E!`~NwfBb#&_uB>E_h5Yg{Cn{4QyzLq{{8s(+<@PgfA3WM z{(L|1{lWJO-#>gmdEx%z`;G6v1l*5&fAamx_b=bie1G%(&i6k*5Bz-a^TN*$KTrI8 zUB~mr&mTXJ{Cx8B%Fi!9&s*?(r$YZ6jOSk;{edm|hZ^WF8lnH#hyJ8A`js*Ytmoff6#CU9o@%atL>jfCUEij(*_|D^f5d1(mAK?5T8uBN1QJ;NB+e5R5J1_&bK)KDu;ZG^E1xZ z9>WiU^SSBp1L=u;Z!7Y@56B0@kROgfzE}nMV;nF`7h6hd49YZ^JSht^L*L}ek(lR=J~f4^KqV^-@|-;5$5mbFrVLz`F(fH z_gyjnFNJ!54eA4zQ7_>70oN0_zQFZ{KgP?ixn9Bb3$AByeS_;AT>s#DNFeGXTrc7J zNet>KTwmdO%TUx`xE{mxnK;yIxPHU+9Io$hy@%^RTo2;sws!;`$fY!+cO5TZ4MpYt+voP)`d*eJv36wic+r8KWLI7=BP6QLp3r z9oO@?zQ^@GuK#g8kn4k7FXZ~+pT+rS|L1xo*DtxA$@NXHcXIuc>!Dm9jX=GW>!(~# z?Tz{>*IT*%%Jo>T&vLz%>$hCb<@zqyd%6DWgL?3v#q+EG=lV3)tGRy7^=z(hbG@7E z-%C*s=lVF;%PXLM&h>PzuP342&h>Y$$7i8F&-Hq)-|G)6X6RP-wcz@G4C?*A8rQEL z$LkZkUcu`Zyq>}98@%4Z>mR%x5{vbbZ%t{vq$}1>Jh7fK0DddWvEDKa>n}ee$PbU# zXL!A)I@WJ~wf%qhI9`w9^(kJj;`J+D&*JqhUhm@dFJ2FmSRdo{GG0GBh4nOEU*q+* zE?9r#^|-&={{QxKydKHxle}KZ>zBNq$?KcE-pT8qi?ANb>!ZA0S_$i?yq?PItGwR& z-?p1SpHy_OW1WkSj{UcPeS&E}+>8yhAFz6{FH>5!d8jSonbYf7pGVpN?1vqU{lHtX zA9@}3gZIaN_`%Qve1RUq0eX-=(8Jh54>SsTsQT%o2m5c^|DS&T>EcQe=dQdHy|Ewg zm8VXhBVJ%XDDQ{$AU%V&5B5X9!hY~!*bhGmdVmSgL%f3?#0h$sMbHD;K@VjDJ=iYj z;mUj_J>Y-Z{$D-5Gxme6$9}lZ*bn#_`ytJ+A2b>JVePRWI1~G!Z(=|AR_uqL0X={j z^bpga2Z@CqrZx0H`m}#kdl`DLnb5;MgC1~&59uL)HIBbJ?oK-GhkA_tU~RD)|`m^^JVL#MC><4qgez+^x54ZvQA-`ZhDD-s_dNWxJ`=O_j z9!c_k_@|^-Q9rE47U@#IwmJ$uNLA=zRzeTt20hew=)smj4;KwRU>fw0InaaFgdVoA z4e5c0?j}9-pT)=jzuu4b1KD6d)C}wg+kpLWao7)NiT#kV*bh1$`(e9aKQQlyPQre0 zH|&RJJ-{Qk9Jg8(E!A_R+5fu2JT#d@$#(8D!?9`HK!ke8tcJq0~%XXt?k zLl6BHdT@^KkAEi{(0-sE*bfzt{a{(x4|fv#0e_JGS(e3q&`;P8%lmZbWs_2=f4S459QFft!hXmr*biD5`(a05Kk!uS zhvxm@ydU0+^rC8OtWG~E-$4%oeVu%gq0^g5Kj@*3K@TRNhie2qAnPGtk)A=N)Bb+N zdf*e#L$e;d3-s{s;RnEe2zl^>Fia*t432*m_QSbgKj3xjhrERSpmEp_>yQ1wZLuG^ zAL+g2ZQc)0dSJzR2-btJ9)|TmtcNm#9*p&HtOs<19`Zf(ps%5ay#qaPI`q(a(1U-1 z9zFzq0JGtTum*k*OW}tx8h#*==g1Fb2=)VJVL#+M><7J%{jh1+54<1yp(|rQ_(|-C z-v>Q_mh{i6I`kmNp@(S(JrL`mSP#Z}IMxHQ9+LH-tcPVius8J3)u9Kk06lyR`~cR% z55XCJ5Weuks184n(eOhVf0+DW{IDOg6!wEUU_b0O><9iy{uGk;gSW+gc-8~39^x?c zAgqUBJy0*`p}e36ON1V-67+z5poe?|J?I7KVN*$uq*xEldhj{W!w10+fc+5I4`L|% zFj~P6w#Dg z#d=jgXujV@T2*J z#VVQfz>4*dtOsR1EbD<;56yaT*2A+O0Q(`ZAH*d1VT^_!NE-Z5YQqoa0Q_*ezz?V# z{E${)Kk#_$hi;Dj;5V=zzB=>(AEAe613icy^f0UkVm%b=!B`K+dO+4gzJ?x@^{}i5 z{y_RkSq6IW`_RL)9{~Fy=)n(y{V-;cUPXD4enVNn4<-P9ILYt>Dm;(;klMlzDi-^p zw_`u}8|;S{&;wk99>N-WkXg{fe1jh7GxSib2V*@P>j7C0$$C)M!(KLSG;riBVZ(Z8 z)`PPip8WvW4}tw4*bk!#{6IqBhw>eMFgEbRxdcBT4g8SSvL6)uu>7ze{1EoTcZMDy z33`Zu_Lfc6%5rik^e_vc2igif6zjoQ4`&ZO;3eoGPeBjLdf0Z*16PF}x+wJEtcPbm z0QN&*KM3~2U_X%R@Ix65KbZ3H!)XIQpzrWQvV|YiaQI<`!VgSfKm11M0SZG8F%f!@ z6zE~v?ap<%Jg25?1wB+7=)qVI$9h24L$V%}^{}i5W<4~XZ&eU__}lOU$RmBM>;*rF zE%3uw0Y8uc>Q5B<7d0JzID_B^)DM10Rj7YbKJddTLj9L^1N_izpa;l+9-<)hAm5;e z+4@=Mmn2i5hgu9h*k|fbWft^+W1)v+Jt*s8$DBN!89rr%WIZ(N!C4Q_egN!;zacPvKd?gM2};ACMXRkdR-fr|`p?1V6CX@Iy0&AKVf6;d#X9@)uD7dYBc^ z1D%H+Y9{nxtD%P*3_ai+=phSG{v`WSJ|$TX%z9|ngR>r<{Q%exf&C!Z55o?AAp78l zQVD)Aaqz=g20tL^CshgfLB+xk>jV72PQwqaM0VQ3bt+xE8h&_A@B>_5mGm$lZjv6z z3wo$`(1Z1b9**^Zv!I96Jf3j(c~BjB0(w~11Am1cn)TqUhi5+k_CrX49|ZehupbEf zp|Bqe`{A%3P!9Z%`oj;3{jes%4=jP^6RIBk;LPENw}j>&+F<0t? z0_6lhpndQ|DhEF(L-=8}fFGC>{Lr4j4{j&b3$*9p2j~Jn#J=!@ybnK2j+g&_yG?q) z&d@{Vb?Pv0`j4+-0raqyp$D!HJ@hc>!EZqi-v)jF^Wlf!MfDSjdWv*|9|-%Q^no8t z0{n2;4~YGcT;Knm< z8hX%J=wbIm5BwH-=%dhs7m74nK&i@WV)^`k73JAIf|9!DLds zP5QtOXbAj}(%=Vm1AbV&;0HDVerN~b2Unl!ed0F!0JZQ#)WQ$atUvi-#<-Cm=pWn)C|~%YeWLoUTn|6I)9?fIfFI%;_(6VxALbw9`qkH?3`h@M0eW!O z!?Pd2X!s#?g&)LC_+hkyAIM7hp}4^hrVRXWBH#z)1wW)1_(2814{H?sz&^tdEggPv z0)BW4;Rk36Kg132gIxWT{4jqtzP~zdcze>r>%$MAKl~6H!w;eW{4ff@59A#DP!7Ql z#tnWr1K|f03_qkK_(8#6M)rjt*!;HShi1cmaI_wyTxfkp8wfwdCbWJd{;K_d_kGJe z@&l*^KZLKx$Pc0}{4m8R zhHCa_KJvKIAx3j=_>lL5+kMu2?rECyW_~N-7Lb&_cj{W^4F&Snuu4Br%y=i7Lapfh=%U1C=(<|-Y z85q=7nRoxPecu&3#jp8&KAu0%=i~G9_4xYS9&R7Em)piT=R2i)c$T>1;z5kC6-jJ(oTerI&ISR%0yAOkmHI^%Xf-CRfe5h zSmK5#xxn<*qgh{sWyx3N`qZo-jZM=Hw;ygQgH9Rw)w63OC%*}vP`!N{nbqI!a{rd` zHanhFT5hq{P6a-&sc zShH?JRJ7~SshUnny&E}wKC79NXy;_ut+?>+VjH??l!N&0Y0xiy)htnY<@gO-Q=`S| zX+BFb8a@==CmV!LyIxSH&FC|)bfsGI%APYbZ>6`C6^efxv)I#CUO!{^y6+%cxz2c$ zO)K+wo4ei6*+ZFFUS2evJrkL)`G89?kT5meCqK61;cVTP5GRd$@hvUT#0f!|`#v z*ALxlIcG~7P5sh=TapR~YpR~pUs7Pi4b8DBp8d~ntt5t@oKpKqQXlcuwu$-c`k|tW z?XZ0%hMf{`4h^rB=>1AmZ8mkQwVR=|F#G9wwqJ93=6lkss(tNbT-m6aE1x>cZ=u@< zjLvkHmD?H}h-ngU^LkYCEy1Sls`iBs`qNALD1OcF^YQ$7J|CZ-ugBNt_Hg^Sz1)6| zhvVaTO>P97j;Y&T6LbGqt2)D%X-1Y$tJ|RWeNCR%RoksIYKhl-y$nAE4-_S4RCbaP ztAs(K;j^*bE{MFJJ_j-ieiSLzfmv?rHCc>jmV52R~hKYfF zb6c0VzDbnMcr;9w}eSV5}NA(ii8=A;3j~1CFc5W}5d-?QlJGPJPws2s( z5~qg94FS=id$dDj_Xlq8L#oEx)E>NRNWm)ps-V-;^9emCD}K%I^YQ$7J|CZ-ugBNt z_Hg^Sz1)6|hvVaTPuk6?T*cE_(`RtE>UEC;8zApi znRjAfuc5M6=Jy5ToQKNE?;ll)FBfl9$}D@x=^Nuz*TBo?I_FGR{F>kAGiV+>| zyPjG;R$Mwz{&ev!yG7cZ>8mF9dmvmq4?Ou)U0=qov>g)Op{ZQBwZ_x=fsV3Y&mvW> zFZGc7TXpYrzwRjMv~<6vTkTOYWY_(SpwjU+V%VyEZl@-xhZBtUmiaJS@oRpckLSNJ-$A-hug>P<@R$t93RKqa8~KGNYPL8t%$Mv&b>P|7wTU&c60xzS@%+E85Xs%9Jhs~sB|eUK>sDuOs#xw+actt760*j;hLdt9nn~AEFCDMPca?R| z)Q+3uG(=8%J+q+sH-A}apxwHLU;O2kP~)nuMdNK2haGHdwl6?6PSy1Cd={wqHNVft z^XK_|e15(jU!U8sO%`6uGyS4D z6nwWz7c-4m5S*S+t7w3jI&FsMg4!|S(413dr6V$h!=?@=9Fxn+`N`9)QbStG-}72-eQ8hntp9h+}Ajpty3GCHtsZAIWPP;ut&9E z#jp8&KAu0%=i~G9_4xYS9&R7Em)pB&?&$18B4p9aQBhT%ilOf`o|#3BWcwjm<%XBAl;e!k z8`XWHj5Vm<(Bx)TwOzL>Uqk)}_ypiPHZ5t4U3=<7`4ZckJvue~y}8Ci2bC z?~4?_=J)w{{yd+L&(GK6>vMa!ecWDdKgYxIalGk~mUZKwduTS4?%DiI>u61kIC+0@ z(OgXt>uZ}^cW);uFVNgKv6vz1tl0mloabRNOS|EQf5|NIIkZrU=CYAoWHzH~z&A_T zXwUoAY1&@0_RbTg^3`xD&TZNk7ClKWf1my1bkrm{vuMvp4j(XSnDF?2$-W>!uo z)!jE&^JA*Z$nb^jME7mY>exlh5RDd$SQfeOu(-F+GUtPPmI&Ej=vuy}TNb`?H}+(g z*3z+Sp-Byk_m(5R*L%68%Lw`2tLkyTqLZb3X_&gC&}3l1e&_q2p9g+E_<7;yho2{YzW90L=Z~L9em?nm<>!~5 z=YRV7=KhWQJMRCuKji+A`%CUWxj*IpmHS)nf4M*A{+au0?!W)({+!1%9^ZJpmyt* z;ra>JQ@FnJPuE+x-o*7Mu19fwitANezv6lp*SEOd#q}?)hjD$3>t$R&<9gaZU0>t+ zBG((a{>b%6u1|8klIxdT&*b_h*E_lX$@NgKk8-_~>!<&8J(cUpTwmsTGuNNF9?kV> zu2*yYn(NtI-{yKZ*T1Gwm;clCb6!8-^#opD;PnPxf8g~9UZ3Fg3SPh9^$cF$ z;Pnn(|KRlyULX0V*GqW4h}VyJJ&D(sc)f|&pLjir*Qa>Bir24rJ&V`3c)g3)zj!_D zpI#s1^+8@QdPvrGQUT@^}M_!NQ^+{f@El&*b$@Uhm}f&wqM7G;Q~irUx!X zYDbhD7!YC@ukHAH(%S4E7qpFgw<&hdIz_wIsgF3}cVGMFebKkW?qq6{!s2Y^u6w6- zYCf$`j^?}8(X&*P<=kS*_~O0xjW-)9(;rjs#dI}PpU-c2G5t(oS*cB{Ub&^sWxdbs zhW4(}PDUnYUicu|$|25Ey4^N-*A}l8-dC0Bc$Gt+S54`BvI3o7wx{dKUUYqNoZ2HA ze9*N|wCJpBuP~$bizTmg@rauxbn%I0yL9o2BHwN}w5`5Nd*{}(%;Pi9Xh+w37JSG* zS-YswpvdVR?`zZgygR>pUZ(bhm7HkO{H?Z7Si-zUH@|3i+^^i{Wz8b0Q*Pek3%!lh zsiWaDN~Ts-nLpN@JepovMJ?(0^Ok{u?3<92=&sjR*3D^uG^1K4`P{RXQBzO5-{a1r z*Qy@9uUzSPwVFP!?$Y_>F*?80(DmeYy1q1}_J~n!bnO$yeRb^>4XOR2J;ftF-PFY= zB64)`ikjso7twS)sEsx~zxeIIE84d6Ppz%$aaSv%Y#J53ouTa_Vh5FY@LK!gbGZ)( z_vdI`6O*4_E32n6Mo-L`a=eU+m>axj=)Nkd$k^hI#yHefubPf?e}1EmO1v}f`Rlb6 zq+Q4=y{6kc$lXpG8l4PwmeD^7B){93UMp^<{5rk1X>=*FJHY+AEq-`^BVrx_HE^rn>mVGDBUwLfdakYSz6t?S{J< z_X`-`(3UQ_w(7`FY1%fnUFuCRex*%)xcJk~TG`r})yjVCS-OBaR-^@E(Nal zlV46*L{!M_CFeg{74W%Z85_J-cwcRz<5gGsyvn2V$tXI%TuIlHmUMl2gxVudQTt@A zN4oZktL=5|7yC=-;t_A|=;9M4`s(5p*KE&M(z|?0JKSI2qRyuK+Pi7%2lR`5rqy2U zO1!Co9fDLZo$oOzco_MO+T2O zR~Bl0x&5}U`3Xs&U0)_pd*nrGpR_5dYp-ZZ?H7vT5kp4n;uF)`>*5uW z=WlIUlYBwjb7=oKIU`;BW>n4>pWt`e%c0#mxIg@=9r)(_ncWi$slg5Bm+!Ztv|8=8 zWQAr)Mb&!Q_`x~F>Z&5=oB!N7q=o8U$h74LKWjC0bB~r!7F(%+Tg_kZoX||#?hC#h zv%ysw+f=DL<&lq^TkK+P>0U!*;QGs_=6Tn*nN6=%IeK5=cr}AQug1~&q$8bQ>eKaP z3%b6XOYM=@sD1JWwO6)Trfa|GFj^On80f2uPh_3Y#VekcxcDtcFHsvZ`eVTt#?Q2x zf%{t5T$rsLFsWIs@wW;nYpa(ru6>Iu$FklZ)7lxUok;}~zU-=@&e_{mx?aAqn)K!8 z=kHrARku&8m!!68uRIgu=H1AVYWc<1IZK;a$R}4rw&?Bikh6`CPaSoBlsxOOvYKP# zVKVo&d0fu%n6`MW@V-?d||cE#(oL0&FJRPIsJV{=QE zRUe`w!vj4lsk=`qpR^lpqFVcQA5=ZiOj$iH^L5c48)Y$e#02Zh9o6w7x6F%Z>{R{Y zZjDPhTFHPel}0|V?k&e|t3T8H-dH(wS>CLihkmlYadc#%&(&>w=(QS0?<*XyD$wWE z2|AxNqw`Bsx}KDDeR-1FBYPawwNF-$)3sOTz0$Q`ex!Irh>uG*ORm9`m!puNA9Bb zNz;zH_R7`ub?ukOC+p&o4JbZgJx3R>*m-nHlP{kiXj|PgS$=PNj&?5P4_co)~%8A}r zOX+ykmOiiU(D~#WI=|db*OS-j`f>raN8X|K$*0s_sZZ^fD=8k?{H`uOksGaxS6uhs zQo2-Xs$R(O)pX#dMgl3;M z?l)8RmlrNuF~mj%dcW%VU`r?U;cJ|4ZoG@ydCPsN@^V(!4dVyYdu%5+9~)jnzy4V1 z)~3JVRf}12blD#RZH5F$i?oLA-$Zw{8A-3zKzd(oq2twM`aGXczM}KX;dDJ|PS=-H zsXg)ywNLhHq-(EiPVJY6GIa6CX#u+U!~{QGyuxgHA@lY%GqibAn%9~dou>^j@V$|> zw1gUzJ%6S;Q%+s+{}9@*T}@@$@5Sn&+6GD${p#=e%v|m08Bryod^?pj%)O%aWoPxX z_EFPOZF;NVXY)Qr9PX(aZ#THNV!MO9RnNy1qnvq@wo8q%peo$_>>%o{afX-uQ{uu~)iVl3M}w(q(g*Y8^|f_}i(A=cZRs{wXh4hg;QFO&0FB zSh7iD6*T2V#`;?=mH(FVUZvyPtI9vuFAhD|O%2-;+oqLQUlm=byItbZ-b$PEzShOE zPI9_G;qugI8?w4jn2r5EI}Z9*M&w`K6sgi=jaTB%+y+xD?kzLWH8dl%@S+AO<#Kz~LL zRjm7flQ)fA)q{lTAu*l$suhuihHQD)S#~~iLw6RrxJPuW{;+kdBjS=C^=ku0#HvKnJIu>N6TqKZ@> zkkDN;Q+-bq{xaXOwQAtu(9kWhgUTynV7$A9v+6i}(8;$Z{Z(PtZ=v1o`>Afd9KL1O z>MG}6y?4KKuPL&@ncfBC!spA%SHu?-_-5G*g4}JiM~PTdP@3&Q5Tw zV5ic0XGXN~b5=_N9(P?ZyT3Yc`c}y{8~Ukew~A}qE$k{^ye(bhMAQ^%aPCrE)a&{3 zrsquUGmp8y|K2I|T9u{u)k`{F#nb0i6rE4brt`~mx}Kay*OxP?J@P!YPexFCr75*v zHm7)G#Bp7G@_18Sy#LzY```L}|6BX>f9v@DZ_U^Kt@-)Cbw2iQoqzvZ>n;D*`r5y> zp89XCpZ{CeOa86vWB=Cm(4J?jtX?-FO#JHKnNw}iHXn4~PvEJuk-x>=V$!E4`G5CBhb(_ODoiwtTt0f~k}y#>?ZRkH z=6W%^V&Vzwc3Z^j2Cmn(Rf!Xw^<1pn=G+ox^}mjr(({8zu3*zAGCslRIP z|LXluS+h3%_B%I9Z)S8T|L?G|jx`tM$9rQ?r^zGchlx@h<{H19xLzEsTc_}Zdy%49 z|NRSBl#LSCs($;nv2KD0{aCiUug7cArckV3)0-t^?17&H3h$^Rm7Uw2b%!iuL*IKv zZkB5&yS#nYy`aWUE?D@yuYOiLS$}~;gsN{Wix?d>-q^xg9kox%YIw7Qx^Dd8-U2sk zRj1H{+bYWFfBro@tm@q3w|MK09qzt6|8I{Q=QoDs-`6cB&KSOSe3{gn!po6}&*yq%rBuv+fddI}2ojwslZ|@wNx_Sr24(HEZ4z;)` zTz%9VixFSNp^kMUFIB1}9h%D$cUHHMQ`)riyU@i>HqEtI=Fq37Y}-Bapi_4@`Qr3q zwQ)p$8Qk8p_>O6|GWy&EgC;GyDg9f|nz(iKP-jw0F6;czL;Wn1`*ZDk7q#!s_T*j* zjaAxai}VAktu%-Wv3=M=Bg38Q_z$0JE+cHdth;4cTNZcCdK%(eSWaDe>ClP8H~;iL z$Z^zE{4L(YH3qESod4IdX_bR_^8dOSxo%GI4-@9k%f?MV5hkAB8}C=obfcJGu0>Yp z;(a2^yJE}^pR1y3i*Z_qS#QPdofQt<8e3A|`(L zrWtEmr>%!fyI@gZc+g;JWp-@gNjq10vthaK<(HW&laj6nFa8{&?sT6xtc!M7ex3E+ zC~N(}%0-iX(s7!DDsz0^-T8&Br0>4WGmp+W$W_-CH`}<%R$eG=v83OAbLmmPXU84m zt4aOkd*|NO=*i``eSY@*nJ%7JitJVS=WzG+GuiJhu^3^$n!fi*A1eEN~@bulefA1$XFl$tgZ_> z%09iySNuB9QyC>LiHOzrS52mXx%x0}qJ(?S|p-&^f+x1!wVJ>ZzY&rNN6N8h3XQpP%0m|W>RU9Sxr@47HGQ#L#8{;nm;T}4 zkx9x*n-G`&^R3o<(J^lMjZ(JP#I6w~SHx!R6E_Y%7svTP2 zhxY z{#CNNPWb*rG&4AU@m6YS*{E>m&8D%2By(TN~7vB3K zEBLBdF07E-t@A>@&&)aZb5cE7 zp>STxfyAP+wPs4Y$_eShbBNm*;~U3>@x~#!8CIJ`;|33ce*2v#7R{J(F#qpG5BE8J z^ZPHGqOmV)&kPgQFTFSU_&iKBz2_1d;TI{aN_(GPGCEe=$Z?Hx34J8857}34@v)F> zCN4j>?o?Ms+i!Q?S-hRxP|+!4?aE$q&Fk6GYhU`v@-??ztuu41G|{u&xnS8iIV08a z+OcVa<@yK5P3Ir+Qn@L8-%pt{U7dXG(bnbGY_%?Cxl!fE6IJR?-~RS@I;$e>gU7|6 z866kuGwfFZ4&k9DSr;c6|i3t|zy~E#$S#cI_mFgSG@Gc1fyF)Ex z!m7RV3^sO`(d`eGKb1CE9+=+$YIwT8>=l3P;-|tBWrpj!oumipnVqR)egSi3c#69ne zRd(;$CX%hpH7Nzdg@>kea!h`_gHtBXj?Vv`TW{JmY}dm4``b2RotV2`R9vOa8?+!& z^nSVS(2uQ0#GXQ@4n2`+qU)y=t<8CTnfAcY@zL}~@_a$_s?iB{vR;qw77GsdmwqSu zbsCsFLVli|*}rAjM0t4pb+;DPCdrDj=X$gG9`dtV6ZPc67}a#)6RYbz1C`0r>LGjM z=d1RUg975R1JtO9eg(cC&EG$BB)66Sr4h10oJmf>a(>df@9uZCj(E!jJx?t9`J=b= zTrD~;n9@$hH1g@0>rzJ!SrJvB_sAb&RFkdQjmJC?1&4hL+t(moTs!k6>%!>GqI-8| zm-eIA3w_t5vx)g}=Y1-$A}0TN-u1}t(V#>5<93UfYYUri6edmuKVCVwU*!4sj_vE6 zBBnfUkz6k+M+CiGZ545{g0v1ScFDYXD>-Pzo$UP^oaLoy8=fx;@|MlZzxT4OJ5IWm zwXf~*VUqNi9kMROcZ`f1SUPIq%w8(A?*iwE$LFX=eWJr_bqiLT7o9k9sc4`Y@A=}! z;N~Op_dhykcIZ1;zMTJj;N`<(<@J=}D!h`v4AS(Ei~is#&lJqNu_?BzG+G)reb&pC za@B#`!%PoWl=oa;M{ZC3B+T~5cQDGiD)!g3Yf`!CZsF_sIiTJ7aN$0r;)Jd1!i2gp zXwkC#-`QpHj?o(yg^9?uS8twwuwG<58Nk7!TAX1C!DWv{=)f8FXT6z@Ax7ADd?rax&eu49tAc!v^E=M>P9p!~d@vLF;dA7RoIf^3KFRqd z=bM~=az4uWsS)zkfyiH5BA+!ze#`kT=f9i}bAHVEGUv~nPd`R}&G|Ox-&ZeCKF;|$ z=j)Y_zjHp%`MnkLea`=RKCm0}1D-GN{DJ2aJip-i2G2iuKEm^p|HIs0M`g8r-{ZJq zVp65AxuQk`6YcgM9{=$5Q`3>_O=0D7bm>)4;azp-PAfGyc{3-+T zt#-)2?jj$XjQng0^0h6<-zp)W3q^j%e2@8GYvhB>51B7Ae`G$%{F3=5@fYT!%ukuG zGJoBPe0D1G+j_`%-yr|Jzth{ zFCl(HJS7463h@@=FO7i55T7AlQycgV@f_kiFM#(D{~;bke291v@gw^C`(NTu#G{B$ z5w9YCMLdi67V$3PUm1aiod!NO0eIOH;AdXI(;R`X4Fuj62>gwBTnO;Ft-$Mu-x1IA z2fjzVkN6+)K;nbH`}tSLF2Ey+PZF;ren~u&_$KjA;-7_V1P>)XO1v}~_$l#J;;TWx zTZz9CkDUg5mUu1kTjIIIcZv5B|0N#$SAPE4dE(K;r@wv_yqfqm@$CA*w~2QX|6T|@ zocK8L^3K4|iKi1^cLCl`{GE9GNZ|9t>xthJ&nLc5y#LSq`A`3Ehx!ET6|7&p&n5K? zd(=0^px)t+`bSCBL-wIQvKI9cH`Gs}P*2gQudv?2`imv%F|5z9Uc>qg>pB0aU;p$z z)~kY1zhXU$^{t<`rQXH*7wchLP#-0$J{O33U26UAAJ#el zslUHpzZ3OJ)-PGl{1PtpP1ZYE|E!C8DC?uFmu^A*l=W2BS6Odm{gw4t)@OgW=dX@y zbdN|JaQmgl-~HR@OZf^$;7QXZ|5xF*eIJ-ERJil)gnDHfdCzU?%F{`vE|;rJ{*?2x zDKV;l^sAabOwXg&*fzRmq2ntK99u9UlPNypoCJW)WG_|?j8>Uak|Fwen}Q%;uDYwiAMcj2Og z&YS0T(KL0gnmVU%6u4_jIrVDc+Di$8Jygjm(R)n^9%`b)p@551i>d#WUw<{uQulOE zpYOSDTD_@a?AokvO)(vJ#p+I9On29exAm#>YrlS$s-A;}u=3H90D|)xt&Y$JA;WlENyHy3fV^Am4!YM`c z^4H6|ZMG_|o_3x)_vcj~Resfxi8reGt6Gus!)9ChsIE0qDyaX;{(pMDXz7!;kBz-x^0K{LsNt;_rVaxOw~i_B)l?(Lxm7LSrPGC1{g~2l zr=`x*W%%Q{U32N>lRH0tG%L5x+^*ygO=4Vi zgSy*YURAHEKW(y)Fh#rSlB=C={&6d#+GxMIUzOk*DtF`14a@Tfs1k){-x;tgKn?a) z;dTxD)aFjXt{K*6&_Ql)BfcN@)}`~dTir!_>o&PRB+Y1CPM5kL^>SV3ccy>pC$In7 z=Tn+}bGMp`F9^6_^I3xF<=nT$iq`vV`fPot!kg{sbuqt~E~Bbu*U`oD?3gsfMu*)$ zc)Z|_S$^d1$dY=>9q&;qa#YkUH*7bZ>sm$I?Kokbd6=PV%*bmM zzQs#7x>Kokg*nA_<&JL$RQhhH^F=4$*?%KQ-P_yeOsAk0%C~y0=1=bhtA*1K`g}{N zq?%?A-jwEsx6ZV=Z2zNG>go{Z7+X(QKONsTLqO;}SDp4%Ppc)R(&>u9Z>|+u_4Oam z2S!}O{M+{4GTD6E>00&||GQBcj}O5&(&_JO&y4(IX?9(?z0LTYRc&><+#g%#OU$ne zSeKf&IJ<-X*>hU;s28R6u&lc+E+#nZ$`{X0@0hik?s=(OO#LJu{r!8~AUkhA{k(3g zA>$AF=xd`t-!+vlt;R)!KIu{}M9r}pn{u~9TlH?*v4;Wa+A5bTEi;$6(OCId_bfg5 zxr>fzKA?%;{2*=m8a8)unILW1V?zDQxohe_!krz*E-tI<`?t$5#_5wWt8uX`qpI4e zw?`wkjkU_II#^B&D{1rgPd^9O)kmsDJwIkzaK7_>w;?Z0L%g>wY2cPt4=*?D$dn@4 z^hVFLMJv>_)p=a&q}0DwK=+(J?aGk54m#V+85SmoJ}{HX8&w!Uwc(O*K(U{7YnNzv29EHe6d!=3$IPO?U`QHFA{Y8pzHtZ zf8Ry(c9(kl!1N>2EWhflznYF_She$F@hp0X-{Q>{`EB&TtX<~3IGtawnOC#DLtO{m zc3s zq;I8~I!*h67hgRwRHYw7?o5ekudZD5ygJmqmr^4m>K@sC2!m?}E!ic6#6 z4YbqG`?W?~57(^EyhZ>S?~1n?$Eq?O3O!UGWgo-@T5V__tz<{M;lfH8U;A(kHO8m zxh-(l)4L4lF{pYC9k%Vr>GVhH>4e#SUfst8>Qn89N9>Oe&?SN#vQ+r+%2-=X|16l& zMp@hSEmU%1Z#6nDW<;h*zv^fEtjl;5jZn`2Q{P7VaPc7#Uz{@PmR+hnzdXl9^=)$Y-yF9dW_G>cmZL zR>mf`ZKDf!xLL|_X*IoWfBmBc16)+1d;OIazEo8ul56(g_yLpx_u#cJIA;OF$k2;A`PaPdi3O(lEZu}ayLWXgWo7(6O-23^uF|C)Oh zbLr?08DEr+&8KHo8Gk%{xr1)#d8*3D0%i4)q@N+X?cKEJz}+`z+9{oMwoBzZVYT(E zfJ_^PbZx9}X0bGyKM&P!uinUhGbTiLOCRhUwA5AAE!Fdqm0x$|zIkw-N!f;~a7*V^ z8E%eHt9JG8`?XtNRm0_VLi>OkI%n_X*kxDx=_579_BwxVfS!;%u*UimJ@kNyq4Tyl zH_E~#4w`R@wbQc(}^J&^8&t-D@r(d(+~>l*rK^?hYqmv5wFCN~)n zwXBKGx3lc5n?;-I$kR){ANc64F9$xoZ1cE{YV%`!mj<&3sol5z`j3o@R8i><-HY`Z zsVpB&&TpTgwMvek`X%Z}gnpPMcKxZ^L-p~5OS#*%7^q)#`vlmv*(?xk+Y^s^r+{tFuhV2mam!>k>}U`u!O@|t3N2FX5Jp3A?&4{+WdH4 zI>kHuFfycUZMq}-d(#0Qrw4O4S?EVQ`bYX?nKIxsrzFTVSSn-fn2 zMcV5pEelqjR=bQ|pJQb9c}?B)?H|pJSE1he#f%{<&+M+FZ(mPNlh`*%+fST1rQnKY zddLUAG6i}y(TghOu6gpZpK5cw*?6CFeO1G?E}f5b8LieWPM$qKCQ?PT@|~9VVLvtS z`J4J3r?k`=^IlG~`N9bOP>s%9t?np2F!_lM(+#^`EtN*)O)8dT{W-LkXeD#S2Rp)jY+ejB)-|fcq>7n}i9@lfvBbw^d zj~m=CHlm!K@j9Vjhd!NEKZ{d6do&xNoSm;Wo*g<)&8X!TJuh*zy6E({JY$aH!ShIOBtwvygz${rtBH9+NZn_48- zuYElQ9+`Ycy{)O-@dh12Xgc{-F%Xrik$PJ>BLc% z>S&jN51KbjqplU#`*I!rX1eE@t$b1c%(_YGDqk#e+31+>)eg5VP)KLq9MSYug_7E4 z^uW^1t~l#FWkYXdiucm#HrgC++{9m>PnV(go&$mUdACCYypM$H#N^Aq#U=;ngs?P` zOP&R&Z#wG+RTait72MX3^1Gu9eGD$yU4dU*5Co-Xhu*dUD~kj*j}|>%+6Y zW~-!c*FK=eAM()~`)5h#HM+jGIuUTJyAh%XW(&D>segzL>gNB&DmcFy@z6fx&Xw*e zL!Z~qWnxFF1^2DjzqcKy+W8Oo^!Urj)O@Om9P34LUgLT_RqodnWIP=qeqZXx2J`PtWs={YDk#54HA{YO473TLtFO~O2r>|mue{>mnpLBkCzw|bF-?W{)f67zdM|Du% zPqkj&SH8chbanIltYhT;)~@ot>mKs{>sc}%=shw&s4FsGC`l*9uJ^j^Z#Js+$W3t|=1X+L8 zS6Po$I$59fBw4TZURl3&J6X^5Ls{STL|N}u9$Ej@T!{zNafuJqQi&JTWQiZt42dUH z#>3|LLUojQL*MlW-`Vti<3j$ce^B%aZc65nV~iFb5EiGTDw ziHCHs#7DY@#7la*#7}CH#8c{o#8)b##9OL~#9t~_;xXM`;xp|j@tQ{brk6=Pr=LlD zr>;o6rx5?Cj}i~6suCZnw-PU^GZH_lc!?)feu*ztl&v}5R92VF@u#xrWsXOU5$nwH zsd1pXIbJmlmiSc{l6Y1(l=xOVO1!I|O8l$WOFXPgOMI+CC0zy6 zs88$6`Gm5N{6gJ1XwEl`z5C7ihjHPfIUg}RBtJ1dkbFfaO8%lZOFp9qNq(bSNWP;l zN&cgd52@plA1UNZYLMhl>fms5KBXT>ex*lBzNK?Z{-xJQKBhea&H0(>gyd`LmgH}$ zzT|Uis^oVnbBHl|}oqC${N!44tbHY) z*2u55l6+fV3peNAda2~&YOv(z>Wbv+YNq7x>agVVs<-6#>W1X|>ZIiVs)XPH>Y}e1 zA5f3doACk_oY9OQ7(?cp@q|==iK96R{$R2bJVI9&d_q?eyh8g6exdgXo}ms2zM;GY z?@+)$l&|0+s+Zs+x{%-{I#%!#4Ls#nyko{!^d`YuRD$3y>Z#x{s;J;I%1ZDWl_dC$ z>MVGU`Yia4+A4UDnjrX(dQ#Sm2dVAKj1Q@*XUuq!(R{fXKl*?CrvD8De=s%VWm#l&9c(YMkJGs=K2Z|5G+8W<1cCu*-}O z{;9w8`}e)ql)f-}u#^%v|r#y`=uZdWfnd^$`^y z^%CVI^%K=k>M81s)K^sYMdo^oS}64w)llj&Dq89@>Olu{y~ao<^&7*blDVGqKlk@{ z|9L!C>Qx%`D~)=V4ww3to}bTL?=rSY{Ywp(dYD3eOeIUbOhrijOpTU$nlieX>uW0f zyt&?{HcmI!-;8nd&Gk4V`&)B;&Uk*`T(2|wJDBTt|9|tF{`*P2(llP`m-Z9t5)Jv6LjJbZQ#!oTVQ;nrkUp3xIz18R=^;aXLj=3Id z?E7l2&;Db7_s0nz_`m&Y6cv8X%tFFfsoYWc8>d`_&(OP}?C*CxE&JU|mXiJ7R&QiK z_^GC{AAXOY@B#cQ2p__2o$x_A%o9G$vkt-sim5Jqs0q1+5BA^M|4;AFzE1d8lg9}k zDgIl6nV)m^itts=oDlv-rx(I!*gsnK_kVsQ``zE2l>P9Rng}1jQVSm_7*;2n{A9Bc;Gsc_{o1%g4fJFf9~5#P^ND2YFLQ_%IiOg%5NOe5kD0FKd}w_;4A(2ke0T zg$uw3O^f|!f92Poov&pr{O9EB!UsM)Lin*u9fU9XJXrXX&ToZJ=r~XKb>p<~%@&Ur z{#E^G;UjhT6Mjz1L&8_-0sh9A{K5x0f&Klp!3XjMAF4g}Lw^Myt~dCAJFtKBDEOfB z!H3-oKCm_T(0}G1|G)R3@cCQb6Mp;DPQv$od_?%qVKM zEPTQ?SA}19wwv(H-aHllRX6YfMuHE~6nv2HyM+(45`2c8*x!E{``tf*4_6<2KxgnF zCt$zq4DeyU?-oAr4Dg{(rxiXp{rml|YAgL3_79f+1v734pFi%D@Y~yr62AA+jlzFk zcwhLy7YYeK)^maIMITKT{^Vs#;S<)e6MkK5@XgwRe{}(TkSXBjOavb&H~1T^zz2H{ zKAgsW_Y2@dJ_jGv75jsmfe*Y1eCV{`gRcP}-V6Kfe)oIgmw0o3iixG9U&ED7(!XFq zH{tW!tN z^bCBcd*G`~0Us^}e84i`L;lPne9(H}!=A-{=wo|@4}JWm@WG#e4?i9K0Jy*Kcfa>N zm3|y{YotGg5hDE>cE6SW1-(Or&p&mm@Y}cN6u$RqYvDhytSEfoeBj4E0Uw|r_z>h1 zx`7WvzF9}`p&o&cG!gt95AapOz~7h;KEpilVP}9391yq+dhuJLz9AZ!P%z;lgh}dQJG=_bv+mIScr} zg~5-V3O-02_>;ll6Mmg2{JIg~o1Ft6?iBb)dBKM)0Y2yrZ{fopzbt&>=zQO|B{ZK>8-2A4(DFw-R+-`j6ZzBKbLS0Uzin_>(8W2fGY@T?6m|AAo-P+a|3)8C-65ig3pix`}@aWzxyZj!^rM0{Xj-ye{dA~!CXQ= zocs3DPp3@@=`S-pzw}!n=@IgC*U*`%w@MZ9!cY%-O3qJfI@KqXszi|%zAVy<(Fnd6!ybc03VfP6pdUnC^uve; zpJ6%rp=?1vnB3U^?TmgvJJ1j5+g|CHv@4_Z5Bg~#{d9_>zf4Q?TWJeEL=5_I>_C5t zA>acQME`>P;PXELAFc%W-mSrZUI0F582GSJ;ESFCf3h(6gw?>W>j%D>5Bebt1Rtq9 z_&L|XS8)V?BN2RtM(BsL4ExXh z`_K7+^Ft=g7o0yhpFG6;!uf{tPch6#oS!&f4Z{3Y8S~ja%x_7U@BA?TaXxH>`EefR z%O03Ny)mE0VSZJZZ{slkUc!9L`I+-I=WovEoZstWzUTbU^&krC1J?_#A04rtm%38EbOO)^_1%?*V{r^f4LrW zeXff2n(H^$bFS}P@45an9=MPA;8P{(hf@RbLsP^P84zD=M7*&Y@yEv?iAUBUKG}qL zWf0<*ZHQ+W-!R?@Mf}5fi1ATr#7nM-pBPV#Kz#M#n)DyZjQET3SVP2T*ATB=LHu?a z@th;#yAz1_b|L;_JjnP^Azqw?_>uACNyL|oHyM929t}i%%6OIWE8|(lx50>a_aXjG zL_B;S@o`(k%Qonz^9J#BF~rw-5N|X7K8<*s@j2sl#_x>h8Q(MBXZ+86fce21@f_#Sg4f7r5Kg@@wAwOci#Qdo#@+sz5%(s|-F&|@o z#(a(W8}m8lcg**g|1lqAe#m^0`6Kg5=9kPjnSau6{$;+({FV7E^IPV-%zyon4>Lbz zzWfpSGxKTY*N>5JGyi5j&ivd!zJ3V#yMcVZC-VCb$oJil{|5mN*baPvcmeSP;t9kT zh&Rw*{v|#^yn^@z@eJY{#5w5tyo~tSXW(hX*NC@u1^z}nj`$q$I^uW4^N8;e?<4+4JdpSx@j~K<{C@xJFY!p? zlf)~DUlPyk4t$e%C-F~j;Gx7viI+wKKP8?@e3f`B@mJ!p#Ak`u62B#$OMI7jFY#aE z!GGr8U;UqW^c>*R#H)#46VJ{Ge0v}8ZWHkDL%_qI10SCOy!_`Q!O!i0ryl~oUJ7_S z@pt0!#OI0E6Tc^(Pkf(v|6lp_ch9GUN`FSyCs?mw{UQVE86Q#K=!Sa7XVgEwpdL~g z^^pkFOLC!p!g>npE3CJ${=#|;>ocs^uzvG*{rIQXZ9x5r^(fY-Sg%Tl`qf3$vsmBC zih398U#y3*KE`?(>u0Q|vA)K78|!bZ$Nf|L|J&geM>!YlfvVO{XD(kDPxBj>G^M2bsi!;4!kh1r`{o5`312aD-|3=}fj0At92KWp? z*x#SCgzR^}fc@Y5u^;*=_6Og`e%UYBKUz%qAg0gQU)UA&YELE$5H1V5)1_$rUU-)IXyLs~D{-yenj?qS&f?T7u)hp<0582e=%uzz$u_EV;v zVdg{Wv>nWRFztc;XPvPh>z~^HcdzffM)-usz^|JHzS%VJuiU^#nhJhSj-A3+$&x|% z8{NQXScU!lw!#O{ld%80H1tKIyTkMxLVgKkK*iTst`wJIfzumhaGauIUSAPB3`F-F&PX-^j3HY%~ z!54i8{^Vfr344QIw;p`6t>9m!ll|a22>hHp;H%sKe`6E)4EwRaUtz!dbL{_ahW*gh zus=8w`(>{PA5u5Qe#-r|&3sss2lm@_!2Yv8^N;^;P+a)@ZqyALi2?G+#P)2 z1>nakMW-l(z6R^TG6T z?Eij;{m^Z&Ke#sb%erqg^I=sA_EV+^A6kvUemna2``^K`AILQPf%Gpp4?h27@Y{3S z2;aNFI^jR>2OoGU__6cB7cC0@WLxkFdw^fJ2Yj=a;9r#hAL%LhId#BSaRq;49{3FR zvA;hA``ssE|M&G0W0>3@Fz!sPxt`*y074yGc^!{Y#L+V)Ucke8GSY=>8bP)CjAH;syY}h|qOZow*Fzhe<-S6TRr5{Ht^ruKc zzlKWaU$6pv{z2fk4+h`6H~7y{-~&$vKQ<72(e2<*eg&WKJot4tz&9%Z{#7OLk#>Tg zGYEW@NbomSgU`?%`}?nBzk3(#|2{8#a5W42gMF}Hc25U$KLqs{`zhnFzmWcKME{X$ z=*O`H{V9s0Uqf&7FK`5(KOgw*UBUNGEBoQ~b?|||gCBbee9;8(Crg7*_#XVa5#XDJ zgMXD9e594&=lld;Wj^>Dt%MJ(77HI*Rm6UGPwf9Lfc?-*us?Ve_R9ug|7aEI2cmCa ze_<5*tz?${klH{$j`iqI5sH2dma-pOe+HlbCiv~M!1sO%{__X$f#-oATLyg5yWme= z2A^e3h&HVs$F!p~3Nk0hf zg#E!T*f0A+`l0CQ*iUIG`yowd&~N1h`j6yBKaRfWPZ5cJ4TaFZU<3I4t-)`f48C_F z_|FdH1A`xX4Sdnu!iQ6f!6!Tie%(dz%^rh)^%#7lwBY9~0$=6UNa1gM2A{zZ`}@CP zzxz|{|F*$?=ttNe?2rAj>#%?H2m0v*qQA^T^jl&7k-6x{;fMYd70|CC3H=LRfY0v_ ze*0(ey(fYHyc~Ss1>nb~KOlV3tl&>}1)p#$_;uFcoBag;su}o5<-pH*2EIxi@Hf_h z&#)Bx`)^^tdo=ccyJJ7JHTDO`V!vz>`Uf>dKb=A7FS8Z>Ryw2qNMH2hc#HlNlhCi> z3i=lmC?tG-C-B>kfbZQB{O6J21KWWgyBvH`2jRo2mBI&BwZX5e3BK78@UJ?6k2DSZ zoXgS=LKl&K7`i|B44*rg`=RK1tIYjiwAEm9KOD6O`=OJiAChuKzoeV!ALN35I+M{~ z#vc7vviy+#BQMa8;|TgwWUep$8it~OfiL*{;KQi^@V!02fA#?%xHI^%t-u$p0RH3z z@Cj#tU)LXev$^13*@2Jb27XR7_$smBZwvyT;V1U@*TR1HVc7rO4f~+ZX{!o{|uNw`%*%R=ux`B_>4E&tM;H&fjer+rm-HWDKaOYUPjMCf z8cw5s!Cdh9t-xZSW^!z$Z)(eqA5%%^HAzWeYx1I`DIx zz*lJn{>EVRvtxg^is*NSct3sBZYWLw?{vn3+OL%7X4PPq5sHK^y6rU z{uF@{pXtdx%<-B&DDj)RL4G^<-m&06CrSLL;w2tb6TlZWfj{{Ye8TeJ*Nq3?ED8Lp zDDaU2!Os~CzDgnV?{h^zyFm1JTaA8aN6`PPuEf8(Hu^&$KGsXnKd2e{>BOMF%scd3 z8IS%WS<#Q99r{zCAB1{?{soBN72K!6$qVew_#S zX8zz`%>f_j2KYH#Pu8P<-x2h)%O?4ZMt-A_@92x@ht(DRp{}A|QV;YGT8Vx-VdyUt zfqpB0p#O+7`f=nze~K&U*Ki8`3x0ynzZv}YVDP<{f&aV_eBgWF$9@A}v$G|7_ z0l#iI_-5_FzbXYj68+}i*680?8~yB%&+0?ycZPgdd!rv#NA!nUgnmg2C0|y}&`-w! z{bh2a-wOI+sJ-aNkxTM%^&b5io}zz2H2D1Q!EX-)-+K-C&u760-VS~&`J!jRpZuEL z+z(Lg1HW$X8{wO!2mgxx@~=gp^eZff{(YU$&(0qG-5#Ld*;n-cdMx;d9*zD`z(>?g z^bbNm2xX7{GS29?atZxMvZEhI3i?xAMZbpG=wEOVeEw13w{HO7yCnF}BQ@GD(S@GM;w{mz=B|JM`r!&;60 zP#@4QDTCl;3jIKoFZ#Is_(*&`mG#C{}C(ndRU${YQ^!qE?_4EjT*LBFJC=pST> zemVouU*@Rb>uN6gkJz9e$9VLoNU3P<2dBc&zn~iU{K=<<-~Mf<@V#{};XnUf|NiQ_ zTj{%)($?`#qJfBB#v)@k&IYK4AD579p;0{wK3p})**^jpa! z^%iB1ejEqTpTZmc8Y-cGLDgl#=l?7F|I_mY(T}nS`ZGR8zrx$--!}pM?CPPv+e-91 zD}(-DgQfnZzHgNNP%-G2q|rZU9s21cpubEV^jrB9A^k_9(2pa*N%~X#r+)mW_n{wz zQ62pmJD^`-PW10ANtGWMZcAL zx26Bce`@#d_chzFy5^aYdA*!&*Ny+;?%-9>C(YJE-OG68dDLfF!fF?m-X%FqAy|kbH&_DWH>)6H)S*CUJDs}1Y)blNRdp-X!x^2_lgT2bf-@U#1$!M<& zRbLOekbaWa#CLD)9lFGLZC~a0pw5QbUaG|l`wu%7dewN<$)@J!_#ctYeBFWbP@We!)_>NUK>+VY+HZB0Gq zd0x-^IUdL7^Z0z)L;Gki?WaHVkN%b{^RoGw8r!|56dh!H`r-2SW&E0@NKU>S5pq#oqpgIeXMAmvJ)PA9lRa&pwfXCUJZ`6 z&YX71TQB>sLu|rYBzfg*Ix(W#yN_Paf4ZOhUjCC;m1-MWyT1JFmBXgj?Wl}jy>6fS zY--r?Yw9u2^LpOT@i;!8$LG@?+DCh7KmDP9^tY0-eb?4I#mnjPxXlg1(;8dd3)RWh zAdAt>T9;q*B$shzQ~hSgR^&A%jW}F=#qgrWj_j4HpC44hSa`Ep`;X3LjWsV0EcDS8 zjaKc))`-pNW?alPH+R!kRgAe2^G0MCTFv-2=Su#16}^nUm4gbe@>j;%1E-f&Y3OY% zOWUa1!inCg$2`yLc|XVF_%*j$MtGB{X>1bO8Cl0fIxctWY_xygv&TG( zo`%ndTTKs6?`;fgUwFa%<^7D8FRf#o#||`FdL*1GnsJD+_FA*!OH+m#@2hy-F6KJi zC>`SD;Jaja>M_srdfw0RI6j}p=hGhAM|){M{h@#KH`Cqo2^$9YFnSk0RIL7){zj*2 zIYSd>jWjalJHBGb!0|?*3T0hhm5es3cga^rEtzHHoHO?GnUV{Q!S%mZvAi5>G#zwc z<@=AOx^s! zw#^R1eRS8Dr5kso9`ih}=lvXyw3qhNANogsZxxv_!KeFD!{>AD86T#v zF&wA$U9=*8tC4W4>W!#+dyK29^G3_g2aS1Way{+c;J6X9wCB|-q34Xt5AJmvRr#_} zJj9}#UVGhGGiunZfuVPdkiKCJ93tb5W-Zos{*VQu{H{%!!W!jNfw83reC=OR&5jIi>AJ>6MP3|QHGZ0#GTJ?{?P6J3 zO{h4${*W(~RoW{zcOIx$CH0u+c|GsvcpRV4 z=FvMuB?feV;k>fBY8sd!|K+KzRf)s)dq&r3r^?${T(r8=Uae?2&!%slPAW_6i-=E` zI;&!9_Lo;LyQuEpO1xNJuWRZt&+~fT&+#}upU3CZ9@#x+&*p2hI4p2$q1@`sKI572?=XpKv=Xe~S&*SrH5ACD9w4eUaKl;1F@6yo?4=SpD zuP5~@4*XUKvdprzK=eO-nS(4O5eXk$xU$a6hwRp(Z z==G*{D&*m}@qGe1sd`g4R}Qo9uJX0?omcu(gt~Sk+kzR@`lyT+KVw{+fB8LOe!Y-g z{ngBOAAcO$G(h>h$Q3^&-N4jip6B(vpW|_SK9A3*J+zPZ(ti3w|LE_@en#Y{igBI^ z9($}hRfzMP@!`R!>P~Tket-Jdfnu)N19IJ)Xx8*LZjA!yZqc zeQowveY?kV(39iEf?xg8Lf^h?W0RNvzhj=~^}L_saeO|H&!;`KkM`1j`a}Qd@7TPX z*NmCqp*K9rJKc4zufBKmXIhJt`uc#&|NTCL^}FsBmQO0*Lf5Dncg~p5PFMQwyxFry zXI;GQ+IDI4M`){xAKM+e(nnYCJZodv!2vpE{x*+_8;9uI=fi%)gpJUv2A3{hruHa3 zqpn}wfN`U>^Wi$Hb2p0AXI53NWO!%I?O86P(N`EZt`kbh^{rWQadADG9f=W#vn=Xe~S&*SrH5ACD9w4eUaKl)4m z`FZg3;pfHAkDn($Uw+>F{P}(G`{DP+?~mW-zvcVp@14JYz7Kpq_`dM{;rqn*i|-rX zKfaHAKl#4${r$JR-<;n#-*Nuqe8~Bc^Cjm`&ZnGTIp1>r<$TQfne+9(Wj^P6#`TTs z9oIjuhg=`IUUL29ddl^c>n+z`uE$)T|1Ik`;}^y=jBgn4F#cgY#Q2Eu65}VvQ;e?| zZ!!L2Joayi*BGxdeq}t%_?Gc5<6p+ZjE@;FGk#_~&G?$}HskMqOMK4!g!u~d7v?j} zZ&O?;bpH}P-c;l#)PE%-U>2dpQszQB3|>kq6)us*?h z1?v~AXRyA(dI#$ttcUzt>Lsifv3|sQ66;H>H?jW2dKBwZtXHvq#d;R&Tda4n{`GIE zkFh?;dLiqFtS7R*$a*8|kE}zAx&vcAcB=f9;MI)B}ia$8O=HJLtNspU~< zt?8TXzzkk~+e`~Xm&ZT3wa2u-`mwwgrw^KP}xr@cT5)}mS@ivA8&FRmd?eeNTSK(QLi6%Hjhk?DpzZhbIxPa z=8&_I1*beQB~|$FtjB{VsmDCe>v=!NAXF751 z>BD^^4x5&hKNj_-m-X%FqAy|kbH&_DWH`PG2A9~&Jv zbtv(4(jO5QO>W~3&MnaTrpYqv+ydP`JTTpOu%LP9&ZnkV-IG6cnDo}<)pBE%A`?HF zZl~+qtf}8uQ-eVdN4T6$qi0!;w|P@2y`KN@O!IURne?!n9j`o@YN=l~UY4VvUv_=l zWu*JZRylR8$}2bDXlA9yy{%rb<1DMxW1i>ryr1K7d_IrQr#-Zf_R@a(L;vWnL$G`1 zTh%U^#yGZGI?V63$#avZW7_M9rmEHJmFQ>l(zO3Q%fK$=F z*V5>juO74tZ=6AoDHTz7b9GDY9Wnp>x4t>`z&mMY*#}zd)*r`>(1&gHzU%Q(kqNnV zQzNn8h4Fc{<1lNLW=1}}w8?__=-2sDk9nTg^L~!U@%cPHpZ3r`+DrTC5B;ORF?B+W z{XK7+?uWcRwr=c0QypVxE6Y2tO!x0beOU8LA2-f&RF_(|-%YJvA3MCRe>&}1^~Lt4 zO|s~3yUXv5%xa}?`aT%??2wHPF6FlV>n}aR-lgwds5P^IJ|FQuI@G&}?tSUS?1feB zbx(^4tylJQ(0zPcmfT?!)0NBho4hcxSn4s)^ZL~LF&@X~^Z0z)L;Gki?N9Xw{?XqT z?=rsWeB+^MUsct=ScNyH=P9=Dw{1=~jVx%D6qr4YZr}Jx#aDSU>UO2a*@e!?uIpH} zPkP{Oqm#BST{xyqUR`3&>fx@xbf4R;sk^8AH+$WA=@c)g55=`}==0f~Or^Bb#MLLV zmMx?2xJ{aRDqA_7xlr>{4GkyV@Nw|)bgP|Gk9nTg^L~!U@%cPHpZ3r`+DrTC5B;OR z=jZS7jGXt@ly3g1v5r?inVOxy`1qWah2CGd{>2^9S@h1Y8~44RlS|JDpEAR1N*=xb zLfTWG))v-x9_2gW+ohPUaHDdrkZ|4hnQ6z(Y*rR{qpnW-XflpsY^w)N}_~VYfZ@w<1-DCQ;P0n0g zpQu?q?`69(+P!1LR)xk?)RV_;ckbQ9O(&diIrp?hRbA)w#F!cFJoTEuCHa@wdF$TG z?ZUIi`RL9AGTFCJQ$v?&U8{81`5HR1?2&%{xqVZQd7jtvevZfS`8+;9)gIVKduc!Y zp?~zZZkueIDo1A4{$IaG9S^qF%OWSO@3b+$o}RapvroK(t`(Vf*_$tpI@7TVKi9N# z)`LF%O!>CFvi7*2W1i>ryr1K7d_IrQr#-Zf_R@a( zL;vWn?TK4HWtLg%!@Cy_&l+DqXX>5Bu~)6)I_~SHTGO|c(}CsQS3IU&b>np9-QM@C zrW<{jJte-9kFMOiYrkrz{d7*pjlD)+ucK4$PoEZR(@1~#yr<*WxW?MTVR!lN?!mg- z@}2IL!kcKzhRqLLwQj0wcWHItO|fP=ddU6y<3}}1J?42{&-*zZ$LI6-eA+|%XfN%j zKlG3OR`@aa*7o|j^y44%4(v|Ir(c)r)8g3`2W?TeNn+JiW%MH3&DCFpxaeWa8o51+ zs;b+c-!t|~veKpu*IY7q`RXGJqn&cSs;wVSYG8Tvc746>T8pVVJU~Z19hEORC}5D!f|L z&q>WZQ6+h*ldE#f5>_Uge^s^nOj35MXI`pC(DtSF&wbR@Tyf1y-2bI-x+>?b8LMik zgURoTp0KK;W-m?GZu#4~s&P=QFCUB6SAT@%nd?2Ve(EvL^LpOT@i;!8$LG@?+DCh7 zKmDP9^f$kIrJ%3bT~xDE$>&>Gc&M7wW?7V5RYNU1G_Q5Db9Ggb9naqFatKs@8z)`g zzNo2sa(3Esi;b<-uzGpBJuB2+9T?hfST>6;YMNbO86Y8KrILMiCl;)&Hq=?6Y)#U~aZid^nQMoaBbSryIzZLy+u(Wa3qw>(_hz}yx{g#{E#foT zgpF29b9Bw{#bb=hHgHeSkS$}CM_srdfw0RI6j}p=hGhA zM|){M{h@#KclpJK$KM+s>Sddv*5%sxsvSSlTztE#zWQ>|bxH28LBI4!YvzlI4^v|^ zpZJTIaa6-|~%8!P`2my%;oF6?pRO!H|NH>Ux_Irl+kVQ;&I`*Ykdk$MN|*KA-l` zKH5wB=@0#*zbkT84o~0Wy$Amu$v?H&xVdRO*BX5@PVJV{lgHCsBg4yXF6o)veT3!1 zT4y}mYZQIlU{YbvX7vWHyl}MOJ|0&+er;`&BlSH;`y~fg$X7n~FYoi)(QbEOvzn>n z{C@oVeH@SD|NcCVOZ#Z=@AlI_{)PYgxqRPxt9;)YpO-et_pKx4`_}k;b!Yj$H9mjs zD&M#6Dc`qlA>X&YBHym-X%FqAy|kbH&_DW% z-@7g?@3-D4@3+SLp|8mMt?~Y7yidBHyx$t{o31bKw{9ixw^s6g>t*tO>+JG=>$38G zYa4mLQ;&I`*Ykdk$MN|*KA-l`KH5wB=@0#*zXfDI*I_cB|I&{%&*yrD%;(x(=5vkt zQa_dXTo0G|Tw{LKF*2X)l`@}e%*Pt@v-X$yT#uLeT)&q2JoT98c|GsvcpRV4i}85^=?_e^=MhY^(0xpbv{|Y^%PmZwU?~l`mC(q zx{$2jdbh0Kdb+IN+E3PRyAG zQQ|d~M&dQKMB+8oU*a`|_(*Aq*VHMA*VG+}*A(I_g?LMCka$fcO1!4hNW7-DO1zeO z%=5gS_j5ds&*$;^w1@W5UfNH8=pX&fC-J$`5}zw8iOfehHZVUp}VhNj|1#OFpKmNj|2sNIs^zNqx&JU*ZH&_3Er`{@t;qrc50|2B}H zsw0wrD|gAiRefC{r>X^lr>Zl8r>a=NQ&W$5p4an!j>qx&JU*ZH&_3Er`{@t; zqraYlpBt3~KR4V2KR2%WnDKMNS@3g1#hCGP!&&fil}7M$HNT`8KUdiVKUXe-pQ~8G z&sBfH&(%gRGk&gi4>jZG%0=+=)MK9K^}L_saeO|H&!;`9_Q77-Pk-ni{ayajTrV-| zOTEMxGuB)$F?Lv*>m|l9sh1eFdzkAbMpBr$USfQbdWoS2n(HNMj?_!k?nHCFM4iiF zu9v8RQZG>hoz3+Ub-9wcUZPy2UXpsu^Sqw-b3BgE=kfWphxXB4+E0JzAN~DiX|9hM znWa8vq;)da$BZvG%=IxNqKCOYX0-2Uu8$eHdz$NG#$0Q2eat8)^)bWkrnx?5j2>dH zj~V#~nCoN4yFhb&Ou2qD*T+-|sgJ4HedhXD>M_srdfw0RI6j}p=hGhAM|){M{h@#K z_wHJAJ=A!SY_5kIyK|ZAp@vHnb3N3E@iEs!jc@zS^-!ZuR&zbnxFq#Zqt0Zo zA^N{_--{mb<}#uWy!D*u1%GKQ`oV!!L{He%Mf8OW+Kb-sv0|b>{CDmAUtO1Ors(fh zhaPV<^m&^?ulEf4pU)W~dcJ4dioWlW1ETjE+FbO1`=1p(;8D*+AJ})C=mo!hE&9Ph zXGBjp_=e~UcS@6J)*H5+B>Ka%Hi{nc|H`kw8s|Ft-M@<25P8$fLPbKK_gjHshrbkk zXQX%z^3HcE!8nC}_XpAMequ+_`(0g7^ndTI7Cqp1!$lu>`gG9?UT{P7gB=%$p77|i zqAwiRO!S8LRTTZhyuJYRbxqLQ9S!~6 zZP4Rg0)5^l(6hJ?{oYXM`Id*CMOEni?t=dB3g}skhd!{&VbKfDSxfYTb4(XK;i8j8 zUpVJs(Hq{nQ1plQB#9nz@1~+pT)L#_71xav{o)a~MbG%Wo#-3WpTGMzlZEK(&WGOa zOX%-TfPTp+=<}9{#!=Bf{xkoz z#hvSVleK>LF{p3Y(L8!7^mea7e>W6*yp^HPdk1UOh$hhmS25J>oEX(I+mED0;=Ew~Bu8^D&}lT>YHr z8yC1EddGglMgRCjd(lJw-T$RF?{AF{tER_5Uw1F`b{F3e{oQZS<4uG2Yi{_iE|6TO%(`oK=m3+@g5U}xwPt%p8Q3+NMVgFexz@uElkFiP}^ zZ(k9;Vvo0?U%bdx^o)x|h`w=HH_(@C%f7b_kynFYGKJQ8BQO$vV?*i!gHi8~i1?c^bhW_tW=mEEYK5&5!UuKkut*OdD zKlsd@T>kflIjZi^7k&x7;fl~7z79R&RW_ne+&h=(72EC*{o>C}MbFs#gXkL{Ybtuj zi`I+&vF}UKLr#+@dbyixiGJ=)=;^vcUpEB$W1FErb{qO*m!Lo94E-@H=#M@7O@AyG z^v6y@|Cjn>L!b|w0=?kI&=1}XJ>kjF7cL0BVN2)_TU-)7;)l>Dc4{wr#lzQ$ezAR$ z=o$BJAo|8XJVo!gzp^esH1y{7L2qsk^yX}#H}?nh=2k&(E(i373qy~%0rcj+ zL2s^lfan*0ttfiN^@fYS@n(C`JGQ$m`p0)2in=#EGvBxkz1*?T7aRnA!8^4@UpIqI z@9L}1rd2zkzgrY~yqTddSRVR<=b+y^1$w^epf4D>RP=rmq5taxeZhLr2Yvy)Uvn0J>tI5leB@JE>2ff(A(2M;8da<*h z7uyATv2CCi>kWNlyL6&=Y>`RykDEg;)(3jIm!O|J4|=-Ips$-9db|^@OYA_c8^)pR~|}4#n?_zqd=j=|S`N8I0d6f4}@a`{DOp62Eu;{`o%K!u!GZ zh3}6q-Y33aBk{gvoFMw&*`eoK1MlZ5ysxeC{(i>$9EbOt@B2)=|C|q~FUoMJA?DX` z%(t9>IUjR==6oH4`J3}O=XcKcoc}LiJ>dGl_2Mwrk0w}8935@H*~Pf%aI7~~u>M41 zJ>vSr_3Ay=uRyG4BeA}5y>r9*$MulwBiBo=pIlG5zH+@?hV_^0G1q6V*Id7=U_DR4 z`X0VS*868=lBbl~*;S86Ja8KEfivO-#t(%NPcXhb`*<3q-a zj323A%=nV=Cgaaeh(`w^K4rYh`1Kp&*$Bk9xe@R7NBnDrc=!(D$Dj(p$_@`HHf3)_%CG)F$+gZ$zp@(t!6%tx4? zFkfN*!hDAL4f7r5KWmT=F+XCy^aA-)d*oAlkY70<-^zykD-`+IapY%1kgt_N{>FT6 z9`ZZpd(8iKAs=LZ_y+l6ZRC&4Cs!fAoQ8ap`6u&H=BLb8nZGihWq!+iHyQcw739OW zkstR#zI+z>vk&rV=GV-(Um^cyKE4_GIrDYq@66|!-!tEjNB&PdU>Wd%9l#5SA8Z4j zK!5o+6@LI8L41OE1@Q~w8N@e2fp;7M{y{v1_z3Y5;wQvYh_6IIADH+H@t7vSXNcEO zZm3;+AH8~qkzAy0v<lLhDu%5yC2J0QHf3O}BjrzzN z)Jv|QezFwxl!%T}U)hOz%Q4hnSdU?SW+du0tluP{p7Wpj^-u3(y^8fK*0WgOV!ey? zFV@3YA7j0Y^)uGfSYKnk?L6vl3iY`0sL#2gUiSt1#sAd)|Mq&;D_Or}J(KlK);n4M zWIdGiQPxXYKV?0Y_0`O%x6VfW)f4sD+NjU|Q~S@YT^5q{!2plH`_~zIyspsa^@d*W z8R+-^Y?d7GF8Q13BJ_QaLGSk>^ncev4|oOifgeaeY?CAOgKeQFTnzfcQ5!^W`0R6Y zKWx+Awex>3^<=L%%lz^n5*_@4F0ozh$BSTN8S~eW4GWApOsE z9q0!ihn}!C^o3oaH*7i}`on(EBmQ6c^;hE@l79EP2K0DeNWXjiNc!FD!qD#>D*f*D zbm;r$gx>D}=>PsWR{Y1^e0F*|^npX67n~yf?)7u&cdxrbU$_ADhPy(4xF7V0r$V1N zcD3jg|CRm!^n9~m(c7I2{oN|i<6Q-P-nG!{Z2A2>7gf~!M6 z_~XrqCxRmFbqw@{r$cYJ8T5xcL67(X^ohqouhh-O z7oG>b;gZlFZVNr)p?-@uTjaOVqo7wD4E^HdxuRzr1byQx?xJ_RxR~f4|C#^8p{H94 z`nrvwx0}*^LjB9RYpOq>$Gb@MYLr)T(d%6Y{oX+6`QCuO?*!=mmV*AT7xaK{LLb-` zdcoJBAG{8F!mXe$+z@)h*3ci0fgbS)=o4>-UU5d~7pH}uad+q&Z-?G-CFmcY6up}N zXI5XjCsH|~x4RwsyI#=aEen0#`q1kw4*lNRUqsKhKlFVIL+>{)^nZ6k4|pB) zfzv`SI1&26H=!ro5BkD~p*MUL`ory@N4y65#08*N41FT)1U+Lv=o`<6-f;=&A3yVd z6>i)2L8{->&#ezV-Q%4^UpEYTyOW^5dmMVaEuqhQ6necO(C-}zJ>SyM_gxIV-!0Jp zb%GvncIX42g!^IbTLj1vL#V0&Y{K9v|H+9#IM9x97FuYwZ&&V zU;M^C;yZqR=yJ3)i#+U3;zRZbn)bSN5fA%&@#n&)n^gR|5#rmuEB@Wo;^W;Ue%@{U z4PWna@%P3MpYLVy`(75`uT%WLTg3<5SNyx`)KKJ4O7v^Tfydt@wGbh_5%Z_{@hC9(=BWGfh~vlcCU+ncZK+PkBgr-xTyVGnwJ4~ zEW;0Me=9!UE#miGX83{a3F7}vCq7{OrcB}so+$oc<+nDQ@>U`74Xb|ZC)1wQNc_YV z#8-Su{Kb;jt|)$EfAJk>6aVo{@gWyB`diV*>o4z3LxZ{bj5F>^$QCEhs+V+TsVUBEH~DCHJ11wyCDoL43la#V_1c ze8UsOKb*{rFH7UiS|z^X7(-rPbmj84vWd_5sTr?!VeuXJ6#sF1@gYAFUv3-m=XMsK z?o#pV))U`uYw_=17awm=@$>E$U+-}<|EvY#^NkR{Z!7Wrwh{ktT=4EhE@4X>D-x1>XohZKF$;MvWvfsAsx&6KP zf@SaR7~&ItDt=*0e8XA9KYT`f#D&C9JWG7VGsItfLVU){#BV%Xe8(&vwo#0NY^ z{J=ZJ7ra^g!4cvUzGBvYJFf8u>`>z$*q4pJV99^5QW$^2l7C@c5ub5F@f%+i-*I#C zAHNqL@(A(eHWYvEB=PA!62I6R70u2X!wImN&GM0~u*#m^fozTTPQ?=3Gr z-yg*9dqaG`F7f~F6d!PG@dIZUU+`M-2ZxDIIGXr{gTyynSNy}f#Yfyo{KVQH+GEXr z(XMaykM<_BpS0_W?|8oWk6AzSi7)rM_;ZhlPdBF7zgj!Qw_B)1;t`vRB(Z|U$Gc1X zyz|7@TS5H2_r>QsQvAN*;`_ZQ{@=H&67Q%{x1zOB{J?9?e%$(6{J|;3C)`*3!lTW8 z-by3>VeR*AAMq1g<~+a-5r1(!b6#NAFy{w$7x5jVFTc&-=F07;xzBM-{JBrXr#oK! zx@E+-+eiGn1I5RiM*O@>#n;7$X{`zz^e7lvl z82;U)2Mix?Y4P*=i?8>U_z23pgufTR zu+HNxKXX2BtrH*dGVv4V7hkc?_pNm1yx;M;dj3)V>*C{WB!1qi;_E#i{@&!`^S$rA z@c7NzajkCR``s%3Uw`odpAbKACGiFSEdF3`@d=L?zwj9I{lzLO{$YKeu`Y<8xTyGw zPl&(xkL3Tm(u?FWe7$qU-}^*-z9q%)dtQ9M%f$b?MSQ^H#1H&he8D}%ADl^i!b`+2 zTuyw$!^A(lPkhAT;wO$PzT&FlFaEpq`m^=)ylMD*%ZksptN49uito3u_e9lna2fVKP zkkMKUjhpLgHtVMD!?x6Y;99y5ywGBr182BIaPR-7#9-8irc%0RaW+oXz(e=7B7Q`NRiy&L26zxc$j+g4Ib$HI)jI*mdD`11`jcKxItkC5BRzA z|JnQ*JPe-jsP4mU)_p*aL?Mail_{_3vo1JBfb=rG*}Z?60B-Gm3IuKWFub>H0~Jj^ZKhkicL z;Gx#nG2W_tVu$_cAOOnLkuPW+3_%h*h9tf|JO8AZT!h@6&9wxK!KwE`}%9+pL!L~j( zc(@`>3?A@YN`r^=8g1~Ps}34GZ0Hq(2YwOX;Gus{KmKncJb$eEH*ZV`^t67^eXv=& z4;Odqgi;st`dSxtA99uMgTB{&*zLLx?0M=|_C{5j+RKDD8?O8C*MvtZSnb+|@2WMj zyo6WjCOk|j;epoaet&i0!Da{#cW|Y_1J?f8;32y|H+aw%n++be(o};79yQY7p_g?s zcyRQK`nx!ViPtbp_o1RsHhBKpx(~Ng_W`E}|J+>nLF0uEJ3HL7h*eE^(c8KYeNuQr z@O3AIH!CPS#AV?@8VH}WNO+a9!f&Jzp5eIgaEbDEb(J6Z&=IEl-)WKEc!*8Hn-voNYKQPZw(wBkRk{ej(Mov0=DOei_35J> z-v?fCL{Dn)u)`-9Jn;0a1`pl&j=_Vk^EY_-3-?VtfOpeOJcOuvTWw7|4zI0~PkdSG zkRx>(6R+Wk?n8Fbeb79@x8Ku!;CjM8pA#OqyY9p16<)N6@DRI&2l03v7%MDy4ZFSY zK<9*q8Yw)|P~me{39ph*c*y+1GsF`fwn*M#RlMV$cBCI=@X#@r7(Doo-x)mo%U32I zz}d$p9>UmaCLYAG4JIB2`Y->%#2@kgzES7ICw_6{@HO!%zVv4+`HN zKkk?p{q{As7772HL3rTrg^xWeJV-U+C$kDq7*}|xoWh%B5+3d=;gPxtpW`w3VbS-+ zDp;9?-|!ZmAy9be=1t?2`DXJDN9BnI55J+Pi3jjtp^1m!GuOm}cwNxM!|T( zGx1QStTFLc9u73|N3zFA^@DfT(~bwa58F=nfuHL>beQn`IfZXuCOm*g$pM6JMrt3lndp)s-V&L;CD;q^R?< z%BC6*91g{&*rj+4w-vwOvGDv&gm2HEG~(fan{BLO!au(f9_WJbP-%o0tt~uUw4(-3 zcvbj1KjF>R2oJkPc%xliW{4u9PTU$6V{O@#*-ruYSg zg$Kzbe0xFRz1s;7pc{m*dnP<^JK>=-2#>T=c=$`gt5g(z zW3l2vq`hn6VXU2M;(^>RY2u*-E->+6CLcBNa3&Tv@qorPGx39FG&S*b%BCxmJ!Os+ zj>KzCyp=PGKQdK#fJBN<@vHD4BZP-JCOptx;h{Xb_+2Yqx0w|r{PR5F0nZB`J5G4f zEyBb43r|>Ac<7wMgYOX@zOmu~6c#>bnBqYMDIUfH;Tb|Ins_K9^O$%rXD^y~I60r0 zctC~gnRrO2UYdAGn~s_IK|NNOcsj@CnfNlXQ;#mwdBu5$$JRA|1s8f+;}wtNlHyaG z79Qxr`b_gYE3~!h3C~|zc)01kFVC&ivZQrI_~)6zgN_g$cB$~9CxxG!FFfHZ;opA zmOXeVyy$J&i=(n1V`Wda$-aCodlM}Cb5iyQ`&3!>3j2jU!@gnfTFU-m53!HQWiPRx z^<_`@%f4c73&{RrkFn1iWv{W{*z>Hi@7R0neSNS9OC-^J)FZeU~H~2gFKflT!!aq7A zf9Z<+C;Taw{44w|{I3-9$MDba*EY+4!=H1>znd$6@1p#_=<)}b%0I+k+%5m{t^CPA z`Iq>cW#xb3kK&)=uj0Sr&*I<`#4uzz4bkx2WC+}dyWX#cT7`w{jh>{r;ou%BUn!+wYTkB|04 z?2p(l)zbc{fc8^swZ9sx{nlvhzb?r~R8l`?-SJ-?86g|Hpoi{UQ5B z_K)l** z8l87={=s>OrSlQaOE^ENs`C`iS2%CEqVpHdV>qA5uJ{F<-*BG8`3~njod0kh#Q9Jo zofmoP{AiTUlQ!sl34Npfaz4d*73Wu+XZ6(i7Ux}@e=XK|SS_88ab8wK=V#q@p5~+T zHD8^#-PHNp2%X0r)cIUYo!4=G$9W#-dz|-i{>OPB=YyOVa()<9FwM{+*Nc_rtU zoM&>r$$4iz&Odb?%K2z@otJWc%6aNDov(7<%K2+5#lzx!mh)Q9Z#mE9e3$cH&VN(s zJUFUefA*R4XwIiOujc%k^X#=c-{!oV^KWmRhjTv8d3j5npL3qh`T8uKw{!l^dHi=e zpXa=u^ZVC|hsgOp=ly?Hzdy>y_XxgE@V$cX7e)0wgYO$V^t~fk-#2VSlF&_#3~yov6^g9p(4Z~K_=Am@aK$s|0`K;fZI3lBD2c(^&j z19lW1^3Uq=NBL6gK2(6gi`w1>KWW#}eZUpE57}4uL9^;UY;xTPUaR}ixpW`=mF~k= z6&_%$@DQ7X2gxBkOf2Dn777oQOn9)A!oxX)2W%)jWESB;@0Yo72RlZ1x}7ar)2@KD~ugQXT8?z!-Q z@q~x$AUtR?;bB(_58PXL=zV6ce?5LN$Hx)1eE_rdPyKHNs#2RxsP0)3>gMiiZ$Y@A0}1c2oD^9+`Lz))w7| z?56vmO%1-?a_K&Bb%TGl_vt?P9NmZSEj+-T0iW=bR)p{%gM^1kAUx1=;h{1K54K-; zxNzYC8ww9ONqEo~!ov<09vD3ISmD8&3J>2@@c>pS9ztWqgZMS?r~8HO`JO}f;U?=o zU>V(qtf%{+Ub+t}JioO{_o372K6nG&hp%n$!1iH-kF{;#LA-^B@fRLwittcz4BpI| zB|O|y;Q>nv4>?MB(Cfm(9uXdRknqr_g$GY8JbY%w1E{Nb2u{U=sHu1uqZJQi>R}TP zWsL3v*3*5+*}4x}*2JfN50FlHh{M8z z3=kfsm%)46*M*0QEj(Cn;o-Un54h6cC#~wjgElkxI%~f0!2N`W&Llke1>xcEDIUOi z#Y0%Bcn~)g596ugflM>^zwN7v2lI>K;k-5XWnBkM{2*(L?gQ`Cedw4=KgCjEgokS>JYYJ5f3|B151LhY*kZy1ClDU` zz3|{yg@=z&Jb-(Ohj2*oAUqWhBeCLvBvw2WPsM|osCYQF6%XjF;vwxnGts4havlNO+*Q!b5ct9xRvea1(_GjAiic_B`Q1>j@9b zdfHrg=()m!E59{J@c`;69zrk0gGi`&7;6;|rgoj_RcmOLE4`I9FK@?Ryj1-CovO)1sQYjux7RAHyP&}X?6c6cz;z0!| z9##g$1KX{5Xq|)yxGOxwaN$Ab2@exbc%Zz(Lmd|$?7Hx9cZ3I&y|q#c586|B*eSvT zw-p{*_S=>{w+Aa8z!1elh@*HA!pB-#AFP3jhq6HNU@|Hm&KSi5`k;77c@z&Szv5wi zrFdX-6c5d*cyOzQhiE1|$Zx{Kq!u2io$yd`ga?}@JluHU0T&4mxkq@=S;E7n5*~P* z@X$Ae2mjuz*Y+=p2OxaA?P=C``<>!pTva@fJ&K1S|G=uNcsRWj59qw&Aw5w%sI!WP zMLe(xiieg@@!)<@JiLvI6c3}W;(^3gJe1vv2Qymna3&}oP%*_rs-bvL z(-aS@isFG04{ea*!Mz>epC@~qIQDJD0}P1~o}t>WeHAt#~VzB|Q8Y#RHhCcnI>(?YYKZw}t1oy%Y~+mEyt3-?!xd zTlEzW$w%>^Rw^FWEyV-Nrg&)86%Q`G;^FmDJirjeLu5VaAv{z&;lVly59c8~;4|SN zR|yXqEIjN=;eq1`53T)^@^IL%F7SFuy7u4)K7r z-?R2A9+dWj);YxkYpi%^y%Y~_jpE@&C?4Pi#Y4=kc#!DL?{wkez84Vm{al4rYIiVesf-63r}d@Qar>6#e>YKc$nzR@6N@a&LD9%C<3JfL)nhtyf| zpvo#9md^B-%c;^7ewu&Cl8>ioz~qIj6ziU*3mQGcDngJuvOHYi)MXSL6G zSmT6;E+IU45#ixyDIP#U#Y52fn3Y%YFght7$Opwkxu;NqF{KFg(efLRm|aiZcuULYQ(;(p)c%*m;lN1l4vEpG&S3D4%ms)8Q52mc*;dm(?Pyxk5I;wb3Hx&;{=d<=S z#Y1bXcyPkETXhu=FhcPVlifG*Aiq>R%&2<(+2?-3L(dZ)e53I2sT2>OvEm_=Qap%g zV_V<2J}sG*Me#r~D;~-k#eI z6b~@F;vu$DJV<}V!~C=Q{ZYQaf}i3uIue@i6OKoUhcH9&AnGa}MzG?6Bvw3>lZpq^ zTk&uTC>~Hf#X~Bgcu+3I!wOP7ush~^i=A8X;3_B{UPHwL9HDrKF>01dGp~Fa>yPCB ztLc}__a{d>^F7Lu?a`<2Q;unhhY_lHAngcDxYQD$We^rmaS}w~w6Az-3;$e(eJdocM4`q$w!Aw^? zoGOY36eDlXVQC^_TSXKPYMkO>^-?^rCyIx*Sn=RqoA@&JaK!^mtayljRqm+e!q+|Y zYjL%YU={J6j(Wl60 z^INsvgHQIuv+V6pzZolC{`Bi8fA(LVNhd$$sgL^qU%!V-((|?YF-~8jC-P_7IrNiW zmDd!i`f9 z`e~2$k>~%G{=8q>%arrJ8K=RQs{eEUWvw}KU*kx92EO&WdNZPrqsF!N4PsyJ=&m^zOr+wq}cDT;gm_H_dS4YL8MHW1$UfXePal%RO$Cr2UOgi~_ zKh#J4v`72MgM5FN-q;i77vqihk37Q%MEJJ9*vFBg^vwl7W$WWu^>gFZ$L4o*yuCJY zcJ6yqTqi^O#hX*v<#IX(ewE_Gao6$cYvVrbao+t*I{7J2ebi5Tw2wT9`e~2$kq7yZ_pj>B`pJ5NeZ}4|{}_+-5AxpruK2`anO?cjZ)3-hn{B?R zYLDM>vwh3x&FtZW=2q@?HqiY{I{7J2ebi5Tw2wT$Kg>tQ zC;f%|l^!n1{7tNe_J;SF-nTB?+ivHxdS=dmk@md0jtu=)k8wYfPJYT$ANA87?IREJ zAusZOuHN`hj33rl<`?!Cd&K-?ywZQ@<3DcNp6xHj+BKInE8TES2Wx%c@e|(JW>`Fv zPJYT$ANA87?IREJAusZOuHLK<_*eKFtiOym<{$Qo`OA2wf6>n_S@+JEUF)ogZA$tF ze?8CQnRN0~p8BYt_Glk@kPms0|8w=mf5xB0e&TPi{<0onpBbObU&b^2i@w)0eQ?b1 z*k|)hI{7J2ebi5Tw2wTdpLMzA%57Ps}go8}pC($oyo!GJnyJ{^gl;@>8DrsGs&|A9;`u zd6EBf^~N4zAF-F%PwXl76?=>QWqe|v(TDzIJo8LC`6*9*)K7b~k37hSyvYB#db9qq z9 zkNRnk_K^qqqRRd6K3|G*-oXBs_Idw|Kjt6y2m6aYtiL>yPJYT$ANA87?XzAX-@mKp z@0I6#gZ6mej5p>R_6B=Pf3e=;Z}3by`6*9*)K7b~k37F8@8A7D@0an#{KCFqUs+#R zU-2*KKb}b^Kjo>9`e~2$|8BiLw?6C%_LTL6{y~2HDf~&ENhd$$sgL?USFZnbe%8-< zvJ3c6j8FV$o=GP^<^R)i|F=DJF8<&5@W10dY&+OIX6Lc79DmnusOk&WZ(03TK499p zA7*}w>z8NJ$xnIe`@7`(yXyH#dPUQ3@m)r*Q4`GX#O2?Adas)r27LO>m)8H&@6+y$ z{^gl;@>8DrsGs)!F8Tj#J-q*{(zB@ZU-g@DqV6YsYI?@{^t)i`j~*Y#)5=$wqka6n zldIs{PLaQb8mxQu@t0@P$xnIe<9*N`?IX{hmH%_|ZKOXnK64Z{`c|7?>yv)VmY4JV zs2BRAY&mJ!N4;A5ck$~O`THVq(x3F#^G;>`KI)nMTaQ?+BY&Ulnl-&pd3NBRKqtm#=S3 zN7eoIrD!oc9sMtt_{lrK!~IM;`6*9*)K7b~k37hSyvYAYdXmn3Vf^qusXyq$)_ouK zWxUcqAvx|>>Dw!oBxDxUbzA-qdE2_Y+C9}joZ$bTdKxv?48~$b)>yi~Q(=e!usNyHqxgURQZ5+zqkZH-KIBDy^g+L<`bU%fV!gnAVo#V~j5ppt^31BxbavWb0$q0wq^|Wk z(Lz_)vL*LJvL1HLZW!isE8i1Wzu<+PW|fR*-+R^Kexu^4>|#SJ<|$G&z5AJT@>8Dr zsGs&|A9;`ud66G|&=0*C|JVc8OV$tUDfWf=#`vQ@kk42B*=+K6A39!-X-5S0Ka|5O zn_aQrvO6zpm9mc%NIBJ&)z3b8Cf%fO`+(jdgYA4lGjmP}>+60do&1!iKI*4E+D9JbW4Zd*0M;_!uUgSp~^h00PclJlv1N>+FN&GAP4c1@Q zBkVKwiuucUrhn1*uE*y7^S5occ_y9wl&3!Gr#;$79^^w_ zp)dXm{tW&N_5lBf@s59lzl8sUKZSpVy!03A5%U#$#WU&Tr#$shKkd;z@*p4bB0u_| zANu02;=eK;@Ne;V@qh7$@sC+Q@t={8{$YHw{$ii7&peY(e#%oH_0t~hBM{r;ou%E#mvfp9;upeT7ggo>Ir>k@>8DrsGs&|A9;`ud66G| z&<}m1{$`cG&io3owlb`a`NBy)%`^bZQ$cy~w z6IIWs&y0W8cg`<3&)|H6_ITfnH|87m2760?vEJfu@Ju@SDNlXWPkXeFJjjQ<$d5iz z_58hO&Zn>ktnbv%`(=DFzpyXZSJoHSfBXylE1pRwKjo>9`e~2$kq7yZ7x{lrzd!n) z^GWLCeKMYyPuLUese3*7A9kJ^^?mUE7(dJ(><9Lf^@H^j{{jDx@rnP;GwI}~JoQmO z?a@B+AYW9u|E_1|3-$tg$$G(h$#}qD!vAG_pbyWalb`a`NBy)%`^fWm>Gx;rVSR`e z<@*Bu5%Mzs*dMSz;+b^vQ=a)n{j~RI<@-U8Dr{%-kO z6^@g8Wvu{Te!tiA&_d?_?8(jV^oub+<=g#sPp*&oOQda;{o`+iu)=XZ{!Tiu^{W+; zztIM~y0Ikk*DG`Sag!o{3zi65<{$Z6x>WSIo{_(vcN->KP&2^S6=(LHE|I@HlTLoh zQy=xy9_=F!@*ywsqYwH;{SA=5c0r?O((7M*(zDjE_n-8<8~s?$kNPDE^-uosx7+NO z7neu=K0C0X`wx-7vkTOlUMli;>dYl!-`5E6{qcSMss5D$d^^AJ_PA9fz&BC8?dxNw zh}V9_d$EK&v-ySYXIKt}psLi9X|gNZrxS7-wRCfAH{9=lS0f#4gc2#ChS1-*Ug+w8Ob&?|`Y-lJ0Ro zlTLohQy=xy9_=F!@*ywsqYwI_FY|%%!TX~8Uhg`krbX(@c#GZmz_Tje0q*{!zr3;~ zcz&+#bZ6d&_hM&1y3LvNsb@&F#^KJ_3-%t~{qD6hao?Y7O=$V0%k#m2!mTzWb9MD@ z?`knBmHU}=@>8DrsGs&256FXj$cy~wgMR3XJz#z?UU+}h$Nbwl;#7ggo$C9hoRV&R z;~YJmlXC^dsC{OWb7{n_RWYkybL-c)Tfv>V-{o)(nYO({lSO4+O{1UblW##?S77Ek zH5^x(x$5|wI9exROZPMBxzD^yn7b4>#(r1>+Y(78B$am?eaZbZg0boxvrnf zY?&AMDA;vBB+d3QM^?C>Nhd$$sgL?;kNJW;$cMbhk3Q&!zN`n>N9+ajhw;SwrM+lR z8x$zGGrDWo$}LUqdKY&0-}3zV_D|nF-qkow`^$Ojt#uXMyi~Q(=e(1}3$ohc2#C|ZJ7+<_^ z+P_}B#mO4kI=K6D!@ZQpcD~)=)~9H2w`Av1esH}go~v28$_ec41N?h_c`l{BzMNIH zaK^OmXVS^f`=LI@1MSg1@*p4bB0u_|ANt}Cus*V0U_Y@Z%rC|p?;m-toGP33VWs`9 zWLw{ijJWZ{mFht5EpKBaw%cFM?l~$XyZt`wz3;gIUpwiVgGau)P|nVAF`~uwj^DYT zNhd$$sgL?;kM@xV`H&a+(Fgs|m+_B1V7+Ahz@B1Xm~V_f`UCms&;3Py32$HhTYJ&4 zl^=Y6@Uwp_oUE{GXn?&sH1*P^OIzE|wz|&5x!%tGOgi}~Pkq!+d$f-{$cMbhk3Q&! zzW9UqN6Zh_Pu3IcEB1!@$9SZFkawqdzBtZWb=~^KUe)74&9go1UlN4xT9cr!-FNTi zSPg3Tbw88N`=C7aQ9td`KJp+R@*+R_pdb3;4>KO{m+&8$Kddjk?~1?A^)JZ zCoY#r+{a$)?69kQoo;rAB87IP@$k3mbT}E7zGY8~XVS?}dFrEn+M|8sK|bU~e)K^< z^kqN5`iH-W|HSxVePw=Of3Zi*PsS_#hd%a&d+}l|8*UZ5+-Az_;2*3PuHz5lwOZhQ zCY}70r#|YZJ=#Ye9`e~2$kq7yZ7x~c#{m_^7o&6E^0RI_(68nk2!TQU3 zgnedwGJhG*^e_6xAKbCMSI-ceXVS?}dFrEn+M|8sK|bU~e)K^<^hJN(2k(dX#rxxZ z@_u>Wynp(G{-M9kNRnk_K^qqkQe#U2mR2O@y_^XJ}^I+FU%k2 z6Z4Dt#{6SGGC!HG%wP1Qe|aXI{FJ9Y>Zd*0M;_!uUgSp~^h00l8}<(ShdsnTVlT0u z*i-B)_7?lg_{2V=5B9`e~2$kq7yZ7x~c#{m>VG75|m-fPag>i~oy1 zjQwPO;XflE{loZVeqx`n&peY(e#%oH_0t~hBM{r>pGC$bg zvOci?rG4H%?`XF>nr{R{l_!uZ5+zqkZH-KIBDy^g%!Lp)cPL_@2P` z1@iO07%$8h>;?9c^@8=1{=i?tU!=d#hiB5sPkHL2e%hmb<{&>?7*~>m%b0{|I@Rf9wy~AMs2&`6*9*)K7b~k37hSyvUC}=!d>he|aB_ z2j&Cz0DH)Kz)wAH3Ex-0` z8WB4GV8MW1k-uGPjO#rt^7nLt%fm_qM1(f~vQVwwZ6ZQf)XHR6+Z_>F@$5`jkNMX_ zSB$#p-SyDZ(ByNsh1V&PzG$xnIeqkh_>eYZT44|$Oveb6tezDF|F zSvWFM-?)!EE#DBS@8Lul>Rs&`5n63XrW;S|Tn$}*?!tqFIq!w0E>I@_xM^QFC;0?l zIC(dZ)9?2E)ETGNcJ6Ar`cbsW-JJv17g;?s+7#!W(qq4xwraUE-sUG&Qy%@rxp?ZW zL#ciCI{kkv*JSL8BhF1vU#>s5|Csxkbn;W4`lz4wXdiiy4|$Oveb5j6c^{;g?Gk^; zx}FiCNy7@SyMOs==!0b|d!^g(B=qo=JSi^sP37FL{ycm8VBBeif}CEZOZ5usG25-* z^OAASgmgabochg~f(6z-be^xhvvE70=&lm&I#)|{JicpAQ1=o$cO`LcT~%ewt9;4b z&!m%|^3=!spgr109^^w_jX_KHl@tt=lJT$o(>t^UShaHM1wJ z=Paf1ne59Y$sDgXIvWRsY&n+eobzG3iLY7=f9ph_G7YkHFW(@y>l?qaE6Thp;Yv93 z;lb&HtGLF;|Mk$=akX3nW@Pb8`>c-pnRN0~p8BYt_Glk@kPms0AAQgdeVGr858fB$ z*W@j*XlXQm_xL@r{CtYdO?Ehg)SvWUzC*4bbDt{cO0uK!g%W`^Tl_iUxU!{qzNgb!es+@1K`TX?rBz<9;Tc{FLW?P(SU_ zKJp+R@*+R_pdb2T53vu-7se0olloK43fmArQ#My`jn{SR&(-7B-rih!u4_y1>{bO6UmbD9$#l+pbiHub=z-4*6^Q%5HL}C*X45Y{a}9r(ZQT6|FWt|ilb`a` zNBy)%`^bZQ$cy~wgMR4CdVqbzUNC*TiQ{38Q$O-yfJFV?cyvrZY^&!m%| z^3+HDv`72MgM7$~{OE&z=*xP@`hdN}elVXHU%YSH&pPDLic32Vxck%N%A$Zq(c{=( zNWaIePM0{{Gp}7UVUq>L`uf@pT&ucuOi;%DW>mL`QU%MopGhY_<*ASHKzp>0JjjQ< z$d5kghraj&tdFc0*iY;U^NaDu`$wKb?cYrbPx7_hwpQcg8`@;EA3X34469edEZ5+zqkZH-KIBDy^g%!L z#UH{RuwJr$U{A3x%s0j#{egV7)SvxQpE#POWIg-tyODnLE48%0*|zgYSD?!wZz!Q}taJ_cQ6_r#$shKkd;z@*p4bB0u_|ANt}C;vY@b`o#LldV+n$-Z1|d zkMxgQ-o!r@*!Q%xeNXyL$?<6M>eHR=T)$-OdFxGCO>@D_(`N;UBzmUIwmt@(_bZTq2X@BsT$KiI? zvAucc6znp>+A?E)w|U#gxt~cVKjo>9`e~2$kq7yZ7x~c#{m_^F0RA!lBK{NOhxL{D zh5f}IF+Ulv^q*TFYx~HZuP0fFT6JCbuG@4gDB9vmeWy%uKlfKU`6*9*)K7b~k37hS zyvUC}=!d@SkJv9@5Ai4Qukbfme_4;P&)6&GFXNg1Mc=Tq;a`Q!|K2{3rP!CPJI}Fs zCY}70r#|YZJ=#Ye$&-j!0SNI#OzpO{tXY3X8m+?&hqHp7z z3C?x7yUwjY>Ex$8^-(|V(LVAZAMzqU`k){BqCfA0_rv?*{qa6|zr1hWKm9@f&|mZ) z{Yn3#KhLC-pYqg4{j^8>$b)>yi~Q(=e(1}1XZ$lCm>p)d9gdx!nQ9%3J{m)KA2DfSh6i~YqOW1rE7 z{$xD!Ogi}~Pkq!+d$f-{$cMbhk3Q&!zN}}gZ>)E$f2@bBkF1xhpRA{>udKJMzsOJj zF@Bl9Jd;j-%2OZp(;n?35Aq=|@}m#>p)dXm{tW&N_5lBf@q>Sazl8sUKZSpVy!032 zmHCRj;+b^vQ=a;$pY~`Ud5{lzksp1~4}I}h@n0Da__z4G_`mqW_{YpI{Ac8&e;A+4 zPwW%+nP<|;PkHL2e%hmb{r>p2FYJ%f6IQC{V(nF{uzJF zKkN_om-UDBmuJ$+PkHL2e%hmb$ay2@kDNzxK1qGNPsS7T z344M)Wj$d%MSlD#{7IfkCqLz>kNRnk_K^qqkQe#U2mR2O^JLDKIdA6tnex0p#t-uc z`+@yr{b2pXf53mjf5d<0nRN0~p8BYt_Glk@kPms0AAQgdeffUC_XNH#ke~O(cwxR^ zFR+)a7p#|4We@R}@E7SX^x>Iw@>8DrsGs&|A9;`ud66G|&<}n2Uc~n!(s@6O59SB< z0sF}M!1~B|!#_e^{A2b9?2mXRo&1!iKI*4E+D9JbLtf-ZAM``tsNV;9AB+d)1NOje K5C4aM5B)#Ww^uCy literal 0 HcmV?d00001 diff --git a/filters/FB_make_1D.m b/filters/FB_make_1D.m new file mode 100644 index 00000000..5d20f6e8 --- /dev/null +++ b/filters/FB_make_1D.m @@ -0,0 +1,36 @@ +% Various ways to make filterbanks. See inside of this file for details. +% +% keep adding different filterbanks, don't alter old ones! +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function FB = FB_make_1D + flag = 1; + + if flag==1 % gabor filter bank for spatiotemporal stuff + omegas = 1 ./ [3 4 5 7.5 11]; + sigmas = [3 4 5 7.5 11]; + FB = mfb_gabor1D( 15, sigmas, omegas ); + end + + + + +function FB = mfb_gabor1D( r, sigmas, omegas ) + counter=1; + for i=1:length(omegas) + [feven,fodd]=filter_gabor_1D(r,sigmas(i),omegas(i)); + FB(counter,:)=feven; counter=counter+1; + FB(counter,:)=fodd; counter=counter+1; + end + + + +%%%%%% Used to test filterbank response +% x=1:31; y=cos(2*pi*x* 1/5 ) + cos(2*pi*x* 1/7 ); y = y/max(y); +% resp = sum(repmat( y, 10,1 ).*FB, 2); stem(resp); diff --git a/filters/FB_make_2D.m b/filters/FB_make_2D.m new file mode 100644 index 00000000..e874cfaf --- /dev/null +++ b/filters/FB_make_2D.m @@ -0,0 +1,148 @@ +% Various ways to make filterbanks. See inside of this file for details. +% +% keep adding different filterbanks, don't alter old ones! +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function FB = FB_make_2D + flag = 5; + + switch flag + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + case 1 %filter bank from serge belongie: + r=15; + FB = mfb_gabor( r, 6, 3, 3, sqrt(2) ); + FB2 = mfb_DOG( r, .6, 2.8, 4); + FB = cat(3, FB, FB2); + %FB = FB(:,:,1:2:36); %include only even symmetric filters + %FB = FB(:,:,2:2:36); %include only odd symmetric filters + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + case 2 % derivative of offset Gaussian filterbank + FB = mfb_DOOG( 15, 6, 3, 5, .5) ; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + case 3 + % wierd filterbank of Gaussian derivatives at various scales + % this is supposed to kind of immitate Laptev&Lindberg ICPR04 + % should see little difference in using higher order then 2nd + r = 9; sigmas = [.5 1 1.5 3]; % sigmas = [1,1.5,2];% + + derivs = []; + %derivs = [ derivs; 0 0 ]; % 0th order + %derivs = [ derivs; 0 1; 1 0 ]; % first order + %derivs = [ derivs; 0 2; 2 0; 1 1 ]; % 2nd order + %derivs = [ derivs; 0 3; 3 0; 2 1; 1 2 ]; % 3rd order + %derivs = [ derivs; 0 4; 4 0; 3 1; 1 3; 2 2 ]; % 4th order + derivs = [ derivs; 1 0; 2 0; 3 0; 4 0; 5 0 ]; % n0 order + derivs = [ derivs; fliplr([ 1 0; 2 0; 3 0; 4 0; 5 0 ])]; % 0n order + counter=1; + for s=sigmas + for i=1:size(derivs,1) + dG = filter_DOOG_2D( r, s, s, derivs(i,:), 0 ); + FB(:,:,counter) = dG; counter=counter+1; + %dG = filter_DOOG_2D( r, s*3, s, derivs(i,:), 0 ); + %FB(:,:,counter) = dG; counter=counter+1; + %dG = filter_DOOG_2D( r, s, s*3, derivs(i,:), 0 ); + %FB(:,:,counter) = dG; counter=counter+1; + end + end + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + case 4 % pretty decent SEPERABLE STEERABLE? Filterbank + r = 9; + sigmas = [.5 1.5 3]; + derivs = [0 1; 1 0; 0 2; 2 0]; + counter=1; + for s=sigmas + for i=1:size(derivs,1) + dG = filter_DOOG_2D( r, s, s, derivs(i,:), 0 ); + FB(:,:,counter) = dG; counter=counter+1; + end + end + FB2 = mfb_DOG( r, .6, 2.8, 4); + FB = cat(3, FB, FB2); + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + case 5 % berkeley fb for textons papers + %FB = mfb_gabor( 6, 6, 1, 2, sqrt(2) ); + %FB = mfb_gabor( 4, 6, 1, 1.6, sqrt(2) ); %using for image dist + FB = mfb_gabor( 7, 6, 1, 2, 2 ); + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + case 6 % symmetric DOOG filters + FB = mfb_DOOG_symmetric( 4, 2, [.5 1] ); + + otherwise + error('none created.'); + end + + + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% multi-scale even and odd filters. These are basically gabor filters +% at a whole bunch of orientations. Adapted from code by Serge +% Belongie. +function FB = mfb_gabor( r, num_ori, num_scales, lambda, sigma ) + counter=1; + for m=1:num_scales + for n=1:num_ori + [F1,F2]=filter_gabor_2D(r,sigma^m,lambda,180*(n-1)/num_ori); + FB(:,:,counter)=F1; counter=counter+1; + FB(:,:,counter)=F2; counter=counter+1; + end + end + +% adds a series of symmetric DooG filters. These are different from +% gabor filters. +function FB = mfb_DOOG_symmetric( r, num_ori, sigmas ) + counter=1; + for sigma=sigmas + Fodd = -filter_DOOG_2D( r, sigma, sigma, [0,1], 0 ); + Feven = filter_DOOG_2D( r, sigma, sigma, [0,2], 0 ); + for n=1:num_ori + theta = 180*(n-1)/num_ori; + FB(:,:,counter) = imrotate( Feven, theta, 'bil', 'crop' ); counter=counter+1; + FB(:,:,counter) = imrotate( Fodd, theta, 'bil', 'crop' ); counter=counter+1; + end + end + + +% adds a series of DooG filters. These are almost identical to the +% gabor filters, so don't include both! +% Defaults: num_ori=6, num_scales=3, lambda=5, sigma=.5, +function FB = mfb_DOOG( r, num_ori, num_scales, lambda, sigma ) + counter=1; + for m=1:num_scales + sigma = sigma * m^.7; + Fodd = -filter_DOOG_2D( r, lambda*sigma^.6, sigma, [0,1], 0 ); + Feven = filter_DOOG_2D( r, lambda*sigma^.6, sigma, [0,2], 0 ); + for n=1:num_ori + theta = 180*(n-1)/num_ori; + FB(:,:,counter) = imrotate( Feven, theta, 'bil', 'crop' ); counter=counter+1; + FB(:,:,counter) = imrotate( Fodd, theta, 'bil', 'crop' ); counter=counter+1; + end + end + +% adds a serires of difference of Gaussian filters. +function FB = mfb_DOG( r, sigma_st, sigma_end, n ) + sigmas = sigma_st:(sigma_end-sigma_st)/(n-1):sigma_end; + FB=[]; + for s=sigmas + FB = cat(3,FB,filter_DOG_2D(r,s,2)); + end; diff --git a/filters/FB_make_3D.m b/filters/FB_make_3D.m new file mode 100644 index 00000000..1957b81f --- /dev/null +++ b/filters/FB_make_3D.m @@ -0,0 +1,37 @@ +% Various ways to make filterbanks. See inside of this file for details. +% +% keep adding different filterbanks, don't alter old ones! +% +% To veiw use: +% montages( FB ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function FB = FB_make_3D + flag = 1; + switch flag + case 1 % pretty decent SEPERABLE STEERABLE? Filterbank + r = 9; + sigmas = [.5 1.5 3]; + derivs = [0 0 1; 0 1 0; 1 0 0; 0 0 2; 0 2 0; 2 0 0]; + counter=1; + for s=sigmas + for i=1:size(derivs,1) + dG = filter_DOOG_3D( r, [s, s, s], derivs(i,:), 0 ); + FB(:,:,:,counter) = dG; counter=counter+1; + end + end + %FB2 = mfb_DOG( r, .6, 2.8, 4); + %FB = cat(3, FB, FB2); + + otherwise + error('none created.'); + end + + + diff --git a/filters/FB_reconstruct_2D.m b/filters/FB_reconstruct_2D.m new file mode 100644 index 00000000..f1811364 --- /dev/null +++ b/filters/FB_reconstruct_2D.m @@ -0,0 +1,105 @@ +% Use to see how much image information is preserved in filter outputs. +% +% Reconstructs the orginal image from filter outputs. Does this independenly for each +% pixel, and then just combines the pixel info. Note that each patch is 0 mean, since no +% mean information is captured by the filter outputs. Alter flag below to either attempt +% to reconstruct the entire image of just a patch (interactively specified). Other flags +% can also be changed, see file. +% +% INPUTS +% I - original image +% FB - FB to apply and do reconstruction with +% +% OUTPUTS +% I2 - recovered image +% +% EXAMPLE +% load trees; X=imresize(X,.5); +% load FB_DoG.mat; +% I2 = FB_reconstruct_2D( X, FB ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function I2 = FB_reconstruct_2D( I, FB ) + FB_mrows = size(FB,1); FB_ncols = size(FB,2); + FB_mradius = (FB_mrows-1)/2; FB_nradius = (FB_ncols-1)/2; + [mrows,ncols] = size(I); + + % add mean vector to filterbank (helps for visualization to have mean) + if( 0 ) FB = cat(3, FB, ones([FB_mrows FB_ncols])/FB_mrows/FB_ncols ); end + + % get FB responses + IFR = FB_apply_2D( I, FB, 'same' ); + IFR_str = squeeze( sum( sum( abs(IFR), 1 ), 2) ); + + % Reshape FB. Each row of F will be taken from 1 of the filters in FB. + % reshape takes elements out of FB columnwise, starting with the first + % filter and so on, creating a matrix where each column represents a + % filter response. We tranpose this. The fliplr is important because + % when conv was done, the REVERSED version (fliplr and flipud) of each + % filter was passed. Once each filter is string strung out we just need + % to do 1 fliplr to perfectly reverse the whole thing. + F = reshape( FB, FB_mrows*FB_ncols, [] ); F=F'; F=fliplr(F); + + % invert filter bank + Finv = pinv(F); + + if 1 %%% recover entire image + if 1 % reconstruct filter + w = filter_binomial_1D( 1 ); + w = w * w'; + else + w = [0 0 0; 0 1 0; 0 0 0]; + end + + I2 = zeros( size(IFR,1)+2, size(IFR,2)+2 ); + index_r = (FB_mrows+1)/2; index_c = (FB_ncols+1)/2; + for r=1:size(IFR,1) for c=1:size(IFR,2) + % recover the vector at this point + filter_resp_vec = squeeze( IFR(r,c,:) ); + I_win_recovered_vec = Finv * filter_resp_vec; + I_win_recovered = reshape( I_win_recovered_vec, FB_mrows, FB_ncols ); + + % update overall image + Idelta = w .* I_win_recovered( index_r-1:index_r+1, index_c-1:index_c+1 ); + I2(r:r+2,c:c+2) = I2( r:r+2,c:c+2 ) + Idelta; + end; end; + I2 = arraycrop2dims( I2, size(I2)-2 ); + + % display + figure; + subplot(2,2,1); montage2( IFR, 1 ); + subplot(2,2,2); montage2( FB, 1 ); + subplot(2,2,3); im( I ); + subplot(2,2,4); im( I2 ); + %IFR_str + + else %%% recover a specific patch + + % get a specific r,c + figure(1); im(I); + [c,r] = ginput(1); r=round(r); c=round(c); + hold('on'); plot( c, r, '+r' ); hold('off'); + + % recover a given window patch + filter_resp_vec = squeeze( IFR(r,c,:) ); + I_win_recovered_vec = Finv * filter_resp_vec; + I_win_recovered = reshape( I_win_recovered_vec, FB_mrows, FB_ncols ); + + % get the TRUE image window around given point (for comparison only) + I_win = I( max(1,r-FB_mradius):min(r+FB_mradius,mrows), max(1,c-FB_mradius):min(c+FB_mradius,ncols )); + I_win_vec = reshape( I_win, [], 1 ); + + % show the TRUE window vs the recovered window + figure(2); im( I_win ); + hold('on'); plot( FB_mradius+1, FB_nradius+1, '+r' ); hold('off'); + figure(3); im( I_win_recovered); + hold('on'); plot( FB_mradius+1, FB_nradius+1, '+r' ); hold('off'); + + I2 = []; + end diff --git a/filters/FB_visualize_1D.m b/filters/FB_visualize_1D.m new file mode 100644 index 00000000..60a38873 --- /dev/null +++ b/filters/FB_visualize_1D.m @@ -0,0 +1,34 @@ +% Used to visualize the Fourier spectra of a series of 1D filters. +% +% INPUTS +% FB - filter bank to visualize +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function FB_visualize_1D( FB ) + r = (size(FB,2)-1)/2; + + FBF=zeros(size(FB)); + for n=1:size(FB,1) + FBF(n,:)=abs(fftshift(fft(FB(n,:)))); + end + + figure; + subplot(1,3,1); plot_vectors( -r:r, FB ); + subplot(1,3,2); plot_vectors( [-r:r]/(2*r+1), FBF ); + subplot(1,3,3); stem( [-r:r]/(2*r+1), max(FBF,[],1) ); + + +function plot_vectors( x, ys ) + colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k']; nc = length(colors); + + gcf; + hold('on'); + for n=1:size(ys,1) plot( x, ys(n,:), 'color', colors(mod((n-1),nc)+1) ); end; + hold('off'); + diff --git a/filters/FB_visualize_2D.m b/filters/FB_visualize_2D.m new file mode 100644 index 00000000..238c4d90 --- /dev/null +++ b/filters/FB_visualize_2D.m @@ -0,0 +1,25 @@ +% Used to visualize the Fourier spectra of a series of 2D filters. +% +% Used to visualize the Fourier spectra of a series of filters. Generally best if called +% only on the part of the FB that contains the oriented filters. +% +% INPUTS +% FB - filter bank to visualize +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function FB_visualize_2D( FB ) + FBF=zeros(size(FB)); + for n=1:size(FB,3) + FBF(:,:,n)=abs(fftshift(fft2(FB(:,:,n)))); + end + + figure; + subplot(1,3,1); montage2(FB); + subplot(1,3,2); montage2(FBF); + subplot(1,3,3); im(sum(FBF,3)); diff --git a/filters/filter_DOG_2D.m b/filters/filter_DOG_2D.m new file mode 100644 index 00000000..ab623c80 --- /dev/null +++ b/filters/filter_DOG_2D.m @@ -0,0 +1,74 @@ +% Difference of Gaussian (Dog) Filter. +% +% Adapted from code by Serge Belongie. Takes a "difference of Gaussian" - all centered +% on the same point but with different values for sigma. +% +% INPUTS +% r - Final filter will be 2*r+1 on each side +% sig - standard deviation of central Gaussian +% order - should be either 1 or 2 +% show - [optional] figure to use for display (no display if == 0) +% +% OUTPUTS +% G - final filter +% +% EXAMPLE +% G = filter_DOG_2D( 6, 3, 1, 1 ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also FILTER_DOOG_2D + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function G = filter_DOG_2D( r, sig, order, show ) + if( nargin<4 || isempty(show) ) show=0; end; + + N = 2*r+1; + [x,y]=meshgrid(-r:r,-r:r); + X=[x(:) y(:)]; + + if (order==1) + sigi=0.71*sig; % these should have all been square-rooted + sigo=1.14*sig; + Ci=diag([sigi,sigi]); + Co=diag([sigo,sigo]); + + Ga=normpdf2(X,[0 0]',Ci); Ga=reshape(Ga,N,N); + Gb=normpdf2(X,[0 0]',Co); Gb=reshape(Gb,N,N); + + a=1; b=-1; + G = a*Ga + b*Gb; + + elseif (order==2) + sigi=0.62*sig; + sigo=1.6*sig; + C=diag([sig,sig]); + Ci=diag([sigi,sigi]); + Co=diag([sigo,sigo]); + + Ga=normpdf2(X,[0 0]',Ci); Ga=reshape(Ga,N,N); + Gb=normpdf2(X,[0 0]',C); Gb=reshape(Gb,N,N); + Gc=normpdf2(X,[0 0]',Co); Gc=reshape(Gc,N,N); + + a=-1; b=2; c=-1; + G = a*Ga + b*Gb + c*Gc; + + else + error('order not supported'); + end + + % normalize + G=G-mean(G(:)); + G=G/norm(G(:),1); + + % display + if (show) + figure(show); filter_visualize_2D( G, 0 ); + end + + + diff --git a/filters/filter_DOOG_1D.m b/filters/filter_DOOG_1D.m new file mode 100644 index 00000000..fc9a58ea --- /dev/null +++ b/filters/filter_DOOG_1D.m @@ -0,0 +1,45 @@ +% 1D difference of offset Gaussian (DooG) filters. +% +% Creates a 2D derivative of Gaussian kernel. Use primarily for visualization purposes. +% For filtering better to use the indvidiual seperable kernels for efficiency purposes. +% +% INPUTS +% r - final mask will have length 2r+1 +% sig - sigma for Gaussian +% deriv - order of derivative +% show - [optional] figure to use for display (no display if == 0) +% +% OUTPUTS +% dG - The derivative of Gaussian mask +% +% EXAMPLE +% dG = filter_DOOG_1D( 11, 2, 3, 1 ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also FILTER_DOOG_2D, FILTER_DOOG_3D + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function dG = filter_DOOG_1D( r, sig, deriv, show ) + if( nargin<4 || isempty(show) ) show=0; end; + + % get initial Gaussian + dG = fspecial( 'Gaussian', [1,2*r+1], sig ); + + % apply derivativfe operator appropriate number of times + dx = .5*[-1 0 1]; + for i=1:deriv dG = conv2( dG, dx, 'same' ); end; + + % normalize (don't need to adjust mean since DOOG always have 0 mean) + L1norm = norm(dG(:),1); + dG=dG/L1norm; + + % display + if ( show ) + figure(show); filter_visualize_1D( dG ); + end + diff --git a/filters/filter_DOOG_2D.m b/filters/filter_DOOG_2D.m new file mode 100644 index 00000000..4481408a --- /dev/null +++ b/filters/filter_DOOG_2D.m @@ -0,0 +1,50 @@ +% 2D difference of offset Gaussian (DooG) filters. +% +% Creates a 2D derivative of Gaussian kernel. Use primarily for visualization purposes. +% For filtering better to use the indvidiual seperable kernels for efficiency purposes. +% +% INPUTS +% r - final mask will be 2r+1 x 2r+1 +% sigx - sigma for Gaussian in x direction +% sigy - sigma for Gaussian in y direction +% nderivs - order of derivative along each dimension +% show - [optional] figure to use for display (no display if == 0) +% +% OUTPUTS +% dG - The derivative of Gaussian mask +% +% EXAMPLE +% dG = filter_DOOG_2D( 20, 3, 3, [1,1], 1 ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also FILTER_DOOG_1D, FILTER_DOOG_3D, FILTER_DOG_2D, FILTER_GABOR_2D + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function dG = filter_DOOG_2D( r, sigx, sigy, nderivs, show ) + if( nargin<5 || isempty(show) ) show=0; end; + + % get initial Gaussian + dG1 = fspecial( 'Gaussian', [2*r+1,1], sigy ); + dG2 = fspecial( 'Gaussian', [1,2*r+1], sigx ); + dG = dG1 * dG2; + + % apply derivativfe operator appropriate number of times + dx = .5*[-1 0 1]; + for i=1:nderivs(1) dG = conv2( dG, dx, 'same' ); end; + for i=1:nderivs(2) dG = conv2( dG, dx', 'same' ); end; + + % normalize (don't need to adjust mean since DOOG always have 0 mean) + L1norm = norm(dG(:),1); + dG=dG/L1norm; + + % showlay + if (show) + figure(show); filter_visualize_2D( dG, 0 ); + title( ['sigx = ' num2str(sigx) ', sigy = ' num2str(sigy) ', deriv order = [' num2str( nderivs ) ']' ] ); + end + diff --git a/filters/filter_DOOG_3D.m b/filters/filter_DOOG_3D.m new file mode 100644 index 00000000..fd02413f --- /dev/null +++ b/filters/filter_DOOG_3D.m @@ -0,0 +1,55 @@ +% 3D difference of offset Gaussian (DooG) filters. +% +% Creates a 3D derivative of Gaussian kernel. Use primarily for visualization purposes. +% For filtering better to use the indvidiual seperable kernels for efficiency purposes. +% +% INPUTS +% r - final mask will be NxNxN where N=2r+1 +% sigmas - sigmas for 3D Gaussian +% nderivs - order of derivative along each dimension +% show - [optional] whether or not to visually display the kernel +% +% OUTPUTS +% dG - The derivative of Gaussian mask +% +% EXAMPLE +% dG = filter_DOOG_3D( 50, [4,4,10], [1,1,0], 1 ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also FILTER_DOOG_1D, FILTER_DOOG_2D + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function dG = filter_DOOG_3D( r, sigmas, nderivs, show ) + if( nargin<4 || isempty(show) ) show=0; end; + N = 2*r+1; + + % create 1D Gaussian and derivative masks + gauss_x = fspecial( 'Gaussian', [1,N], sigmas(1) ); + gauss_y = fspecial( 'Gaussian', [N,1], sigmas(2) ); + gauss_t = fspecial( 'Gaussian', [N,1], sigmas(3) ); + gauss_t = permute( gauss_t', circshift(1:3,[1,2-1]) ); + dx = .5*[-1 0 1]; dy = dx'; dt = .5* cat(3, -1, cat(3,0,1)); + + % create Gaussian kernel + dG =convn( gauss_t, gauss_y*gauss_x ); + + % take derivative of kernel appropriately + for i=1:nderivs(1) dG = convn( dG, dx, 'same' ); end; + for i=1:nderivs(2) dG = convn( dG, dy, 'same' ); end; + for i=1:nderivs(3) dG = convn( dG, dt, 'same' ); end; + + % normalize + L1norm = norm(dG(:),1); + dG=dG/L1norm; + + % display + if (show) + figure(show); clf; montage2(dG,1); + figure(show+1); clf; filter_visualize_3D( dG, .1 ); + end + diff --git a/filters/filter_binomial_1D.m b/filters/filter_binomial_1D.m new file mode 100644 index 00000000..da2a19d5 --- /dev/null +++ b/filters/filter_binomial_1D.m @@ -0,0 +1,41 @@ +% 1D binomial filter (approximation to Gaussian filter) +% +% Creates a binomial filter of size 2*r+1 x 1. This can be used to approximate the +% Gaussian distribution with sigma=sqrt((2*r+1)/4). For large r, should give same output +% as: +% g = fspecial( 'Gaussian', [2*r+1,1],sqrt((2*r+1)/4) ); +% Given sigma, use r ~= 2*sigma^2. +% +% Use F = f*f' to get the equivalent 2d filter. +% +% INPUTS +% r - mask will have length 2r+1 and var=(2*r+1)/4 +% show - [optional] figure to use for display (no display if == 0) +% +% OUTPUTS +% f - 1D binomial filter +% +% EXAMPLE +% r = 10; +% fbinom = filter_binomial_1D( r, 1 ); +% fgauss = filter_gauss_1D( r, sqrt((2*r+1)/4), 2 ); +% +% DATESTAMP +% 11-Oct-2005 7:00pm +% +% See also FILTER_GAUSS_1D + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function f = filter_binomial_1D( r, show ) + if( nargin<2 ) show=0; end; + if( mod(r,1)~=0 ) error( 'r must be an integer'); end; + + f = diag(fliplr(pascal(2*r+1))) / 4^r; + + % display + if ( show ) + figure(show); filter_visualize_1D( f ); + end diff --git a/filters/filter_gabor_1D.m b/filters/filter_gabor_1D.m new file mode 100644 index 00000000..ce92bf14 --- /dev/null +++ b/filters/filter_gabor_1D.m @@ -0,0 +1,57 @@ +% 1D Gabor Filters. +% +% Creates a pair of 1D Gabor filters (even/odd). +% +% INPUTS +% r - final mask will be 2r+1 (good choice for r is r=2*sig) +% sig - standard deviation of Gaussian mask +% omega - frequency of underlying sine/cosine +% should range between 1/(2r+1) and r/(2r+1)~.5 +% otherwise false frequencies form +% show - [optional] figure to use for display (no display if == 0) +% +% OUTPUTS +% feven - even symmetric filter (-cosine masked with Gaussian) +% fodd - odd symmetric filter (-sine masked with Gaussian) +% +% EXAMPLE +% tau = 5; filter_gabor_1D(2*tau,tau,1/tau,1); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also FILTER_GABOR_2D + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [feven,fodd] = filter_gabor_1D( r, sig, omega, show ); + r = ceil(r); + if (omega<1/(2*r+1) || omega>r/(2*r+1)) + msg = ['omega =' num2str(omega) ' out of range; range = [']; + msg = [msg num2str(1/(2*r+1)) ',' num2str(r/(2*r+1)) ']']; + error(msg); + end; + if( nargin<4 || isempty(show) ) show=0; end; + + % create even and odd pair (ppd version of F1 is the actual Gabor filter) + x = -r:r; + feven = -cos(2*pi*x*omega) .* exp( -(x.^2)/sig^2 ); + fodd = -sin(2*pi*x*omega) .* exp( -(x.^2)/sig^2 ); %imag(hilbert(feven)); + + % normalize to mean==0, but only in locs that are nonzero + inds = abs(feven)>.00001; feven(inds) = feven(inds) - mean( feven(inds ) ); + inds = abs(fodd)>.00001; fodd(inds) = fodd(inds) - mean( fodd(inds ) ); + + % set L1norm to 0 + feven=feven/norm(feven(:),1); + fodd=fodd/norm(fodd(:),1); + + % visualization + if (show) + figure(show); filter_visualize_1D( feven ); + title( ['even filter: sig = ' num2str(sig) ', omega = ' num2str(omega) ] ); + figure(show+1); filter_visualize_1D( fodd ); + title( ['odd filter: sig = ' num2str(sig) ', omega = ' num2str(omega) ] ); + end diff --git a/filters/filter_gabor_2D.m b/filters/filter_gabor_2D.m new file mode 100644 index 00000000..f1ee1185 --- /dev/null +++ b/filters/filter_gabor_2D.m @@ -0,0 +1,56 @@ +% 2D Gabor filters. +% +% Creates a pair of Gabor filters (one odd one even) at the specified orientation. +% For Thomas' ECCV98 filters, use sig=sqrt(2), lam=4. +% +% INPUTS +% r - final mask will be 2r+1 x 2r+1 +% sig - standard deviation +% lam - elongation +% theta - orientation +% show - [optional] figure to use for display (no display if == 0) +% +% OUTPUTS +% Feven - even symmetric filter (-cosine masked with Gaussian) +% Fodd - even symmetric filter (-sine masked with Gaussian) +% +% EXAMPLE +% [Feven,Fodd]=filter_gabor_2D(15,sqrt(2),4,45,1); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also FILTER_GABOR_1D, FILTER_GAUSS_ND + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function [Feven,Fodd]=filter_gabor_2D(r,sig,lam,theta,show) + if( nargin<5 || isempty(show) ) show=0; end; + + % create even and odd pair (ppd version of Feven is the actual Gabor filter) + % instead of using cos and sin, masks y.^2. + [x,y]=meshgrid(-r:r,-r:r); + %Feven = -cos(2*pi*y/4 ) .* exp(-(y.^2)/(sig^2)-(x.^2)/(lam^2*sig^2)); + Feven = (4*(y.^2)/(sig^4)-2/(sig^2)).*exp(-(y.^2)/(sig^2)-(x.^2)/(lam^2*sig^2)); + Fodd = imag(hilbert(Feven)); + + % orient appropriately + Feven=imrotate(Feven,theta,'bil','crop'); + Fodd=imrotate(Fodd,theta,'bil','crop'); + + % Set mean to 0 (should already be 0) + Feven=Feven-mean(Feven(:)); + Fodd=Fodd-mean(Fodd(:)); + + % set L1norm to 0 + Feven=Feven/norm(Feven(:),1); + Fodd=Fodd/norm(Fodd(:),1); + + + % showlay + if (show) + figure(show); filter_visualize_2D( Feven, 0 ); + figure(show+1); filter_visualize_2D( Fodd, 0 ); + end; diff --git a/filters/filter_gauss_1D.m b/filters/filter_gauss_1D.m new file mode 100644 index 00000000..4d1918dc --- /dev/null +++ b/filters/filter_gauss_1D.m @@ -0,0 +1,41 @@ +% 1D Gaussian filter. +% +% Equivalent to: f = fspecial('Gaussian',[2*r+1,1],sigma) +% Equivalent to: f = filter_gauss_nD( 2*r+1, r+1, sigma^2 ); +% +% INPUTS +% r - mask will have length 2r+1, if r=[] r is set to ceil(2.25*sigma) +% sigma - standard deviation of mask +% show - [optional] figure to use for display (no display if == 0) +% +% OUTPUTS +% f - 1D Gaussian filter +% +% EXAMPLE +% f1 = filter_gauss_1D( 10, 2, 1 ); +% f2 = filter_gauss_nD( 21, [], 2^2, 2); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also FILTER_BINOMIAL_1D, FILTER_GAUSS_ND + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function f = filter_gauss_1D( r, sigma, show ) + if( nargin<3 || isempty(show) ) show=0; end; + if( isempty(r) ) r = ceil(sigma*2.25); end; + if( mod(r,1)~=0 ) error( 'r must be an integer'); end; + + x = -r:r; + f = exp(-(x.*x)/(2*sigma*sigma))'; + f(f3 ) show=0; end; + + if( size(C,1)==1 || size(C,2)==1 ) C=diag(C); end; + if( length(mu)~=nd ) error('invalid mu'); end; + if( any(size(C)~=nd)) error( 'invalid C'); end; + + % get vector of grid locations + if (nd==1) + grid_vec = 1:dims(1); + else + for d=1:nd temp{d} = 1:dims(d); end; + [ temp{:}] = ndgrid( temp{:} ); + grid_vec = zeros( nd, prod(dims) ); + for d=1:nd grid_vec( d, : ) = temp{d}(:)'; end + end + + % evaluate the Gaussian at those points + ps = normpdf2( grid_vec, mu, C ); + if( nd>1) G = reshape( ps, dims ); else G = ps; end; + + % optionally show + if ( show ) + figure(show); clf; + if ( nd==1 ) + filter_visualize_1D( G ); + elseif( nd==2 ) + im(G); hold('on'); plot_gaussellipses( mu, C, 2 ); hold('off'); + elseif( nd==3 ) + if 1 montage2( G, 1 ); else filter_visualize_3D( G, .2 ); end + end + end + diff --git a/filters/filter_steerable.m b/filters/filter_steerable.m new file mode 100644 index 00000000..1def337e --- /dev/null +++ b/filters/filter_steerable.m @@ -0,0 +1,35 @@ +% Steerable Gaussian derivative filter. +% +% This function is meant for visualization only. It is a demonstration of steerable +% filters. +% +% Analytically find Gx = dxG and Gy = dxG. Then find the derivative of G in some +% arbitrary direction theta by taking a linear combination of Gx and Gy. +% +% INPUTS +% theta - orientation +% +% EXAMPLE +% filter_steerable( 30 ) +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function filter_steerable( theta ) + % Get G (could alternatively use fspecial but need phi) + [x,y]=meshgrid(-1:.1:1, -1:.1:1 ); + r = sqrt( x.^2 + y.^2 ); + G = exp( -r .* r *2 ); + + % get first derivative in x, y, and linear comb in theta + phi = atan2( y, x ); + Gx = r .* cos(phi) .* G; + Gy = r .* sin(phi) .* G; + Gtheta = cos(theta)*Gx + sin(theta)*Gy; + + % show (scale for visualization purposes) + figure(1); im( [G Gx*2 Gy*2 Gtheta*2 ] ); diff --git a/filters/filter_visualize_1D.m b/filters/filter_visualize_1D.m new file mode 100644 index 00000000..8423ae5d --- /dev/null +++ b/filters/filter_visualize_1D.m @@ -0,0 +1,35 @@ +% Used to help visualize the a 1D filter. +% +% Marks local image maxima with a green '+' and minima with a red '+'. Also shows the fft +% response of the filter. +% +% INPUTS +% f - filter to visualize +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function filter_visualize_1D( f ) + r = (length(f)-1)/2; + + f( abs(f)<.00001 ) = 0; + subplot(2,1,1); plot(-r:r, f); + hold('on'); plot(0,0,'m+'); + h = line([-r,r],[0,0]); set(h,'color','green') + hold('off'); xlim( [-r, r] ); + + % plot local maxes and mins in f + localmaxes_BW = imregionalmax(f); localmaxes = find(localmaxes_BW); + localmins_BW = imregionalmin(f); localmins = find(localmins_BW); + + hold('on'); + plot( localmaxes-r-1, f(localmaxes), 'g+'); + plot( localmins-r-1, f(localmins), 'r+'); + hold('off'); + + % plot fft magnitude (fft magnitude of feven & fodd is same) + subplot(2,1,2); stem( [-r:r] / (2*r+1), abs( fftshift( fft( f ) )) ); diff --git a/filters/filter_visualize_2D.m b/filters/filter_visualize_2D.m new file mode 100644 index 00000000..b8eb2300 --- /dev/null +++ b/filters/filter_visualize_2D.m @@ -0,0 +1,61 @@ +% Used to help visualize a 2D filter. +% +% Marks local image maxima with a green '+' and minima with a red '+'. Also shows the fft +% response of the filter. Can optionally also plot a scanline through either center row+2 +% or center column+2. +% +% INPUTS +% F - filter to visualize +% plotline - if 1, then draw line through center row+2, if 2 then +% througt center col+2. else no line. optional. +% +% DATESTAMP +% 29-Sep-2005 2:00pm + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function filter_visualize_2D( F, plotline ) + + subplot(2,1,1); + F( abs(F)<.00001 ) = 0; im(F); + title(inputname(1)); + + % plot maxes and mins in F + localmaxes_BW = imregionalmax(F); + localmaxes_BW(1,1)=0; localmaxes_BW(end,end)=0; + localmaxes_BW(1,end)=0; localmaxes_BW(end,1)=0; + [localmaxes(:,1),localmaxes(:,2)] = find(localmaxes_BW); + + localmins_BW = imregionalmin(F); + localmins_BW(1,1)=0; localmins_BW(end,end)=0; + localmins_BW(1,end)=0; localmins_BW(end,1)=0; + [localmins(:,1),localmins(:,2)] = find(localmins_BW); + + hold('on'); plot( localmaxes(:,2), localmaxes(:,1), 'g+'); + plot( localmins(:,2), localmins(:,1), 'r+'); hold('off'); + + % show fft response + subplot(2,1,2); + FF = abs(fftshift(fft2(F))); + im(FF); title('Fourier spectra'); + + % plot scanline + if (nargin==2) + if (plotline==1) + sc = F( (size(F,1)-1)/2 +2, : ); + elseif (plotline==2) + sc = F( :, (size(F,2)-1)/2 +2 ); + else + return; + end + + localmaxes_BW = imregionalmax(sc); localmaxes = find(localmaxes_BW); + localmins_BW = imregionalmin(sc); localmins = find(localmins_BW) ; + figure(2); plot( sc ); hold('on'); + plot( localmaxes, sc(localmaxes), 'g+'); + plot( localmins, sc(localmins), 'r+'); + hold('off'); + end + diff --git a/filters/filter_visualize_3D.m b/filters/filter_visualize_3D.m new file mode 100644 index 00000000..e13a2bf6 --- /dev/null +++ b/filters/filter_visualize_3D.m @@ -0,0 +1,40 @@ +% Used to help visualize a 3D filter. +% +% Dark lobes correspond to negative areas. Surfaces shown are drawn at a percentage of +% the peak filter response detemined by frac. +% +% INPUTS +% F - 3D filter to visualize +% frac - frac of max value of F at which to draw surfaces. +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also FILTER_VISUALIZE_2D + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function filter_visualize_3D( F, frac ) + if( nargin<2 || isempty(frac)) frac = .1; end; % 10% of peak + + %%% better visualization this way, t negative at left to positive at right + F = flipdim( permute( F, [3, 1, 2] ), 1 ); + + %%% approximate display as surface (may miss lots of lobes!!!) + maxval = max(abs(F(:))); + washeld = ishold; if (~washeld) hold('on'); end; + p = patch(isosurface( F>frac*maxval, 0 )); + set(p,'FaceColor',[.9 .9 .9],'EdgeColor','none'); % light gray lobes + p2 = patch(isosurface( F<-frac*maxval, 0 )); + set(p2,'FaceColor',[.4 .4 .4],'EdgeColor','none'); % dark gray lobes + + %%% set view + daspect([1 1 1]); view(3); axis tight; + camlight; lighting gouraud; set(gca,'Box','on'); + set(gca,'YTick',[]); set(gca,'XTick',[]); set(gca,'ZTick',[]); + xlabel('y'); ylabel('t'); zlabel('x'); + if (~washeld) hold('off'); end; + + diff --git a/images/Contents.m b/images/Contents.m new file mode 100644 index 00000000..e7dacc0c --- /dev/null +++ b/images/Contents.m @@ -0,0 +1,70 @@ +% IMAGE +% See also +% +% Display: +% im - [2D] Function for displaying grayscale images. +% montage2 - [3D] Used to display a stack of T images. +% montages - [4D] Used to display R sets of T images each. +% montages2 - [4D] Used to display R sets of T images each. +% filmstrip - [3D] Used to display a stack of T images as a filmstrip. +% filmstrips - [4D] Used to display R sets of filmstrips. +% makemovie - [3D] Used to convert a stack of T images into a movie. +% makemovies - [4D] Used to convert R sets of equal length videos into a single movie. +% makemoviesets - [5D] Used to convert S sets of R videos into a movie. +% makemoviesets2 - [5D] Used to convert S sets of R videos into a movie. +% playmovie - [3D] shows the image sequence I as a movie. +% playmovies - [4D] shows R videos simultaneously as a movie. +% clustermontage - Used for visualization of clusters of images and videos. +% movie2images - Creates a stack of images from a matlab movie M. +% +% Histograms: +% assign2bins - Quantizes I according to values in edges. +% histc_1D - Generalized, version of histc (histogram count), allows weighted values. +% histc_image - Calculates histograms at every point in an array I. +% histc_nD - Generalized, multidimensional version of normalized histc (histogram count). +% histc_sift - Creates a series of locally position dependent histograms of the values in I. +% histc_sift_nD - Creates a series of locally position dependent histograms. +% histmontage - Used to display multiple 1D histograms. +% +% Convolution: +% convn_fast - Fast convolution, replacement for both conv2 and convn. +% gauss_smooth - Applies Gaussian smoothing to a (multidimensional) image. +% +% Generalized correlation: +% normxcorrn - Normalized n-dimensional cross-correlation. +% normxcorrn_fg - Normalized n-dimensional cross-correlation with a mask. +% xcorrn - n-dimensional cross-correlation. Generalized version of xcorr2. +% xeucn - n-dimensional euclidean distance between each window in A and template T. +% +% Image deformation: +% apply_homography - Applies the homography defined by H on the image I. +% texture_map - Maps texture in I according to row_dest and col_dest. +% imnormalize - Various ways to normalize a (multidimensional) image. +% imrotate2 - Custom version of imrotate that demonstrates use of apply_homography. +% imtranslate - Translate an image to subpixel accuracy. +% imshrink - Used to shrink a multidimensional array I by integer amount. +% imsubs2array - Converts subs/vals image representation to array representation. +% imsubs_resize - Resizes subs in subs/vals image representation by resizevals. +% +% Generalized nonmaximal suppression: +% nonmaxsupr - Applies nonmaximal suppression on an image of arbitrary dimension. +% nonmaxsupr_list - Applies nonmaximal suppression to a list. +% nonmaxsupr_window - Nonmaximal suppression of values outside of a given window. +% +% Optical Flow: +% optflow_corr - Calculate optical flow using cross-correlation. +% optflow_horn - Calculate optical flow using Horn & Schunck. +% optflow_lucaskanade - Calculate optical flow using Lucas & Kanade. Fast, parallel code. +% +% Miscellaneous: +% imageMLG - Calculates maximum likelihood parameters of gaussian that gave rise to image G. +% imwrite2 - Similar to imwrite, except follows a strict naming convention. +% imwrite2split - Writes/reads a large set of images into/from multiple directories. +% jitter_image - Creates multiple, slightly jittered versions of an image. +% jitter_video - Creates multiple, slightly jittered versions of a video. +% localsum - Fast routine for box filtering. +% localsum_block - Calculates the sum in non-overlapping blocks of I of size dims. +% mask_circle - Creates an image of a 'pie slice' of a circle. +% mask_ellipse - Creates a binary image of an ellipse. +% mask_gaussians - Divides a volume into softly overlapping gaussian windows. +% modefilt1 - One-dimensional mode filtering. diff --git a/images/apply_homography.m b/images/apply_homography.m new file mode 100644 index 00000000..1726f55c --- /dev/null +++ b/images/apply_homography.m @@ -0,0 +1,93 @@ +% Applies the homography defined by H on the image I. +% +% Takes the center of the image as the origin, not the top left corner. Also, the +% coordinate system is row/ column format, so H must be also. +% +% The bounding box of the image is set by the BBOX argument, a string that can be 'loose' +% (default) or 'crop'. When BBOX is 'loose', IR includes the whole transformed image, +% which generally is larger than I. When BBOX is 'crop' IR is cropped to include only the +% central portion of the transformed image and is the same size as I. Preserves I's type. +% +% INPUTS +% I - input black and white image (2D double or unint8 array) +% H - 3x3 nonsingular homography matrix +% method - [optional] parameter for interp2 ('nearest',{'linear'},'spline','cubic'); +% bbox - [optional] see above for meaning of bbox ({'loose'},'crop') +% show - [optional] figure to use for display (no display if == 0) +% +% OUTPUTS +% IR - result of applying H to I. +% +% EXAMPLE +% load trees; I=X; +% R = rotation_matrix2D( pi/4 ); T = [1; 3]; H = [R T; 0 0 1]; +% IR = apply_homography( I, H, [], 'crop', 1 ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also TEXTURE_MAP, IMROTATE2 + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function IR = apply_homography( I, H, method, bbox, show ) + if( ndims(I)~=2 ) error('I must a MxN array'); end; + if(any(size(H)~=[3 3])) error('H must be 3 by 3'); end; + if(rank(H)~=3) error('H must be full rank.'); end; + if( nargin<3 || isempty(method)) method='linear'; end; + if( nargin<4 || isempty(bbox)) bbox='loose'; end; + if( nargin<5 || isempty(show)) show=0; end; + + classname = class( I ); + if(~strcmp(classname,'double')) I = double(I); end; + sizOrig = size(I); + I = padarray(I,[3,3],eps,'both'); + siz = size(I); + + % set origin to be center of image + rstart = (-siz(1)+1)/2; rend = (siz(1)-1)/2; + cstart = (-siz(2)+1)/2; cend = (siz(2)-1)/2; + + % If 'bbox' then get bounds of resulting image. To do this project the + % original points accoring to the homography and see the bounds. Note + % that since a homography maps a quadrilateral to a quadrilateral only + % need to look at where the bounds of the quadrilateral are mapped to. + % If 'same' then simply use the original image bounds. + if (strcmp(bbox,'loose')) + pr = H * [rstart rend rstart rend; cstart cstart cend cend; 1 1 1 1]; + row_dest = pr(1,:) ./ pr(3,:); col_dest = pr(2,:) ./ pr(3,:); + minr = floor(min(row_dest(:))); maxr = ceil(max(row_dest(:))); + minc = floor(min(col_dest(:))); maxc = ceil(max(col_dest(:))); + elseif (strcmp(bbox,'crop')) + minr = rstart; maxr = rend; + minc = cstart; maxc = cend; + else + error('illegal value for bbox'); + end; + + mrows = maxr-minr+1; + ncols = maxc-minc+1; + + % apply inverse homography on meshgrid in destination image + [col_dest_grid,row_dest_grid] = meshgrid( minc:maxc, minr:maxr ); + pr = inv(H) * [row_dest_grid(:)'; col_dest_grid(:)'; ones(1,mrows*ncols)]; + row_sample_locs = pr(1,:) ./ pr(3,:) + (siz(1)+1)/2; + row_sample_locs = reshape(row_sample_locs,mrows,ncols); + col_sample_locs = pr(2,:) ./ pr(3,:) + (siz(2)+1)/2; + col_sample_locs = reshape(col_sample_locs,mrows,ncols); + + % now texture map results + IR = interp2( I, col_sample_locs, row_sample_locs, method ); + IR(isnan(IR)) = 0; + IR = arraycrop2dims( IR, size(IR)-6 ); %undo extra padding + + if(~strcmp(classname,'double')) IR=feval(classname,IR ); end; + + % optionally show + if ( show) + I = arraycrop2dims( I, size(IR)-2 ); + figure(show); clf; im(I); + figure(show+1); clf; im(IR); + end diff --git a/images/assign2bins.m b/images/assign2bins.m new file mode 100644 index 00000000..c9b15e65 --- /dev/null +++ b/images/assign2bins.m @@ -0,0 +1,39 @@ +% Quantizes I according to values in edges. +% +% assign2bins replaces each value in I with a value between [0,nbins] where +% nbins=length(edges)-1. edges must be a vector of monotonically increasing values. Each +% element v in I gets converted to a discrete value q such that edges(q)<=v< edges(q+1). +% If v==edges(end) then q=nbins. If v does not fall into any bin, then q=0. +% +% See histc_1D for more details about edges and nbins. +% +% INPUTS +% I - numeric array of arbitrary dimension +% edges - either nbins+1 length vector of quantization bounds, or scalar nbins +% +% OUTPUTS +% B - size(I) array of quantization levels, int values between [0,nbins] +% +% EXAMPLE +% I = rand(5,5) +% B = assign2bins(I,[0:.1:1]) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also HISTC_1D + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function B = assign2bins( I, edges ) + if(~isa(I,'double')) I = double(I); end; + + if( length(edges)==1 ) % if nbins given instead of edges calculate edges + edges = linspace( min(I(:))-eps, max(I(:))+eps, edges+1 ); end; + + B = assign2binsc( I, edges ); % assign bin number + B = B + 1; % convert to 1 indexed + B = reshape( B, size(I) ); % resize B to have correct shape + B( B==(length(edges)) ) = 0; % vals outside or range get bin 0 diff --git a/images/clustermontage.m b/images/clustermontage.m new file mode 100644 index 00000000..a65130d0 --- /dev/null +++ b/images/clustermontage.m @@ -0,0 +1,64 @@ +% Used for visualization of clusters of images and videos. +% +% To display only a subset of clusters, given in a vector cs, use IDXb: +% IDXb = zeros(size(IDX)); for i=1:length(cs) IDXb(IDX==cs(i))=i; end; +% +% To save created movie: +% movie2avi(M, ['example.avi'], 'compression','Cinepak'); +% +% INPUTS +% X - MxNxR array of images or MxNxTxR array of videos +% IDX - cluster membership (Rx1 integer vector) [see kmeans2.m] +% nvals - max number of instances to show of each cluster +% pad - pads each cluster w blanks so it has exactly nvals elements, if necessary +% +% OUTPUTS +% XC - if pad==1 +% M x N x nvals x nclusters if X contains images +% M x N x T x nvals x nclusters if X contains videos +% - if pad==0 +% nclusters cell of M x N x c arrays if X contains images +% nclusters cell of M x N x T x c arrays if X contains videos +% +% EXAMPLE +% +% DATESTAMP +% 29-Nov-2005 10:00am +% +% See also KMEANS2, MONTAGES, MAKEMOVIESETS, CELL2ARRAY + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function XC = clustermontage( X, IDX, nvals, pad ) + %%% error check + siz = size(X); nd = ndims(X); k = max(IDX); + if(nd~=3 && nd~=4) error('X must be 3 or 4 dimensional array'); end; + inds = {':'}; inds = inds(:,ones(1,nd-1)); + + %%% sample both X and IDX so have nvals per cluster + keeplocs = find( IDX>0 ); IDX = IDX(keeplocs); X=X(inds{:},keeplocs); + for i=1:k + locs = find(IDX==i); nlocs = length(locs); + if( nlocs>nvals ) + rperm=randperm(nlocs); + keeplocs = [find(IDX~=i); locs(rperm(1:nvals))]; + IDX = IDX(keeplocs); X=X(inds{:},keeplocs); + elseif( nlocsndB) sizB = [sizB ones(1,ndA-ndB)]; end; + if (ndA0 ) ) + error('If flag==''smooth'' then mask must have strictly positive values.'); + end; + if( any( (sizB-1)/2>sizA ) ) + error('B is more then twice as big as A, cannot use flag==''smooth'''); + end; + end + + %%% OPTIMIZATION for 3D conv when B is actually 2D - calls (spatial) conv2 repeatedly + %%% on 2D slices of A. Note that may need to rearange A and B first and use + %%% recursion. The benefits carry over to convn_boundaries (which is faster for 2D + %%% arrays). + if( ndA==3 && ndB==3 && (sizB(1)==1 || sizB(2)==1) ) + if (sizB(1)==1) + A = permute( A, [2 3 1]); B = permute( B, [2 3 1]); + C = convn_fast( A, B, shapeorig ); + C = permute( C, [3 1 2] ); + elseif (sizB(2)==1) + A = permute( A, [3 1 2]); B = permute( B, [3 1 2]); + C = convn_fast( A, B, shapeorig ); + C = permute( C, [2 3 1] ); + end + return; + elseif( ndA==3 && ndB==2 ) + C1 = conv2( A(:,:,1), B, shape ); + C = zeros( [size(C1), sizA(3)] ); C(:,:,1) = C1; + for i=2:sizA(3) C(:,:,i) = conv2( A(:,:,i), B, shape ); end; + if (smoothFlag) for i=1:sizA(3) + C(:,:,i) = convn_boundaries( A(:,:,i), B, C(:,:,i), sizA(1:2), sizB(1:2) ); + end; end; + return; + end + + %%% get predicted time of convolution in frequency and spatial domain + %%% constants taken from time_conv + sizfft = 2.^ceil(real(log2(sizA+sizB-1))); psizfft=prod(sizfft); + frequen_pt = 3 * 1e-7 * psizfft * log(psizfft); + if (nd==2) + spatial_pt = 5e-9 * sizA(1) * sizA(2) * sizB(1) * sizB(2); + else + spatial_pt = 5e-8 * prod(sizA) * prod(sizB); + end + + %%% perform convolution + if ( spatial_pt < frequen_pt ) + if (nd==2) + C = conv2( A, B, shape ); + else + C = convn( A, B, shape ); + end + else + C = convn_freq( A, B, sizA, sizB, shape ); + end; + + + %%% now correct boundary effects (if shape=='smooth') + if( ~smoothFlag ) return; end; + C = convn_boundaries( A, B, C, sizA, sizB ); + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% calculate boundary values for C in spatial domain +function C = convn_boundaries( A, B, C, sizA, sizB ) + nd = length(sizA); + radii = (sizB-1)/2; + + % flip B appropriately (conv flips B) + for d=1:nd B = flipdim(B,d); end; + + % get location that need to be updated + % this is the LEAST efficient part (fixing is annoying though) + inds = {':'}; inds = inds(:,ones(1,nd)); + Dind = zeros( sizA ); + for d=1:nd + inds1 = inds; inds1{ d } = 1:radii(d); + inds2 = inds; inds2{ d } = sizA(d)-radii(d)+1:sizA(d); + Dind(inds1{:}) = 1; Dind(inds2{:}) = 1; + end + Dind = find( Dind ); + Dndx = ind2sub2( sizA, Dind ); + nlocs = length(Dind); + + % get cuboid dimensions for all the boundary regions + sizA_rep = repmat( sizA, [nlocs,1] ); + radii_rep = repmat( radii, [nlocs,1] ); + Astarts = max(1,Dndx-radii_rep); + Aends = min( sizA_rep, Dndx+radii_rep); + Bstarts = Astarts + (1-Dndx+radii_rep); + Bends = Bstarts + (Aends-Astarts); + + % now update these locations + vs = zeros( 1, nlocs ); + if( nd==2 ) + for i=1:nlocs % accelerated for 2D arrays [fast] + Apart = A( Astarts(i,1):Aends(i,1), Astarts(i,2):Aends(i,2) ); + Bpart = B( Bstarts(i,1):Bends(i,1), Bstarts(i,2):Bends(i,2) ); + v = (Apart.*Bpart); vs(i) = sum(v(:)) ./ sum(Bpart(:)); + end + elseif( nd==3 ) % accelerated for 3D arrays [stupid that can't speed up more] + for i=1:nlocs + Apart = A( Astarts(i,1):Aends(i,1), Astarts(i,2):Aends(i,2), ... + Astarts(i,3):Aends(i,3) ); + Bpart = B( Bstarts(i,1):Bends(i,1), Bstarts(i,2):Bends(i,2), ... + Bstarts(i,3):Bends(i,3) ); + za = sum(sum(sum(Apart.*Bpart))); zb=sum(sum(sum(Bpart))); vs(1,i) = za./zb; + end + else % general case [slow] + for i=1:nlocs + for d=1:nd extract{d} = Astarts(i,d):Aends(i,d); end; Apart = A( extract{:} ); + for d=1:nd extract{d} = Bstarts(i,d):Bends(i,d); end; Bpart = B( extract{:} ); + v = (Apart.*Bpart); vs(i) = sum(v(:)) ./ sum(Bpart(:)); + end + end + C( Dind ) = vs * sum(B(:)); + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Convolution as multiplication in the frequency domain +function C = convn_freq( A, B, sizA, sizB, shape ) + siz = sizA + sizB - 1; + + % calculate correlation in frequency domain + Fa = fftn(A,siz); + Fb = fftn(B,siz); + C = ifftn(Fa .* Fb); + + % make sure output is real if inputs were both real + if(isreal(A) && isreal(B)) C = real(C); end; + + % crop to size + if(strcmp(shape,'valid')) + C = arraycrop2dims( C, max(0,sizA-sizB+1 ) ); + elseif(strcmp(shape,'same')) + C = arraycrop2dims( C, sizA ); + elseif(~strcmp(shape,'full')) + error('unknown shape'); + end + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Function used to calculate constants for prediction of convolution in the +% frequency and spatial domains. Method taken from normxcorr2.m +% May need to reset K's if placing this on a new machine, however, their +% ratio should be about the same.. +function K = time_conv + mintime = 4; + + switch 3 + case 1 %%% conv2 [[empirically K = 5e-9]] + % convolution time = K*prod(size(a))*prod(size(b)) + siza = 30; sizb = 200; + a = ones(siza); b = ones(sizb); + t1 = cputime; t2 = t1; k = 0; + while (t2-t1) length(sigmas)) error('Incorrect # of simgas specified'); end; + sigmas = sigmas(1:nd); + + if( isa( I, 'uint8' ) ) I = double(I); end; + if( nargin<3 || isempty(shape) ) shape='full'; end; + if( nargin<4 || isempty(radius) ) radius=2.25; end; + + % create and apply 1D gaussian masks along each dimension + L = I; filters = cell(1,nd); + for i=1:nd + if (sigmas(i)>.3) + r = ceil( sigmas(i)*radius ); + f = filter_gauss_1D( r, sigmas(i) ); + f = permute( f, circshift(1:nd,[1,i-1]) ); + filters{i} = f; + L = convn_fast( L, f, shape ); + else + filters{i} = 1; + end + end + diff --git a/images/histc_1D.m b/images/histc_1D.m new file mode 100644 index 00000000..0a1539bf --- /dev/null +++ b/images/histc_1D.m @@ -0,0 +1,62 @@ +% Generalized, version of histc (histogram count), allows weighted values. +% +% Creates a histogram h of the values in I, with edges as specified. h will have length +% nbins, where nbins=length(edges)-1. Each value in I has associated weight given by +% weightmask, which should have the same dimensions as I. h(q) contains the weighted +% count of values v in I such that edges(q) <= v < edges(q+1). h(nbins) additionally +% contains the weighted count of values in I such that v==edges(nbins+1) -- which is +% different then how histc treates the boundary condition. Finally, h is normalized so +% that sum(h(:))==1. +% +% It usually makes sense to specify edges explicitly, especially if different histograms +% are going to be compared. In general, edges must have monotonically non-decreasing +% values. Also, if the exact bounds are unknown then it is convenient to set the first +% element in edges to -inf and the last to inf. If h = histc_1D( I, nbins, ...), edges are +% automatically generated and have bins equally spaced between min(I) and max(I). That is +% edges is generated via: 'edges = linspace( minI-eps, maxI+eps, nbins+1 )'. +% +% See histc for more information. +% +% INPUTS +% I - numeric array [treated as a vector] +% edges - either nbins+1 length vector of quantization bounds, or scalar nbins +% weightmask - [optional] size(I) numeric array of weights +% +% OUTPUTS +% h - histogram (vector of size 1xnbins) +% +% EXAMPLE +% G = filter_gauss_nD([1000 1000],[],[],1); +% h1 = histc_1D( G, 25 ); figure(1); bar(h1); +% h2 = histc_1D( G, 25, G ); figure(2); bar(h2); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also HISTC, ASSIGN2BINS + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function h = histc_1D( I, edges, weightmask ) + if( nargin<3 ), weightmask=[]; end; + if( ~isa(I,'double') ) I=double(I); end; + + %%% if nbins given instead of edges calculate edges + if(length(edges)==1) edges = linspace(min(I(:))-eps,max(I(:))+eps,edges+1); end; + + %%% create histogram + if(isempty(weightmask)) + % If no weightmask specified then basically call histc and normalize + h = histc( I(:), edges )'; + h(end-1) = h(end-1)+h(end); + h = h(1:end-1); h = h / sum(h); + else + % create masked histograms + h = histc_nD_c( I(:), weightmask(:), edges ); + h = h / sum(h); + end + + + diff --git a/images/histc_image.m b/images/histc_image.m new file mode 100644 index 00000000..0e01b398 --- /dev/null +++ b/images/histc_image.m @@ -0,0 +1,63 @@ +% Calculates histograms at every point in an array I. +% +% The qth bin of each histogram contains the count of the number of locations in I that +% have value in between edges(q)<=v< edges(q+1). HS(i,j,...,k,:) will contain the +% histogram at location (i,j,...,k), as calculated by weighing values in I by placing +% weightmask at that location. For example, if weightmask is ones(window_size) then the +% histogram at every location will simply be a histogram of the pixels within that window. +% +% See histc_1D for more details about edges and nbins. +% +% The shape flag specifies what to do at boundaries. See convn_fast for +% possible flags such as 'same', 'valid', 'full, or 'smooth'. +% +% INPUTS +% I - Array with integer values [see above] +% edges - either nbins+1 length vector of quantization bounds, or nbins +% weightmask - numeric array of weights, or cell array of seperable weight kernels +% shape - [optional] 'valid', ['full'], 'same', or 'smooth' +% +% OUTPUTS +% HS - ~size(I)xQ array where each ~size(I) elt is a Q element +% histogram (~size(I) because depends on val of shape) +% +% EXAMPLE +% load trees; +% L = conv2(X, filter_DOG_2D(10,4,1,0), 'valid' ); +% f1=filter_gauss_1D([],5); HS1 = histc_image( L, 15, {f1,f1'}, 'same' ); +% f2=ones(1,15); HS2 = histc_image( L, 15, {f2,f2'}, 'same' ); +% figure(1); im(X); figure(2); im(L); figure(3); montage2(HS1,1,1); +% figure(4); montage2(HS2,1,1); figure(5); montage2(HS1-HS2,1,1); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also ASSIGN2BINS, HISTC_1D + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function HS = histc_image( I, edges, weightmask, shape ) + if( nargin<4 || isempty(shape) ) shape = 'full'; end; + if( ~iscell(weightmask) ) weightmask={weightmask}; end; + + % split I into channels + I = assign2bins( I, edges ); + nbins=length(edges)-1; if(nbins==0) nbins=edges; end; + nd = ndims(I); siz=size(I); maxI = max(I(:)); + if( nd==2 && siz(2)==1) nd=1; siz=siz(1); end; + QI = logical( zeros( [siz maxI] ) ); + inds = {':'}; inds = inds(:,ones(1,nd)); + for i=1:nbins QI(inds{:},i)=I==i; end; + HS = double( QI ); + + % convolve with weightmask to get histograms, scale appropriately + for i=1:length(weightmask) + weightmaski = weightmask{i}; + for d=1:ndims(weightmaski) weightmaski = flipdim(weightmaski,d); end; + weightmaski = weightmaski / sum(weightmaski(:)); + HS = convn_fast( HS, weightmaski, shape ); + end; + + diff --git a/images/histc_nD.m b/images/histc_nD.m new file mode 100644 index 00000000..5c44e9eb --- /dev/null +++ b/images/histc_nD.m @@ -0,0 +1,73 @@ +% Generalized, multidimensional version of normalized histc (histogram count). +% +% Generalized version of normalized histc (histogram count) that allows for weighted +% pixels and also multiple channels. For example, suppose I is a nx2 array (n samples, 2 +% channels). Then histc_nD creates a 2D histogram such that h(q1,q2) contains the weighted +% count of values [v1;v2] in I such that edges1(q1)<=v1100 || nhist*nbins>10000 ) + error('Too much histogram data to display!'); end; + + %%% get layout of images (mm=#images/row, nn=#images/col) + if (nargin<3 || isempty(mm) || isempty(nn)) + if (nargin==1 || (nargin==2 && isempty(mm)) || (nargin==3 && isempty(mm) && isempty(nn)) ) + nn = round(sqrt(nhist)); + mm = ceil( nhist / nn ); + elseif (isempty(mm)) + mm = ceil( nhist / nn ); + else + nn = ceil( nhist / mm ); + end; + end; + + %%% plot each histogram + clf; + for q=1:nhist + if( nhist>1 ) subplot( mm, nn, q ); end; + bar( HS(q,:), 1 ); shading('flat'); + ylim( [0,1] ); set( gca, 'YTick', [] ); + xlim( [.5, nbins+.5] ); set( gca, 'XTick', [] ); + end; diff --git a/images/im.m b/images/im.m new file mode 100644 index 00000000..f9671a9f --- /dev/null +++ b/images/im.m @@ -0,0 +1,37 @@ +%IM [2D] Function for displaying grayscale images. +% +% Handy function for showing a grayscale image with a colorbar and interactive pixel value +% tool. +% +% INPUTS +% I - image in a valid format +% range - [optional] minval/maxval for imagesc +% +% EXAMPLE +% load clown +% im( X ) +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also IMSHOW, IMVIEW + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function im( I, range ); + if( nargin==1 || isempty(range)) + imagesc(I); + else + imagesc(I,range) + end + + pixval on; % info about image pixels + title(inputname(1)); % title according to name of input arg + colormap(gray); % black/white image + colorbar; % appends a colorbar + axis('image'); % used for images + % whitebg('black'); set(gcf,'color', [0 0 0]); %black background: + % set(gcf,'menubar','none'); % no menu + diff --git a/images/imageMLG.m b/images/imageMLG.m new file mode 100644 index 00000000..18049261 --- /dev/null +++ b/images/imageMLG.m @@ -0,0 +1,161 @@ +% Calculates maximum likelihood parameters of gaussian that gave rise to image G. +% +% Suppose G contains an image of a gaussian distribution. One way to recover the +% parameters of the gaussian is to threshold the image, and then estimate the +% mean/covariance based on the coordinates of the thresholded points. A better method is +% to do no thresholding and instead use all the coordinates, weighted by their value. +% This function does the latter, except in a very efficient manner since all computations +% are done in parallel over the entire image. +% +% This function works over 2D or 3D images. It makes most sense when G in fact contains +% an image of a single gaussian, but a result will be returned regardless. All operations +% are performed on abs(G) in case it contains negative or complex values. +% +% symmFlag is an optional flag that if set to 1 then imageMLG recovers the maximum +% likelihood symmetric gaussian. That is the variance in each direction is equal, and all +% covariance terms are 0. If symmFlag is set to 2 and G is 3D, imageMLG recovers the ML +% guassian with equal variance in the 1st 2 dimensions (row and col) and all covariance +% terms equal to 0, but a possibly different variance in the 3rd (z or t) dimension. +% +% INPUTS +% G - image of a gaussian (weighted pixels) +% symmFlag - [optional] see above +% show - [optional] figure to use for display (no display if == 0) +% +% OUTPUTS +% mu - 2 or 3 element vector specifying the mean [row,col,z] +% C - 2x2 or 3x3 covariance matrix [row,col,z] +% GR - image of the recovered gaussian (faster if omitted) +% logl - log likelihood of G given the recovered gaussian (faster if omitted) +% +% EXAMPLE +% % example 1 [2D] +% R = rotation_matrix2D( pi/6 ); C=R'*[10^2 0; 0 20^2]*R; +% G = filter_gauss_nD( [200, 300], [150,100], C, 0 ); +% [mu,C,GR,logl] = imageMLG( G, 0, 1 ); +% mask = mask_ellipse( size(G,1), size(G,2), mu, C ); +% figure(3); im(mask) +% % example 2 [3D] +% R = rotation_matrix3D( [1,1,0], pi/4 ); +% C = R'*[5^2 0 0; 0 2^2 0; 0 0 4^2]*R; +% G = filter_gauss_nD( [50,50,50], [25,25,25], C, 0 ); +% [mu,C,GR,logl] = imageMLG( G, 0, 1 ); +% +% DATESTAMP +% 29-Sep-2005 2:00pm +% +% See also GAUSS2ELLIPSE, PLOT_GAUSSELLIPSES, MASK_ELLIPSE + +% Piotr's Image&Video Toolbox Version 1.03 +% Written and maintained by Piotr Dollar pdollar-at-cs.ucsd.edu +% Please email me if you find bugs, or have suggestions or questions! + +function varargout = imageMLG( G, symmFlag, show ) + if( nargin<2 || isempty(symmFlag) ) symmFlag=0; end; + if( nargin<3 || isempty(show) ) show=0; end; + + varargout = cell(1,max(nargout,2)); + nd = ndims(G); G = abs(G); + if( nd==2 ) + [varargout{:}] = imageMLG_2D( G, symmFlag, show ); + elseif( nd==3 ) + [varargout{:}] = imageMLG_3D( G, symmFlag, show ); + else + error( 'Unsupported dimension for G. G must be 2D or 3D.' ); + end + + +function [mu,C,GR,logl] = imageMLG_2D( G, symmFlag, show ) + + % to be used throughout calculations + [ grid_cols, grid_rows ] = meshgrid( 1:size(G,2), 1:size(G,1) ); + sumG = sum(G(:)); if(sumG==0) sumG=1; end; + + % recover mean + mu_col = (grid_cols .* G); mu_col = sum( mu_col(:) ) / sumG; + mu_row = (grid_rows .* G); mu_row = sum( mu_row(:) ) / sumG; + mu = [mu_row, mu_col]; + + % recover sigma + dist_cols = (grid_cols - mu_col); + dist_rows = (grid_rows - mu_row); + if( symmFlag==0 ) + Ccc = (dist_cols .^ 2) .* G; Ccc = sum(Ccc(:)) / sumG; + Crr = (dist_rows .^ 2) .* G; Crr = sum(Crr(:)) / sumG; + Crc = (dist_cols .* dist_rows) .* G; Crc = sum(Crc(:)) / sumG; + C = [Crr Crc; Crc Ccc]; + elseif( symmFlag==1 ) + sigma_sq = (dist_cols.^2 + dist_rows.^2) .* G; + sigma_sq = 1/2 * sum(sigma_sq(:)) / sumG; + C = sigma_sq*eye(2); + else + error(['Illegal value for symmFlag: ' num2str(symmFlag)]) + end + + % get the log likelihood of the data + if (nargout>2) + GR = filter_gauss_nD( size(G), mu, C ); + probs = GR; probs( probs2 || (show)) + GR = filter_gauss_nD( size(G), mu, C ); + probs = GR; probs( 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�V1wR?KUr;pv{xm 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